1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
#include <map>
#include <set>
#include <string>
#include <vector>
#include "base/containers/hash_tables.h"
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/memory/scoped_vector.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h"
#include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h"
namespace sync_file_system {
namespace drive_backend {
class FileMetadata;
class FileTracker;
class LevelDBWrapper;
class ServiceMetadata;
} // namespace drive_backend
} // namespace sync_file_system
namespace BASE_HASH_NAMESPACE {
template<> struct hash<sync_file_system::drive_backend::ParentIDAndTitle> {
std::size_t operator()(
const sync_file_system::drive_backend::ParentIDAndTitle& v) const {
return base::HashInts64(v.parent_id, hash<std::string>()(v.title));
}
};
} // namespace BASE_HASH_NAMESPACE
namespace sync_file_system {
namespace drive_backend {
struct DatabaseContents {
DatabaseContents();
~DatabaseContents();
ScopedVector<FileMetadata> file_metadata;
ScopedVector<FileTracker> file_trackers;
};
// Maintains indexes of MetadataDatabase on memory.
class MetadataDatabaseIndex : public MetadataDatabaseIndexInterface {
public:
~MetadataDatabaseIndex() override;
static scoped_ptr<MetadataDatabaseIndex> Create(LevelDBWrapper* db);
static scoped_ptr<MetadataDatabaseIndex> CreateForTesting(
DatabaseContents* contents, LevelDBWrapper* db);
// MetadataDatabaseIndexInterface overrides.
bool GetFileMetadata(const std::string& file_id,
FileMetadata* metadata) const override;
bool GetFileTracker(int64 tracker_id, FileTracker* tracker) const override;
void StoreFileMetadata(scoped_ptr<FileMetadata> metadata) override;
void StoreFileTracker(scoped_ptr<FileTracker> tracker) override;
void RemoveFileMetadata(const std::string& file_id) override;
void RemoveFileTracker(int64 tracker_id) override;
TrackerIDSet GetFileTrackerIDsByFileID(
const std::string& file_id) const override;
int64 GetAppRootTracker(const std::string& app_id) const override;
TrackerIDSet GetFileTrackerIDsByParentAndTitle(
int64 parent_tracker_id,
const std::string& title) const override;
std::vector<int64> GetFileTrackerIDsByParent(
int64 parent_tracker_id) const override;
std::string PickMultiTrackerFileID() const override;
ParentIDAndTitle PickMultiBackingFilePath() const override;
int64 PickDirtyTracker() const override;
void DemoteDirtyTracker(int64 tracker_id) override;
bool HasDemotedDirtyTracker() const override;
bool IsDemotedDirtyTracker(int64 tracker_id) const override;
void PromoteDemotedDirtyTracker(int64 tracker_id) override;
bool PromoteDemotedDirtyTrackers() override;
size_t CountDirtyTracker() const override;
size_t CountFileMetadata() const override;
size_t CountFileTracker() const override;
void SetSyncRootTrackerID(int64 sync_root_id) const override;
void SetLargestChangeID(int64 largest_change_id) const override;
void SetNextTrackerID(int64 next_tracker_id) const override;
int64 GetSyncRootTrackerID() const override;
int64 GetLargestChangeID() const override;
int64 GetNextTrackerID() const override;
std::vector<std::string> GetRegisteredAppIDs() const override;
std::vector<int64> GetAllTrackerIDs() const override;
std::vector<std::string> GetAllMetadataIDs() const override;
private:
typedef base::ScopedPtrHashMap<std::string, FileMetadata> MetadataByID;
typedef base::ScopedPtrHashMap<int64, FileTracker> TrackerByID;
typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByFileID;
typedef base::hash_map<std::string, TrackerIDSet> TrackerIDsByTitle;
typedef std::map<int64, TrackerIDsByTitle> TrackerIDsByParentAndTitle;
typedef base::hash_map<std::string, int64> TrackerIDByAppID;
typedef base::hash_set<std::string> FileIDSet;
typedef base::hash_set<ParentIDAndTitle> PathSet;
typedef std::set<int64> DirtyTrackers;
friend class MetadataDatabaseTest;
explicit MetadataDatabaseIndex(LevelDBWrapper* db);
void Initialize(scoped_ptr<ServiceMetadata> service_metadata,
DatabaseContents* contents);
// Maintains |app_root_by_app_id_|.
void AddToAppIDIndex(const FileTracker& new_tracker);
void UpdateInAppIDIndex(const FileTracker& old_tracker,
const FileTracker& new_tracker);
void RemoveFromAppIDIndex(const FileTracker& tracker);
// Maintains |trackers_by_file_id_| and |multi_tracker_file_ids_|.
void AddToFileIDIndexes(const FileTracker& new_tracker);
void UpdateInFileIDIndexes(const FileTracker& old_tracker,
const FileTracker& new_tracker);
void RemoveFromFileIDIndexes(const FileTracker& tracker);
// Maintains |trackers_by_parent_and_title_| and |multi_backing_file_paths_|.
void AddToPathIndexes(const FileTracker& new_tracker);
void UpdateInPathIndexes(const FileTracker& old_tracker,
const FileTracker& new_tracker1);
void RemoveFromPathIndexes(const FileTracker& tracker);
// Maintains |dirty_trackers_| and |demoted_dirty_trackers_|.
void AddToDirtyTrackerIndexes(const FileTracker& new_tracker);
void UpdateInDirtyTrackerIndexes(const FileTracker& old_tracker,
const FileTracker& new_tracker);
void RemoveFromDirtyTrackerIndexes(const FileTracker& tracker);
scoped_ptr<ServiceMetadata> service_metadata_;
LevelDBWrapper* db_; // Not owned
MetadataByID metadata_by_id_;
TrackerByID tracker_by_id_;
TrackerIDByAppID app_root_by_app_id_;
TrackerIDsByFileID trackers_by_file_id_;
FileIDSet multi_tracker_file_ids_;
TrackerIDsByParentAndTitle trackers_by_parent_and_title_;
PathSet multi_backing_file_paths_;
DirtyTrackers dirty_trackers_;
DirtyTrackers demoted_dirty_trackers_;
DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndex);
};
} // namespace drive_backend
} // namespace sync_file_system
#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
|