Browse Source

complete function: Get_fields

master
王雪飞 8 months ago
parent
commit
bee846839e
2 changed files with 36 additions and 17 deletions
  1. +12
    -9
      db/db_impl.cc
  2. +24
    -8
      test/db_test3.cc

+ 12
- 9
db/db_impl.cc View File

@ -1180,15 +1180,6 @@ Status DBImpl::Get(const ReadOptions& options, const Slice& key,
mem->Unref();
if (imm != nullptr) imm->Unref();
current->Unref();
// TODO(begin): search the slotpage and get value from vlog
size_t slot_num = *(size_t *)value->c_str();
struct slot_content sc;
std::string vlog_value;
slot_page_->get_slot(slot_num, &sc);
vlog_set_->get_value(sc.vlog_num, sc.value_offset, &vlog_value);
*value = vlog_value;
// TODO(end)
return s;
}
@ -1200,6 +1191,18 @@ Status DBImpl::Get_Fields(const ReadOptions& options, const Slice& key,
if (!s.ok()) {
return s;
}
// 从value中提取slot_num
size_t slot_num;
slot_num = *(size_t *)value.c_str(); // 这里假设value的前几个字节存储了slot_num
struct slot_content sc;
std::string vlog_value;
// 从slot_page中获取slot内容
slot_page_->get_slot(slot_num, &sc);
// 从vlog_set中获取实际的日志值
vlog_set_->get_value(sc.vlog_num, sc.value_offset, &vlog_value);
// 更新value为从vlog获取的值
value = vlog_value;
std::cout << "value from value_log: " << key.ToString() << value << std::endl;
*fields = DeserializeValue(value);
return Status::OK();

+ 24
- 8
test/db_test3.cc View File

@ -175,9 +175,13 @@ TEST(TestSchema, Basic) {
std::cerr << "open db failed" << std::endl;
abort();
}
std::string key = "key";
std::string key0 = "k_0";
std::string key1 = "k_1";
std::string key2 = "k_2";
std::string key3 = "k_3";
std::string value = "value";
FieldArray fields0 = {{"name", "wxf"}};
FieldArray fields1 = {
{"name", "Customer1"},
{"address", "IVhzIApeRb"},
@ -194,21 +198,33 @@ TEST(TestSchema, Basic) {
{"address", "ecnu"},
{"phone", "11111"}
};
db->Put(writeOptions, key, value);
std::cout << "put_value: " << value << std::endl;
db->Put_Fields(leveldb::WriteOptions(), key0, fields0);
db->Put_Fields(leveldb::WriteOptions(), key1, fields1);
db->Put_Fields(leveldb::WriteOptions(), key2, fields2);
db->Put_Fields(leveldb::WriteOptions(), key3, fields3);
// 读取并反序列化
std::string value_ret;
FieldArray fields_ret;
db->Get_Fields(leveldb::ReadOptions(), key1, &fields_ret);
db->Get(readOptions, key, &value_ret);
std::cout << "get_value: " << value_ret << std::endl;
// 读取并反序列化
FieldArray fields_ret_0;
FieldArray fields_ret_1;
db->Get_Fields(leveldb::ReadOptions(), key0, &fields_ret_0);
db->Get_Fields(leveldb::ReadOptions(), key1, &fields_ret_1);
// 检查反序列化结果
ASSERT_EQ(fields_ret.size(), fields1.size());
for (size_t i = 0; i < fields_ret.size(); ++i) {
ASSERT_EQ(fields_ret[i].name, fields1[i].name);
ASSERT_EQ(fields_ret[i].value, fields1[i].value);
ASSERT_EQ(fields_ret_0.size(), fields0.size());
for (size_t i = 0; i < fields_ret_0.size(); ++i) {
ASSERT_EQ(fields_ret_0[i].name, fields1[i].name);
ASSERT_EQ(fields_ret_0[i].value, fields1[i].value);
}
ASSERT_EQ(fields_ret_1.size(), fields1.size());
for (size_t i = 0; i < fields_ret_1.size(); ++i) {
ASSERT_EQ(fields_ret_1[i].name, fields1[i].name);
ASSERT_EQ(fields_ret_1[i].value, fields1[i].value);
}
// 测试查找功能

Loading…
Cancel
Save