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 "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h" 16 #include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h" 17 18 namespace sync_file_system { 19 namespace drive_backend { 20 21 class FileMetadata; 22 class FileTracker; 23 struct DatabaseContents; 24 25 } // namespace drive_backend 26 } // namespace sync_file_system 27 28 namespace BASE_HASH_NAMESPACE { 29 30 #if defined(COMPILER_GCC) 31 template<> struct hash<sync_file_system::drive_backend::ParentIDAndTitle> { 32 std::size_t operator()( 33 const sync_file_system::drive_backend::ParentIDAndTitle& v) const { 34 return base::HashInts64(v.parent_id, hash<std::string>()(v.title)); 35 } 36 }; 37 #elif defined(COMPILER_MSVC) 38 inline size_t hash_value( 39 const sync_file_system::drive_backend::ParentIDAndTitle& v) { 40 return base::HashInts64(v.parent_id, hash_value(v.title)); 41 } 42 #endif // COMPILER 43 44 } // namespace BASE_HASH_NAMESPACE 45 46 namespace sync_file_system { 47 namespace drive_backend { 48 49 // Maintains indexes of MetadataDatabase on memory. 50 class MetadataDatabaseIndex : public MetadataDatabaseIndexInterface { 51 public: 52 explicit MetadataDatabaseIndex(DatabaseContents* content); 53 virtual ~MetadataDatabaseIndex(); 54 55 // MetadataDatabaseIndexInterface overrides. 56 virtual const FileMetadata* GetFileMetadata( 57 const std::string& file_id) const OVERRIDE; 58 virtual const FileTracker* GetFileTracker(int64 tracker_id) const OVERRIDE; 59 virtual void StoreFileMetadata(scoped_ptr<FileMetadata> metadata) OVERRIDE; 60 virtual void StoreFileTracker(scoped_ptr<FileTracker> tracker) OVERRIDE; 61 virtual void RemoveFileMetadata(const std::string& file_id) OVERRIDE; 62 virtual void RemoveFileTracker(int64 tracker_id) OVERRIDE; 63 virtual TrackerIDSet GetFileTrackerIDsByFileID( 64 const std::string& file_id) const OVERRIDE; 65 virtual int64 GetAppRootTracker(const std::string& app_id) const OVERRIDE; 66 virtual TrackerIDSet GetFileTrackerIDsByParentAndTitle( 67 int64 parent_tracker_id, 68 const std::string& title) const OVERRIDE; 69 virtual std::vector<int64> GetFileTrackerIDsByParent( 70 int64 parent_tracker_id) const OVERRIDE; 71 virtual std::string PickMultiTrackerFileID() const OVERRIDE; 72 virtual ParentIDAndTitle PickMultiBackingFilePath() const OVERRIDE; 73 virtual int64 PickDirtyTracker() const OVERRIDE; 74 virtual void DemoteDirtyTracker(int64 tracker_id) OVERRIDE; 75 virtual bool HasDemotedDirtyTracker() const OVERRIDE; 76 virtual void PromoteDemotedDirtyTrackers() OVERRIDE; 77 virtual size_t CountDirtyTracker() const OVERRIDE; 78 virtual size_t CountFileMetadata() const OVERRIDE; 79 virtual size_t CountFileTracker() const OVERRIDE; 80 virtual std::vector<std::string> GetRegisteredAppIDs() const OVERRIDE; 81 virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE; 82 virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE; 83 84 private: 85 typedef base::ScopedPtrHashMap<std::string, FileMetadata> MetadataByID; 86 typedef base::ScopedPtrHashMap<int64, FileTracker> TrackerByID; 87 typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByFileID; 88 typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByTitle; 89 typedef std::map<int64, TrackerIDsByTitle> TrackerIDsByParentAndTitle; 90 typedef base::hash_map<std::string, int64> TrackerIDByAppID; 91 typedef base::hash_set<std::string> FileIDSet; 92 typedef base::hash_set<ParentIDAndTitle> PathSet; 93 typedef std::set<int64> DirtyTrackers; 94 95 friend class MetadataDatabaseTest; 96 97 // Maintains |app_root_by_app_id_|. 98 void AddToAppIDIndex(const FileTracker& new_tracker); 99 void UpdateInAppIDIndex(const FileTracker& old_tracker, 100 const FileTracker& new_tracker); 101 void RemoveFromAppIDIndex(const FileTracker& tracker); 102 103 // Maintains |trackers_by_file_id_| and |multi_tracker_file_ids_|. 104 void AddToFileIDIndexes(const FileTracker& new_tracker); 105 void UpdateInFileIDIndexes(const FileTracker& old_tracker, 106 const FileTracker& new_tracker); 107 void RemoveFromFileIDIndexes(const FileTracker& tracker); 108 109 // Maintains |trackers_by_parent_and_title_| and |multi_backing_file_paths_|. 110 void AddToPathIndexes(const FileTracker& new_tracker); 111 void UpdateInPathIndexes(const FileTracker& old_tracker, 112 const FileTracker& new_tracker1); 113 void RemoveFromPathIndexes(const FileTracker& tracker); 114 115 // Maintains |dirty_trackers_| and |demoted_dirty_trackers_|. 116 void AddToDirtyTrackerIndexes(const FileTracker& new_tracker); 117 void UpdateInDirtyTrackerIndexes(const FileTracker& old_tracker, 118 const FileTracker& new_tracker); 119 void RemoveFromDirtyTrackerIndexes(const FileTracker& tracker); 120 121 MetadataByID metadata_by_id_; 122 TrackerByID tracker_by_id_; 123 124 TrackerIDByAppID app_root_by_app_id_; 125 126 TrackerIDsByFileID trackers_by_file_id_; 127 FileIDSet multi_tracker_file_ids_; 128 129 TrackerIDsByParentAndTitle trackers_by_parent_and_title_; 130 PathSet multi_backing_file_paths_; 131 132 DirtyTrackers dirty_trackers_; 133 DirtyTrackers demoted_dirty_trackers_; 134 135 DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndex); 136 }; 137 138 } // namespace drive_backend 139 } // namespace sync_file_system 140 141 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_ 142