1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_ 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <map> 9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include <set> 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string> 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <vector> 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/containers/hash_tables.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/containers/scoped_ptr_hash_map.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_path.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_vector.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/weak_ptr.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/sequence_checker.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/values.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h" 222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_status_code.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace leveldb { 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Env; 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace google_apis { 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ChangeResource; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FileResource; 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ResourceEntry; 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace tracked_objects { 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Location; 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace sync_file_system { 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace drive_backend { 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FileDetails; 42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass FileMetadata; 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass FileTracker; 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class LevelDBWrapper; 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)class MetadataDatabaseIndexInterface; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ServiceMetadata; 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// MetadataDatabase holds and maintains a LevelDB instance and its indexes, 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// which holds 1)ServiceMetadata, 2)FileMetadata and 3)FileTracker. 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 1) ServiceMetadata is a singleton in the database which holds information for 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the backend. 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 2) FileMetadata represents a remote-side file and holds latest known 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// metadata of the remote file. 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 3) FileTracker represents a synced or to-be-synced file and maintains 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// the local-side folder tree. 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// The term "file" includes files, folders and other resources on Drive. 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// FileTrackers form a tree structure on the database, which represents the 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// FileSystem trees of SyncFileSystem. The tree has a FileTracker named 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// sync-root as its root node, and a set of FileTracker named app-root. An 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// app-root represents a remote folder for an installed Chrome App and holds all 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// synced contents for the App. 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// One FileMetadata is created for each tracked remote file, which is identified 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// by FileID. 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// One FileTracker is created for every different {parent tracker, FileID} pair, 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// excluding non-app-root inactive parent trackers. Multiple trackers may be 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// associated to one FileID when the file has multiple parents. Multiple 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// trackers may have the same {parent tracker, title} pair when the associated 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// remote files have the same title. 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Files have following state: 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - Unknown file 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - Has a dirty inactive tracker and empty synced_details. 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - Is initial state of a tracker, only file_id and parent_tracker_id field 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// are known. 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - Folder 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - Is either one of sync-root folder, app-root folder or a regular folder. 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - Sync-root folder holds app-root folders as its direct children, and 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// holds entire SyncFileSystem files as its descentants. Its tracker 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// should be stored in ServiceMetadata by its tracker_id. 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - App-root folder holds all files for an application as its descendants. 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - File 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - Unsupported file 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - Represents unsupported files such as hosted documents. Must be 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// inactive. 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Invariants: 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - Any tracker in the database must either: 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// - be sync-root, 92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - have an app-root as its parent tracker, or 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - have an active tracker as its parent. 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// That is, all trackers must be reachable from sync-root via app-root folders 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// and active trackers. 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - Any active tracker must either: 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - have |needs_folder_listing| flag and dirty flag, or 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - have all children at the stored largest change ID. 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - If multiple trackers have the same parent tracker and same title, they 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// must not have same |file_id|, and at most one of them may be active. 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// - If multiple trackers have the same |file_id|, at most one of them may be 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// active. 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MetadataDatabase { 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef std::vector<std::string> FileIDList; 109bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum ActivationStatus { 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ACTIVATION_PENDING, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER, 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum UpdateOption { 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UPDATE_TRACKER_FOR_UNSYNCED_FILE, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UPDATE_TRACKER_FOR_SYNCED_FILE, 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // The entry point of the MetadataDatabase for production code. 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |env_override| is non-NULL, internal LevelDB uses |env_override| instead 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // of leveldb::Env::Default(). Use leveldb::MemEnv in test code for faster 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // testing. 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static scoped_ptr<MetadataDatabase> Create( 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::FilePath& database_path, 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Env* env_override, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode* status); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static scoped_ptr<MetadataDatabase> CreateInternal( 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::FilePath& database_path, 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci leveldb::Env* env_override, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool enable_on_disk_index, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode* status); 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static SyncStatusCode CreateForTesting( 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LevelDBWrapper> db, 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool enable_on_disk_index, 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<MetadataDatabase>* metadata_database_out); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~MetadataDatabase(); 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void ClearDatabase(scoped_ptr<MetadataDatabase> metadata_database); 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 GetLargestFetchedChangeID() const; 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int64 GetSyncRootTrackerID() const; 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool HasSyncRoot() const; 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns all file metadata for the given |app_id|. 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<base::ListValue> DumpFiles(const std::string& app_id); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns all database data. 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::ListValue> DumpDatabase(); 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(tzik): Move GetLargestKnownChangeID() to private section, and hide its 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // handling in the class, instead of letting user do. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Gets / updates the largest known change ID. 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The largest known change ID is on-memory and not persist over restart. 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is supposed to use when a task fetches ChangeList in parallel to other 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // operation. When a task starts fetching paged ChangeList one by one, it 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // should update the largest known change ID on the first round and background 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // remaining fetch job. 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Then, when other tasks that update FileMetadata by UpdateByFileResource, 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it should use largest known change ID as the |change_id| that prevents 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // FileMetadata from overwritten by ChangeList. 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Also if other tasks try to update a remote resource whose change is not yet 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // retrieved the task should fail due to etag check, so we should be fine. 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 GetLargestKnownChangeID() const; 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void UpdateLargestKnownChangeID(int64 change_id); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Populates empty database with initial data. 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Adds a file metadata and a file tracker for |sync_root_folder|, and adds 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // file metadata and file trackers for each |app_root_folders|. 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Newly added tracker for |sync_root_folder| is active and non-dirty. 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Newly added trackers for |app_root_folders| are inactive and non-dirty. 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Trackers for |app_root_folders| are not yet registered as app-roots, but 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // are ready to register. 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode PopulateInitialData( 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int64 largest_change_id, 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const google_apis::FileResource& sync_root_folder, 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ScopedVector<google_apis::FileResource>& app_root_folders); 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if the folder associated to |app_id| is enabled. 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsAppEnabled(const std::string& app_id) const; 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Registers existing folder as the app-root for |app_id|. The folder 185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // must be an inactive folder that does not yet associated to any App. 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This method associates the folder with |app_id| and activates it. 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode RegisterApp(const std::string& app_id, 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& folder_id); 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Inactivates the folder associated to the app to disable |app_id|. 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Does nothing if |app_id| is already disabled. 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode DisableApp(const std::string& app_id); 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Activates the folder associated to |app_id| to enable |app_id|. 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Does nothing if |app_id| is already enabled. 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode EnableApp(const std::string& app_id); 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Unregisters the folder as the app-root for |app_id|. If |app_id| does not 199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // exist, does nothing. The folder is left as an inactive regular folder. 200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Note that the inactivation drops all descendant files since they are no 201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // longer reachable from sync-root via active folder or app-root. 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UnregisterApp(const std::string& app_id); 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Finds the app-root folder for |app_id|. Returns true if exists. 205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Copies the result to |tracker| if it is non-NULL. 206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool FindAppRootTracker(const std::string& app_id, 207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileTracker* tracker) const; 208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Finds the file identified by |file_id|. Returns true if the file is found. 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Copies the metadata identified by |file_id| into |file| if exists and 211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // |file| is non-NULL. 212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool FindFileByFileID(const std::string& file_id, FileMetadata* file) const; 213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Finds the tracker identified by |tracker_id|. Returns true if the tracker 215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // is found. 216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Copies the tracker identified by |tracker_id| into |tracker| if exists and 217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // |tracker| is non-NULL. 218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool FindTrackerByTrackerID(int64 tracker_id, FileTracker* tracker) const; 219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Finds the trackers tracking |file_id|. Returns true if the trackers are 221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // found. 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool FindTrackersByFileID(const std::string& file_id, 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrackerIDSet* trackers) const; 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Finds the set of trackers whose parent's tracker ID is |parent_tracker_id|, 226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // and who has |title| as its title in the synced_details. 227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Copies the tracker set to |trackers| if it is non-NULL. 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns true if the trackers are found. 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool FindTrackersByParentAndTitle( 230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64 parent_tracker_id, 231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& title, 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrackerIDSet* trackers) const; 233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Builds the file path for the given tracker. Returns true on success. 235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // |path| can be NULL. 236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The file path is relative to app-root and have a leading path separator. 237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool BuildPathForTracker(int64 tracker_id, base::FilePath* path) const; 238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Builds the file path for the given tracker for display purpose. 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This may return a path ending with '<unknown>' if the given tracker does 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // not have title information (yet). This may return an empty path. 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath BuildDisplayPathForTracker(const FileTracker& tracker) const; 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns false if no registered app exists associated to |app_id|. 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If |full_path| is active, assigns the tracker of |full_path| to |tracker|. 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Otherwise, assigns the nearest active ancestor to |full_path| to |tracker|. 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Also, assigns the full path of |tracker| to |path|. 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool FindNearestActiveAncestor(const std::string& app_id, 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath& full_path, 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileTracker* tracker, 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath* path) const; 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Updates database by |changes|. 254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Marks each tracker for modified file as dirty and adds new trackers if 255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // needed. 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UpdateByChangeList( 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 largest_change_id, 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<google_apis::ChangeResource> changes); 259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Updates database by |resource|. 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Marks each tracker for modified file as dirty and adds new trackers if 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // needed. 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UpdateByFileResource( 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const google_apis::FileResource& resource); 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UpdateByFileResourceList( 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedVector<google_apis::FileResource> resources); 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UpdateByDeletedRemoteFile(const std::string& file_id); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UpdateByDeletedRemoteFileList(const FileIDList& file_ids); 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Adds new FileTracker and FileMetadata. The database must not have 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |resource| beforehand. 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The newly added tracker under |parent_tracker_id| is active and non-dirty. 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Deactivates existing active tracker if exists that has the same title and 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // parent_tracker to the newly added tracker. 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode ReplaceActiveTrackerWithNewResource( 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 parent_tracker_id, 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const google_apis::FileResource& resource); 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Adds |child_file_ids| to |folder_id| as its children. 2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This method affects the active tracker only. 2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // If the tracker has no further change to sync, unmarks its dirty flag. 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode PopulateFolderByChildList(const std::string& folder_id, 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const FileIDList& child_file_ids); 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Updates |synced_details| of the tracker with |updated_details|. 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode UpdateTracker(int64 tracker_id, 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const FileDetails& updated_details); 2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Activates a tracker identified by |parent_tracker_id| and |file_id| if the 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // tracker can be activated without inactivating other trackers that have the 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // same |file_id| but different paths. 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |file_id| has another active tracker, the function returns 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER and does not invoke |callback|. 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If there is another active tracker that has the same path but different 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |file_id|, inactivates the tracker. 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In success case, returns ACTIVATION_PENDING and invokes |callback| upon 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // completion. 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The tracker to be activated must: 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - have a tracked metadata in the database, 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - have |synced_details| with valid |title|. 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ActivationStatus TryActivateTracker(int64 parent_tracker_id, 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& file_id, 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode* status); 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Changes the priority of the tracker to low. 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void DemoteTracker(int64 tracker_id); 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool PromoteDemotedTrackers(); 3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void PromoteDemotedTracker(int64 tracker_id); 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if there is a normal priority dirty tracker. 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Assigns the dirty tracker if exists and |tracker| is non-NULL. 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool GetDirtyTracker(FileTracker* tracker) const; 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if there is a low priority dirty tracker. 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool HasDemotedDirtyTracker() const; 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool HasDirtyTracker() const; 320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t CountDirtyTracker() const; 321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t CountFileMetadata() const; 322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t CountFileTracker() const; 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool GetMultiParentFileTrackers(std::string* file_id, 325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TrackerIDSet* trackers); 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool GetConflictingTrackers(TrackerIDSet* trackers); 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sets |app_ids| to a list of all registered app ids. 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void GetRegisteredAppIDs(std::vector<std::string>* app_ids); 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Clears dirty flag of trackers that can be cleared without external 3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // interactien. 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode SweepDirtyTrackers(const std::vector<std::string>& file_ids); 3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 3361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) friend class MetadataDatabaseTest; 337bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MetadataDatabase(const base::FilePath& database_path, 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool enable_on_disk_index, 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leveldb::Env* env_override); 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncStatusCode Initialize(); 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Database manipulation methods. 344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void RegisterTrackerAsAppRoot(const std::string& app_id, 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 tracker_id); 346ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void CreateTrackerForParentAndFileID(const FileTracker& parent_tracker, 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& file_id); 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CreateTrackerForParentAndFileMetadata(const FileTracker& parent_tracker, 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const FileMetadata& file_metadata, 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateOption option); 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CreateTrackerInternal(const FileTracker& parent_tracker, 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& file_id, 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const FileDetails* details, 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateOption option); 35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void MaybeAddTrackersForNewFile(const FileMetadata& file, 3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateOption option); 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 IncrementTrackerID(); 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CanActivateTracker(const FileTracker& tracker); 3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool ShouldKeepDirty(const FileTracker& tracker) const; 3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool HasDisabledAppRoot(const FileTracker& tracker) const; 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool HasActiveTrackerForFileID(const std::string& file_id) const; 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool HasActiveTrackerForPath(int64 parent_tracker, 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& title) const; 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RemoveUnneededTrackersForMissingFile(const std::string& file_id); 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void UpdateByFileMetadata(const tracked_objects::Location& from_where, 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<FileMetadata> file, 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) UpdateOption option); 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncStatusCode WriteToDatabase(); 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool HasNewerFileMetadata(const std::string& file_id, int64 change_id); 378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::ListValue> DumpTrackers(); 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::ListValue> DumpMetadata(); 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AttachSyncRoot(const google_apis::FileResource& sync_root_folder); 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AttachInitialAppRoot(const google_apis::FileResource& app_root_folder); 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ForceActivateTrackerByPath(int64 parent_tracker_id, 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& title, 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& file_id); 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool CanClearDirty(const FileTracker& tracker); 390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath database_path_; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) leveldb::Env* env_override_; 3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LevelDBWrapper> db_; 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool enable_on_disk_index_; 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 largest_known_change_id_; 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<MetadataDatabaseIndexInterface> index_; 400bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::WeakPtrFactory<MetadataDatabase> weak_ptr_factory_; 4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(MetadataDatabase); 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace drive_backend 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace sync_file_system 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_METADATA_DATABASE_H_ 410