// 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 #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;iemplace_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 *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(); } }