Вопрос

Я пытаюсь написать простую программу на 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 :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top