我应该如何初始化一个 BerkeleyDB 键数据对来获取?

Posted

技术标签:

【中文标题】我应该如何初始化一个 BerkeleyDB 键数据对来获取?【英文标题】:How should I initialize a BerkeleyDB key-data pair for getting? 【发布时间】:2019-07-12 17:57:22 【问题描述】:

我正在解决使用 BerkeleyDB 库(通过其 C++ API)的未维护代码库中的一些问题。具体来说,我看到以下代码:

Dbt dkey, ddata;

memset(&dkey, 0, sizeof(dkey));
memset(&ddata, 0, sizeof(ddata));

_storage_key_cursor->get( &dkey, &ddata, DB_NEXT );

if ( dkey.get_data() == NULL ) 
  // etc. etc.

现在,Dbt 类在我的/usr/include/db_cxx.h 中被前向声明,这意味着它不知道 - 至少编译器不知道 - 可以像这样初始化。事实上,我得到:

../src/AM/WSMV.cpp: In member function ‘BDBPage* WSMV::getNextSKPage()’:
../src/AM/WSMV.cpp:126:32: warning: ‘void* memset(void*, int, size_t)’ clearing an object of type ‘class Dbt’ with no trivial copy-assignment; use assignment or value-initialization instead [-Wclass-memaccess]
   memset(&dkey, 0, sizeof(dkey));

ddata 也是如此。

但是,似乎这种 memset'ing 为 0 有点习惯:BerkeleyDB Reference Guide 在 this example 中这样做。

那么,我该怎么办?

抑制/忽略警告? 以其他方式显式初始化或构造? 根本不初始化,留给默认初始化?

【问题讨论】:

【参考方案1】:

我的最佳猜测:

类 Dbt 私下继承自 (C API) DBT 类型,这是 struct __db_dbt 的 typedef。它的定义是:

struct __db_dbt 
        void *     data;
        u_int32_t  size;
        u_int32_t  ulen;
        u_int32_t  dlen;
        u_int32_t  doff;
        void *     app_data;
        u_int32_t  flags;
;

标志值为 0 表示未设置标志。这至少意味着memset() 不会立即且明显有害。我可以重新解释为struct __db_dbt 并手动设置一些字段,但我不确定要设置哪些字段。另外 - 我不确定那些没有 API 函数的是否可以安全地设置为 0 。

【讨论】:

以上是关于我应该如何初始化一个 BerkeleyDB 键数据对来获取?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Berkeley DB 中使用批量功能?

如何使用berkeley db检索键小于指定键的数据?

您如何将关系实体表示为 BerkeleyDB 中可检索数据的单个单元?

分层数据和 Berkeley DB

在 C# 中读取 BerkeleyDB 数据库行

在 BerkeleyDB JE 中选择不同的辅助键值