LMDB Get 中的错误检索?
Bad Retrieval in LMDB Get?
我在我的项目中使用 lmdb 数据库,我在使用 lmdb 的 mdb_get 函数检索数据时遇到问题...我确信 mdb_put 工作正常,但 get 函数将一些垃圾与我的数据连接起来...
std::string Get(std::string key)
{
int rc=0;
char *c_key=(char *)key.c_str();
MDB_val d_key,data;
data.mv_data = nullptr;
data.mv_size = 0;
MDB_txn *txn = nullptr;
rc = mdb_txn_begin(env_, NULL,MDB_RDONLY, &txn);
rc = mdb_dbi_open(txn,NULL, 0, &dbi_);
d_key.mv_size = key.size();
d_key.mv_data = c_key;
rc= mdb_get(txn,dbi_,&d_key,&data);
if (rc) {
std::cout<<"Data Can't be Found, Error: "<<mdb_strerror(rc);
mdb_dbi_close(env_,dbi_);
return "";
}
else if(rc==0)
std::cout<<"Data Found.\n";
mdb_dbi_close(env_,dbi_);
return (char *)data.mv_data;
}
返回的 str 包含一些垃圾,例如,str 应该包含 "w ah n" 但是当我检索它时 mdb_get returns "w ah n[=16=]04",它在字符串 null 之后连接垃圾字符.
问题出在这一行:
return (char *)data.mv_data;
因为 data.mv_data
实际上只是一堆字节而不是 null-terminated 字符串。如果你只是将它转换为 char*
你可以在字符串的末尾得到垃圾。
解决方案是将data.mv_size bytes
从data.mv_data
复制到新分配的char*
。或者,您可以将目标指针作为 Get
方法的 out
参数传递。
至少这是我的解决方案。
我在我的项目中使用 lmdb 数据库,我在使用 lmdb 的 mdb_get 函数检索数据时遇到问题...我确信 mdb_put 工作正常,但 get 函数将一些垃圾与我的数据连接起来...
std::string Get(std::string key)
{
int rc=0;
char *c_key=(char *)key.c_str();
MDB_val d_key,data;
data.mv_data = nullptr;
data.mv_size = 0;
MDB_txn *txn = nullptr;
rc = mdb_txn_begin(env_, NULL,MDB_RDONLY, &txn);
rc = mdb_dbi_open(txn,NULL, 0, &dbi_);
d_key.mv_size = key.size();
d_key.mv_data = c_key;
rc= mdb_get(txn,dbi_,&d_key,&data);
if (rc) {
std::cout<<"Data Can't be Found, Error: "<<mdb_strerror(rc);
mdb_dbi_close(env_,dbi_);
return "";
}
else if(rc==0)
std::cout<<"Data Found.\n";
mdb_dbi_close(env_,dbi_);
return (char *)data.mv_data;
}
返回的 str 包含一些垃圾,例如,str 应该包含 "w ah n" 但是当我检索它时 mdb_get returns "w ah n[=16=]04",它在字符串 null 之后连接垃圾字符.
问题出在这一行:
return (char *)data.mv_data;
因为 data.mv_data
实际上只是一堆字节而不是 null-terminated 字符串。如果你只是将它转换为 char*
你可以在字符串的末尾得到垃圾。
解决方案是将data.mv_size bytes
从data.mv_data
复制到新分配的char*
。或者,您可以将目标指针作为 Get
方法的 out
参数传递。
至少这是我的解决方案。