Как заставить DBCursor->get(...) распознать память, выделенную для key.data и data.data

Я работаю над программой на C для извлечения записей, значения данных которых соответствуют определенному шаблону из базы данных BerkeleyDB DBTree. Я создаю базу данных, открываю ее, обнуляю DBT для ключа и другое для данных, устанавливаю флаги DBT в DB_DBT_USERMEM, создаю большие буферы malloc для членов данных DBT, устанавливаю ulen-слот DBT в размер выделенных буферов, получаю курсор, и перейдите к этой строке

ret = cursor->get(курсор, & ключ, & данные, DB_NEXT);

ret всегда равен DB_BUFFER_SMALL, хотя буферные буферы имеют размер 2056 символов, а размер key.data равен 25, а data.data равен 75.

Что я делаю неправильно?

1 ответ

Спасибо, что задали вопрос. Это привело меня к решению, которое было

/* Initialize key/data structures. */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));

key.flags = DB_DBT_USERMEM;
data.flags = DB_DBT_USERMEM;

key.data = (char *)malloc(dataSize);
key.ulen = dataSize;
data.data = (char *)malloc(dataSize);
data.ulen = dataSize;

memset(key.data, 0, sizeof(key.data));
memset(data.data, 0, sizeof(data.data));

вместо

/* Initialize key/data structures. */
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));

key.flags = DB_DBT_USERMEM;
data.flags = DB_DBT_USERMEM;

key.data = (char *)malloc(dataSize);
key.ulen = dataSize;
data.data = (char *)malloc(dataSize);
data.ulen = dataSize;

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

Я передавал указатель на char * указатель на memset, а не сам указатель. Ваш вопрос заставил меня подвергнуть сомнению код инициализации.

Спасибо

Другие вопросы по тегам