smdb.h revision 95154
1/* 2 * Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 * $Id: smdb.h,v 1.1.1.4 2002/02/17 21:56:43 gshapiro Exp $ 10 * 11 */ 12 13#ifndef _SMDB_H_ 14# define _SMDB_H_ 15 16# include <sys/types.h> 17# include <sys/stat.h> 18# include <sm/gen.h> 19# include <sm/errstring.h> 20 21# ifdef NDBM 22# include <ndbm.h> 23# endif /* NDBM */ 24 25# ifdef NEWDB 26# include <db.h> 27# ifndef DB_VERSION_MAJOR 28# define DB_VERSION_MAJOR 1 29# endif /* ! DB_VERSION_MAJOR */ 30# endif /* NEWDB */ 31 32/* 33** Some size constants 34*/ 35 36#define SMDB_MAX_USER_NAME_LEN 1024 37#define SMDB_MAX_NAME_LEN 1024 38 39/* 40** This file defines the abstraction for database lookups. It is pretty 41** much a copy of the db2 interface with the exception that every function 42** returns 0 on success and non-zero on failure. The non-zero return code 43** is meaningful. 44** 45** I'm going to put the function comments in this file since the interface 46** MUST be the same for all inheritors of this interface. 47*/ 48 49typedef struct database_struct SMDB_DATABASE; 50typedef struct cursor_struct SMDB_CURSOR; 51typedef struct entry_struct SMDB_DBENT; 52 53/* 54** DB_CLOSE_FUNC -- close the database 55** 56** Parameters: 57** db -- The database to close. 58** 59** Returns: 60** 0 - Success, otherwise errno. 61** 62*/ 63 64typedef int (*db_close_func) __P((SMDB_DATABASE *db)); 65 66/* 67** DB_DEL_FUNC -- removes a key and data pair from the database 68** 69** Parameters: 70** db -- The database to close. 71** key -- The key to remove. 72** flags -- delete options. There are currently no defined 73** flags for delete. 74** 75** Returns: 76** 0 - Success, otherwise errno. 77** 78*/ 79 80typedef int (*db_del_func) __P((SMDB_DATABASE *db, 81 SMDB_DBENT *key, unsigned int flags)); 82 83/* 84** DB_FD_FUNC -- Returns a pointer to a file used for the database. 85** 86** Parameters: 87** db -- The database to close. 88** fd -- A pointer to store the returned fd in. 89** 90** Returns: 91** 0 - Success, otherwise errno. 92** 93*/ 94 95typedef int (*db_fd_func) __P((SMDB_DATABASE *db, int* fd)); 96 97/* 98** DB_GET_FUNC -- Gets the data associated with a key. 99** 100** Parameters: 101** db -- The database to close. 102** key -- The key to access. 103** data -- A place to store the returned data. 104** flags -- get options. There are currently no defined 105** flags for get. 106** 107** Returns: 108** 0 - Success, otherwise errno. 109** 110*/ 111 112typedef int (*db_get_func) __P((SMDB_DATABASE *db, 113 SMDB_DBENT *key, 114 SMDB_DBENT *data, unsigned int flags)); 115 116/* 117** DB_PUT_FUNC -- Sets some data according to the key. 118** 119** Parameters: 120** db -- The database to close. 121** key -- The key to use. 122** data -- The data to store. 123** flags -- put options: 124** SMDBF_NO_OVERWRITE - Return an error if key alread 125** exists. 126** SMDBF_ALLOW_DUP - Allow duplicates in btree maps. 127** 128** Returns: 129** 0 - Success, otherwise errno. 130** 131*/ 132 133typedef int (*db_put_func) __P((SMDB_DATABASE *db, 134 SMDB_DBENT *key, 135 SMDB_DBENT *data, unsigned int flags)); 136 137/* 138** DB_SYNC_FUNC -- Flush any cached information to disk. 139** 140** Parameters: 141** db -- The database to sync. 142** flags -- sync options: 143** 144** Returns: 145** 0 - Success, otherwise errno. 146** 147*/ 148 149typedef int (*db_sync_func) __P((SMDB_DATABASE *db, unsigned int flags)); 150 151/* 152** DB_SET_OWNER_FUNC -- Set the owner and group of the database files. 153** 154** Parameters: 155** db -- The database to set. 156** uid -- The UID for the new owner (-1 for no change) 157** gid -- The GID for the new owner (-1 for no change) 158** 159** Returns: 160** 0 - Success, otherwise errno. 161** 162*/ 163 164typedef int (*db_set_owner_func) __P((SMDB_DATABASE *db, uid_t uid, gid_t gid)); 165 166/* 167** DB_CURSOR -- Obtain a cursor for sequential access 168** 169** Parameters: 170** db -- The database to use. 171** cursor -- The address of a cursor pointer. 172** flags -- sync options: 173** 174** Returns: 175** 0 - Success, otherwise errno. 176** 177*/ 178 179typedef int (*db_cursor_func) __P((SMDB_DATABASE *db, 180 SMDB_CURSOR **cursor, unsigned int flags)); 181 182typedef int (*db_lockfd_func) __P((SMDB_DATABASE *db)); 183 184struct database_struct 185{ 186 db_close_func smdb_close; 187 db_del_func smdb_del; 188 db_fd_func smdb_fd; 189 db_get_func smdb_get; 190 db_put_func smdb_put; 191 db_sync_func smdb_sync; 192 db_set_owner_func smdb_set_owner; 193 db_cursor_func smdb_cursor; 194 db_lockfd_func smdb_lockfd; 195 void *smdb_impl; 196}; 197/* 198** DB_CURSOR_CLOSE -- Close a cursor 199** 200** Parameters: 201** cursor -- The cursor to close. 202** 203** Returns: 204** 0 - Success, otherwise errno. 205** 206*/ 207 208typedef int (*db_cursor_close_func) __P((SMDB_CURSOR *cursor)); 209 210/* 211** DB_CURSOR_DEL -- Delete the key/value pair of this cursor 212** 213** Parameters: 214** cursor -- The cursor. 215** flags -- flags 216** 217** Returns: 218** 0 - Success, otherwise errno. 219** 220*/ 221 222typedef int (*db_cursor_del_func) __P((SMDB_CURSOR *cursor, 223 unsigned int flags)); 224 225/* 226** DB_CURSOR_GET -- Get the key/value of this cursor. 227** 228** Parameters: 229** cursor -- The cursor. 230** key -- The current key. 231** value -- The current value 232** flags -- flags 233** 234** Returns: 235** 0 - Success, otherwise errno. 236** SMDBE_LAST_ENTRY - This is a success condition that 237** gets returned when the end of the 238** database is hit. 239** 240*/ 241 242typedef int (*db_cursor_get_func) __P((SMDB_CURSOR *cursor, 243 SMDB_DBENT *key, 244 SMDB_DBENT *data, 245 unsigned int flags)); 246 247/* 248** Flags for DB_CURSOR_GET 249*/ 250 251#define SMDB_CURSOR_GET_FIRST 0 252#define SMDB_CURSOR_GET_LAST 1 253#define SMDB_CURSOR_GET_NEXT 2 254#define SMDB_CURSOR_GET_RANGE 3 255 256/* 257** DB_CURSOR_PUT -- Put the key/value at this cursor. 258** 259** Parameters: 260** cursor -- The cursor. 261** key -- The current key. 262** value -- The current value 263** flags -- flags 264** 265** Returns: 266** 0 - Success, otherwise errno. 267** 268*/ 269 270typedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor, 271 SMDB_DBENT *key, 272 SMDB_DBENT *data, 273 unsigned int flags)); 274 275 276 277struct cursor_struct 278{ 279 db_cursor_close_func smdbc_close; 280 db_cursor_del_func smdbc_del; 281 db_cursor_get_func smdbc_get; 282 db_cursor_put_func smdbc_put; 283 void *smdbc_impl; 284}; 285 286 287struct database_params_struct 288{ 289 unsigned int smdbp_num_elements; 290 unsigned int smdbp_cache_size; 291 bool smdbp_allow_dup; 292}; 293 294typedef struct database_params_struct SMDB_DBPARAMS; 295 296struct database_user_struct 297{ 298 uid_t smdbu_id; 299 gid_t smdbu_group_id; 300 char smdbu_name[SMDB_MAX_USER_NAME_LEN]; 301}; 302 303typedef struct database_user_struct SMDB_USER_INFO; 304 305struct entry_struct 306{ 307 void *data; 308 size_t size; 309}; 310 311typedef char *SMDB_DBTYPE; 312typedef unsigned int SMDB_FLAG; 313 314/* 315** These are types of databases. 316*/ 317 318# define SMDB_TYPE_DEFAULT NULL 319# define SMDB_TYPE_DEFAULT_LEN 0 320# define SMDB_TYPE_HASH "hash" 321# define SMDB_TYPE_HASH_LEN 5 322# define SMDB_TYPE_BTREE "btree" 323# define SMDB_TYPE_BTREE_LEN 6 324# define SMDB_TYPE_NDBM "dbm" 325# define SMDB_TYPE_NDBM_LEN 4 326 327/* 328** These are flags 329*/ 330 331/* Flags for put */ 332# define SMDBF_NO_OVERWRITE 0x00000001 333# define SMDBF_ALLOW_DUP 0x00000002 334 335 336extern SMDB_DATABASE *smdb_malloc_database __P((void)); 337extern void smdb_free_database __P((SMDB_DATABASE *)); 338extern int smdb_open_database __P((SMDB_DATABASE **, char *, int, 339 int, long, SMDB_DBTYPE, 340 SMDB_USER_INFO *, 341 SMDB_DBPARAMS *)); 342# ifdef NEWDB 343extern int smdb_db_open __P((SMDB_DATABASE **, char *, int, int, 344 long, SMDB_DBTYPE, SMDB_USER_INFO *, 345 SMDB_DBPARAMS *)); 346# endif /* NEWDB */ 347# ifdef NDBM 348extern int smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int, 349 long, SMDB_DBTYPE, 350 SMDB_USER_INFO *, 351 SMDB_DBPARAMS *)); 352# endif /* NDBM */ 353extern int smdb_add_extension __P((char *, int, char *, char *)); 354extern int smdb_setup_file __P((char *, char *, int, long, 355 SMDB_USER_INFO *, struct stat *)); 356extern int smdb_lock_file __P((int *, char *, int, long, char *)); 357extern int smdb_unlock_file __P((int)); 358extern int smdb_filechanged __P((char *, char *, int, 359 struct stat *)); 360extern void smdb_print_available_types __P((void)); 361extern char *smdb_db_definition __P((SMDB_DBTYPE)); 362extern int smdb_lock_map __P((SMDB_DATABASE *, int)); 363extern int smdb_unlock_map __P((SMDB_DATABASE *)); 364#endif /* ! _SMDB_H_ */ 365