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_ON_DISK_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_ON_DISK_H_
13 #include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h"
14 #include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h"
16 namespace sync_file_system {
17 namespace drive_backend {
22 class ServiceMetadata;
23 struct DatabaseContents;
24 // TODO(peria): Migrate implementation of ParentIDAndTitle structure from
25 // metadata_database_index.{cc,h} to here, on removing the files.
26 struct ParentIDAndTitle;
28 // Maintains indexes of MetadataDatabase on disk.
29 class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
31 static scoped_ptr<MetadataDatabaseIndexOnDisk> Create(LevelDBWrapper* db);
33 ~MetadataDatabaseIndexOnDisk() override;
35 // MetadataDatabaseIndexInterface overrides.
36 bool GetFileMetadata(const std::string& file_id,
37 FileMetadata* metadata) const override;
38 bool GetFileTracker(int64 tracker_id, FileTracker* tracker) const override;
39 void StoreFileMetadata(scoped_ptr<FileMetadata> metadata) override;
40 void StoreFileTracker(scoped_ptr<FileTracker> tracker) override;
41 void RemoveFileMetadata(const std::string& file_id) override;
42 void RemoveFileTracker(int64 tracker_id) override;
43 TrackerIDSet GetFileTrackerIDsByFileID(
44 const std::string& file_id) const override;
45 int64 GetAppRootTracker(const std::string& app_id) const override;
46 TrackerIDSet GetFileTrackerIDsByParentAndTitle(
47 int64 parent_tracker_id,
48 const std::string& title) const override;
49 std::vector<int64> GetFileTrackerIDsByParent(
50 int64 parent_tracker_id) const override;
51 std::string PickMultiTrackerFileID() const override;
52 ParentIDAndTitle PickMultiBackingFilePath() const override;
53 int64 PickDirtyTracker() const override;
54 void DemoteDirtyTracker(int64 tracker_id) override;
55 bool HasDemotedDirtyTracker() const override;
56 bool IsDemotedDirtyTracker(int64 tracker_id) const override;
57 void PromoteDemotedDirtyTracker(int64 tracker_id) override;
58 bool PromoteDemotedDirtyTrackers() override;
59 size_t CountDirtyTracker() const override;
60 size_t CountFileMetadata() const override;
61 size_t CountFileTracker() const override;
62 void SetSyncRootTrackerID(int64 sync_root_id) const override;
63 void SetLargestChangeID(int64 largest_change_id) const override;
64 void SetNextTrackerID(int64 next_tracker_id) const override;
65 int64 GetSyncRootTrackerID() const override;
66 int64 GetLargestChangeID() const override;
67 int64 GetNextTrackerID() const override;
68 std::vector<std::string> GetRegisteredAppIDs() const override;
69 std::vector<int64> GetAllTrackerIDs() const override;
70 std::vector<std::string> GetAllMetadataIDs() const override;
72 // Builds on-disk indexes from FileTracker entries on disk.
73 // Returns the number of newly added entries for indexing.
74 int64 BuildTrackerIndexes();
76 // Deletes entries used for indexes on on-disk database.
77 // Returns the number of the deleted entries.
78 int64 DeleteTrackerIndexes();
80 LevelDBWrapper* GetDBForTesting();
84 NONE, // No entries are found.
85 SINGLE, // One entry is found.
86 MULTIPLE, // Two or more entires are found.
89 explicit MetadataDatabaseIndexOnDisk(LevelDBWrapper* db);
91 // Maintain indexes from AppIDs to tracker IDs.
92 void AddToAppIDIndex(const FileTracker& new_tracker);
93 void UpdateInAppIDIndex(const FileTracker& old_tracker,
94 const FileTracker& new_tracker);
95 void RemoveFromAppIDIndex(const FileTracker& tracker);
97 // Maintain indexes from remote file IDs to tracker ID sets.
98 void AddToFileIDIndexes(const FileTracker& new_tracker);
99 void UpdateInFileIDIndexes(const FileTracker& old_tracker,
100 const FileTracker& new_tracker);
101 void RemoveFromFileIDIndexes(const FileTracker& tracker);
103 // Maintain indexes from path indexes to tracker ID sets
104 void AddToPathIndexes(const FileTracker& new_tracker);
105 void UpdateInPathIndexes(const FileTracker& old_tracker,
106 const FileTracker& new_tracker);
107 void RemoveFromPathIndexes(const FileTracker& tracker);
109 // Maintain dirty tracker IDs.
110 void AddToDirtyTrackerIndexes(const FileTracker& new_tracker);
111 void UpdateInDirtyTrackerIndexes(const FileTracker& old_tracker,
112 const FileTracker& new_tracker);
113 void RemoveFromDirtyTrackerIndexes(const FileTracker& tracker);
115 // Returns a TrackerIDSet built from IDs which are found with given key
117 TrackerIDSet GetTrackerIDSetByPrefix(
118 const std::string& active_tracker_key,
119 const std::string& key_prefix) const;
122 // Simulate behavior of TrackerIDSet class.
124 // Adds an entry with |key_prefix| and tracker ID of |tracker|. If |tracker|
125 // is active, an entry for |active_key| is added.
126 void AddToTrackerIDSetWithPrefix(
127 const std::string& active_tracker_key,
128 const std::string& key_prefix,
129 const FileTracker& tracker);
131 // Returns true if |tracker_id| is removed successfully. If no other entries
132 // are stored with |key_prefix|, the entry for |active_key| is also removed.
133 bool EraseInTrackerIDSetWithPrefix(
134 const std::string& active_tracker_key,
135 const std::string& key_prefix,
138 // Adds an entry for |active_key| on DB, if |tracker_id| has an entry with
140 void ActivateInTrackerIDSetWithPrefix(
141 const std::string& active_tracker_key,
142 const std::string& key_prefix,
145 // Removes an entry for |active_key| on DB, if the value of |active_key| key
147 void DeactivateInTrackerIDSetWithPrefix(
148 const std::string& active_tracker_key,
149 const std::string& key_prefix,
152 // Checks if |db_| has an entry whose key is |key|.
153 bool DBHasKey(const std::string& key) const;
155 // Returns the number of dirty trackers, actually counting them.
156 size_t CountDirtyTrackerInternal() const;
158 // Returns the number of entries starting with |prefix| in NumEntries format.
159 // Entries for |ignored_id| are not counted in.
160 NumEntries CountWithPrefix(const std::string& prefix, int64 ignored_id);
162 // Deletes entries whose keys start from |prefix|.
163 void DeleteKeyStartsWith(const std::string& prefix);
165 LevelDBWrapper* db_; // Not owned.
166 scoped_ptr<ServiceMetadata> service_metadata_;
168 size_t num_dirty_trackers_;
170 DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndexOnDisk);
173 } // namespace drive_backend
174 } // namespace sync_file_system
176 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_ON_DISK_H_