检查 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_string
是std::string
,您必须将其转换为纯C 字符数组。考虑在写入数据库的字符串中包含NUL
终止符。您不必这样做,但它通常会使调试更容易。
【讨论】:
感谢您的回答。大小的指针符号在这里只是一个疏忽。我的代码中没有这个。有什么理由我必须将其转换为纯 C 吗?我的意思是,文档指出 Dbt 对象几乎可以是任何东西。 没有。如果您需要更多帮助,请提供一个最小的、可验证的示例。我们可以编译和运行的东西。以上是关于检查 Berkeley DB C++ API 中是不是存在密钥 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章