Проблема с Berkeley DB и C ++
-
21-09-2019 - |
Вопрос
Я пытаюсь написать простую программу на C ++, которая использует Berkeley DB для хранения данных.Ключ базы данных имеет тип time_t
и эти данные представляют собой integer
.
Мне нужно взять разницу между двумя соседними данными в ключе between two.Я открываю курсор с флагом DB_SET_RANGE, а затем использую DB_NEXT для итерации.
Моя проблема в том, что курсор возвращает несортированные данные.Есть ли способ указать пользовательскую функцию сортировки для курсора?
Решение
Вот некоторые из причин, по которым вы, возможно, захотите предоставить пользовательскую функцию сортировки:
Вы используете систему с начальным порядком (например, x86) и используете целые числа в качестве ключей вашей базы данных.Berkeley DB хранит ключи в виде байтовых строк, а целые числа с малым порядком окончания плохо сортируются при просмотре в виде байтовых строк.Существует несколько решений этой проблемы, одно из которых заключается в предоставлении пользовательской функции сравнения.Видишь http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html для получения дополнительной информации.
Вы устанавливаете функцию сравнения ключей BTree с помощью DB->set_bt_compare().
Например, пример процедуры, которая используется для сортировки целочисленных ключей в базе данных, является:
int
compare_int(DB *dbp, const DBT *a, const DBT *b)
{
int ai, bi;
/*
* Returns:
* < 0 if a < b
* = 0 if a = b
* > 0 if a > b
*/
memcpy(&ai, a->data, sizeof(int));
memcpy(&bi, b->data, sizeof(int));
return (ai - bi);
}
Другие советы
Я думаю, вы должны создать вторичный индекс для ваших данных.
Я пробовал базу данных Sleeping Cat Berkeley (из-за обслуживания кода), но я не пробовал вторичные индексы.
Если производительность не так критична и вы можете переключить database engine, я рекомендую Базы данных SQLite :-)