leveldb调用get时,string把value截断。解决方案

来源:互联网 发布:淘宝网购物ppt 编辑:程序博客网 时间:2024/06/07 09:14

用leveldb的get接口如下:

virtual Status Get(const ReadOptions& options, const Slice& key,std::string* value) = 0;


以上标红的部分会将存入到leveldb中的字符串截断,如果存入的是(str = “123\0456”)

则调用get接口只能得到value = 123.


因此可以通过如下方式进行解决:(放弃使用get接口,使用迭代器)

/*get content*/
    Iterator* iter_content = db->NewIterator(ReadOptions());
    iter_content->Seek(Slice(strDetailKey));
*len = iter_content->value().size();
if (0 == *len)
{
    ldout(cct, 5) << "###############################" << iter_content->value().size() << dendl;
        return E_GET_FAILED;
}
memcpy(content, iter_content->value().data(), *len);



如果在leveldb的put时,出现这个问题,可以放弃使用 Slice() : data_(""), size_(0) { }。改成使用:

  // Create a slice that refers to d[0,n-1].
  Slice(const char* d, size_t n) : data_(d), size_(n) { }

这样就成功解决了put,get的问题


0 0
原创粉丝点击