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 162 163 164 165 166 167 168 169
|
// Copyright 2014 The Chromium Authors
// 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 <stddef.h>
#include <stdint.h>
#include <functional>
#include <map>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include "base/hash/hash.h"
#include "base/memory/raw_ptr.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 std {
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 std
namespace sync_file_system {
namespace drive_backend {
struct DatabaseContents {
DatabaseContents();
~DatabaseContents();
std::vector<std::unique_ptr<FileMetadata>> file_metadata;
std::vector<std::unique_ptr<FileTracker>> file_trackers;
};
// Maintains indexes of MetadataDatabase on memory.
class MetadataDatabaseIndex : public MetadataDatabaseIndexInterface {
public:
MetadataDatabaseIndex(const MetadataDatabaseIndex&) = delete;
MetadataDatabaseIndex& operator=(const MetadataDatabaseIndex&) = delete;
~MetadataDatabaseIndex() override;
static std::unique_ptr<MetadataDatabaseIndex> Create(LevelDBWrapper* db);
static std::unique_ptr<MetadataDatabaseIndex> CreateForTesting(
DatabaseContents* contents,
LevelDBWrapper* db);
// MetadataDatabaseIndexInterface overrides.
void RemoveUnreachableItems() override;
bool GetFileMetadata(const std::string& file_id,
FileMetadata* metadata) const override;
bool GetFileTracker(int64_t tracker_id, FileTracker* tracker) const override;
void StoreFileMetadata(std::unique_ptr<FileMetadata> metadata) override;
void StoreFileTracker(std::unique_ptr<FileTracker> tracker) override;
void RemoveFileMetadata(const std::string& file_id) override;
void RemoveFileTracker(int64_t tracker_id) override;
TrackerIDSet GetFileTrackerIDsByFileID(
const std::string& file_id) const override;
int64_t GetAppRootTracker(const std::string& app_id) const override;
TrackerIDSet GetFileTrackerIDsByParentAndTitle(
int64_t parent_tracker_id,
const std::string& title) const override;
std::vector<int64_t> GetFileTrackerIDsByParent(
int64_t parent_tracker_id) const override;
std::string PickMultiTrackerFileID() const override;
ParentIDAndTitle PickMultiBackingFilePath() const override;
int64_t PickDirtyTracker() const override;
void DemoteDirtyTracker(int64_t tracker_id) override;
bool HasDemotedDirtyTracker() const override;
void PromoteDemotedDirtyTracker(int64_t tracker_id) override;
bool PromoteDemotedDirtyTrackers() override;
size_t CountDirtyTracker() const override;
size_t CountFileMetadata() const override;
size_t CountFileTracker() const override;
void SetSyncRootRevalidated() const override;
void SetSyncRootTrackerID(int64_t sync_root_id) const override;
void SetLargestChangeID(int64_t largest_change_id) const override;
void SetNextTrackerID(int64_t next_tracker_id) const override;
bool IsSyncRootRevalidated() const override;
int64_t GetSyncRootTrackerID() const override;
int64_t GetLargestChangeID() const override;
int64_t GetNextTrackerID() const override;
std::vector<std::string> GetRegisteredAppIDs() const override;
private:
typedef std::unordered_map<std::string, std::unique_ptr<FileMetadata>>
MetadataByID;
typedef std::unordered_map<int64_t, std::unique_ptr<FileTracker>> TrackerByID;
typedef std::unordered_map<std::string, TrackerIDSet> TrackerIDsByFileID;
typedef std::unordered_map<std::string, TrackerIDSet> TrackerIDsByTitle;
typedef std::map<int64_t, TrackerIDsByTitle> TrackerIDsByParentAndTitle;
typedef std::unordered_map<std::string, int64_t> TrackerIDByAppID;
typedef std::unordered_set<std::string> FileIDSet;
typedef std::unordered_set<ParentIDAndTitle> PathSet;
typedef std::set<int64_t> DirtyTrackers;
friend class MetadataDatabaseTest;
explicit MetadataDatabaseIndex(LevelDBWrapper* db);
void Initialize(std::unique_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);
std::unique_ptr<ServiceMetadata> service_metadata_;
raw_ptr<LevelDBWrapper, DanglingUntriaged> 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_;
};
} // namespace drive_backend
} // namespace sync_file_system
#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_H_
|