我正在尝试编写一个使用Berkeley DB进行存储的简单C ++程序。数据库的键是time_t
类型,数据是integer
。
我需要在两个键之间取两个相邻数据之间的差异。我打开一个带有标志DB_SET_RANGE的游标,然后使用DB_NEXT进行迭代。
我的问题是游标返回未排序的数据。有没有办法为光标指定自定义排序器功能?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
我认为您必须为您的数据创建secondary index。
我曾尝试过Sleep Cat Berkeley数据库(由于代码维护),但我没有尝试二级索引 如果性能不是那么关键且您可以切换数据库引擎,我建议SQLite: - )