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 db_
.reset(new sql::Connection
);
41 db_
->set_exclusive_locking();
42 db_
->set_page_size(4096);
43 if (!db_
->Open(backing_filepath_
) || !InitializeTables())
46 db_is_on_disk_
= true;
49 return DirectoryBackingStore::SaveChanges(snapshot
);
52 DirOpenResult
DeferredOnDiskDirectoryBackingStore::Load(
53 Directory::MetahandlesMap
* handles_map
,
54 JournalIndex
* delete_journals
,
55 Directory::KernelLoadInfo
* kernel_load_info
) {
56 // Open an in-memory database at first to create initial sync data needed by
58 CHECK(!db_
->is_open());
59 if (!db_
->OpenInMemory())
60 return FAILED_OPEN_DATABASE
;
62 if (!InitializeTables())
63 return FAILED_OPEN_DATABASE
;
64 if (!LoadEntries(handles_map
))
65 return FAILED_DATABASE_CORRUPT
;
66 if (!LoadInfo(kernel_load_info
))
67 return FAILED_DATABASE_CORRUPT
;
72 } // namespace syncable