libstddjb
libskarnet
skalibs
Software
skarnet.org
The skalibs/cdb.h header
General information
A cdb, for constant database, is an immutable key-value store. In skalibs, a cdb is built once via the cdbmake primitives and stored on disk; the cdb primitives, documented here, are about accessing the information.
Data structures
- A cdb is an opaque structure, that must be initialized to CDB_ZERO when declared.
- A cdb_data is a structure that is passed by address to cdb-reading primitives, which fill
it with record information. It contains (at least) two fields:
- s, a char const *, which holds a pointer to the record; the const indicates that a cdb is read-only, you cannot write to the record even when you have a pointer to it.
- len, a uint32_t, which holds the record length. It can be zero (records can be empty). A cdb must fit into 4 GB, so record lengths always fit in 32 bits.
- A cdb_find_state is an opaque structure, that should be initialized to CDB_FIND_STATE_ZERO when declared. It is passed by address to cdb_findnext, to maintain position state when looking for all the data records under one key.
Macros and functions
Starting and ending
int cdb_init (cdb *c, char const *file)
Maps the file named file to the cdb pointed to by c.
*c must be CDB_ZERO before the call. The function returns a
positive integer if it succeeds, and 0 (and sets errno) if it fails.
int cdb_init_at (cdb *c, int dfd, char const *file)
Like cdb_init, but file is interpreted relative to the
file descriptor dfd, which must be open on a directory.
int cdb_init_fromfd (cdb *c, int fd)
Like cdb_init, but the database file is already open and
readable via then file descriptor fd.
void cdb_free (cdb *c)
Frees the resources used by a cdb mapping. After the call, c
is immediately reusable by another cdb_init function.
cdb lookup
Single record lookup
int cdb_find (cdb const *c, cdb_data *data, char const *key, uint32_t klen)
Looks up key key of length klen in the cdb *c. The function returns
-1 if *c isn't a valid cdb; 0 if no record can be found for the key; and 1 on success, in
which case the corresponding value is returned in *data: data→s
points to the start of the value, and data→len contains the length of
the value. Only the first record with the same key can be obtained this way.
Multiple record lookup
void cdb_findstart (cdb_find_state *state)
Initializes state so that the next invocation of cdb_findnext()
finds the first record for a given key.
int cdb_findnext (cdb const *c, cdb_data *data, char const *key, uint32_t klen, cdb_find_state *state)
Like cdb_find, except that the extra argument state memorizes
internal cdb lookup data, so the next cdb_findnext() invocation with the
same key, klen and state will yield the next record
for the key. cdb_findnext returns 0 when all the records for the key have
been exhausted.
cdb enumeration
void cdb_traverse_init (uint32_t *pos)
Initializes *pos so that the next invocation of cdb_traverse_next
finds the first entry in the cdb. *pos can also be initialized to the
macro CDB_TRAVERSE_INIT() instead.
int cdb_traverse_next (cdb const *c, cdb_data *key, cdb_data *data, uint32_t *pos)
Gets the next entry in the cdb *c. On success, the key is stored in *key and the
data is stored in *data. *pos* is an opaque integer storing internal
state; it is automatically updated so that the next invocation of cdb_traverse_next()
yields the next entry. The function returns -1 if *c is not a valid cdb or *pos
is not valid state, 1 on success, and 0 if no entry can be found, i.e. the end of the cdb has
been reached.
