Berkeley数据库 - 重复条目分段错误

时间:2012-04-05 04:06:31

标签: c database segmentation-fault berkeley-db

所以我目前正在通过C开发一个Berkeley数据库,我遇到了一个关于允许重复数据的小问题。如果我不允许通过DB-> set_flags重复输入,并且我用光标迭代数据库中的项目,一切正常。我在我的程序中添加DB-> set_flags行的那一刻,并没有改变其他任何东西,我得到一个分段错误,我不知道如何修复它,考虑到它没有重复条目就可以正常工作。代码如下:

DB *dates_db;
db_create(&dates_db, NULL, 0);
dates_db->set_flags(dates_db, DB_DUP);
dates_db->open(dates_db, NULL, "da.idx", NULL, DB_BTREE, 0, 0664);

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

DBC *DBpointer;
dates_db->cursor(dates_db, NULL, &DBpointer, 0);

while(DBpointer->c_get(DBpointer, &key, &data, DB_NEXT) != DB_NOTFOUND)
{
    printf("The key is: %s\nThe data is: %s\n", (char *)key.data, (char *)data.data);
}

任何人都可以告诉我需要添加什么吗?我已经检查了sourceforge页面,其中包含有关Berkeley DB的所有信息,据我所知,我只需要添加DB-&gt; set_flags行以允许重复输入,但是有没有我错过的东西?< / p>

1 个答案:

答案 0 :(得分:1)

首先,您应该在函数失败时检查返回值。

具体而言,db_createset_flagsopencursor 所有都会返回错误指示。

如果你似乎在评论中指出,它是导致SIGSEGV的c_get,你可能想确保光标确实是正确创建的。

更改:

DBC *DBpointer;
dates_db->cursor(dates_db, NULL, &DBpointer, 0);

为:

DBC *DBpointer = (DBC*)0xdeadbeef;
int rc = dates_db->cursor(dates_db, NULL, &DBpointer, 0);
printf ("DEBUG: %d %p\n", rc, DBpointer);
fflush (stdio); // and possibly also: fsync (fileno (stdio));

将是一个良好的开端。

最好是一路走下去,使用类似的东西:

#define CHKERR(x) if(rc!=0){printf("%s err=%d\n",x,rc);fflush(stdout);exit(1);}
int rc;
DB *dates_db;

rc = db_create(&dates_db, NULL, 0);
CHKERR("create");

rc = dates_db->set_flags(dates_db, DB_DUP);
CHKERR("set_flags");

rc = dates_db->open(dates_db, NULL, "da.idx", NULL, DB_BTREE, 0, 0664);
CHKERR("open");

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

DBC *DBpointer;
rc = dates_db->cursor(dates_db, NULL, &DBpointer, 0);
CHKERR("cursor");

while((rc = DBpointer->c_get(DBpointer, &key, &data, DB_NEXT)) != DB_NOTFOUND)
{
    CHKERR("c_get");
    printf("The key is: %s\nThe data is: %s\n", (char *)key.data, (char *)data.data);
}

根据进一步的评论,你在公开招募中收到错误22,那是EINVAL(至少在我的系统上),这意味着你的一个参数不正确。

根据网络搜索,open调用似乎有一些变体,范围介于五到七个参数之间。一些Oracle BDB doco表示它需要五个参数(没有数据库指针而不是事务指针)但是同一文档中的示例代码(和other Oracle doco)具有七个参数形式

查看您的BDB头文件以查看您应该使用哪个文件可能是值得的。