OLD | NEW |
| (Empty) |
1 // Copyright (c) 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. | |
4 | |
5 #include "sync/syncable/deferred_on_disk_directory_backing_store.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/metrics/histogram.h" | |
9 #include "base/stl_util.h" | |
10 #include "sync/syncable/syncable-inl.h" | |
11 | |
12 namespace syncer { | |
13 namespace syncable { | |
14 | |
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) { | |
20 } | |
21 | |
22 DeferredOnDiskDirectoryBackingStore::~DeferredOnDiskDirectoryBackingStore() {} | |
23 | |
24 bool DeferredOnDiskDirectoryBackingStore::SaveChanges( | |
25 const Directory::SaveChangesSnapshot& snapshot) { | |
26 DCHECK(CalledOnValidThread()); | |
27 | |
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()) { | |
32 return true; | |
33 } | |
34 | |
35 if (!db_is_on_disk_) { | |
36 if (!base::DeleteFile(backing_filepath_, false)) | |
37 return false; | |
38 | |
39 // Reopen DB on disk. | |
40 db_.reset(new sql::Connection); | |
41 db_->set_exclusive_locking(); | |
42 db_->set_page_size(4096); | |
43 if (!db_->Open(backing_filepath_) || !InitializeTables()) | |
44 return false; | |
45 | |
46 db_is_on_disk_ = true; | |
47 } | |
48 | |
49 return DirectoryBackingStore::SaveChanges(snapshot); | |
50 } | |
51 | |
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 | |
57 // Directory. | |
58 CHECK(!db_->is_open()); | |
59 if (!db_->OpenInMemory()) | |
60 return FAILED_OPEN_DATABASE; | |
61 | |
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; | |
68 | |
69 return OPENED; | |
70 } | |
71 | |
72 } // namespace syncable | |
73 } // namespace syncer | |
OLD | NEW |