#include <cdb.h> cdb_init(&c,fd); cdb_free(&c); result = cdb_read(&c,d,dlen,dpos); cdb_findstart(&c); result = cdb_findnext(&c,k,klen); result = cdb_find(&c,k,klen); dpos = cdb_datapos(&c); dlen = cdb_datalen(&c); static struct cdb c; int fd; char *d; unsigned int dlen; uint32 dpos; char *k; unsigned int klen; int result;
A struct cdb variable such as c is either unallocated or allocated. If it is allocated, it holds information about a constant database:
cdb_free unallocates c if c is allocated. Otherwise it leaves c alone. cdb_free does not close fd.
cdb_init allocates c to hold information about a constant database read by descriptor fd. You may call cdb_init repeatedly; if c is already allocated, cdb_init unallocates it first.
cdb_read reads dlen bytes into d from byte position dpos in the database. You must allocate c before calling cdb_read. Normally cdb_read returns 0. If the database file is shorter than dpos+dlen bytes, or if there is a disk read error, cdb_read returns -1, setting errno appropriately.
cdb_findstart prepares c to search for the first record under a new key. You must allocate c before calling cdb_findstart, and you must call cdb_findstart before calling cdb_findnext.
cdb_findnext looks for the nth record under key k in the database, where n is the number of calls to cdb_findnext after the most recent call to cdb_findstart. If it finds the record, cdb_findnext returns 1; if there are exactly n-1 such records, cdb_findnext returns 0; if there are fewer than n-1 such records, the behavior of cdb_findnext is undefined; if there is a database format error or disk error, cdb_findnext returns -1, setting errno appropriately. Each call to cdb_findnext (before another call to cdb_findstart) must use the same k and klen.
If cdb_findnext returns 1, it arranges for cdb_datapos to return the starting byte position of the data in the record, and for cdb_datalen to return the number of bytes of data in the record. Otherwise the results of cdb_datapos and cdb_datalen are undefined.
cdb_find is the same as cdb_findstart followed by cdb_findnext: it finds the first record under key k.
Beware that these functions may rely on non-atomic operations on the fd ofile, such as seeking to a particular position and then reading. Do not attempt two simultaneous database reads using a single ofile.