metadata_database_index.h revision 116680a4aac90f2aa7413d9095a592090648e557
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
19namespace leveldb {
20class DB;
21class WriteBatch;
22}
23
24namespace sync_file_system {
25namespace drive_backend {
26
27class FileMetadata;
28class FileTracker;
29class ServiceMetadata;
30
31}  // namespace drive_backend
32}  // namespace sync_file_system
33
34namespace BASE_HASH_NAMESPACE {
35
36#if defined(COMPILER_GCC)
37template<> struct hash<sync_file_system::drive_backend::ParentIDAndTitle> {
38  std::size_t operator()(
39      const sync_file_system::drive_backend::ParentIDAndTitle& v) const {
40    return base::HashInts64(v.parent_id, hash<std::string>()(v.title));
41  }
42};
43#elif defined(COMPILER_MSVC)
44inline size_t hash_value(
45    const sync_file_system::drive_backend::ParentIDAndTitle& v) {
46  return base::HashInts64(v.parent_id, hash_value(v.title));
47}
48#endif  // COMPILER
49
50}  // namespace BASE_HASH_NAMESPACE
51
52namespace sync_file_system {
53namespace drive_backend {
54
55struct DatabaseContents {
56  DatabaseContents();
57  ~DatabaseContents();
58  ScopedVector<FileMetadata> file_metadata;
59  ScopedVector<FileTracker> file_trackers;
60};
61
62// Maintains indexes of MetadataDatabase on memory.
63class MetadataDatabaseIndex : public MetadataDatabaseIndexInterface {
64 public:
65  virtual ~MetadataDatabaseIndex();
66
67  static scoped_ptr<MetadataDatabaseIndex> Create(
68      leveldb::DB* db, leveldb::WriteBatch* batch);
69  static scoped_ptr<MetadataDatabaseIndex> CreateForTesting(
70      DatabaseContents* contents);
71
72  // MetadataDatabaseIndexInterface overrides.
73  virtual bool GetFileMetadata(
74      const std::string& file_id, FileMetadata* metadata) const OVERRIDE;
75  virtual bool GetFileTracker(
76      int64 tracker_id, FileTracker* tracker) const OVERRIDE;
77  virtual void StoreFileMetadata(
78      scoped_ptr<FileMetadata> metadata, leveldb::WriteBatch* batch) OVERRIDE;
79  virtual void StoreFileTracker(
80      scoped_ptr<FileTracker> tracker, leveldb::WriteBatch* batch) OVERRIDE;
81  virtual void RemoveFileMetadata(
82      const std::string& file_id, leveldb::WriteBatch* batch) OVERRIDE;
83  virtual void RemoveFileTracker(
84      int64 tracker_id, leveldb::WriteBatch* batch) OVERRIDE;
85  virtual TrackerIDSet GetFileTrackerIDsByFileID(
86      const std::string& file_id) const OVERRIDE;
87  virtual int64 GetAppRootTracker(const std::string& app_id) const OVERRIDE;
88  virtual TrackerIDSet GetFileTrackerIDsByParentAndTitle(
89      int64 parent_tracker_id,
90      const std::string& title) const OVERRIDE;
91  virtual std::vector<int64> GetFileTrackerIDsByParent(
92      int64 parent_tracker_id) const OVERRIDE;
93  virtual std::string PickMultiTrackerFileID() const OVERRIDE;
94  virtual ParentIDAndTitle PickMultiBackingFilePath() const OVERRIDE;
95  virtual int64 PickDirtyTracker() const OVERRIDE;
96  virtual void DemoteDirtyTracker(
97      int64 tracker_id, leveldb::WriteBatch* batch) OVERRIDE;
98  virtual bool HasDemotedDirtyTracker() const OVERRIDE;
99  virtual void PromoteDemotedDirtyTrackers(leveldb::WriteBatch* batch) OVERRIDE;
100  virtual size_t CountDirtyTracker() const OVERRIDE;
101  virtual size_t CountFileMetadata() const OVERRIDE;
102  virtual size_t CountFileTracker() const OVERRIDE;
103  virtual void SetSyncRootTrackerID(int64 sync_root_id,
104                                    leveldb::WriteBatch* batch) const OVERRIDE;
105  virtual void SetLargestChangeID(int64 largest_change_id,
106                                  leveldb::WriteBatch* batch) const OVERRIDE;
107  virtual void SetNextTrackerID(int64 next_tracker_id,
108                                leveldb::WriteBatch* batch) const OVERRIDE;
109  virtual int64 GetSyncRootTrackerID() const OVERRIDE;
110  virtual int64 GetLargestChangeID() const OVERRIDE;
111  virtual int64 GetNextTrackerID() const OVERRIDE;
112  virtual std::vector<std::string> GetRegisteredAppIDs() const OVERRIDE;
113  virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE;
114  virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE;
115
116 private:
117  typedef base::ScopedPtrHashMap<std::string, FileMetadata> MetadataByID;
118  typedef base::ScopedPtrHashMap<int64, FileTracker> TrackerByID;
119  typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByFileID;
120  typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByTitle;
121  typedef std::map<int64, TrackerIDsByTitle> TrackerIDsByParentAndTitle;
122  typedef base::hash_map<std::string, int64> TrackerIDByAppID;
123  typedef base::hash_set<std::string> FileIDSet;
124  typedef base::hash_set<ParentIDAndTitle> PathSet;
125  typedef std::set<int64> DirtyTrackers;
126
127  friend class MetadataDatabaseTest;
128
129  MetadataDatabaseIndex();
130  void Initialize(scoped_ptr<ServiceMetadata> service_metadata,
131                  DatabaseContents* contents);
132
133  // Maintains |app_root_by_app_id_|.
134  void AddToAppIDIndex(const FileTracker& new_tracker);
135  void UpdateInAppIDIndex(const FileTracker& old_tracker,
136                          const FileTracker& new_tracker);
137  void RemoveFromAppIDIndex(const FileTracker& tracker);
138
139  // Maintains |trackers_by_file_id_| and |multi_tracker_file_ids_|.
140  void AddToFileIDIndexes(const FileTracker& new_tracker);
141  void UpdateInFileIDIndexes(const FileTracker& old_tracker,
142                             const FileTracker& new_tracker);
143  void RemoveFromFileIDIndexes(const FileTracker& tracker);
144
145  // Maintains |trackers_by_parent_and_title_| and |multi_backing_file_paths_|.
146  void AddToPathIndexes(const FileTracker& new_tracker);
147  void UpdateInPathIndexes(const FileTracker& old_tracker,
148                           const FileTracker& new_tracker1);
149  void RemoveFromPathIndexes(const FileTracker& tracker);
150
151  // Maintains |dirty_trackers_| and |demoted_dirty_trackers_|.
152  void AddToDirtyTrackerIndexes(const FileTracker& new_tracker);
153  void UpdateInDirtyTrackerIndexes(const FileTracker& old_tracker,
154                                   const FileTracker& new_tracker);
155  void RemoveFromDirtyTrackerIndexes(const FileTracker& tracker);
156
157  scoped_ptr<ServiceMetadata> service_metadata_;
158
159  MetadataByID metadata_by_id_;
160  TrackerByID tracker_by_id_;
161
162  TrackerIDByAppID app_root_by_app_id_;
163
164  TrackerIDsByFileID trackers_by_file_id_;
165  FileIDSet multi_tracker_file_ids_;
166
167  TrackerIDsByParentAndTitle trackers_by_parent_and_title_;
168  PathSet multi_backing_file_paths_;
169
170  DirtyTrackers dirty_trackers_;
171  DirtyTrackers demoted_dirty_trackers_;
172
173  DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndex);
174};
175
176}  // namespace drive_backend
177}  // namespace sync_file_system
178
179#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
180