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