2009-10-15 100 views
0

我正在尝试编写一个使用Berkeley DB进行存储的简单C++程序。数据库的密钥类型为time_t,数据为integerBerkeley DB和C++的问题

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

我的问题是光标返回未排序的数据。有没有办法为光标指定一个自定义的分类器函数?

回答

4

一些原因,你可能想提供一个自定义排序功能是:

你是使用一个小端系统(比如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); 
} 
0

我认为你必须为你的数据创建一个secondary index

我曾试过睡猫伯克利数据库(由于代码维护),但我没有尝试二级索引。
如果性能比较不是那么重要,你可以切换数据库引擎,我建议SQLite :-)