GNU版のdbmライブラリ。
基本的な使い方はndbmとあまり変わらない。
ndbmではキーとデータの長さがあわせて4,096バイトを超えられなかったが、gdbmは制限なし。
標準の環境では利用できない。インストールが必要。また、リンクするときにはライブラリとして-lgdbmを付ける必要がある。
データベースファイルはgdbm_openでオープン、gdbm_closeでクローズする。書式は以下の通り。
nameで、データベースファイル名を指定する。ndbmとは違い、ここで指定されたファイル名のファイル一つだけが作られる。#include <gdbm.h> GDBM_FILE gdbm_open(char *name, int block_size, int read_write, int mode, void (*fatal_func)()); void gdbm_close(GDBM_FILE dbf);
データベースファイルファイルをオープンするプロセスはリーダまたはライタと呼ばれ、ライタは読み書き可能だが、リーダは読むことだけができる。一つのファイルは一つのライタまたは複数のリーダによってオープンすることができる。
- GDBM_READER
- リーダ
- GDBM_WRITER
- ライタ
- GDBM_WRCREAT
- ライタ(データベースが存在しなければ生成する)
- GDBM_NEWDB
- ライタ(無条件に新しいデータベースを生成する)
データを登録するときはgdbm_storeを使う。書式は以下の通り。
keyにキーを、contentにデータをセットしておく。datumの構造は以下の通り。int gdbm_store(GDBM_FILE dbf, datum key, datum content, int flag);
dptrはキーまたはデータの実体を差すポインタ。dsizeはキーまたはデータの実体のサイズ。dptrはchar*だが、どんな構造でも大丈夫。typedef struct { char *dptr; int dsize; } datum;
データをキーで検索して取り出すときはgdbm_fetchを使う。書式は以下の通り。
戻り値はデータ。戻り値のdptrがNULLの場合、検索失敗。datum gdbm_fetch(GDBM_FILE dbf, datum key);
データをキーで検索するきはgdbm_existsを使う。書式は以下の通り。
戻り値がtrueなら検索成功、falseなら検索失敗。int gdbm_exists(GDBM_FILE dbf, datum key);
指定したキーのデータを削除するときはgdbm_deleteを使う。書式は以下の通り。
戻り値が負の場合、削除失敗。int gdbm_delete(GDBM_FILE dbf, datum key);
データベースに登録されているデータを全部見たい場合、gdbm_firstkeyとgdbm_nextkeyを使う。書式は以下の通り。
戻り値はキー。実際に使うときは以下のようにする。datum gdbm_firstkey(GDBM_FILE dbf); datum gdbm_nextkey(GDBM_FILE dbf, datum key);
gdbm_firstkeyもgdbm_nextkeyもキーを返すだけなので、データはgdbm_fetchで取り出さなければならない。for(key = gdbm_firstkey(dbf); key.dptr != NULL; key = gdbm_nextkey(dbf, key)){ content = gdbm_fetch(dbf, key); free(content.dptr); }
gdbm_deleteでデータの削除を行っても、データベースファイルは小さくならない。ファイルサイズを小さくしたい場合はgdbm_reorganizeを再構成する。書式は以下の通り。
int gdbm_reorganize(GDBM_FILE dbf);
データベースファイルをオープンするときにread_writeにGDBM_FASTをorで付加すると、データを書き込むときにディスク上のファイルとメモリとの同期をとらない。これにより、書き込みは早くなるが、データの不整合が起こる可能性がある。そこで、gdbm_syncを使って、ファイルとメモリの同期をとらせることができる。書式は以下の通り。
void gdbm_sync(GDBM_FILE dbf);
データベースのエラーはgdbm_errnoというgdbm_error型のグローバル変数に格納されている。このエラーコードはgdbm_strerrorで英語のテキストに変換する事ができる。書式は以下の通り。
char *gdbm_strerror(gdbm_error errno);
gdbm_setoptでデータベースに対する特定のオプションを設定することができる。書式は以下の通り。
int gdbm_setopt(GDBM_FILE dbf, int option, int *value, int size);
char*型のグローバル変数gdbm_versionにバージョン情報が文字列で格納されている。たとえばこんな感じ。
This is GDBM version 1.7.3, as of May 19, 1994.