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の使い方についてウェブ上に情報が少ないのでゆとりには厳しい...