| /* |
| * sdbm - ndbm work-alike hashed database library |
| * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978). |
| * author: oz@nexus.yorku.ca |
| * status: public domain. |
| */ |
| |
| /* These settings are -incompatible- with mod_dav [www.webdav.org/mod_dav/] |
| * but are required for compatibility with mod_auth_dbm. Do not link this |
| * build of sdbm into mod_dav and expect success, dav requires big records. |
| */ |
| #define DBLKSIZ 4096 |
| #define PBLKSIZ 1024 |
| #define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */ |
| #define SPLTMAX 10 /* maximum allowed splits */ |
| /* for a single insertion */ |
| #define DIRFEXT ".dir" |
| #define PAGFEXT ".pag" |
| |
| typedef struct { |
| int dirf; /* directory file descriptor */ |
| int pagf; /* page file descriptor */ |
| int flags; /* status/error flags, see below */ |
| long maxbno; /* size of dirfile in bits */ |
| long curbit; /* current bit number */ |
| long hmask; /* current hash mask */ |
| long blkptr; /* current block for nextkey */ |
| int keyptr; /* current key for nextkey */ |
| long blkno; /* current page to read/write */ |
| long pagbno; /* current page in pagbuf */ |
| char pagbuf[PBLKSIZ]; /* page file block buffer */ |
| long dirbno; /* current block in dirbuf */ |
| char dirbuf[DBLKSIZ]; /* directory file block buffer */ |
| } DBM; |
| |
| #define DBM_RDONLY 0x1 /* data base open read-only */ |
| #define DBM_IOERR 0x2 /* data base I/O error */ |
| |
| /* |
| * utility macros |
| */ |
| #define sdbm_rdonly(db) ((db)->flags & DBM_RDONLY) |
| #define sdbm_error(db) ((db)->flags & DBM_IOERR) |
| |
| #define sdbm_clearerr(db) ((db)->flags &= ~DBM_IOERR) /* ouch */ |
| |
| #define sdbm_dirfno(db) ((db)->dirf) |
| #define sdbm_pagfno(db) ((db)->pagf) |
| |
| typedef struct { |
| char *dptr; |
| int dsize; |
| } datum; |
| |
| extern datum nullitem; |
| |
| #ifdef __STDC__ |
| #define proto(p) p |
| #else |
| #define proto(p) () |
| #endif |
| |
| /* |
| * flags to sdbm_store |
| */ |
| #define DBM_INSERT 0 |
| #define DBM_REPLACE 1 |
| |
| /* |
| * ndbm interface |
| */ |
| extern DBM *sdbm_open proto((char *, int, int)); |
| extern void sdbm_close proto((DBM *)); |
| extern datum sdbm_fetch proto((DBM *, datum)); |
| extern int sdbm_delete proto((DBM *, datum)); |
| extern int sdbm_store proto((DBM *, datum, datum, int)); |
| extern datum sdbm_firstkey proto((DBM *)); |
| extern datum sdbm_nextkey proto((DBM *)); |
| |
| /* |
| * other |
| */ |
| extern DBM *sdbm_prep proto((char *, char *, int, int)); |
| extern long sdbm_hash proto((char *, int)); |