解決済みの質問
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
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
0人が「このQ&Aが役に立った」と投票しています