Berkeley DBでDB_RECNOを使用する場合の注意点
けっこうハマったので,メモ.
Berkeley DBでRECNOを扱っているとき,DB_APPENDでputしているはずなのに,recnoがいつも1のまま.あれー?と思って試行錯誤したら一応問題を解消することができた.
DB *dbp; int ret = db_create(&dbp, NULL, 0); // DB_RECNO ret = dbp->open(dbp, NULL, "my_recno.db", NULL, DB_RECNO, DB_CREATE, 0); char *description = "hoge foo bar piyo"; DBT key, data; db_recno_t recno; /* Zero out the DBTs before using them. */ memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); key.data = &recno; key.size = sizeof(recno); /* ↓これを忘れてた */ // key.ulen = sizeof(recno); // key.flags = DB_DBT_USERMEM; data.data = description; data.size = strlen(description) + 1; ret = dbp->put(dbp, NULL, &key, &data, DB_APPEND); printf("%u %u\n", recno, *(db_recno_t *)key.data);
これを実行すると,ポインタ渡ししているはずのrecnoの値と,実際のレコード番号が一致しない.どうやらulenとflagsを設定しなければいけない模様.
Berkeley DBのAPIやドキュメントは充実しているけれど,C APIの使い方についてウェブ上に情報が少ないのでゆとりには厳しい...