123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #ifndef __TDB_H__
- #define __TDB_H__
- #ifdef __cplusplus
- extern "C" {
- #endif
- #ifndef PRINTF_ATTRIBUTE
- #if (__GNUC__ >= 3)
- #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
- #else
- #define PRINTF_ATTRIBUTE(a1, a2)
- #endif
- #endif
- #define TDB_REPLACE 1
- #define TDB_INSERT 2
- #define TDB_MODIFY 3
- #define TDB_DEFAULT 0
- #define TDB_CLEAR_IF_FIRST 1
- #define TDB_INTERNAL 2
- #define TDB_NOLOCK 4
- #define TDB_NOMMAP 8
- #define TDB_CONVERT 16
- #define TDB_BIGENDIAN 32
- #define TDB_ERRCODE(code, ret) ((tdb->ecode = (code)), ret)
- enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK,
- TDB_ERR_OOM, TDB_ERR_EXISTS, TDB_ERR_NOLOCK, TDB_ERR_LOCK_TIMEOUT,
- TDB_ERR_NOEXIST};
- #ifndef u32
- #define u32 unsigned
- #endif
- typedef struct {
- char *dptr;
- size_t dsize;
- } TDB_DATA;
- typedef u32 tdb_len;
- typedef u32 tdb_off;
- struct tdb_header {
- char magic_food[32];
- u32 version;
- u32 hash_size;
- tdb_off rwlocks;
- tdb_off reserved[31];
- };
- struct tdb_lock_type {
- u32 count;
- u32 ltype;
- };
- struct tdb_traverse_lock {
- struct tdb_traverse_lock *next;
- u32 off;
- u32 hash;
- };
- typedef struct tdb_context {
- char *name;
- void *map_ptr;
- int fd;
- tdb_len map_size;
- int read_only;
- struct tdb_lock_type *locked;
- enum TDB_ERROR ecode;
- struct tdb_header header;
- u32 flags;
- struct tdb_traverse_lock travlocks;
- struct tdb_context *next;
- dev_t device;
- ino_t inode;
- void (*log_fn)(struct tdb_context *tdb, int level, const char *, ...) PRINTF_ATTRIBUTE(3,4);
- u32 (*hash_fn)(TDB_DATA *key);
- int open_flags;
- } TDB_CONTEXT;
- typedef int (*tdb_traverse_func)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *);
- typedef void (*tdb_log_func)(TDB_CONTEXT *, int , const char *, ...);
- typedef u32 (*tdb_hash_func)(TDB_DATA *key);
- TDB_CONTEXT *tdb_open(const char *name, int hash_size, int tdb_flags,
- int open_flags, mode_t mode);
- TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
- int open_flags, mode_t mode,
- tdb_log_func log_fn,
- tdb_hash_func hash_fn);
- int tdb_reopen(TDB_CONTEXT *tdb);
- int tdb_reopen_all(void);
- void tdb_logging_function(TDB_CONTEXT *tdb, tdb_log_func);
- enum TDB_ERROR tdb_error(TDB_CONTEXT *tdb);
- const char *tdb_errorstr(TDB_CONTEXT *tdb);
- TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key);
- int tdb_delete(TDB_CONTEXT *tdb, TDB_DATA key);
- int tdb_store(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
- int tdb_append(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA new_dbuf);
- int tdb_close(TDB_CONTEXT *tdb);
- TDB_DATA tdb_firstkey(TDB_CONTEXT *tdb);
- TDB_DATA tdb_nextkey(TDB_CONTEXT *tdb, TDB_DATA key);
- int tdb_traverse(TDB_CONTEXT *tdb, tdb_traverse_func fn, void *);
- int tdb_exists(TDB_CONTEXT *tdb, TDB_DATA key);
- int tdb_lockkeys(TDB_CONTEXT *tdb, u32 number, TDB_DATA keys[]);
- void tdb_unlockkeys(TDB_CONTEXT *tdb);
- int tdb_lockall(TDB_CONTEXT *tdb);
- void tdb_unlockall(TDB_CONTEXT *tdb);
- void tdb_set_lock_alarm(sig_atomic_t *palarm);
- int tdb_chainlock(TDB_CONTEXT *tdb, TDB_DATA key);
- int tdb_chainunlock(TDB_CONTEXT *tdb, TDB_DATA key);
- void tdb_dump_all(TDB_CONTEXT *tdb);
- int tdb_printfreelist(TDB_CONTEXT *tdb);
- extern TDB_DATA tdb_null;
- #ifdef __cplusplus
- }
- #endif
- #endif
|