1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_ON_DISK_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_ON_DISK_H_ 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <set> 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync_file_system/drive_backend/metadata_database_index_interface.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace sync_file_system { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace drive_backend { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileMetadata; 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileTracker; 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class LevelDBWrapper; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ServiceMetadata; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct DatabaseContents; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// TODO(peria): Migrate implementation of ParentIDAndTitle structure from 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// metadata_database_index.{cc,h} to here, on removing the files. 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct ParentIDAndTitle; 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Maintains indexes of MetadataDatabase on disk. 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MetadataDatabaseIndexOnDisk : public MetadataDatabaseIndexInterface { 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static scoped_ptr<MetadataDatabaseIndexOnDisk> Create(LevelDBWrapper* db); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~MetadataDatabaseIndexOnDisk(); 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // MetadataDatabaseIndexInterface overrides. 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool GetFileMetadata( 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& file_id, FileMetadata* metadata) const OVERRIDE; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool GetFileTracker( 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 tracker_id, FileTracker* tracker) const OVERRIDE; 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void StoreFileMetadata(scoped_ptr<FileMetadata> metadata) OVERRIDE; 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void StoreFileTracker(scoped_ptr<FileTracker> tracker) OVERRIDE; 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void RemoveFileMetadata(const std::string& file_id) OVERRIDE; 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void RemoveFileTracker(int64 tracker_id) OVERRIDE; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual TrackerIDSet GetFileTrackerIDsByFileID( 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& file_id) const OVERRIDE; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual int64 GetAppRootTracker(const std::string& app_id) const OVERRIDE; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual TrackerIDSet GetFileTrackerIDsByParentAndTitle( 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 parent_tracker_id, const std::string& title) const OVERRIDE; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual std::vector<int64> GetFileTrackerIDsByParent( 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64 parent_tracker_id) const OVERRIDE; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual std::string PickMultiTrackerFileID() const OVERRIDE; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ParentIDAndTitle PickMultiBackingFilePath() const OVERRIDE; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual int64 PickDirtyTracker() const OVERRIDE; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void DemoteDirtyTracker(int64 tracker_id) OVERRIDE; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool HasDemotedDirtyTracker() const OVERRIDE; 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void PromoteDemotedDirtyTracker(int64 tracker_id) OVERRIDE; 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual bool PromoteDemotedDirtyTrackers() OVERRIDE; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual size_t CountDirtyTracker() const OVERRIDE; 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual size_t CountFileMetadata() const OVERRIDE; 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual size_t CountFileTracker() const OVERRIDE; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetSyncRootTrackerID(int64 sync_root_id) const OVERRIDE; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetLargestChangeID(int64 largest_change_id) const OVERRIDE; 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetNextTrackerID(int64 next_tracker_id) const OVERRIDE; 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual int64 GetSyncRootTrackerID() const OVERRIDE; 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual int64 GetLargestChangeID() const OVERRIDE; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual int64 GetNextTrackerID() const OVERRIDE; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual std::vector<std::string> GetRegisteredAppIDs() const OVERRIDE; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual std::vector<int64> GetAllTrackerIDs() const OVERRIDE; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual std::vector<std::string> GetAllMetadataIDs() const OVERRIDE; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Builds on-disk indexes from FileTracker entries on disk. 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Returns the number of newly added entries for indexing. 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 BuildTrackerIndexes(); 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Deletes entries used for indexes on on-disk database. 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Returns the number of the deleted entries. 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 DeleteTrackerIndexes(); 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LevelDBWrapper* GetDBForTesting(); 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum NumEntries { 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NONE, // No entries are found. 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SINGLE, // One entry is found. 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MULTIPLE, // Two or more entires are found. 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) explicit MetadataDatabaseIndexOnDisk(LevelDBWrapper* db); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Maintain indexes from AppIDs to tracker IDs. 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddToAppIDIndex(const FileTracker& new_tracker); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UpdateInAppIDIndex(const FileTracker& old_tracker, 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileTracker& new_tracker); 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RemoveFromAppIDIndex(const FileTracker& tracker); 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Maintain indexes from remote file IDs to tracker ID sets. 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddToFileIDIndexes(const FileTracker& new_tracker); 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UpdateInFileIDIndexes(const FileTracker& old_tracker, 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileTracker& new_tracker); 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RemoveFromFileIDIndexes(const FileTracker& tracker); 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Maintain indexes from path indexes to tracker ID sets 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddToPathIndexes(const FileTracker& new_tracker); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UpdateInPathIndexes(const FileTracker& old_tracker, 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileTracker& new_tracker); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RemoveFromPathIndexes(const FileTracker& tracker); 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Maintain dirty tracker IDs. 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddToDirtyTrackerIndexes(const FileTracker& new_tracker); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UpdateInDirtyTrackerIndexes(const FileTracker& old_tracker, 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileTracker& new_tracker); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RemoveFromDirtyTrackerIndexes(const FileTracker& tracker); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns a TrackerIDSet built from IDs which are found with given key 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // and key prefix. 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TrackerIDSet GetTrackerIDSetByPrefix( 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& active_tracker_key, 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& key_prefix) const; 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Simulate behavior of TrackerIDSet class. 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Adds an entry with |key_prefix| and tracker ID of |tracker|. If |tracker| 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is active, an entry for |active_key| is added. 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AddToTrackerIDSetWithPrefix( 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& active_tracker_key, 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& key_prefix, 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileTracker& tracker); 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns true if |tracker_id| is removed successfully. If no other entries 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // are stored with |key_prefix|, the entry for |active_key| is also removed. 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool EraseInTrackerIDSetWithPrefix( 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& active_tracker_key, 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& key_prefix, 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 tracker_id); 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Adds an entry for |active_key| on DB, if |tracker_id| has an entry with 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |key_prefix|. 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void ActivateInTrackerIDSetWithPrefix( 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& active_tracker_key, 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& key_prefix, 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 tracker_id); 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Removes an entry for |active_key| on DB, if the value of |active_key| key 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is |tracker_id|. 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void DeactivateInTrackerIDSetWithPrefix( 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& active_tracker_key, 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& key_prefix, 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 tracker_id); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Checks if |db_| has an entry whose key is |key|. 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool DBHasKey(const std::string& key); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns the number of dirty trackers, actually counting them. 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t CountDirtyTrackerInternal() const; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns the number of entries starting with |prefix| in NumEntries format. 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Entries for |ignored_id| are not counted in. 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NumEntries CountWithPrefix(const std::string& prefix, int64 ignored_id); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Deletes entries whose keys start from |prefix|. 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void DeleteKeyStartsWith(const std::string& prefix); 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LevelDBWrapper* db_; // Not owned. 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ServiceMetadata> service_metadata_; 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t num_dirty_trackers_; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseIndexOnDisk); 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace drive_backend 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace sync_file_system 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_INDEX_ON_DISK_H_ 176