c - Berkeley DB 无法在不关闭数据库的情况下放置然后访问数据

标签 c berkeley-db

我正在尝试使用 berkeley DB 来存储和获取简单的键/数据对,但这并不像我预期的那样有效。 我创建了一个函数 ( putdb() ) 将键/数据对放入数据库中,并创建了另一个函数 ( getdb() ) 来检索这对。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <db.h>
DB *dbp;
void opendb(void)
{
        int ret; 
        if ((ret = db_create(&dbp, NULL, 0)) != 0)
                exit(EXIT_FAILURE);
        if ((ret = dbp->open(dbp, NULL, "db.db", NULL,DB_BTREE, DB_CREATE, 0664)) != 0)
                exit(EXIT_FAILURE);
}


void putdb(const char *key, const char *value)
{
    DBT keyValue, dataValue;
    memset(&keyValue, 0, sizeof(keyValue));
    memset(&dataValue, 0, sizeof(dataValue));

    keyValue.size = sizeof(key);
    dataValue.size = sizeof(value);

    keyValue.data = malloc(keyValue.size);
    strcpy(keyValue.data,key);

    dataValue.data = malloc(dataValue.size);
    strcpy(dataValue.data,value);

    if ((ret = dbp->put(dbp, NULL, &keyValue, &dataValue, 0)) == 0)
            printf("db: %s: key stored.\n", (char *)keyValue.data);
    else {
            dbp->err(dbp, ret, "DB->put");
    }
    dbp->sync(dbp, 0);
}

void getdb(const char *key,const char *value)
{
    DBT keyValue, dataValue;
    memset(&keyValue, 0, sizeof(keyValue));
    memset(&dataValue, 0, sizeof(dataValue));

    keyValue.size = sizeof(key);
    dataValue.size = sizeof(value);

    keyValue.data = malloc(keyValue.size);
    strcpy(keyValue.data,key);

    dataValue.data = malloc(dataValue.size);
    strcpy(dataValue.data,value);

    if ((ret = dbp->get(dbp, NULL, &keyValue, &dataValue, 0)) == 0)
            printf("db: %s: key retrieved: data was %s.\n",
                (char *)keyValue.data, (char *)dataValue.data);
    else {
            dbp->err(dbp, ret, "DB->get");
    }
}
void closedb(void)
{
    dbp->close(dbp, 0);
    //TODO : error code return check
}

和主文件:

int main()
{
    opendb();
    putdb("toto","titi");
    getdb("toto","titi");
    closedb();
 }

我得到:

db: toto: key stored.
DB->get: BDB0073 DB_NOTFOUND: No matching key/data pair found

你能解释一下为什么吗?

如果我更改了 main 函数,请注意:

int main()
{
    opendb();
    putdb("toto","titi");
    closedb();
    opendb();
    getdb("toto","titi");
    closedb();
}

然后就可以了! :

db: toto: key stored.
db: toto: key retrieved: data was titi.

最佳答案

您从教程中复制了太多内容。他们可以使用 sizeof("a string")但你必须使用 strlen(key)在两个putdbgetdb

keyValue.size = strlen(key);
dataValue.size = strlen(value);

关于c - Berkeley DB 无法在不关闭数据库的情况下放置然后访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39312527/

相关文章:

centos - Rpmdb 损坏

sqlite - Berkeley DB SQL 与 SQLite 相比有多快?

berkeley-db - BerkeleyDB 的替代品?

c++ - BerkeleyDB 最大化性能并最小化数据丢失

svn - 从 BDB SVN 存储库恢复源代码

c - i = post_increment_i()的行为是指定的,未指定的还是未定义的?

c++ - 初始化后将指针设为const

c++ - 为外部 dll 上的缓冲区分配内存并在主应用程序上使用它是否安全?

c - C 中的 math.sqrt 问题

c - gdb - 检查下一步更改的变量值