diff --git a/db/db_impl.cc b/db/db_impl.cc index f423733..aaff6fb 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -1169,7 +1169,7 @@ Status DBImpl::GetFields(const ReadOptions& options, const Slice& key, FieldArray* fields) { std::string value; Status s = DBImpl::Get(options, key, &value); - fields = ParseValue(value); + *fields = *ParseValue(value); return s; } diff --git a/test/lab1_test.cc b/test/lab1_test.cc index d12239b..94b0ee4 100644 --- a/test/lab1_test.cc +++ b/test/lab1_test.cc @@ -33,7 +33,12 @@ TEST(TestLab1, Basic) { // 读取并反序列化 FieldArray fields_ret; db->GetFields(ReadOptions(), key, &fields_ret); + // ASSERT_EQ(fields, fields_ret); 顺序不一样 + for (const Field& pairs : fields_ret) { + ASSERT_NE(std::find(fields.begin(), fields.end(), pairs), fields.end()); + } + //todo Field field = {"name", "Customer#000000001"}; std::vector resKeys = db->FindKeysByField(field); } diff --git a/util/serialize_value.cc b/util/serialize_value.cc index 6a30e27..28ab79a 100644 --- a/util/serialize_value.cc +++ b/util/serialize_value.cc @@ -1,10 +1,44 @@ #include "util/serialize_value.h" +#include +#include +#include "util/coding.h" +#include namespace leveldb{ - std::string SerializeValue(const FieldArray& fields){ - return ""; +bool compareByFirst(const Field& a, const Field& b) { + return a.first < b.first; // 按字段名升序排序 +} + +std::string SerializeValue(const FieldArray& fields){ + FieldArray sortFields = fields; + std::sort(sortFields.begin(), sortFields.end(), compareByFirst); + std::string result; + for (const Field& pairs : sortFields) { + PutLengthPrefixedSlice(&result, pairs.first); + PutLengthPrefixedSlice(&result, pairs.second); } - FieldArray *ParseValue(const std::string& value_str){ - return new FieldArray; + return result; +} + +FieldArray *ParseValue(const std::string& value_str){ + Slice valueSlice(value_str); + FieldArray *res = new FieldArray; + Slice nameSlice = Slice(); + Slice valSlice = Slice(); + std::string nameStr; + std::string valStr; + while(GetLengthPrefixedSlice(&valueSlice, &nameSlice)){ + nameStr = nameSlice.ToString(); + + if(GetLengthPrefixedSlice(&valueSlice, &valSlice)){ + valStr = valSlice.ToString(); + res->emplace_back(nameStr, valStr); + } else { + std::cout << "name and val not match!" << std::endl; + } + nameSlice = Slice(); + valSlice = Slice(); } + return res; +} } \ No newline at end of file