Berkeley DB 无法在不关闭数据库的情况下放置然后访问数据
Berkeley DB can't put then access data without closing db
我正在尝试使用 berkeley DB 来存储和获取简单的 key/data 对,但这并不像我预期的那样有效。
我创建了一个函数 ( putdb() ) 将 key/data 对放入数据库,另一个函数 ( 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
你能解释一下为什么吗?
如果我更改了我的主要功能,请注意:
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")
但你必须在 putdb
和 getdb
中都使用 strlen(key)
keyValue.size = strlen(key);
dataValue.size = strlen(value);
我正在尝试使用 berkeley DB 来存储和获取简单的 key/data 对,但这并不像我预期的那样有效。 我创建了一个函数 ( putdb() ) 将 key/data 对放入数据库,另一个函数 ( 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
你能解释一下为什么吗?
如果我更改了我的主要功能,请注意:
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")
但你必须在 putdb
和 getdb
strlen(key)
keyValue.size = strlen(key);
dataValue.size = strlen(value);