From bee846839ed3a9cf72a1c19c3a8d0fe964291537 Mon Sep 17 00:00:00 2001 From: wangxuefei <10225501435@stu.ecnu.edu.cn> Date: Wed, 1 Jan 2025 09:54:28 +0800 Subject: [PATCH] complete function: Get_fields --- db/db_impl.cc | 21 ++++++++++++--------- test/db_test3.cc | 32 ++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index 7a0dcc5..e806eb9 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -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(); diff --git a/test/db_test3.cc b/test/db_test3.cc index 9c80952..b5f9563 100644 --- a/test/db_test3.cc +++ b/test/db_test3.cc @@ -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); } // 测试查找功能