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 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
13 #include "base/containers/hash_tables.h"
14 #include "base/containers/scoped_ptr_hash_map.h"
15 #include "base/memory/scoped_vector.h"
16 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h"
17 #include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h"
19 namespace sync_file_system {
20 namespace drive_backend {
25 class ServiceMetadata;
27 } // namespace drive_backend
28 } // namespace sync_file_system
30 namespace BASE_HASH_NAMESPACE {
32 #if defined(COMPILER_GCC)
33 template<> struct hash<sync_file_system::drive_backend::ParentIDAndTitle> {
34 std::size_t operator()(
35 const sync_file_system::drive_backend::ParentIDAndTitle& v) const {
36 return base::HashInts64(v.parent_id, hash<std::string>()(v.title));
39 #elif defined(COMPILER_MSVC)
40 inline size_t hash_value(
41 const sync_file_system::drive_backend::ParentIDAndTitle& v) {
42 return base::HashInts64(v.parent_id, hash_value(v.title));
46 } // namespace BASE_HASH_NAMESPACE
48 namespace sync_file_system {
49 namespace drive_backend {
51 struct DatabaseContents {
54 ScopedVector<FileMetadata> file_metadata;
55 ScopedVector<FileTracker> file_trackers;
58 // Maintains indexes of MetadataDatabase on memory.
59 class MetadataDatabaseIndex : public MetadataDatabaseIndexInterface {
61 virtual ~MetadataDatabaseIndex();
63 static scoped_ptr<MetadataDatabaseIndex> Create(LevelDBWrapper* db);
64 static scoped_ptr<MetadataDatabaseIndex> CreateForTesting(
65 DatabaseContents* contents, LevelDBWrapper* db);
67 // MetadataDatabaseIndexInterface overrides.
68 virtual bool GetFileMetadata(
69 const std::string& file_id, FileMetadata* metadata) const OVERRIDE;
70 virtual bool GetFileTracker(
71 int64 tracker_id, FileTracker* tracker) const OVERRIDE;
72 virtual void StoreFileMetadata(scoped_ptr<FileMetadata> metadata) OVERRIDE;
73 virtual void StoreFileTracker(scoped_ptr<FileTracker> tracker) OVERRIDE;
74 virtual void RemoveFileMetadata(const std::string& file_id) OVERRIDE;
75 virtual void RemoveFileTracker(int64 tracker_id) OVERRIDE;
76 virtual TrackerIDSet GetFileTrackerIDsByFileID(
77 const std::string& file_id) const OVERRIDE;
78 virtual int64 GetAppRootTracker(const std::string& app_id) const OVERRIDE;
79 virtual TrackerIDSet GetFileTrackerIDsByParentAndTitle(
80 int64 parent_tracker_id,
81 const std::string& title) const OVERRIDE;
82 virtual std::vector<int64> GetFileTrackerIDsByParent(
83 int64 parent_tracker_id) const OVERRIDE;
84 virtual std::string PickMultiTrackerFileID() const OVERRIDE;
85 virtual ParentIDAndTitle PickMultiBackingFilePath() const OVERRIDE;
86 virtual int64 PickDirtyTracker() const OVERRIDE;
87 virtual void DemoteDirtyTracker(int64 tracker_id) OVERRIDE;
88 virtual bool HasDemotedDirtyTracker() const OVERRIDE;
89 virtual void PromoteDemotedDirtyTracker(int64 tracker_id) OVERRIDE;
90 virtual bool PromoteDemotedDirtyTrackers() OVERRIDE;
91 virtual size_t CountDirtyTracker() const OVERRIDE;
92 virtual size_t CountFileMetadata() const OVERRIDE;
93 virtual size_t CountFileTracker() const OVERRIDE;
94 virtual void SetSyncRootTrackerID(int64 sync_root_id) const OVERRIDE;
95 virtual void SetLargestChangeID(int64 largest_change_id) const OVERRIDE;
96 virtual void SetNextTrackerID(int64 next_tracker_id) const OVERRIDE;
97 virtual int64 GetSyncRootTrackerID() const OVERRIDE;
98 virtual int64 GetLargestChangeID() const OVERRIDE;
99 virtual int64 GetNextTrackerID() const OVERRIDE;
100 virtual std::vector<std::string> GetRegisteredAppIDs() const OVERRIDE;
101 virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE;
102 virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE;
105 typedef base::ScopedPtrHashMap<std::string, FileMetadata> MetadataByID;
106 typedef base::ScopedPtrHashMap<int64, FileTracker> TrackerByID;
107 typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByFileID;
108 typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByTitle;
109 typedef std::map<int64, TrackerIDsByTitle> TrackerIDsByParentAndTitle;
110 typedef base::hash_map<std::string, int64> TrackerIDByAppID;
111 typedef base::hash_set<std::string> FileIDSet;
112 typedef base::hash_set<ParentIDAndTitle> PathSet;
113 typedef std::set<int64> DirtyTrackers;
115 friend class MetadataDatabaseTest;
117 explicit MetadataDatabaseIndex(LevelDBWrapper* db);
118 void Initialize(scoped_ptr<ServiceMetadata> service_metadata,
119 DatabaseContents* contents);
121 // Maintains |app_root_by_app_id_|.
122 void AddToAppIDIndex(const FileTracker& new_tracker);
123 void UpdateInAppIDIndex(const FileTracker& old_tracker,
124 const FileTracker& new_tracker);
125 void RemoveFromAppIDIndex(const FileTracker& tracker);
127 // Maintains |trackers_by_file_id_| and |multi_tracker_file_ids_|.
128 void AddToFileIDIndexes(const FileTracker& new_tracker);
129 void UpdateInFileIDIndexes(const FileTracker& old_tracker,
130 const FileTracker& new_tracker);
131 void RemoveFromFileIDIndexes(const FileTracker& tracker);
133 // Maintains |trackers_by_parent_and_title_| and |multi_backing_file_paths_|.
134 void AddToPathIndexes(const FileTracker& new_tracker);
135 void UpdateInPathIndexes(const FileTracker& old_tracker,
136 const FileTracker& new_tracker1);
137 void RemoveFromPathIndexes(const FileTracker& tracker);
139 // Maintains |dirty_trackers_| and |demoted_dirty_trackers_|.
140 void AddToDirtyTrackerIndexes(const FileTracker& new_tracker);
141 void UpdateInDirtyTrackerIndexes(const FileTracker& old_tracker,
142 const FileTracker& new_tracker);
143 void RemoveFromDirtyTrackerIndexes(const FileTracker& tracker);
145 scoped_ptr<ServiceMetadata> service_metadata_;
146 LevelDBWrapper* db_; // Not owned
148 MetadataByID metadata_by_id_;
149 TrackerByID tracker_by_id_;
151 TrackerIDByAppID app_root_by_app_id_;
153 TrackerIDsByFileID trackers_by_file_id_;
154 FileIDSet multi_tracker_file_ids_;
156 TrackerIDsByParentAndTitle trackers_by_parent_and_title_;
157 PathSet multi_backing_file_paths_;
159 DirtyTrackers dirty_trackers_;
160 DirtyTrackers demoted_dirty_trackers_;
162 DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndex);
165 } // namespace drive_backend
166 } // namespace sync_file_system
168 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_