Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / metadata_database_index_on_disk.h
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.
4
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_
7
8 #include <map>
9 #include <set>
10 #include <string>
11 #include <vector>
12
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"
15
16 namespace sync_file_system {
17 namespace drive_backend {
18
19 class FileMetadata;
20 class FileTracker;
21 class LevelDBWrapper;
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;
27
28 // Maintains indexes of MetadataDatabase on disk.
29 class MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface {
30  public:
31   static scoped_ptr<MetadataDatabaseIndexOnDisk>  Create(LevelDBWrapper* db);
32
33   ~MetadataDatabaseIndexOnDisk() override;
34
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;
71
72   // Builds on-disk indexes from FileTracker entries on disk.
73   // Returns the number of newly added entries for indexing.
74   int64 BuildTrackerIndexes();
75
76   // Deletes entries used for indexes on on-disk database.
77   // Returns the number of the deleted entries.
78   int64 DeleteTrackerIndexes();
79
80   LevelDBWrapper* GetDBForTesting();
81
82  private:
83   enum NumEntries {
84     NONE,      // No entries are found.
85     SINGLE,    // One entry is found.
86     MULTIPLE,  // Two or more entires are found.
87   };
88
89   explicit MetadataDatabaseIndexOnDisk(LevelDBWrapper* db);
90
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);
96
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);
102
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);
108
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);
114
115   // Returns a TrackerIDSet built from IDs which are found with given key
116   // and key prefix.
117   TrackerIDSet GetTrackerIDSetByPrefix(
118       const std::string& active_tracker_key,
119       const std::string& key_prefix) const;
120
121
122   // Simulate behavior of TrackerIDSet class.
123
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);
130
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,
136       int64 tracker_id);
137
138   // Adds an entry for |active_key| on DB, if |tracker_id| has an entry with
139   // |key_prefix|.
140   void ActivateInTrackerIDSetWithPrefix(
141       const std::string& active_tracker_key,
142       const std::string& key_prefix,
143       int64 tracker_id);
144
145   // Removes an entry for |active_key| on DB, if the value of |active_key| key
146   // is |tracker_id|.
147   void DeactivateInTrackerIDSetWithPrefix(
148       const std::string& active_tracker_key,
149       const std::string& key_prefix,
150       int64 tracker_id);
151
152   // Checks if |db_| has an entry whose key is |key|.
153   bool DBHasKey(const std::string& key) const;
154
155   // Returns the number of dirty trackers, actually counting them.
156   size_t CountDirtyTrackerInternal() const;
157
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);
161
162   // Deletes entries whose keys start from |prefix|.
163   void DeleteKeyStartsWith(const std::string& prefix);
164
165   LevelDBWrapper* db_;  // Not owned.
166   scoped_ptr<ServiceMetadata> service_metadata_;
167
168   size_t num_dirty_trackers_;
169
170   DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndexOnDisk);
171 };
172
173 }  // namespace drive_backend
174 }  // namespace sync_file_system
175
176 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_ON_DISK_H_