blob: 4d098f4958f5f21fd9d159cf0de4489ca8cdaa89 [file] [log] [blame]
// 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 leveldb {
class DB;
class WriteBatch;
}
namespace sync_file_system {
namespace drive_backend {
class FileMetadata;
class FileTracker;
class ServiceMetadata;
} // namespace drive_backend
} // namespace sync_file_system
namespace BASE_HASH_NAMESPACE {
#if defined(COMPILER_GCC)
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));
}
};
#elif defined(COMPILER_MSVC)
inline size_t hash_value(
const sync_file_system::drive_backend::ParentIDAndTitle& v) {
return base::HashInts64(v.parent_id, hash_value(v.title));
}
#endif // COMPILER
} // 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:
virtual ~MetadataDatabaseIndex();
static scoped_ptr<MetadataDatabaseIndex> Create(
leveldb::DB* db, leveldb::WriteBatch* batch);
static scoped_ptr<MetadataDatabaseIndex> CreateForTesting(
DatabaseContents* contents);
// MetadataDatabaseIndexInterface overrides.
virtual bool GetFileMetadata(
const std::string& file_id, FileMetadata* metadata) const OVERRIDE;
virtual bool GetFileTracker(
int64 tracker_id, FileTracker* tracker) const OVERRIDE;
virtual void StoreFileMetadata(
scoped_ptr<FileMetadata> metadata, leveldb::WriteBatch* batch) OVERRIDE;
virtual void StoreFileTracker(
scoped_ptr<FileTracker> tracker, leveldb::WriteBatch* batch) OVERRIDE;
virtual void RemoveFileMetadata(
const std::string& file_id, leveldb::WriteBatch* batch) OVERRIDE;
virtual void RemoveFileTracker(
int64 tracker_id, leveldb::WriteBatch* batch) OVERRIDE;
virtual TrackerIDSet GetFileTrackerIDsByFileID(
const std::string& file_id) const OVERRIDE;
virtual int64 GetAppRootTracker(const std::string& app_id) const OVERRIDE;
virtual TrackerIDSet GetFileTrackerIDsByParentAndTitle(
int64 parent_tracker_id,
const std::string& title) const OVERRIDE;
virtual std::vector<int64> GetFileTrackerIDsByParent(
int64 parent_tracker_id) const OVERRIDE;
virtual std::string PickMultiTrackerFileID() const OVERRIDE;
virtual ParentIDAndTitle PickMultiBackingFilePath() const OVERRIDE;
virtual int64 PickDirtyTracker() const OVERRIDE;
virtual void DemoteDirtyTracker(
int64 tracker_id, leveldb::WriteBatch* batch) OVERRIDE;
virtual bool HasDemotedDirtyTracker() const OVERRIDE;
virtual void PromoteDemotedDirtyTrackers(leveldb::WriteBatch* batch) OVERRIDE;
virtual size_t CountDirtyTracker() const OVERRIDE;
virtual size_t CountFileMetadata() const OVERRIDE;
virtual size_t CountFileTracker() const OVERRIDE;
virtual void SetSyncRootTrackerID(int64 sync_root_id,
leveldb::WriteBatch* batch) const OVERRIDE;
virtual void SetLargestChangeID(int64 largest_change_id,
leveldb::WriteBatch* batch) const OVERRIDE;
virtual void SetNextTrackerID(int64 next_tracker_id,
leveldb::WriteBatch* batch) const OVERRIDE;
virtual int64 GetSyncRootTrackerID() const OVERRIDE;
virtual int64 GetLargestChangeID() const OVERRIDE;
virtual int64 GetNextTrackerID() const OVERRIDE;
virtual std::vector<std::string> GetRegisteredAppIDs() const OVERRIDE;
virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE;
virtual 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;
MetadataDatabaseIndex();
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_;
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_