Hovel - the GDBM-compatible API of QDBM
#include <hovel.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
typedef struct { char *dptr; size_t dsize; } datum;
extern char *gdbm_version;
extern gdbm_error gdbm_errno;
char *gdbm_strerror(gdbm_error gdbmerrno);
GDBM_FILE gdbm_open(char *name, int block_size, int read_write,
int mode, void (*fatal_func)(void));
GDBM_FILE gdbm_open2(char *name, int read_write, int mode, int
bnum, int dnum, int align);
void gdbm_close(GDBM_FILE dbf);
int gdbm_store(GDBM_FILE dbf, datum key, datum content, int
flag);
int gdbm_delete(GDBM_FILE dbf, datum key);
datum gdbm_fetch(GDBM_FILE dbf, datum key);
int gdbm_exists(GDBM_FILE dbf, datum key);
datum gdbm_firstkey(GDBM_FILE dbf);
datum gdbm_nextkey(GDBM_FILE dbf, datum key);
void gdbm_sync(GDBM_FILE dbf);
int gdbm_reorganize(GDBM_FILE dbf);
int gdbm_fdesc(GDBM_FILE dbf);
int gdbm_setopt(GDBM_FILE dbf, int option, int *value, int
size);
Hovel is the API which is compatible with GDBM. So, Hovel wraps
functions of Depot and Curia as API of GDBM. It is easy to port an
application from GDBM to QDBM. In most cases, you should only replace the
includings of `gdbm.h' with `hovel.h' and replace the linking option
`-lgdbm' with `-lqdbm'. Hovel cannot handle database files made by the
original GDBM.
In order to use Hovel, you should include `hovel.h', `stdlib.h',
`sys/types.h' and `sys/stat.h' in the source files. Usually, the following
description will be near the beginning of a source file.
#include <hovel.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
An object of `GDBM_FILE' is used as a database handle. A database
handle is opened with the function `gdbm_open' and closed with `gdbm_close'.
You should not refer directly to any member of a handle. Although Hovel
works as a wrapper of Depot and handles a database file usually, if you use
the function `gdbm_open2' to open the handle, it is possible to make
behavior of a handle as a wrapper of Curia and treat a database
directory.
Structures of `datum' type is used in order to give and receive
data of keys and values with functions of Hovel.
- typedef struct { char
*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 external variable `gdbm_version' is the string containing the
version information.
- extern char
*gdbm_version;
The external variable `gdbm_errno' is assigned with the last
happened error code. Refer to `hovel.h' for details of the error codes.
- extern gdbm_error
gdbm_errno;
- The initial value of this variable is `GDBM_NO_ERROR'. The other values
are `GDBM_MALLOC_ERROR', `GDBM_BLOCK_SIZE_ERROR', `GDBM_FILE_OPEN_ERROR',
`GDBM_FILE_WRITE_ERROR', `GDBM_FILE_SEEK_ERROR', `GDBM_FILE_READ_ERROR',
`GDBM_BAD_MAGIC_NUMBER', `GDBM_EMPTY_DATABASE', `GDBM_CANT_BE_READER',
`GDBM_CANT_BE_WRITER', `GDBM_READER_CANT_DELETE',
`GDBM_READER_CANT_STORE', `GDBM_READER_CANT_REORGANIZE',
`GDBM_UNKNOWN_UPDATE', `GDBM_ITEM_NOT_FOUND', `GDBM_REORGANIZE_FAILED',
`GDBM_CANNOT_REPLACE', `GDBM_ILLEGAL_DATA', `GDBM_OPT_ALREADY_SET', and
`GDBM_OPT_ILLEGAL'.
The function `gdbm_strerror' is used in order to get a message
string corresponding to an error code.
- char
*gdbm_strerror(gdbm_error gdbmerrno);
- `gdbmerrno' specifies an error code. The return value is the message
string of the error code. The region of the return value is not
writable.
The function `gdbm_open' is used in order to get a database handle
after the fashion of GDBM.
- GDBM_FILE
gdbm_open(char *name, int block_size, int read_write, int mode, void
(*fatal_func)(void));
- `name' specifies the name of a database. `block_size' is ignored.
`read_write' specifies the connection mode: `GDBM_READER' as a reader,
`GDBM_WRITER', `GDBM_WRCREAT' and `GDBM_NEWDB' as a writer. `GDBM_WRCREAT'
makes a database file or directory if it does not exist. `GDBM_NEWDB'
makes a new database even if it exists. You can add the following to
writer modes by bitwise or: `GDBM_SYNC', `GDBM_NOLOCK', `GDBM_LOCKNB',
`GDBM_FAST', and `GDBM_SPARSE'. `GDBM_SYNC' means a database is
synchronized after every updating method. `GDBM_NOLOCK' means a database
is opened without file locking. `GDBM_LOCKNB' means file locking is
performed without blocking. `GDBM_FAST' is ignored. `GDBM_SPARSE' is an
original mode of QDBM and makes database a sparse file. `mode' specifies
mode of a database file as the one of `open' call does. `fatal_func' is
ignored. The return value is the database handle or `NULL' if it is not
successful.
The function `gdbm_open2' is used in order to get a database
handle after the fashion of QDBM.
- GDBM_FILE
gdbm_open2(char *name, int read_write, int mode, int bnum, int dnum, int
align);
- `name' specifies the name of a database. `read_write' specifies the
connection mode: `GDBM_READER' as a reader, `GDBM_WRITER', `GDBM_WRCREAT'
and `GDBM_NEWDB' as a writer. `GDBM_WRCREAT' makes a database file or
directory if it does not exist. `GDBM_NEWDB' makes a new database even if
it exists. You can add the following to writer modes by bitwise or:
`GDBM_SYNC', `GDBM_NOLOCK', `GDBM_LOCKNB', `GDBM_FAST', and `GDBM_SPARSE'.
`GDBM_SYNC' means a database is synchronized after every updating method.
`GDBM_NOLOCK' means a database is opened without file locking.
`GDBM_LOCKNB' means file locking is performed without blocking.
`GDBM_FAST' is ignored. `GDBM_SPARSE' is an original mode of QDBM and
makes database sparse files. `mode' specifies a mode of a database file or
a database directory as the one of `open' or `mkdir' call does. `bnum'
specifies the number of elements of each bucket array. If it is not more
than 0, the default value is specified. `dnum' specifies the number of
division of the database. If it is not more than 0, the returning handle
is created as a wrapper of Depot, else, it is as a wrapper of Curia.
`align' specifies the basic size of alignment. The return value is the
database handle or `NULL' if it is not successful. If the database already
exists, whether it is one of Depot or Curia is measured
automatically.
The function `gdbm_close' is used in order to close a database
handle.
- void gdbm_close(GDBM_FILE
dbf);
- `dbf' specifies a database handle. Because the region of the closed handle
is released, it becomes impossible to use the handle.
The function `gdbm_store' is used in order to store a record.
- int gdbm_store(GDBM_FILE dbf,
datum key, datum content, int flag);
- `dbf' specifies a database handle connected as a writer. `key' specifies a
structure of a key. `content' specifies a structure of a value. `flag'
specifies behavior when the key overlaps, by the following values:
`GDBM_REPLACE', which means the specified value overwrites the existing
one, `GDBM_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 `gdbm_delete' is used in order to delete a
record.
- int gdbm_delete(GDBM_FILE
dbf, datum key);
- `dbf' specifies a database handle connected as a writer. `key' specifies a
structure of a key. The return value is 0 if it is successful, -1 if some
errors occur.
The function `gdbm_fetch' is used in order to retrieve a
record.
- datum
gdbm_fetch(GDBM_FILE dbf, datum key);
- `dbf' 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'.
Because the region pointed to by `dptr' is allocated with the `malloc'
call, it should be released with the `free' call if it is no longer in
use.
The function `gdbm_exists' is used in order to check whether a
record exists or not.
- int gdbm_exists(GDBM_FILE
dbf, datum key);
- `dbf' specifies a database handle. `key' specifies a structure of a key.
The return value is true if a record corresponds and no error occurs, or
false, else, it is false.
The function `gdbm_firstkey' is used in order to get the first key
of a database.
- datum
gdbm_firstkey(GDBM_FILE dbf);
- `dbf' 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'. Because the region pointed to by `dptr' is
allocated with the `malloc' call, it should be released with the `free'
call if it is no longer in use.
The function `gdbm_nextkey' is used in order to get the next key
of a database.
- datum
gdbm_nextkey(GDBM_FILE dbf, datum key);
- `dbf' 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'. Because the region pointed to by `dptr' is
allocated with the `malloc' call, it should be released with the `free'
call if it is no longer in use.
The function `gdbm_sync' is used in order to synchronize updating
contents with the file and the device.
- void
gdbm_sync(GDBM_FILE dbf);
- `dbf' specifies a database handle connected as a writer.
The function `gdbm_reorganize' is used in order to reorganize a
database.
- int
gdbm_reorganize(GDBM_FILE dbf);
- `dbf' specifies a database handle connected as a writer. If successful,
the return value is 0, else -1.
The function `gdbm_fdesc' is used in order to get the file
descriptor of a database file.
- int gdbm_fdesc(GDBM_FILE
dbf);
- `dbf' specifies a database handle connected as a writer. The return value
is the file descriptor of the database file. If the database is a
directory the return value is -1.
The function `gdbm_setopt' has no effect.
- int gdbm_setopt(GDBM_FILE
dbf, int option, int *value, int size);
- `dbf' specifies a database handle. `option' is ignored. `size' is ignored.
The return value is 0. The function is only for compatibility.
If QDBM was built with POSIX thread enabled, the global variable
`gdbm_errno' is treated as thread specific data, and functions of Hovel are
reentrant. In that case, they 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.