diff --git a/.gitignore b/.gitignore index c4b2425..cda61e2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ # Build directory. build/ out/ + +# 忽略 third_party 目录及其内容 +third_party/ +testdb_for_XOY/ \ No newline at end of file diff --git a/db/db_impl.cc b/db/db_impl.cc index d2932ef..2e3e21b 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -1214,66 +1214,6 @@ Status DBImpl::Put(const WriteOptions& o, const Slice& key, const Slice& val) { return DB::Put(o, key, val); } -std::string DB::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_; -} - - // 反序列化为字段数组 -void DB::ParseValue(const std::string& value_str,FieldArray* res){ - Slice slice=Slice(value_str.c_str()); - uint64_t siz; - bool tmpres=GetVarint64(&slice,&siz); - assert(tmpres); - res->clear(); - for(int i=0;iemplace_back(value_name,value); - } -} - -Status DB::Put_with_fields(const WriteOptions& op, const Slice& key,const FieldArray& fields){ - auto value=SerializeValue(fields); - return Put(op,key,value); -} -Status DB::Get_with_fields(const ReadOptions& options, const Slice& key,FieldArray* fields){ - std::string* value; - auto status=Get(options,key,value); - if(!status.ok())return status; - ParseValue(*value,fields); - return status; -} -Status DB::Get_keys_by_field(const ReadOptions& options, const Field field,std::vector *keys){ - auto it=NewIterator(options); - it->SeekToFirst(); - keys->clear(); - while(it->Valid()){ - auto val=it->value(); - FieldArray arr; - auto str_val=std::string(val.data(),val.size()); - ParseValue(str_val,&arr); - for(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(); - } - delete it; - return Status::OK(); -} Status DBImpl::Delete(const WriteOptions& options, const Slice& key) { return DB::Delete(options, key); diff --git a/include/leveldb/db.h b/include/leveldb/db.h index 4d4da6e..566fbee 100644 --- a/include/leveldb/db.h +++ b/include/leveldb/db.h @@ -90,17 +90,17 @@ class LEVELDB_EXPORT DB { virtual Status Get(const ReadOptions& options, const Slice& key, std::string* value) = 0; - virtual std::string SerializeValue(const FieldArray& fields); + // virtual std::string SerializeValue(const FieldArray& fields); - // 反序列化为字段数组 - virtual void ParseValue(const std::string& value_str,FieldArray* res); + // // 反序列化为字段数组 + // virtual void DeserializeValue(const std::string& value_str,FieldArray* res); - virtual Status Put_with_fields(const WriteOptions& options, const Slice& key,const FieldArray& fields); + // virtual Status Put_with_fields(const WriteOptions& options, const Slice& key,const FieldArray& fields); - virtual Status Get_with_fields(const ReadOptions& options, const Slice& key, - FieldArray* fields); + // virtual Status Get_with_fields(const ReadOptions& options, const Slice& key, + // FieldArray* fields); - virtual Status Get_keys_by_field(const ReadOptions& options, const Field field,std::vector *keys); + // virtual Status Get_keys_by_field(const ReadOptions& options, const Field field,std::vector *keys); virtual std::vector>> WriteValueLog(std::vector value){ assert(0); diff --git a/test/test.cpp b/test/test.cpp index ead36ef..2ac837c 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -1,8 +1,13 @@ #include "gtest/gtest.h" #include "leveldb/env.h" #include "leveldb/db.h" +#include "util/coding.h" + using namespace leveldb; +using Field=std::pair; +using FieldArray=std::vector>; + constexpr int value_size = 2048; constexpr int data_size = 128 << 20; @@ -12,7 +17,73 @@ Status OpenDB(std::string dbName, DB **db) { return DB::Open(options, dbName, db); } -TEST(TestTTL, OurTTL) { +bool CompareFieldArray(const FieldArray &a, const FieldArray &b) { + if (a.size() != b.size()) return false; + for (size_t i = 0; i < a.size(); ++i) { + if (a[i].first != b[i].first || a[i].second != b[i].second) return false; + } + return true; +} + +bool CompareKey(const std::vector a, std::vector b) { + if (a.size() != b.size()) return false; + for (size_t i = 0; i < a.size(); ++i) { + if (a[i] != b[i]) return false; + } + return true; +} + +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_; +} + + // 反序列化为字段数组 +void DeserializeValue(const std::string& value_str,FieldArray* res){ + Slice slice=Slice(value_str.c_str()); + uint64_t siz; + bool tmpres=GetVarint64(&slice,&siz); + assert(tmpres); + res->clear(); + for(int i=0;iemplace_back(value_name,value); + } +} + +Status Get_keys_by_field(DB *db,const ReadOptions& options, const Field field,std::vector *keys){ + auto it=db->NewIterator(options); + it->SeekToFirst(); + keys->clear(); + while(it->Valid()){ + auto val=it->value(); + FieldArray arr; + auto str_val=std::string(val.data(),val.size()); + DeserializeValue(str_val,&arr); + for(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(); + } + delete it; + return Status::OK(); +} + +TEST(Test, CheckGetFields) { DB *db; WriteOptions writeOptions; ReadOptions readOptions; @@ -20,36 +91,67 @@ TEST(TestTTL, OurTTL) { std::cerr << "open db failed" << std::endl; abort(); } - std::string key = "k_1"; - - std::string key1 = "k_2"; + std::string key1 = "k_1"; + std::string key2 = "k_2"; - FieldArray fields = { + FieldArray fields1 = { {"name", "Customer#000000001"}, {"address", "IVhzIApeRb"}, {"phone", "25-989-741-2988"} }; - FieldArray fields1 = { + FieldArray fields2 = { {"name", "Customer#000000001"}, {"address", "abc"}, {"phone", "def"} }; - db->Put_with_fields(WriteOptions(), key, fields); + auto value1=SerializeValue(fields1); + auto value2=SerializeValue(fields2); - db->Put_with_fields(WriteOptions(), key1, fields1); + db->Put(WriteOptions(), key1, value1); + db->Put(WriteOptions(), key2, value2); // 读取并反序列化 - FieldArray value_ret; - db->Get_with_fields(ReadOptions(), key, &value_ret);; - for(auto pr:value_ret){ + std::string value_ret; + FieldArray res1; + + db->Get(ReadOptions(), key1, &value_ret); + DeserializeValue(value_ret, &res1); + for(auto pr:res1){ std::cout< keys = {key1, key2}; + std::vector key_res; + Get_keys_by_field(db,ReadOptions(),fields1[0],&key_res); + for(auto s:key_res)std::cout< v; - db->Get_keys_by_field(ReadOptions(),fields[0],&v); - for(auto s:v)std::cout<