ndbm

[戻る]

概要

手軽なデータベースライブラリ。
データベースには、キーとデータの組合せで登録する。
検索で使えるのはキーのみで、キーは一つのデータベースファイルでユニーク。
単にキーとデータを組合せるだけなので、キーもデータも、その構造は任意。

データベースファイル

データベースファイルはdbm_openでオープン、dbm_closeでクローズする。書式は以下の通り。

#include <ndbm.h>

DBM *dbm_open(char *file, int flags, int mode);
void dbm_close(DBM *db);
fileで、データベースファイル名を指定するが、データベースファイルは*.pag*.dirで一組なので、拡張子まで渡す必要はない。
flagsはファイルのオープンモード。sys/fcntl.hに記述されている、O_*を指定する。通常はO_RDWR | O_CREATとしておけばよい。読み書き可で、もし、指定したファイルが存在しなかったら作ってくれる。また、読み込みのみするのであれば、O_RDONLYにしておく。
modeはファイルを作るときのパーミッション。sys/stat.hに記述されているS_*を指定する。通常はS_IRUSR | S_IWUSR | S_IRGRP | S_IROTHとしておけばよい。userが読み書き可、groupとotherは読み込みのみ可となる。chmod 644と同じ。

データの登録

データを登録するときはdbm_storeを使う。書式は以下の通り。

int dbm_store(DBM *db, datum key, datum data, int flags);
keyにキーを、dataにデータをセットしておく。datumの構造は以下の通り。
typedef struct {
  char  *dptr;
  int   dsize;
} datum;
dptrはキーまたはデータの実体を差すポインタ。dsizeはキーまたはデータの実体のサイズ。dptrはchar*だが、どんな構造でも大丈夫。
flagsにはDBM_INSERTDBM_REPLACEを指定する。DBM_INSERTを指定すると、同じキーのデータが登録されている場合、データは登録されない。DBM_REPLACEを指定すると、同じキーのデータが登録されている場合、データは置き換えられる。同じキーのデータが登録されていない場合は、どちらを指定してもデータは登録される。
戻り値が負の場合、登録失敗。

データの検索(取り出し)

データをキーで検索して取り出すときはdbm_fetchを使う。書式は以下の通り。

datum dbm_fetch(DBM *db, datum key);
戻り値はデータ。戻り値のdptrがNULLの場合、検索失敗。

データの削除

指定したキーのデータを削除するときはdbm_deleteを使う。書式は以下の通り。

int dbm_delete(DBM *db, datum key);
戻り値が負の場合、削除失敗。

データベースに登録されているデータを全部見るには

データベースに登録されているデータを全部みたい場合、dbm_firstkeydbm_nextkeyを使う。書式は以下の通り。

datum dbm_firstkey(DBM *db);
datum dbm_nextkey(DBM *db);
戻り値はキー。実際に使うときは以下のようにする。
for(key = dbm_firstkey(db); key.dptr != NULL; key = dbm_nextkey(db)){
  data = dbm_fetch(db, key);
}
dbm_firstkeyもdbm_nextkeyもキーを返すだけなので、データはdbm_fetchで取り出さなければならない。

エラー

データベースのエラーはdbm_errorで取り出すことができる。また、dbm_clearerrで発生しているエラーの情報をリセットすることができる。書式は以下の通り。

int dbm_error(DBM *db);
int dbm_clearerr(DBM *db);

実際に使って気付いたこと

実際使ってみて気付いたことを以下に記すが、いろいろな環境で試したわけではないので、もしかしたら大丈夫かもしれない。


Copyright © 1998 by Jun Takahashi