Как заставить 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, а не сам указатель. Ваш вопрос заставил меня подвергнуть сомнению код инициализации.
Спасибо