nmdb: Add LevelDB support
[nmdb.git] / nmdb / be-tdb.c
blob0c3fca11e67a2c62a3200cc34fdeaa531f3f9bec
2 #if BE_ENABLE_TDB
4 #include <string.h> /* memcpy() */
5 #include <stdlib.h> /* malloc() and friends */
7 /* tdb.h needs mode_t defined externally, and it is defined in one of these
8 (which are the ones required for open() */
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 #include <fcntl.h>
12 #include <tdb.h>
14 #include "be.h"
16 /* Local operations names are prepended with an 'x' so they don't collide with
17 * tdb real functions */
19 int xtdb_set(struct db_conn *db, const unsigned char *key, size_t ksize,
20 unsigned char *val, size_t vsize);
21 int xtdb_get(struct db_conn *db, const unsigned char *key, size_t ksize,
22 unsigned char *val, size_t *vsize);
23 int xtdb_del(struct db_conn *db, const unsigned char *key, size_t ksize);
24 int xtdb_firstkey(struct db_conn *db, unsigned char *key, size_t *ksize);
25 int xtdb_nextkey(struct db_conn *db,
26 const unsigned char *key, size_t ksize,
27 unsigned char *nextkey, size_t *nksize);
28 int xtdb_close(struct db_conn *db);
31 struct db_conn *xtdb_open(const char *name, int flags)
33 struct db_conn *db;
34 TDB_CONTEXT *tdb_db;
36 tdb_db = tdb_open(name, 0, 0, O_CREAT | O_RDWR, 0640);
37 if (tdb_db == NULL)
38 return NULL;
40 db = malloc(sizeof(struct db_conn));
41 if (db == NULL) {
42 tdb_close(tdb_db);
43 return NULL;
46 db->conn = tdb_db;
47 db->set = xtdb_set;
48 db->get = xtdb_get;
49 db->del = xtdb_del;
50 db->firstkey = xtdb_firstkey;
51 db->nextkey = xtdb_nextkey;
52 db->close = xtdb_close;
54 return db;
57 int xtdb_close(struct db_conn *db)
59 int rv;
61 rv = tdb_close(db->conn);
62 free(db);
63 return rv == 0;
66 int xtdb_set(struct db_conn *db, const unsigned char *key, size_t ksize,
67 unsigned char *val, size_t vsize)
69 TDB_DATA k, v;
71 /* we can't maintain "const"ness here because tdb's prototypes; the
72 * same applies to get and del, so we just cast */
73 k.dptr = (unsigned char *) key;
74 k.dsize = ksize;
75 v.dptr = (unsigned char *) val;
76 v.dsize = vsize;
78 return tdb_store(db->conn, k, v, TDB_REPLACE) == 0;
81 int xtdb_get(struct db_conn *db, const unsigned char *key, size_t ksize,
82 unsigned char *val, size_t *vsize)
84 TDB_DATA k, v;
86 k.dptr = (unsigned char *) key;
87 k.dsize = ksize;
89 v = tdb_fetch(db->conn, k);
90 if (v.dptr == NULL)
91 return 0;
93 if (v.dsize > *vsize)
94 return 0;
96 *vsize = v.dsize;
97 memcpy(val, v.dptr, v.dsize);
98 free(v.dptr);
99 return 1;
102 int xtdb_del(struct db_conn *db, const unsigned char *key, size_t ksize)
104 TDB_DATA k;
106 k.dptr = (unsigned char *) key;
107 k.dsize = ksize;
109 return tdb_delete(db->conn, k) == 0;
112 int xtdb_firstkey(struct db_conn *db, unsigned char *key, size_t *ksize)
114 TDB_DATA k;
116 k = tdb_firstkey(db->conn);
117 if (k.dptr == NULL)
118 return 0;
120 *ksize = k.dsize;
121 memcpy(key, k.dptr, k.dsize);
122 free(k.dptr);
123 return 1;
126 int xtdb_nextkey(struct db_conn *db,
127 const unsigned char *key, size_t ksize,
128 unsigned char *nextkey, size_t *nksize)
130 TDB_DATA pk, nk;
132 pk.dptr = (unsigned char *) key;
133 pk.dsize = ksize;
135 nk = tdb_nextkey(db->conn, pk);
136 if (nk.dptr == NULL)
137 return 0;
139 *nksize = nk.dsize;
140 memcpy(nextkey, nk.dptr, nk.dsize);
141 free(nk.dptr);
142 return 1;
145 #else
147 #include <stddef.h> /* NULL */
149 struct db_conn *xtdb_open(const char *name, int flags)
151 return NULL;
154 #endif