cdb


cdbはdaemontoolsやqmailの作者でもあるdjbこと
Daniel J.Bernstein氏によって作成されたデータベースマネージャ。


かなり高速に動作するが、一度追加したものは削除したり、
更新することはできない。(どうしてもやるなら再構築するしかない)
以下、tinycdbを使ったCのサンプル。

make.c

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <cdb.h>

int main(int argc, char *argv[]){

  struct cdb_make cdbm;
  int fd;
  char *key = "abc", *value = "def";
  unsigned int klen, vlen;
  
  klen = strlen(key);
  vlen = strlen(value);

  fd = open("tmpfile", O_RDWR|O_CREAT, 0644);
  cdb_make_start(&cdbm, fd);
  cdb_make_put(&cdbm, key, klen, value, vlen, CDB_PUT_INSERT);
  cdb_make_exists(&cdbm, key, klen);
  cdb_make_finish(&cdbm);
  rename("tmpfile", "cdbfile");

  return 0;
}

read.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <cdb.h>

int main(int argc, char *argv[]){

  int fd;
  struct cdb cdb;
  char *key = "abc", *value;
  unsigned int klen, vlen, vpos;
  klen = strlen(key);
  fd = open("cdbfile", O_RDONLY);
  cdb_init(&cdb, fd);
  if (cdb_find(&cdb, key, klen) > 0) {
    vpos = cdb_datapos(&cdb);
    vlen = cdb_datalen(&cdb);
    value = malloc(vlen);
    cdb_read(&cdb, value, vlen, vpos);
    printf("value=%s\n", value);
    free(value);
  }

  return 0;
}

実行結果

narazuya@bokkko% ls
make.c read.c
narazuya@bokkko% gcc -o makecdb make.c -lcdb
narazuya@bokkko% gcc -o readcdb read.c -lcdb
narazuya@bokkko% ./makecdb
narazuya@bokkko% ls
cdbfile make.c  makecdb read.c  readcdb
narazuya@bokkko% ./readcdb
value=def
narazuya@bokkko% 


ちなみに各種DBMのベンチマークTokyoCabinetのページにある。