LINUX.ORG.RU

berkeley db


0

0

есть такой код:

Db berk(NULL,0);
if (berk.open(NULL,"/tmp/mybase.db",NULL,DB_BTREE,DB_CREATE,0))
std::cout << "error opening" << std::endl;


char * c_data ="fun";
int i_key = 777;

Dbt key(&i_key,sizeof(i_key)),
data(c_data,sizeof(char) * (strlen(c_data)+1));
if (berk.put(NULL,&key,&data,NULL)!=0)
std::cout << "error putting" << std::endl;

if (berk.sync(NULL)!=0)
std::cout << "error sync" << std::endl;

if (berk.close(NULL)!=0)
std::cout << "error close" << std::endl;


Db berk2(NULL,0);

if (berk2.open(NULL,"/tmp/mybase.db",NULL,DB_BTREE,NULL,0))
std::cout << "error opening" << std::endl;


c_data = "nuf";

Dbt key_r, data_r;
key_r.set_data(&i_key);
key_r.set_ulen(sizeof(i_key));
int res;
try {
res =berk2.get(NULL,&key_r,&data_r,0);
} catch (DbException &e) {
std::cout << "except " <<e.what() << std::endl;
}
if (res == DB_NOTFOUND)
std::cout << "error getting" << std::endl;
else {
c_data = (char *) data_r.get_data();
std::cout << "value: " <<c_data <<std::endl;
}

berk2.close(NULL);

этот код всегда возвращает "error getting". Почему?

ps сори за пред. пост =)

★★

вопрос снят на половину. Если инициализировать ключ Dbt key_r(&i_key,sizeof(i_key)) - то все работает.

А вот вариант из "C++ Getting Started Guide":

Dbt key_r, data_r; key_r.set_ulen(sizeof(i_key)); key_r.set_data(&i_key);

не работает =) Почему?

ale ★★
() автор топика

Так потребно:

key_r.set_data (&i_key);

key_r.set_size (sizeof (i_key));

res = berk2.get (NULL, &key_r, &data_r, 0);

кури разницу между set_size и set_ulen. Пошто примеры из букваря не работают - вряд ли тебе кто-то на этом форуме ответит, тут ИМХО разработчиков bdb не тусуецо :(

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

>кури разницу между set_size и set_ulen.

пасиб, я уж экспериментально сравнил sizeof(data) и size, dlen, ulen =)

>тут ИМХО разработчиков bdb не тусуецо :(

а гденить в рунете тусуются?

ale ★★
() автор топика
Ответ на: комментарий от ale

Да пёс ево знает, где тусуюцо. Списка контактов разработчиков нету разве? Я просто не интересовался, но ИМХО в рунете нету ни одново.

bugmaker ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.