| Index: sync/syncable/deferred_on_disk_directory_backing_store.cc
|
| diff --git a/sync/syncable/deferred_on_disk_directory_backing_store.cc b/sync/syncable/deferred_on_disk_directory_backing_store.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..04540803f1bd199bf4ef77a2c3f6b0a0ea14d45c
|
| --- /dev/null
|
| +++ b/sync/syncable/deferred_on_disk_directory_backing_store.cc
|
| @@ -0,0 +1,73 @@
|
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "sync/syncable/deferred_on_disk_directory_backing_store.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/metrics/histogram.h"
|
| +#include "base/stl_util.h"
|
| +#include "sync/syncable/syncable-inl.h"
|
| +
|
| +namespace syncer {
|
| +namespace syncable {
|
| +
|
| +DeferredOnDiskDirectoryBackingStore::DeferredOnDiskDirectoryBackingStore(
|
| + const std::string& dir_name, const base::FilePath& backing_filepath)
|
| + : DirectoryBackingStore(dir_name),
|
| + backing_filepath_(backing_filepath),
|
| + db_is_on_disk_(false) {
|
| +}
|
| +
|
| +DeferredOnDiskDirectoryBackingStore::~DeferredOnDiskDirectoryBackingStore() {}
|
| +
|
| +bool DeferredOnDiskDirectoryBackingStore::SaveChanges(
|
| + const Directory::SaveChangesSnapshot& snapshot) {
|
| + DCHECK(CalledOnValidThread());
|
| +
|
| + // Back out early if there is nothing to save.
|
| + if (snapshot.dirty_metas.empty() && snapshot.metahandles_to_purge.empty() &&
|
| + snapshot.delete_journals.empty() &&
|
| + snapshot.delete_journals_to_purge.empty()) {
|
| + return true;
|
| + }
|
| +
|
| + if (!db_is_on_disk_) {
|
| + if (!base::DeleteFile(backing_filepath_, false))
|
| + return false;
|
| +
|
| + // Reopen DB on disk.
|
| + db_.reset(new sql::Connection);
|
| + db_->set_exclusive_locking();
|
| + db_->set_page_size(4096);
|
| + if (!db_->Open(backing_filepath_) || !InitializeTables())
|
| + return false;
|
| +
|
| + db_is_on_disk_ = true;
|
| + }
|
| +
|
| + return DirectoryBackingStore::SaveChanges(snapshot);
|
| +}
|
| +
|
| +DirOpenResult DeferredOnDiskDirectoryBackingStore::Load(
|
| + Directory::MetahandlesMap* handles_map,
|
| + JournalIndex* delete_journals,
|
| + Directory::KernelLoadInfo* kernel_load_info) {
|
| + // Open an in-memory database at first to create initial sync data needed by
|
| + // Directory.
|
| + CHECK(!db_->is_open());
|
| + if (!db_->OpenInMemory())
|
| + return FAILED_OPEN_DATABASE;
|
| +
|
| + if (!InitializeTables())
|
| + return FAILED_OPEN_DATABASE;
|
| + if (!LoadEntries(handles_map))
|
| + return FAILED_DATABASE_CORRUPT;
|
| + if (!LoadInfo(kernel_load_info))
|
| + return FAILED_DATABASE_CORRUPT;
|
| +
|
| + return OPENED;
|
| +}
|
| +
|
| +} // namespace syncable
|
| +} // namespace syncer
|
|
|