谢瑞阳&徐翔宇的KV分离LEVELDB实现
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

66 lines
2.3 KiB

// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include <string>
#include "db/dbformat.h"
#include "leveldb/fields.h"
namespace leveldb {
std::string SerializeValue(const FieldArray& fields){
std::string res_="";
PutVarint64(&res_,(uint64_t)fields.size());
for(auto pr:fields){
PutLengthPrefixedSlice(&res_, pr.first);
PutLengthPrefixedSlice(&res_, pr.second);
}
return res_;
}
Status DeserializeValue(const std::string& value_str,FieldArray* res){
Slice slice=Slice(value_str.c_str());
uint64_t siz;
bool tmpres=GetVarint64(&slice,&siz);
if(!tmpres)return Status::Corruption("Deserialize fail");
res->clear();
for(int i=0;i<siz;i++){
Slice value_name;
Slice value;
tmpres=GetLengthPrefixedSlice(&slice,&value_name);
if(!tmpres)return Status::Corruption("Deserialize fail");
tmpres=GetLengthPrefixedSlice(&slice,&value);
if(!tmpres)return Status::Corruption("Deserialize fail");
res->emplace_back(std::string(value_name.data(),value_name.size()),std::string(value.data(),value.size()));
}
return Status::OK();
}
Status Get_keys_by_field(DB *db,const ReadOptions& options, const Field field,std::vector<std::string> *keys){
auto it=db->NewUnorderedIterator(options,Slice(),Slice());
keys->clear();
while(it->Valid()&&it->status().ok()){
auto val=it->value();
FieldArray arr;
auto str_val=std::string(val.data(),val.size());
auto res=DeserializeValue(str_val,&arr);
if(res.ok())
for(const auto &pr:arr){
if(pr.first==field.first&&pr.second==field.second){
Slice key=it->key();
keys->push_back(std::string(key.data(),key.size()));
break;
}
}
it->Next();
}
if(it->Valid()&&!it->status().ok()){
auto res=it->status();
delete it;
return res;
}
delete it;
return Status::OK();
}
}