| // Copyright 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_file_path) |
| : OnDiskDirectoryBackingStore(dir_name, backing_file_path), |
| created_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.HasUnsavedMetahandleChanges()) { |
| return true; |
| } |
| if (!created_on_disk_ && !CreateOnDisk()) |
| return false; |
| return OnDiskDirectoryBackingStore::SaveChanges(snapshot); |
| } |
| |
| bool DeferredOnDiskDirectoryBackingStore::CreateOnDisk() { |
| DCHECK(CalledOnValidThread()); |
| DCHECK(!created_on_disk_); |
| ResetAndCreateConnection(); |
| if (!base::DeleteFile(backing_file_path(), false)) |
| return false; |
| if (!Open(backing_file_path()) || !InitializeTables()) |
| return false; |
| created_on_disk_ = true; |
| return true; |
| } |
| |
| DirOpenResult DeferredOnDiskDirectoryBackingStore::Load( |
| Directory::MetahandlesMap* handles_map, |
| JournalIndex* delete_journals, |
| MetahandleSet* metahandles_to_purge, |
| Directory::KernelLoadInfo* kernel_load_info) { |
| DCHECK(CalledOnValidThread()); |
| // Open an in-memory database at first to create initial sync data needed by |
| // Directory. |
| CHECK(!IsOpen()); |
| if (!OpenInMemory()) |
| return FAILED_OPEN_DATABASE; |
| |
| if (!InitializeTables()) |
| return FAILED_OPEN_DATABASE; |
| if (!LoadEntries(handles_map, metahandles_to_purge)) |
| return FAILED_DATABASE_CORRUPT; |
| if (!LoadInfo(kernel_load_info)) |
| return FAILED_DATABASE_CORRUPT; |
| |
| return OPENED; |
| } |
| |
| } // namespace syncable |
| } // namespace syncer |