metadata_database_index.h revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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 18namespace sync_file_system { 19namespace drive_backend { 20 21class FileMetadata; 22class FileTracker; 23struct DatabaseContents; 24 25} // namespace drive_backend 26} // namespace sync_file_system 27 28namespace BASE_HASH_NAMESPACE { 29 30#if defined(COMPILER_GCC) 31template<> 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) 38inline 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 46namespace sync_file_system { 47namespace drive_backend { 48 49// Maintains indexes of MetadataDatabase on memory. 50class 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