GDBMを使う

GDBMファイルをオープンする

#include <gdbm.h>

GDBM_FILE gdbm_open(char *name, int block_size, 
    int read_write, int mode, void (*fatal_func)());


戻り値: 関数が成功ならばgdbmファイルにアクセスする
ためのポインタ、エラーならばNULLポインタ

  • name: データベースファイル名

  • block_size: ディスクからメモリへ1回で転送されるサイズ(最小は512)

  • read_write: GDBM_READER, GDBM_WRITER, GDBM_WRCREAT, GDBM_NEWDBに加えて、GDBM_SYNC, GDBM_NOKICK, GDBM_FASTをORで追加できる。
  • 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;
    }
    

    ビルドは、gccに-lgdbmオプションをつける。
    >gcc -lgdbm gdbm.c
    >./a.out