Berkeley DB 和 C++ 的问题

发布于 2024-08-07 16:27:33 字数 217 浏览 8 评论 0原文

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

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

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

I'm trying to write a simple C++ program that uses Berkeley DB for storage. The key of the database is of type time_t and the data is an integer.

I need to take the difference between two adjacent data in a between two key. I open a cursor with the flag DB_SET_RANGE and then i use DB_NEXT to iterate.

My problem is that the cursor returns unsorted data. Is there a way to specify a custom sorter function for the cursor?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光礼记 2024-08-14 16:27:33

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

您使用的是小端系统(例如 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); 
} 

Some of the reasons why you may want to provide a custom sorting function are:

You are using a little-endian system (such as x86) and you are using integers as your database's keys. Berkeley DB stores keys as byte strings and little-endian integers do not sort well when viewed as byte strings. There are several solutions to this problem, one being to provide a custom comparison function. See http://www.oracle.com/technology/documentation/berkeley-db/db/ref/am_misc/faq.html for more information.

You set a BTree's key comparison function using DB->set_bt_compare().

For example, an example routine that is used to sort integer keys in the database is:

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); 
} 
凉薄对峙 2024-08-14 16:27:33

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

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

I think you have to create a secondary index for your data.

I had tried Sleeping Cat Berkeley Database (due to code maintenance) but I did not try secondary indices.
If perfomance isn't so critical and you can switch database engine, I recommend SQLite :-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文