diff --git a/1 b/1 deleted file mode 100755 index 13d81a8..0000000 Binary files a/1 and /dev/null differ diff --git a/db/fields.cpp b/db/fields.cpp index f90a715..2d76a6c 100644 --- a/db/fields.cpp +++ b/db/fields.cpp @@ -1,9 +1,9 @@ -#include "fields.h" -#include "util/coding.h" - #include #include +#include "fields.h" +#include "util/coding.h" +#include "dbformat.h" namespace leveldb { @@ -163,24 +163,75 @@ std::string& Fields::operator[](const std::string& field_name) { } /* 通过若干个字段查询 Key */ +//std::vector Fields::FindKeysByFields(leveldb::DB* db, const FieldArray& fields) { +// Fields to_fields = Fields(fields); +// to_fields.Fields::SortFields(); +// FieldArray search_fields_ = to_fields.fields_; +// +// std::vector find_keys; +// +// Iterator* it = db->NewIterator(leveldb::ReadOptions()); +// for (it->SeekToFirst(); it->Valid(); it->Next()) { +// +// Slice iter_key_slice = it->key(); +// Slice iter_key_for_parse; +// if (!GetLengthPrefixedSlice(&iter_key_slice, &iter_key_for_parse)) { +// continue; +// } +// +// std::string iter_key = iter_key_for_parse.ToString(); +// if (std::find(find_keys.begin(), find_keys.end(), iter_key) != find_keys.end()){ +// continue; +// } +// +// 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())) { +// find_keys.emplace_back(iter_key); +// } +// } +// +// assert(it->status().ok()); +// delete it; +// +// return find_keys; +//} + std::vector Fields::FindKeysByFields(leveldb::DB* db, const FieldArray& fields) { Fields to_fields = Fields(fields); to_fields.Fields::SortFields(); FieldArray search_fields_ = to_fields.fields_; std::vector find_keys; + std::vector deleted_keys; Iterator* it = db->NewIterator(leveldb::ReadOptions()); for (it->SeekToFirst(); it->Valid(); it->Next()) { Slice iter_key_slice = it->key(); + const char* p = iter_key_slice.data(); + const char* limit = p + iter_key_slice.size(); +// const char* limit = p + 5; + + uint32_t key_length; + const char* key_ptr = GetVarint32Ptr(p, limit, &key_length); + + iter_key_slice = Slice(p, iter_key_slice.size() - 8); Slice iter_key_for_parse; if (!GetLengthPrefixedSlice(&iter_key_slice, &iter_key_for_parse)) { continue; } std::string iter_key = iter_key_for_parse.ToString(); - if (std::find(find_keys.begin(), find_keys.end(), iter_key) != find_keys.end()){ + 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; + } + + const uint64_t tag = DecodeFixed64(key_ptr + key_length - 8); + if ((tag & 0xff) == kTypeDeletion) { + deleted_keys.emplace_back(iter_key); continue; }