1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_DRIVE_METADATA_STORE_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_DRIVE_METADATA_STORE_H_
13 #include "base/callback_forward.h"
14 #include "base/files/file_path.h"
15 #include "base/logging.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/threading/non_thread_safe.h"
19 #include "chrome/browser/sync_file_system/sync_callbacks.h"
20 #include "chrome/browser/sync_file_system/sync_status_code.h"
21 #include "webkit/browser/fileapi/file_system_url.h"
25 class SequencedTaskRunner;
35 namespace sync_file_system {
41 // This class holds a snapshot of the server side metadata.
42 class DriveMetadataStore
43 : public base::NonThreadSafe,
44 public base::SupportsWeakPtr<DriveMetadataStore> {
46 typedef std::map<GURL, std::string> ResourceIdByOrigin;
47 typedef std::map<std::string, GURL> OriginByResourceId;
48 typedef std::map<base::FilePath, DriveMetadata> PathToMetadata;
49 typedef std::map<GURL, PathToMetadata> MetadataMap;
50 typedef std::vector<std::pair<fileapi::FileSystemURL, DriveMetadata> >
51 URLAndDriveMetadataList;
52 typedef base::Callback<void(SyncStatusCode status, bool created)>
53 InitializationCallback;
55 static const base::FilePath::CharType kDatabaseName[];
57 DriveMetadataStore(const base::FilePath& base_dir,
58 base::SequencedTaskRunner* file_task_runner);
59 ~DriveMetadataStore();
61 // Initializes the internal database and loads its content to memory.
62 // This function works asynchronously.
63 void Initialize(const InitializationCallback& callback);
65 void SetLargestChangeStamp(int64 largest_changestamp,
66 const SyncStatusCallback& callback);
67 int64 GetLargestChangeStamp() const;
69 // Updates database entry. Invokes |callback|, upon completion.
70 void UpdateEntry(const fileapi::FileSystemURL& url,
71 const DriveMetadata& metadata,
72 const SyncStatusCallback& callback);
74 // Deletes database entry for |url|. Invokes |callback|, upon completion.
75 void DeleteEntry(const fileapi::FileSystemURL& url,
76 const SyncStatusCallback& callback);
78 // Lookups and reads the database entry for |url|.
79 SyncStatusCode ReadEntry(const fileapi::FileSystemURL& url,
80 DriveMetadata* metadata) const;
82 // Marks |origin| as incremental sync and associates it with the directory
83 // identified by |resource_id|.
84 // |origin| must not already be an incremental sync origin.
85 void AddIncrementalSyncOrigin(const GURL& origin,
86 const std::string& resource_id);
88 // Returns true if |origin| is an incremental sync or disabled origin.
89 bool IsKnownOrigin(const GURL& origin) const;
91 // Returns true if |origin| is an incremental sync origin, i.e. the origin's
92 // entire file list has been cached and is ready to apply changes
94 bool IsIncrementalSyncOrigin(const GURL& origin) const;
96 // Returns true if |origin| is a disabled origin.
97 bool IsOriginDisabled(const GURL& origin) const;
99 void EnableOrigin(const GURL& origin,
100 const SyncStatusCallback& callback);
102 void DisableOrigin(const GURL& origin,
103 const SyncStatusCallback& callback);
105 void RemoveOrigin(const GURL& origin,
106 const SyncStatusCallback& callback);
108 // Sets the directory identified by |resource_id| as the sync data directory.
109 // All data for the Sync FileSystem should be store into the directory.
110 void SetSyncRootDirectory(const std::string& resource_id);
111 void SetOriginRootDirectory(const GURL& origin,
112 const std::string& resource_id);
114 // Returns a set of URLs for files in conflict.
115 SyncStatusCode GetConflictURLs(
116 fileapi::FileSystemURLSet* urls) const;
118 // Returns a set of URLs and Resource IDs for files to be fetched.
119 SyncStatusCode GetToBeFetchedFiles(URLAndDriveMetadataList* list) const;
121 // Returns resource id for |origin|.
122 // This may return an empty string if |origin| is not a incremental or
124 std::string GetResourceIdForOrigin(const GURL& origin) const;
126 const std::string& sync_root_directory() const {
127 DCHECK(CalledOnValidThread());
128 return sync_root_directory_resource_id_;
131 const ResourceIdByOrigin& incremental_sync_origins() const {
132 DCHECK(CalledOnValidThread());
133 return incremental_sync_origins_;
136 const ResourceIdByOrigin& disabled_origins() const {
137 DCHECK(CalledOnValidThread());
138 return disabled_origins_;
141 // Returns all tracked origins. i.e. incremental_sync_origins_ and
142 // disabled_origins_.
143 void GetAllOrigins(std::vector<GURL>* origins);
145 // Maps |resource_id| to corresponding |origin|.
146 // Returns true if the directory indicated by |resource_id| is not an origin
148 bool GetOriginByOriginRootDirectoryId(const std::string& resource_id,
151 // Returns all file metadata for the given origin.
152 scoped_ptr<base::ListValue> DumpFiles(const GURL& origin);
155 friend class DriveMetadataStoreTest;
157 void WriteToDB(scoped_ptr<leveldb::WriteBatch> batch,
158 const SyncStatusCallback& callback);
160 void UpdateDBStatus(SyncStatusCode status);
161 void UpdateDBStatusAndInvokeCallback(const SyncStatusCallback& callback,
162 const leveldb::Status& status);
163 void DidInitialize(const InitializationCallback& callback,
164 scoped_ptr<DBContents> contents);
165 void DidUpdateOrigin(const SyncStatusCallback& callback,
166 SyncStatusCode status);
168 leveldb::DB* GetDBInstanceForTesting();
170 scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
171 base::FilePath base_dir_;
172 scoped_ptr<leveldb::DB> db_;
173 SyncStatusCode db_status_;
175 int64 largest_changestamp_;
176 MetadataMap metadata_map_;
178 std::string sync_root_directory_resource_id_;
179 ResourceIdByOrigin incremental_sync_origins_;
180 ResourceIdByOrigin disabled_origins_;
182 OriginByResourceId origin_by_resource_id_;
184 DISALLOW_COPY_AND_ASSIGN(DriveMetadataStore);
187 } // namespace sync_file_system
189 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_DRIVE_METADATA_STORE_H_