Index: chrome/browser/chromeos/drive/drive_resource_metadata_storage.cc |
diff --git a/chrome/browser/chromeos/drive/drive_resource_metadata_storage.cc b/chrome/browser/chromeos/drive/drive_resource_metadata_storage.cc |
index 3c887a9cfd06d0ca00cbd818d2c80231080a2fa5..ee8f1788bc66da905ef29a33c056d6ac3c66b661 100644 |
--- a/chrome/browser/chromeos/drive/drive_resource_metadata_storage.cc |
+++ b/chrome/browser/chromeos/drive/drive_resource_metadata_storage.cc |
@@ -10,6 +10,7 @@ |
#include "base/threading/thread_restrictions.h" |
#include "chrome/browser/chromeos/drive/drive.pb.h" |
#include "third_party/leveldatabase/src/include/leveldb/db.h" |
+#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
namespace drive { |
@@ -31,16 +32,6 @@ std::string GetHeaderDBKey() { |
return key; |
} |
-// Returns a string to be used as a key for child entry. |
-std::string GetChildEntryKey(const std::string& parent_resource_id, |
- const std::string& child_name) { |
- std::string key = parent_resource_id; |
- key.push_back(kDBKeyDelimeter); |
- key.append(child_name); |
- key.push_back(kDBKeyDelimeter); |
- return key; |
-} |
- |
// Returns true if |key| is a key for a child entry. |
bool IsChildEntryKey(const leveldb::Slice& key) { |
return !key.empty() && key[key.size() - 1] == kDBKeyDelimeter; |
@@ -132,21 +123,37 @@ int64 DriveResourceMetadataStorage::GetLargestChangestamp() { |
return header->largest_changestamp(); |
} |
-void DriveResourceMetadataStorage::PutEntry(const DriveEntryProto& entry) { |
+bool DriveResourceMetadataStorage::PutEntry(const DriveEntryProto& entry) { |
base::ThreadRestrictions::AssertIOAllowed(); |
DCHECK(!entry.resource_id().empty()); |
std::string serialized_entry; |
if (!entry.SerializeToString(&serialized_entry)) { |
DLOG(ERROR) << "Failed to serialize the entry: " << entry.resource_id(); |
- return; |
+ return false; |
} |
- const leveldb::Status status = resource_map_->Put( |
- leveldb::WriteOptions(), |
- leveldb::Slice(entry.resource_id()), |
- leveldb::Slice(serialized_entry)); |
- DCHECK(status.ok()); |
+ leveldb::WriteBatch batch; |
+ |
+ // Remove from the old parent. |
+ scoped_ptr<DriveEntryProto> old_entry = GetEntry(entry.resource_id()); |
+ if (old_entry && !old_entry->parent_resource_id().empty()) { |
+ batch.Delete(GetChildEntryKey(old_entry->parent_resource_id(), |
+ old_entry->base_name())); |
+ } |
+ |
+ // Add to the new parent. |
+ if (!entry.parent_resource_id().empty()) { |
+ batch.Put(GetChildEntryKey(entry.parent_resource_id(), entry.base_name()), |
+ entry.resource_id()); |
+ } |
+ |
+ // Put the entry itself. |
+ batch.Put(entry.resource_id(), serialized_entry); |
+ |
+ const leveldb::Status status = resource_map_->Write(leveldb::WriteOptions(), |
+ &batch); |
+ return status.ok(); |
} |
scoped_ptr<DriveEntryProto> DriveResourceMetadataStorage::GetEntry( |
@@ -167,14 +174,27 @@ scoped_ptr<DriveEntryProto> DriveResourceMetadataStorage::GetEntry( |
return entry.Pass(); |
} |
-void DriveResourceMetadataStorage::RemoveEntry(const std::string& resource_id) { |
+bool DriveResourceMetadataStorage::RemoveEntry(const std::string& resource_id) { |
base::ThreadRestrictions::AssertIOAllowed(); |
DCHECK(!resource_id.empty()); |
- const leveldb::Status status = resource_map_->Delete( |
- leveldb::WriteOptions(), |
- leveldb::Slice(resource_id)); |
- DCHECK(status.ok()); |
+ scoped_ptr<DriveEntryProto> entry = GetEntry(resource_id); |
+ if (!entry) |
+ return false; |
+ |
+ leveldb::WriteBatch batch; |
+ |
+ // Remove from the parent. |
+ if (!entry->parent_resource_id().empty()) { |
+ batch.Delete(GetChildEntryKey(entry->parent_resource_id(), |
+ entry->base_name())); |
+ } |
+ // Remove the entry itself. |
+ batch.Delete(resource_id); |
+ |
+ const leveldb::Status status = resource_map_->Write(leveldb::WriteOptions(), |
+ &batch); |
+ return status.ok(); |
} |
void DriveResourceMetadataStorage::Iterate(const IterateCallback& callback) { |
@@ -198,19 +218,6 @@ void DriveResourceMetadataStorage::Iterate(const IterateCallback& callback) { |
} |
} |
-void DriveResourceMetadataStorage::PutChild( |
- const std::string& parent_resource_id, |
- const std::string& child_name, |
- const std::string& child_resource_id) { |
- base::ThreadRestrictions::AssertIOAllowed(); |
- |
- const leveldb::Status status = resource_map_->Put( |
- leveldb::WriteOptions(), |
- leveldb::Slice(GetChildEntryKey(parent_resource_id, child_name)), |
- leveldb::Slice(child_resource_id)); |
- DCHECK(status.ok()); |
-} |
- |
std::string DriveResourceMetadataStorage::GetChild( |
const std::string& parent_resource_id, |
const std::string& child_name) { |
@@ -241,15 +248,15 @@ void DriveResourceMetadataStorage::GetChildren( |
DCHECK(it->status().ok()); |
} |
-void DriveResourceMetadataStorage::RemoveChild( |
+// static |
+std::string DriveResourceMetadataStorage::GetChildEntryKey( |
const std::string& parent_resource_id, |
const std::string& child_name) { |
- base::ThreadRestrictions::AssertIOAllowed(); |
- |
- const leveldb::Status status = resource_map_->Delete( |
- leveldb::WriteOptions(), |
- leveldb::Slice(GetChildEntryKey(parent_resource_id, child_name))); |
- DCHECK(status.ok()); |
+ std::string key = parent_resource_id; |
+ key.push_back(kDBKeyDelimeter); |
+ key.append(child_name); |
+ key.push_back(kDBKeyDelimeter); |
+ return key; |
} |
void DriveResourceMetadataStorage::PutHeader( |