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