NAME
Relic - the NDBM-compatible API of QDBM
SYNOPSIS
#include <relic.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
typedef struct { void *dptr; size_t dsize; } datum;
DBM *dbm_open(char *name, int flags, int mode);
void dbm_close(DBM *db);
int dbm_store(DBM *db, datum key, datum content, int flags);
int dbm_delete(DBM *db, datum key);
datum dbm_fetch(DBM *db, datum key);
datum dbm_firstkey(DBM *db);
datum dbm_nextkey(DBM *db);
int dbm_error(DBM *db);
int dbm_clearerr(DBM *db);
int dbm_rdonly(DBM *db);
int dbm_dirfno(DBM *db);
int dbm_pagfno(DBM *db);
DESCRIPTION
Relic is the API which is compatible with NDBM. So, Relic wraps
functions of Depot as API of NDBM. It is easy to port an application
from NDBM to QDBM. In most cases, you should only replace the
includings of ‘ndbm.h’ with ‘relic.h’ and replace the linking option
‘-lndbm’ with ‘-lqdbm’.
The original NDBM treats a database as a pair of files. One, ‘a
directory file’, has a name with suffix ‘.dir’ and stores a bit map of
keys. The other, ‘a data file’, has a name with suffix ‘.pag’ and
stores entities of each records. Relic creates the directory file as a
mere dummy file and creates the data file as a database. Relic has no
restriction about the size of each record. Relic cannot handle
database files made by the original NDBM.
In order to use Relic, you should include ‘relic.h’, ‘stdlib.h’,
‘sys/types.h’, ‘sys/stat.h’ and ‘fcntl.h’ in the source files.
Usually, the following description will be near the beginning of a
source file.
#include <relic.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
A pointer to ‘DBM’ is used as a database handle. A database handle is
opened with the function ‘dbm_open’ and closed with ‘dbm_close’. You
should not refer directly to any member of a handle.
Structures of ‘datum’ type is used in order to give and receive data of
keys and values with functions of Relic.
typedef struct { void *dptr; size_t dsize; } datum;
‘dptr’ specifies the pointer to the region of a key or a value.
‘dsize’ specifies the size of the region.
The function ‘dbm_open’ is used in order to get a database handle.
DBM *dbm_open(char *name, int flags, int mode);
‘name’ specifies the name of a database. The file names are
concatenated with suffixes. ‘flags’ is the same as one of
‘open’ call, although ‘O_WRONLY’ is treated as ‘O_RDWR’ and
additional flags except for ‘O_CREAT’ and ‘O_TRUNC’ have no
effect. ‘mode’ specifies the mode of the database file as one
of ‘open’ call does. The return value is the database handle or
‘NULL’ if it is not successful.
The function ‘dbm_close’ is used in order to close a database handle.
void dbm_close(DBM *db);
‘db’ specifies a database handle. Because the region of the
closed handle is released, it becomes impossible to use the
handle.
The function ‘dbm_store’ is used in order to store a record.
int dbm_store(DBM *db, datum key, datum content, int flags);
‘db’ specifies a database handle. ‘key’ specifies a structure
of a key. ‘content’ specifies a structure of a value. ‘flags’
specifies behavior when the key overlaps, by the following
values: ‘DBM_REPLACE’, which means the specified value
overwrites the existing one, ‘DBM_INSERT’, which means the
existing value is kept. The return value is 0 if it is
successful, 1 if it gives up because of overlaps of the key, -1
if other error occurs.
The function ‘dbm_delete’ is used in order to delete a record.
int dbm_delete(DBM *db, datum key);
‘db’ specifies a database handle. ‘key’ specifies a structure
of a key. The return value is 0 if it is successful, -1 if some
errors occur.
The function ‘dbm_fetch’ is used in order to retrieve a record.
datum dbm_fetch(DBM *db, datum key);
‘db’ specifies a database handle. ‘key’ specifies a structure
of a key. The return value is a structure of the result. If a
record corresponds, the member ‘dptr’ of the structure is the
pointer to the region of the value. If no record corresponds or
some errors occur, ‘dptr’ is ‘NULL’. ‘dptr’ points to the
region related with the handle. The region is available until
the next time of calling this function with the same handle.
The function ‘dbm_firstkey’ is used in order to get the first key of a
database.
datum dbm_firstkey(DBM *db);
‘db’ specifies a database handle. The return value is a
structure of the result. If a record corresponds, the member
‘dptr’ of the structure is the pointer to the region of the
first key. If no record corresponds or some errors occur,
‘dptr’ is ‘NULL’. ‘dptr’ points to the region related with the
handle. The region is available until the next time of calling
this function or the function ‘dbm_nextkey’ with the same
handle.
The function ‘dbm_nextkey’ is used in order to get the next key of a
database.
datum dbm_nextkey(DBM *db);
‘db’ specifies a database handle. The return value is a
structure of the result. If a record corresponds, the member
‘dptr’ of the structure is the pointer to the region of the next
key. If no record corresponds or some errors occur, ‘dptr’ is
‘NULL’. ‘dptr’ points to the region related with the handle.
The region is available until the next time of calling this
function or the function ‘dbm_firstkey’ with the same handle.
The function ‘dbm_error’ is used in order to check whether a database
has a fatal error or not.
int dbm_error(DBM *db);
‘db’ specifies a database handle. The return value is true if
the database has a fatal error, false if not.
The function ‘dbm_clearerr’ has no effect.
int dbm_clearerr(DBM *db);
‘db’ specifies a database handle. The return value is 0. The
function is only for compatibility.
The function ‘dbm_rdonly’ is used in order to check whether a handle is
read-only or not.
int dbm_rdonly(DBM *db);
‘db’ specifies a database handle. The return value is true if
the handle is read-only, or false if not read-only.
The function ‘dbm_dirfno’ is used in order to get the file descriptor
of a directory file.
int dbm_dirfno(DBM *db);
‘db’ specifies a database handle. The return value is the file
descriptor of the directory file.
The function ‘dbm_pagfno’ is used in order to get the file descriptor
of a data file.
int dbm_pagfno(DBM *db);
‘db’ specifies a database handle. The return value is the file
descriptor of the data file.
Functions of Relic are thread-safe as long as a handle is not accessed
by threads at the same time, on the assumption that ‘errno’, ‘malloc’,
and so on are thread-safe.
SEE ALSO
qdbm(3), depot(3), curia(3), hovel(3), cabin(3), villa(3), odeum(3),
ndbm(3), gdbm(3)