1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "sync/syncable/deferred_on_disk_directory_backing_store.h"
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/stl_util.h"
10 #include "sync/syncable/syncable-inl.h"
15 DeferredOnDiskDirectoryBackingStore::DeferredOnDiskDirectoryBackingStore(
16 const std::string
& dir_name
, const base::FilePath
& backing_filepath
)
17 : DirectoryBackingStore(dir_name
),
18 backing_filepath_(backing_filepath
),
19 db_is_on_disk_(false) {
22 DeferredOnDiskDirectoryBackingStore::~DeferredOnDiskDirectoryBackingStore() {}
24 bool DeferredOnDiskDirectoryBackingStore::SaveChanges(
25 const Directory::SaveChangesSnapshot
& snapshot
) {
26 DCHECK(CalledOnValidThread());
28 // Back out early if there is nothing to save.
29 if (snapshot
.dirty_metas
.empty() && snapshot
.metahandles_to_purge
.empty() &&
30 snapshot
.delete_journals
.empty() &&
31 snapshot
.delete_journals_to_purge
.empty()) {
35 if (!db_is_on_disk_
) {
36 if (!base::DeleteFile(backing_filepath_
, false))
40 ResetAndCreateConnection();
41 if (!db_
->Open(backing_filepath_
) || !InitializeTables())
44 db_is_on_disk_
= true;
47 return DirectoryBackingStore::SaveChanges(snapshot
);
50 DirOpenResult
DeferredOnDiskDirectoryBackingStore::Load(
51 Directory::MetahandlesMap
* handles_map
,
52 JournalIndex
* delete_journals
,
53 MetahandleSet
* metahandles_to_purge
,
54 Directory::KernelLoadInfo
* kernel_load_info
) {
55 // Open an in-memory database at first to create initial sync data needed by
57 CHECK(!db_
->is_open());
58 if (!db_
->OpenInMemory())
59 return FAILED_OPEN_DATABASE
;
61 if (!InitializeTables())
62 return FAILED_OPEN_DATABASE
;
63 if (!LoadEntries(handles_map
, metahandles_to_purge
))
64 return FAILED_DATABASE_CORRUPT
;
65 if (!LoadInfo(kernel_load_info
))
66 return FAILED_DATABASE_CORRUPT
;
71 } // namespace syncable