버클리 DB를 사용하여 간단한 키/데이터 쌍을 저장하고 가져 오려고하지만 예상대로 작동하지 않습니다. 하나의 함수 (putdb())를 만들어 데이터베이스에 키/데이터 쌍을 만들고 다른 하나 (getdb())는이 쌍을 검색합니다.Berkeley DB는 db를 닫지 않고 데이터에 액세스 할 수 없습니다.
#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.
어떤 이유에서
strlen(key)
를 사용할 수 있나요? – Olaf32 비트 플랫폼을 사용하는 경우 정의되지 않은 동작 인 할당 범위를 벗어납니다. 64 비트 아키텍처에서는 UB이기도 한 초기화되지 않은 메모리를 읽으므로 키를 찾을 수없는 오류가 발생할 가능성이 큽니다. 모든 경우에 당신은 기억을 새고 있습니다. 문제를 해결할 수는 있지만 문제를 해결할 수도 있습니다. – rici