From c942a4415d4aa7a2c8248b1f46c07b8ce1416b7f Mon Sep 17 00:00:00 2001 From: augurier <14434658+augurier@user.noreply.gitee.com> Date: Tue, 19 Nov 2024 20:13:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=EF=BC=88=E5=8F=8D?= =?UTF-8?q?=EF=BC=89=E5=BA=8F=E5=88=97=E5=8C=96=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/db_impl.cc | 2 +- test/lab1_test.cc | 5 +++++ util/serialize_value.cc | 42 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 5 deletions(-) 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