Home | History | Annotate | Download | only in drive_backend
      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