检查密钥是否存在于Berkeley DB C ++ API中

问题描述

所以这听起来像是一个愚蠢的问题,但是我已经查阅了Berkeley DB C ++ API的大多数官方文档,而且似乎找不到答案。如何检查数据库中是否存在密钥?这是一些示例代码

// Database created.

Dbt key(&some_string,some_size);
Dbt data(&some_struct,some_other_size);

database.put(nullptr,&key,&data,0);

// Now my &some_string key is definitely in the database,and I can easily get it.
// However if I create an identical string to search for the key,I get DB_NOTFOUND

Dbt search_key(&the_same_string,the_same_size);
int ret = database.exists(nullptr,&search_key,0);

// This returns DB_NOTFOUND.

如果我传递原始密钥Dbt对象,则ret当然为0。但是,如果您还没有该确切记录的关联Dbt对象,那么是否无法检查密钥是否存在?

我还尝试使用游标,并且如果设置DB_FirsT标志,则Dbc :: get()可用于查找键。但是那个会自动写入我传递的任何数据Dbt对象中。

要做的就是检查是否存在带有特定密钥的Dbt对象,仅此而已。

解决方法

用于实例化Dbt的第二个参数只是整数大小,而不是指针。因此,例如,您的一行:

Dbt key(&some_string,&some_size);

应成为:

Dbt key(&some_string,some_size);

此外,如果您的some_stringstd::string,则必须将其转换为纯C字符数组。考虑在写入数据库的字符串中包含NUL终止符。您不必这样做,但这通常使调试更容易。