diff options
Diffstat (limited to 'db')
-rw-r--r-- | db/c.cc | 25 | ||||
-rw-r--r-- | db/db_iter.cc | 3 | ||||
-rw-r--r-- | db/db_test.cc | 15 |
3 files changed, 38 insertions, 5 deletions
@@ -15,7 +15,26 @@ #include "leveldb/status.h" #include "leveldb/write_batch.h" -namespace leveldb { +using leveldb::Cache; +using leveldb::Comparator; +using leveldb::CompressionType; +using leveldb::DB; +using leveldb::Env; +using leveldb::FileLock; +using leveldb::Iterator; +using leveldb::Logger; +using leveldb::NewLRUCache; +using leveldb::Options; +using leveldb::RandomAccessFile; +using leveldb::Range; +using leveldb::ReadOptions; +using leveldb::SequentialFile; +using leveldb::Slice; +using leveldb::Snapshot; +using leveldb::Status; +using leveldb::WritableFile; +using leveldb::WriteBatch; +using leveldb::WriteOptions; extern "C" { @@ -172,7 +191,7 @@ void leveldb_release_snapshot( delete snapshot; } -const char* leveldb_property_value( +char* leveldb_property_value( leveldb_t* db, const char* propname) { std::string tmp; @@ -449,5 +468,3 @@ void leveldb_env_destroy(leveldb_env_t* env) { } } // end extern "C" - -} diff --git a/db/db_iter.cc b/db/db_iter.cc index 0be18ff..8849f92 100644 --- a/db/db_iter.cc +++ b/db/db_iter.cc @@ -216,7 +216,6 @@ void DBIter::FindPrevUserEntry() { ValueType value_type = kTypeDeletion; if (iter_->Valid()) { - SaveKey(ExtractUserKey(iter_->key()), &saved_key_); do { ParsedInternalKey ikey; if (ParseKey(&ikey) && ikey.sequence <= sequence_) { @@ -227,6 +226,7 @@ void DBIter::FindPrevUserEntry() { } value_type = ikey.type; if (value_type == kTypeDeletion) { + saved_key_.clear(); ClearSavedValue(); } else { Slice raw_value = iter_->value(); @@ -234,6 +234,7 @@ void DBIter::FindPrevUserEntry() { std::string empty; swap(empty, saved_value_); } + SaveKey(ExtractUserKey(iter_->key()), &saved_key_); saved_value_.assign(raw_value.data(), raw_value.size()); } } diff --git a/db/db_test.cc b/db/db_test.cc index 22fa70c..14eb44d 100644 --- a/db/db_test.cc +++ b/db/db_test.cc @@ -519,6 +519,21 @@ TEST(DBTest, IterSmallAndLargeMix) { delete iter; } +TEST(DBTest, IterMultiWithDelete) { + ASSERT_OK(Put("a", "va")); + ASSERT_OK(Put("b", "vb")); + ASSERT_OK(Put("c", "vc")); + ASSERT_OK(Delete("b")); + ASSERT_EQ("NOT_FOUND", Get("b")); + + Iterator* iter = db_->NewIterator(ReadOptions()); + iter->Seek("c"); + ASSERT_EQ(IterStatus(iter), "c->vc"); + iter->Prev(); + ASSERT_EQ(IterStatus(iter), "a->va"); + delete iter; +} + TEST(DBTest, Recover) { ASSERT_OK(Put("foo", "v1")); ASSERT_OK(Put("baz", "v5")); |