0

我正在尝试编写一个使用 Berkeley DB 进行存储的简单 C++ 程序。数据库的键是类型time_t,数据是integer.

我需要在两个键之间获取两个相邻数据之间的差异。我打开一个带有标志 DB_SET_RANGE 的游标,然后我使用 DB_NEXT 进行迭代。

我的问题是游标返回未排序的数据。有没有办法为光标指定自定义排序功能?

4

2 回答 2

4

您可能想要提供自定义排序功能的一些原因是:

您正在使用 little-endian 系统(例如 x86)并且正在使用整数作为数据库的键。Berkeley DB 将键存储为字节字符串,而小端整数在被视为字节字符串时不能很好地排序。这个问题有几种解决方案,一种是提供自定义比较功能。有关详细信息,请参阅http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html

使用 DB->set_bt_compare() 设置 BTree 的键比较函数。

例如,用于对数据库中的整数键进行排序的示例例程是:

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); 
} 
于 2010-02-02T13:08:05.467 回答
0

我认为你必须为你的数据创建一个二级索引

我曾尝试过 Sleeping Cat Berkeley 数据库(由于代码维护),但我没有尝试二级索引。
如果性能不是那么重要并且您可以切换数据库引擎,我推荐SQLite :-)

于 2009-10-15T14:00:32.107 回答