summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorperia@chromium.org <peria@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-12 15:47:52 +0000
committerperia@chromium.org <peria@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-12 15:49:59 +0000
commit2ef383d7cf0d5e03712a02b65de2e4a527b839aa (patch)
treefd44a71d9b1c0579e23ea322bdc4537acd668392
parentebf5edcd83865418beed53fa181cff05c3c699dc (diff)
downloadchromium_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
-rw-r--r--chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.cc14
-rw-r--r--chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h1
-rw-r--r--chrome/browser/sync_file_system/drive_backend/leveldb_wrapper_unittest.cc15
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) {