GDBMを使う
GDBMファイルをオープンする
#include <gdbm.h> GDBM_FILE gdbm_open(char *name, int block_size, int read_write, int mode, void (*fatal_func)()); 戻り値: 関数が成功ならばgdbmファイルにアクセスする ためのポインタ、エラーならばNULLポインタ
gdbm_close
gdbmファイルをクローズする#include <gdbm.h> void gdbm_close(GDBM_FILE dbf);
gdbm_store
gdbmファイルにデータを格納する#include <gdbm.h> int gdbm_store(GDBM_FILE dbf, datum key, datum content, int flag); 戻り値: 成功なら0、エラーなら−1
flag:
GDBM_INSERT: 挿入のみ。キーが存在すればエラー
GDBM_REPLACE: キーが存在すれば内容を更新する
datum構造体
データ(文字列)へのポインタdptrと、その長さdsizeからなる。typedef struct { char *dptr; int dsize; } datum;
gdbm_fetch
キーを指定して、データを探索する#include <gdbm.h> datum gdbm_fetch(GDBM_FILE dbf, datum key); 戻り値:戻り値のdatumのデータメンバdptrがNULLの場合、 データは見つからなかった。 見つかった場合は、dptrにデータへのポインタが格納される。 このdptrは、mallocにより確保されるメモリなので、 プログラマーが責任をもって解放しなければならない。
gdbm_exists
データの存在を確かめる#include <gdbm.h> int gdbm_fetch(GDBM_FILE dbf, datum key); 戻り値:データが存在すれば非ゼロ、 存在しなければゼロ。
GDBMサンプル
#include <sys/types.h> #include <limits.h> #include <gdbm.h> #include <fcntl.h> #include <string.h> #include <stdio.h> int main() { GDBM_FILE db; datum key; datum value; int ret; char *pkey = "key"; char *pvalue = "value"; key.dptr = pkey; key.dsize = strlen(pkey); value.dptr = pvalue; value.dsize = strlen(pvalue); /* gdbm open and store */ db = gdbm_open("./db", 1024, GDBM_WRCREAT, 0777, NULL); gdbm_store(db, key, value, GDBM_INSERT); gdbm_close(db); /* gdbm open and fetch */ db = gdbm_open("./db", 1024, GDBM_READER, 0777, NULL); if (gdbm_exists(db, key) != 0) { value = gdbm_fetch(db, key); printf("key: %s, value: %s\n", key.dptr, value.dptr); free(value.dptr);/* 必ず解放すること! */ } else { printf("Not Exists\n"); } gdbm_close(db); return 0; }