手軽なデータベースライブラリ。
データベースには、キーとデータの組合せで登録する。
検索で使えるのはキーのみで、キーは一つのデータベースファイルでユニーク。
単にキーとデータを組合せるだけなので、キーもデータも、その構造は任意。
データベースファイルはdbm_openでオープン、dbm_closeでクローズする。書式は以下の通り。
fileで、データベースファイル名を指定するが、データベースファイルは*.pagと*.dirで一組なので、拡張子まで渡す必要はない。#include <ndbm.h> DBM *dbm_open(char *file, int flags, int mode); void dbm_close(DBM *db);
データを登録するときはdbm_storeを使う。書式は以下の通り。
keyにキーを、dataにデータをセットしておく。datumの構造は以下の通り。int dbm_store(DBM *db, datum key, datum data, int flags);
dptrはキーまたはデータの実体を差すポインタ。dsizeはキーまたはデータの実体のサイズ。dptrはchar*だが、どんな構造でも大丈夫。typedef struct { char *dptr; int dsize; } datum;
データをキーで検索して取り出すときはdbm_fetchを使う。書式は以下の通り。
戻り値はデータ。戻り値のdptrがNULLの場合、検索失敗。datum dbm_fetch(DBM *db, datum key);
指定したキーのデータを削除するときはdbm_deleteを使う。書式は以下の通り。
戻り値が負の場合、削除失敗。int dbm_delete(DBM *db, datum key);
データベースに登録されているデータを全部みたい場合、dbm_firstkeyとdbm_nextkeyを使う。書式は以下の通り。
戻り値はキー。実際に使うときは以下のようにする。datum dbm_firstkey(DBM *db); datum dbm_nextkey(DBM *db);
dbm_firstkeyもdbm_nextkeyもキーを返すだけなので、データはdbm_fetchで取り出さなければならない。for(key = dbm_firstkey(db); key.dptr != NULL; key = dbm_nextkey(db)){ data = dbm_fetch(db, key); }
データベースのエラーはdbm_errorで取り出すことができる。また、dbm_clearerrで発生しているエラーの情報をリセットすることができる。書式は以下の通り。
int dbm_error(DBM *db); int dbm_clearerr(DBM *db);
実際使ってみて気付いたことを以下に記すが、いろいろな環境で試したわけではないので、もしかしたら大丈夫かもしれない。