diff options
author | peria@chromium.org <peria@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-12 15:47:52 +0000 |
---|---|---|
committer | peria@chromium.org <peria@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-12 15:49:59 +0000 |
commit | 2ef383d7cf0d5e03712a02b65de2e4a527b839aa (patch) | |
tree | fd44a71d9b1c0579e23ea322bdc4537acd668392 | |
parent | ebf5edcd83865418beed53fa181cff05c3c699dc (diff) | |
download | chromium_src-2ef383d7cf0d5e03712a02b65de2e4a527b839aa.zip chromium_src-2ef383d7cf0d5e03712a02b65de2e4a527b839aa.tar.gz chromium_src-2ef383d7cf0d5e03712a02b65de2e4a527b839aa.tar.bz2 |
[SyncFS] Support Delete operation on LevelDBWrapper::Iterator
After running Delete() method, the iterator is expected to index
the next entry, if exists.
BUG=347425
TEST=./unit_tests --gtest_filter="LevelDBWrapper*"
Review URL: https://codereview.chromium.org/461823002
Cr-Commit-Position: refs/heads/master@{#288991}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288991 0039d316-1c4b-4281-b951-d872f2087c98
3 files changed, 30 insertions, 0 deletions
diff --git a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc index 3200b30..36569cb 100644 --- a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc +++ b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc @@ -67,6 +67,20 @@ void LevelDBWrapper::Iterator::Next() { AdvanceIterators(); } +void LevelDBWrapper::Iterator::Delete() { + DCHECK(Valid()); + + const std::string key_str = key().ToString(); + Transaction deletion(DELETE_OPERATION, std::string()); + map_iterator_ = db_->pending_.insert(map_iterator_, + std::make_pair(key_str, deletion)); + // In case that |db_->pending_| already had an entry for the key, we have to + // update the value. + map_iterator_->second = deletion; + + AdvanceIterators(); +} + leveldb::Slice LevelDBWrapper::Iterator::key() { DCHECK(Valid()); diff --git a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h index 9199cd4..113e718 100644 --- a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h +++ b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h @@ -56,6 +56,7 @@ class LevelDBWrapper { void SeekToFirst(); void SeekToLast(); void Next(); + void Delete(); leveldb::Slice key(); leveldb::Slice value(); diff --git a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc index 406311d..c161e0c 100644 --- a/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc +++ b/chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc @@ -113,6 +113,21 @@ TEST_F(LevelDBWrapperTest, IteratorTest) { itr->Next(); EXPECT_FALSE(itr->Valid()); + + itr->SeekToFirst(); + EXPECT_TRUE(itr->Valid()); + EXPECT_EQ("a", itr->key().ToString()); + EXPECT_EQ("1", itr->value().ToString()); + + itr->Delete(); + EXPECT_TRUE(itr->Valid()); + EXPECT_EQ("ab", itr->key().ToString()); + EXPECT_EQ("0", itr->value().ToString()); + + itr->SeekToFirst(); + EXPECT_TRUE(itr->Valid()); + EXPECT_EQ("ab", itr->key().ToString()); + EXPECT_EQ("0", itr->value().ToString()); } TEST_F(LevelDBWrapperTest, Iterator2Test) { |