检查 Berkeley DB C++ API 中是不是存在密钥 [关闭]

Posted

技术标签:

【中文标题】检查 Berkeley DB C++ API 中是不是存在密钥 [关闭]【英文标题】:Check if key exists in Berkeley DB C++ API [closed]检查 Berkeley DB C++ API 中是否存在密钥 [关闭] 【发布时间】:2020-10-08 15:03:01 【问题描述】:

所以这听起来像是一个愚蠢的问题,但我已经查阅了 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 对象,仅此而已。

【问题讨论】:

【参考方案1】:

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

Dbt key(&some_string, &some_size);

应该变成:

Dbt key(&some_string, some_size);

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

【讨论】:

感谢您的回答。大小的指针符号在这里只是一个疏忽。我的代码中没有这个。有什么理由我必须将其转换为纯 C 吗?我的意思是,文档指出 Dbt 对象几乎可以是任何东西。 没有。如果您需要更多帮助,请提供一个最小的、可验证的示例。我们可以编译和运行的东西。

以上是关于检查 Berkeley DB C++ API 中是不是存在密钥 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用 Java 编写旧版本的 Berkeley DB

berkeley DB:无法编译 C++ 代码

berkeley DB:无法编译 C++ 代码

从 CLI 检查 Berkeley DB 文件

使用 Berkeley DB、C++ STL 接口进行批量读取

Berkeley DB为啥又叫做db4