C言語によるBerkeley DB アクセスでエラー

解決済みの質問

C言語によるBerkeley DB アクセスでエラー

FreeBSD 6.1でC言語によるプログラムを書いています。
ここでデータベースにBerkeley DBを使用しているのですがputで引数エラーが出ます。
以下テストプログラムです。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <limits.h>
#include <db.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>

int main() {
DB* db;
DBT key, val;

memset(&key, 0, sizeof(DBT));
memset(&val, 0, sizeof(DBT));

key.data = (char *)"key";
key.size = strlen((char *)key.data);
val.data = (char *)"データです。";
val.size = strlen((char *)val.data);

if((db = dbopen("test.db", O_CREAT | O_RDWR, 644, DB_BTREE, NULL)) == NULL) {
perror("dbopen");
exit(1);
}

if(db->put(db, &key, &val, R_SETCURSOR) == -1) {
perror("put");
exit(1);
}
if(db->close(db) == -1) {
perror("close");
exit(1);
}
}

結果:put: Invalid argument

マニュアルやGoogleのソースコード検索等をして調べてみたのですが、どうしても解決できません。
お分かりになる方、ぜひ御教示お願いします。

投稿日時 - 2006-11-08 00:21:29

QNo.2524845

困ってます

質問者が選んだベストアンサー

Berkeleyよく知らないのですが、、

put関数の引数は下記のようですので、
int DB->put(DB *db, DB_TXN *txnid, DBT *key, DBT *data, u_int32_t flags);
二番目の引数が足りないのではないでしょうか?
トランザクションハンドルみたいなのを返してくれるようですが、必要なければNULLでいいみたいです。

投稿日時 - 2006-11-10 11:35:44

お礼

ご返信ありがとうございます。

>put関数の引数は下記のようですので、
>int DB->put(DB *db, DB_TXN *txnid, DBT *key, DBT *data,u_int32_t flags);
>二番目の引数が足りないのではないでしょうか?

仰る通りでした。
ただ、コンパイルするには別途Berkeley DBのライブラリが必要で、
portsからdatabase/db**を入れる必要が有りました。
(またコンパイル時のオプション-Iと-Lにそれぞれ適切なものを指定する必要あり)

デフォルトでは、/usr/includeにヘッダファイルはあるのに、
ライブラリは無いandマニュアルには載っている(それも実際と違う。バージョンの違いか・・・?)
ということで不思議な感じがするのですが、どういう理由が有るんでしょう・・・。

投稿日時 - 2006-11-12 08:16:29

ANo.1

0人が「このQ&Aが役に立った」と投票しています

あわせてチェックしたい
  • memset の第2引数の型 ...
  • memsetについて ...
  • memsetについて ...
PR
【夫婦アンケート】バレンタインしてますか?[ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら