Bläddra i källkod

实现了(反)序列化存储

pull/1/head
augurier 9 månader sedan
förälder
incheckning
c942a4415d
3 ändrade filer med 44 tillägg och 5 borttagningar
  1. +1
    -1
      db/db_impl.cc
  2. +5
    -0
      test/lab1_test.cc
  3. +38
    -4
      util/serialize_value.cc

+ 1
- 1
db/db_impl.cc Visa fil

@ -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;
}

+ 5
- 0
test/lab1_test.cc Visa fil

@ -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<std::string> resKeys = db->FindKeysByField(field);
}

+ 38
- 4
util/serialize_value.cc Visa fil

@ -1,10 +1,44 @@
#include "util/serialize_value.h"
#include <algorithm>
#include <string>
#include "util/coding.h"
#include <iostream>
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;
}
}

Laddar…
Avbryt
Spara