Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / metadata_database_index.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_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
7
8 #include <map>
9 #include <set>
10 #include <string>
11 #include <vector>
12
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"
18
19 namespace sync_file_system {
20 namespace drive_backend {
21
22 class FileMetadata;
23 class FileTracker;
24 class LevelDBWrapper;
25 class ServiceMetadata;
26
27 }  // namespace drive_backend
28 }  // namespace sync_file_system
29
30 namespace BASE_HASH_NAMESPACE {
31
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));
37   }
38 };
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));
43 }
44 #endif  // COMPILER
45
46 }  // namespace BASE_HASH_NAMESPACE
47
48 namespace sync_file_system {
49 namespace drive_backend {
50
51 struct DatabaseContents {
52   DatabaseContents();
53   ~DatabaseContents();
54   ScopedVector<FileMetadata> file_metadata;
55   ScopedVector<FileTracker> file_trackers;
56 };
57
58 // Maintains indexes of MetadataDatabase on memory.
59 class MetadataDatabaseIndex : public MetadataDatabaseIndexInterface {
60  public:
61   virtual ~MetadataDatabaseIndex();
62
63   static scoped_ptr<MetadataDatabaseIndex> Create(LevelDBWrapper* db);
64   static scoped_ptr<MetadataDatabaseIndex> CreateForTesting(
65       DatabaseContents* contents, LevelDBWrapper* db);
66
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;
103
104  private:
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;
114
115   friend class MetadataDatabaseTest;
116
117   explicit MetadataDatabaseIndex(LevelDBWrapper* db);
118   void Initialize(scoped_ptr<ServiceMetadata> service_metadata,
119                   DatabaseContents* contents);
120
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);
126
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);
132
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);
138
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);
144
145   scoped_ptr<ServiceMetadata> service_metadata_;
146   LevelDBWrapper* db_;  // Not owned
147
148   MetadataByID metadata_by_id_;
149   TrackerByID tracker_by_id_;
150
151   TrackerIDByAppID app_root_by_app_id_;
152
153   TrackerIDsByFileID trackers_by_file_id_;
154   FileIDSet multi_tracker_file_ids_;
155
156   TrackerIDsByParentAndTitle trackers_by_parent_and_title_;
157   PathSet multi_backing_file_paths_;
158
159   DirtyTrackers dirty_trackers_;
160   DirtyTrackers demoted_dirty_trackers_;
161
162   DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndex);
163 };
164
165 }  // namespace drive_backend
166 }  // namespace sync_file_system
167
168 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_