diff --git a/db/db_impl.h b/db/db_impl.h index e00559e..91f4fd4 100644 --- a/db/db_impl.h +++ b/db/db_impl.h @@ -37,8 +37,8 @@ class DBImpl : public DB { ~DBImpl() override; // Implementations of the DB interface - Status PutFields(const WriteOptions&, const Slice& key, const Fields& fields); - Status GetFields(const ReadOptions& options, const Slice& key, Fields& fields); + Status PutFields(const WriteOptions&, const Slice& key, const Fields& fields) override; + Status GetFields(const ReadOptions& options, const Slice& key, Fields& fields) override; Status Put(const WriteOptions&, const Slice& key, const Slice& value) override; diff --git a/db/fields.cpp b/db/fields.cpp index cfa4828..476a94b 100644 --- a/db/fields.cpp +++ b/db/fields.cpp @@ -224,6 +224,10 @@ std::vector Fields::FindKeysByFields(leveldb::DB* db, const FieldAr } std::string iter_key = iter_key_for_parse.ToString(); + + std::cout << "iter_key_str: " + iter_key << std::endl; + + if (std::find(deleted_keys.begin(), deleted_keys.end(), iter_key) != deleted_keys.end() || std::find(find_keys.begin(), find_keys.end(), iter_key) != find_keys.end()) { continue; @@ -235,7 +239,18 @@ std::vector Fields::FindKeysByFields(leveldb::DB* db, const FieldAr continue; } - FieldArray iter_fields_ = Fields::ParseValue(it->value().ToString()).fields_; + std::cout << "iter_tag_str: " + tag << std::endl; + + Slice iter_value_slice = it->value(); + Slice iter_value_for_parse; + if (!GetLengthPrefixedSlice(&iter_value_slice, &iter_value_for_parse)) { + continue; + } + + std::cout << "iter_value_str: " + iter_value_for_parse.ToString() << std::endl; + + FieldArray iter_fields_ = Fields::ParseValue(iter_value_for_parse.ToString()).fields_; + // FieldArray iter_fields_ = Fields::ParseValue(it->value().ToString()).fields_; if (iter_fields_ == search_fields_ || std::includes(iter_fields_.begin(), iter_fields_.end(), search_fields_.begin(), search_fields_.end())) { diff --git a/include/leveldb/db.h b/include/leveldb/db.h index 0ee62f4..18a7da1 100644 --- a/include/leveldb/db.h +++ b/include/leveldb/db.h @@ -22,6 +22,7 @@ struct Options; struct ReadOptions; struct WriteOptions; class WriteBatch; +// class Fields; // Abstract handle to particular state of a DB. // A Snapshot is an immutable object and can therefore be safely @@ -60,6 +61,9 @@ class LEVELDB_EXPORT DB { virtual ~DB(); + virtual Status PutFields(const WriteOptions&, const Slice& key, const Fields& fields); + virtual Status GetFields(const ReadOptions& options, const Slice& key, Fields& fields); + // Set the database entry for "key" to "value". Returns OK on success, // and a non-OK status on error. // Note: consider setting options.sync = true. diff --git a/test/value_field_test.cc b/test/value_field_test.cc index 8ea72be..1e37973 100644 --- a/test/value_field_test.cc +++ b/test/value_field_test.cc @@ -1,6 +1,7 @@ #include "gtest/gtest.h" #include "leveldb/db.h" #include "db/fields.h" +#include "db/db_impl.h" #include "leveldb/write_batch.h" using namespace leveldb; @@ -238,19 +239,18 @@ TEST_F(FieldsTest, TestBulkInsertSortSerializeAndFindKeys) { FieldArray fields = {{"field1", "value1_" + std::to_string(i)}, {"field2", "value2_" + std::to_string(i)}}; data_to_insert[key] = Fields(fields); + Fields ffields = Fields(fields); + // 将序列化后的字段添加到 WriteBatch 中 - batch.Put(key, data_to_insert[key].SerializeValue()); + Status status = db_->PutFields(WriteOptions(), Slice(key), ffields); + EXPECT_TRUE(status.ok()) << "Failed to put fields for key: " << key << ", error: " << status.ToString(); } - // 提交批量写入操作 - Status status = db_->Write(WriteOptions(), &batch); - EXPECT_TRUE(status.ok()) << "Failed to write batch: " << status.ToString(); - // 验证插入的数据是否正确 for (size_t i = 1; i <= num_entries; ++i) { std::string key = "key_" + std::to_string(i); std::string value; - status = db_->Get(ReadOptions(), key, &value); + Status status = db_->Get(ReadOptions(), key, &value); EXPECT_TRUE(status.ok()) << "Failed to read key: " << key << ", error: " << status.ToString(); // 反序列化并验证字段值