Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Side by Side Diff: webkit/fileapi/file_system_directory_database.cc

Issue 12163003: Add FilePath to base namespace. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/fileapi/file_system_directory_database.h" 5 #include "webkit/fileapi/file_system_directory_database.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <set> 9 #include <set>
10 #include <stack> 10 #include <stack>
(...skipping 15 matching lines...) Expand all
26 const fileapi::FileSystemDirectoryDatabase::FileInfo& info, 26 const fileapi::FileSystemDirectoryDatabase::FileInfo& info,
27 Pickle* pickle) { 27 Pickle* pickle) {
28 DCHECK(pickle); 28 DCHECK(pickle);
29 std::string data_path; 29 std::string data_path;
30 // Round off here to match the behavior of the filesystem on real files. 30 // Round off here to match the behavior of the filesystem on real files.
31 base::Time time = 31 base::Time time =
32 base::Time::FromDoubleT(floor(info.modification_time.ToDoubleT())); 32 base::Time::FromDoubleT(floor(info.modification_time.ToDoubleT()));
33 std::string name; 33 std::string name;
34 34
35 data_path = fileapi::FilePathToString(info.data_path); 35 data_path = fileapi::FilePathToString(info.data_path);
36 name = fileapi::FilePathToString(FilePath(info.name)); 36 name = fileapi::FilePathToString(base::FilePath(info.name));
37 37
38 if (pickle->WriteInt64(info.parent_id) && 38 if (pickle->WriteInt64(info.parent_id) &&
39 pickle->WriteString(data_path) && 39 pickle->WriteString(data_path) &&
40 pickle->WriteString(name) && 40 pickle->WriteString(name) &&
41 pickle->WriteInt64(time.ToInternalValue())) 41 pickle->WriteInt64(time.ToInternalValue()))
42 return true; 42 return true;
43 43
44 NOTREACHED(); 44 NOTREACHED();
45 return false; 45 return false;
46 } 46 }
(...skipping 12 matching lines...) Expand all
59 pickle.ReadInt64(&iter, &internal_time)) { 59 pickle.ReadInt64(&iter, &internal_time)) {
60 info->data_path = fileapi::StringToFilePath(data_path); 60 info->data_path = fileapi::StringToFilePath(data_path);
61 info->name = fileapi::StringToFilePath(name).value(); 61 info->name = fileapi::StringToFilePath(name).value();
62 info->modification_time = base::Time::FromInternalValue(internal_time); 62 info->modification_time = base::Time::FromInternalValue(internal_time);
63 return true; 63 return true;
64 } 64 }
65 LOG(ERROR) << "Pickle could not be digested!"; 65 LOG(ERROR) << "Pickle could not be digested!";
66 return false; 66 return false;
67 } 67 }
68 68
69 const FilePath::CharType kDirectoryDatabaseName[] = FILE_PATH_LITERAL("Paths"); 69 const base::FilePath::CharType kDirectoryDatabaseName[] = FILE_PATH_LITERAL("Pat hs");
70 const char kChildLookupPrefix[] = "CHILD_OF:"; 70 const char kChildLookupPrefix[] = "CHILD_OF:";
71 const char kChildLookupSeparator[] = ":"; 71 const char kChildLookupSeparator[] = ":";
72 const char kLastFileIdKey[] = "LAST_FILE_ID"; 72 const char kLastFileIdKey[] = "LAST_FILE_ID";
73 const char kLastIntegerKey[] = "LAST_INTEGER"; 73 const char kLastIntegerKey[] = "LAST_INTEGER";
74 const int64 kMinimumReportIntervalHours = 1; 74 const int64 kMinimumReportIntervalHours = 1;
75 const char kInitStatusHistogramLabel[] = "FileSystem.DirectoryDatabaseInit"; 75 const char kInitStatusHistogramLabel[] = "FileSystem.DirectoryDatabaseInit";
76 76
77 enum InitStatus { 77 enum InitStatus {
78 INIT_STATUS_OK = 0, 78 INIT_STATUS_OK = 0,
79 INIT_STATUS_CORRUPTION, 79 INIT_STATUS_CORRUPTION,
80 INIT_STATUS_IO_ERROR, 80 INIT_STATUS_IO_ERROR,
81 INIT_STATUS_UNKNOWN_ERROR, 81 INIT_STATUS_UNKNOWN_ERROR,
82 INIT_STATUS_MAX 82 INIT_STATUS_MAX
83 }; 83 };
84 84
85 std::string GetChildLookupKey( 85 std::string GetChildLookupKey(
86 fileapi::FileSystemDirectoryDatabase::FileId parent_id, 86 fileapi::FileSystemDirectoryDatabase::FileId parent_id,
87 const FilePath::StringType& child_name) { 87 const base::FilePath::StringType& child_name) {
88 std::string name; 88 std::string name;
89 name = fileapi::FilePathToString(FilePath(child_name)); 89 name = fileapi::FilePathToString(base::FilePath(child_name));
90 return std::string(kChildLookupPrefix) + base::Int64ToString(parent_id) + 90 return std::string(kChildLookupPrefix) + base::Int64ToString(parent_id) +
91 std::string(kChildLookupSeparator) + name; 91 std::string(kChildLookupSeparator) + name;
92 } 92 }
93 93
94 std::string GetChildListingKeyPrefix( 94 std::string GetChildListingKeyPrefix(
95 fileapi::FileSystemDirectoryDatabase::FileId parent_id) { 95 fileapi::FileSystemDirectoryDatabase::FileId parent_id) {
96 return std::string(kChildLookupPrefix) + base::Int64ToString(parent_id) + 96 return std::string(kChildLookupPrefix) + base::Int64ToString(parent_id) +
97 std::string(kChildLookupSeparator); 97 std::string(kChildLookupSeparator);
98 } 98 }
99 99
(...skipping 22 matching lines...) Expand all
122 // - Each file in the database has unique backing file. 122 // - Each file in the database has unique backing file.
123 // - Each file in |filesystem_data_directory_| has a database entry. 123 // - Each file in |filesystem_data_directory_| has a database entry.
124 // - Directory structure is tree, i.e. connected and acyclic. 124 // - Directory structure is tree, i.e. connected and acyclic.
125 class DatabaseCheckHelper { 125 class DatabaseCheckHelper {
126 public: 126 public:
127 typedef fileapi::FileSystemDirectoryDatabase::FileId FileId; 127 typedef fileapi::FileSystemDirectoryDatabase::FileId FileId;
128 typedef fileapi::FileSystemDirectoryDatabase::FileInfo FileInfo; 128 typedef fileapi::FileSystemDirectoryDatabase::FileInfo FileInfo;
129 129
130 DatabaseCheckHelper(fileapi::FileSystemDirectoryDatabase* dir_db, 130 DatabaseCheckHelper(fileapi::FileSystemDirectoryDatabase* dir_db,
131 leveldb::DB* db, 131 leveldb::DB* db,
132 const FilePath& path); 132 const base::FilePath& path);
133 133
134 bool IsFileSystemConsistent() { 134 bool IsFileSystemConsistent() {
135 return IsDatabaseEmpty() || 135 return IsDatabaseEmpty() ||
136 (ScanDatabase() && ScanDirectory() && ScanHierarchy()); 136 (ScanDatabase() && ScanDirectory() && ScanHierarchy());
137 } 137 }
138 138
139 private: 139 private:
140 bool IsDatabaseEmpty(); 140 bool IsDatabaseEmpty();
141 // These 3 methods need to be called in the order. Each method requires its 141 // These 3 methods need to be called in the order. Each method requires its
142 // previous method finished successfully. They also require the database is 142 // previous method finished successfully. They also require the database is
143 // not empty. 143 // not empty.
144 bool ScanDatabase(); 144 bool ScanDatabase();
145 bool ScanDirectory(); 145 bool ScanDirectory();
146 bool ScanHierarchy(); 146 bool ScanHierarchy();
147 147
148 fileapi::FileSystemDirectoryDatabase* dir_db_; 148 fileapi::FileSystemDirectoryDatabase* dir_db_;
149 leveldb::DB* db_; 149 leveldb::DB* db_;
150 FilePath path_; 150 base::FilePath path_;
151 151
152 std::set<FilePath> files_in_db_; 152 std::set<base::FilePath> files_in_db_;
153 153
154 size_t num_directories_in_db_; 154 size_t num_directories_in_db_;
155 size_t num_files_in_db_; 155 size_t num_files_in_db_;
156 size_t num_hierarchy_links_in_db_; 156 size_t num_hierarchy_links_in_db_;
157 157
158 FileId last_file_id_; 158 FileId last_file_id_;
159 FileId last_integer_; 159 FileId last_integer_;
160 }; 160 };
161 161
162 DatabaseCheckHelper::DatabaseCheckHelper( 162 DatabaseCheckHelper::DatabaseCheckHelper(
163 fileapi::FileSystemDirectoryDatabase* dir_db, 163 fileapi::FileSystemDirectoryDatabase* dir_db,
164 leveldb::DB* db, 164 leveldb::DB* db,
165 const FilePath& path) 165 const base::FilePath& path)
166 : dir_db_(dir_db), db_(db), path_(path), 166 : dir_db_(dir_db), db_(db), path_(path),
167 num_directories_in_db_(0), 167 num_directories_in_db_(0),
168 num_files_in_db_(0), 168 num_files_in_db_(0),
169 num_hierarchy_links_in_db_(0), 169 num_hierarchy_links_in_db_(0),
170 last_file_id_(-1), last_integer_(-1) { 170 last_file_id_(-1), last_integer_(-1) {
171 DCHECK(dir_db_); 171 DCHECK(dir_db_);
172 DCHECK(db_); 172 DCHECK(db_);
173 DCHECK(!path_.empty() && file_util::DirectoryExists(path_)); 173 DCHECK(!path_.empty() && file_util::DirectoryExists(path_));
174 } 174 }
175 175
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 } 253 }
254 254
255 // TODO(tzik): Add constraint for |last_integer_| to avoid possible 255 // TODO(tzik): Add constraint for |last_integer_| to avoid possible
256 // data path confliction on ObfuscatedFileUtil. 256 // data path confliction on ObfuscatedFileUtil.
257 return max_file_id <= last_file_id_; 257 return max_file_id <= last_file_id_;
258 } 258 }
259 259
260 bool DatabaseCheckHelper::ScanDirectory() { 260 bool DatabaseCheckHelper::ScanDirectory() {
261 // TODO(kinuko): Scans all local file system entries to verify each of them 261 // TODO(kinuko): Scans all local file system entries to verify each of them
262 // has a database entry. 262 // has a database entry.
263 const FilePath kExcludes[] = { 263 const base::FilePath kExcludes[] = {
264 FilePath(kDirectoryDatabaseName), 264 base::FilePath(kDirectoryDatabaseName),
265 FilePath(fileapi::FileSystemUsageCache::kUsageFileName), 265 base::FilePath(fileapi::FileSystemUsageCache::kUsageFileName),
266 }; 266 };
267 267
268 // Any path in |pending_directories| is relative to |path_|. 268 // Any path in |pending_directories| is relative to |path_|.
269 std::stack<FilePath> pending_directories; 269 std::stack<base::FilePath> pending_directories;
270 pending_directories.push(FilePath()); 270 pending_directories.push(base::FilePath());
271 271
272 while (!pending_directories.empty()) { 272 while (!pending_directories.empty()) {
273 FilePath dir_path = pending_directories.top(); 273 base::FilePath dir_path = pending_directories.top();
274 pending_directories.pop(); 274 pending_directories.pop();
275 275
276 file_util::FileEnumerator file_enum( 276 file_util::FileEnumerator file_enum(
277 dir_path.empty() ? path_ : path_.Append(dir_path), 277 dir_path.empty() ? path_ : path_.Append(dir_path),
278 false /* not recursive */, 278 false /* not recursive */,
279 file_util::FileEnumerator::DIRECTORIES | 279 file_util::FileEnumerator::DIRECTORIES |
280 file_util::FileEnumerator::FILES); 280 file_util::FileEnumerator::FILES);
281 281
282 FilePath absolute_file_path; 282 base::FilePath absolute_file_path;
283 while (!(absolute_file_path = file_enum.Next()).empty()) { 283 while (!(absolute_file_path = file_enum.Next()).empty()) {
284 file_util::FileEnumerator::FindInfo find_info; 284 file_util::FileEnumerator::FindInfo find_info;
285 file_enum.GetFindInfo(&find_info); 285 file_enum.GetFindInfo(&find_info);
286 286
287 FilePath relative_file_path; 287 base::FilePath relative_file_path;
288 if (!path_.AppendRelativePath(absolute_file_path, &relative_file_path)) 288 if (!path_.AppendRelativePath(absolute_file_path, &relative_file_path))
289 return false; 289 return false;
290 290
291 if (std::find(kExcludes, kExcludes + arraysize(kExcludes), 291 if (std::find(kExcludes, kExcludes + arraysize(kExcludes),
292 relative_file_path) != kExcludes + arraysize(kExcludes)) 292 relative_file_path) != kExcludes + arraysize(kExcludes))
293 continue; 293 continue;
294 294
295 if (file_util::FileEnumerator::IsDirectory(find_info)) { 295 if (file_util::FileEnumerator::IsDirectory(find_info)) {
296 pending_directories.push(relative_file_path); 296 pending_directories.push(relative_file_path);
297 continue; 297 continue;
298 } 298 }
299 299
300 // Check if the file has a database entry. 300 // Check if the file has a database entry.
301 std::set<FilePath>::iterator itr = files_in_db_.find(relative_file_path); 301 std::set<base::FilePath>::iterator itr = files_in_db_.find(relative_file_p ath);
302 if (itr == files_in_db_.end()) { 302 if (itr == files_in_db_.end()) {
303 if (!file_util::Delete(absolute_file_path, false)) 303 if (!file_util::Delete(absolute_file_path, false))
304 return false; 304 return false;
305 } else { 305 } else {
306 files_in_db_.erase(itr); 306 files_in_db_.erase(itr);
307 } 307 }
308 } 308 }
309 } 309 }
310 310
311 return files_in_db_.empty(); 311 return files_in_db_.empty();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 // Check if we've visited all database entries. 366 // Check if we've visited all database entries.
367 return num_directories_in_db_ == visited_directories && 367 return num_directories_in_db_ == visited_directories &&
368 num_files_in_db_ == visited_files && 368 num_files_in_db_ == visited_files &&
369 num_hierarchy_links_in_db_ == visited_links; 369 num_hierarchy_links_in_db_ == visited_links;
370 } 370 }
371 371
372 // Returns true if the given |data_path| contains no parent references ("..") 372 // Returns true if the given |data_path| contains no parent references ("..")
373 // and does not refer to special system files. 373 // and does not refer to special system files.
374 // This is called in GetFileInfo, AddFileInfo and UpdateFileInfo to 374 // This is called in GetFileInfo, AddFileInfo and UpdateFileInfo to
375 // ensure we're only dealing with valid data paths. 375 // ensure we're only dealing with valid data paths.
376 bool VerifyDataPath(const FilePath& data_path) { 376 bool VerifyDataPath(const base::FilePath& data_path) {
377 // |data_path| should not contain any ".." and should be a relative path 377 // |data_path| should not contain any ".." and should be a relative path
378 // (to the filesystem_data_directory_). 378 // (to the filesystem_data_directory_).
379 if (data_path.ReferencesParent() || data_path.IsAbsolute()) 379 if (data_path.ReferencesParent() || data_path.IsAbsolute())
380 return false; 380 return false;
381 // See if it's not pointing to the special system paths. 381 // See if it's not pointing to the special system paths.
382 const FilePath kExcludes[] = { 382 const base::FilePath kExcludes[] = {
383 FilePath(kDirectoryDatabaseName), 383 base::FilePath(kDirectoryDatabaseName),
384 FilePath(fileapi::FileSystemUsageCache::kUsageFileName), 384 base::FilePath(fileapi::FileSystemUsageCache::kUsageFileName),
385 }; 385 };
386 for (size_t i = 0; i < arraysize(kExcludes); ++i) { 386 for (size_t i = 0; i < arraysize(kExcludes); ++i) {
387 if (data_path == kExcludes[i] || kExcludes[i].IsParent(data_path)) 387 if (data_path == kExcludes[i] || kExcludes[i].IsParent(data_path))
388 return false; 388 return false;
389 } 389 }
390 return true; 390 return true;
391 } 391 }
392 392
393 } // namespace 393 } // namespace
394 394
395 namespace fileapi { 395 namespace fileapi {
396 396
397 FileSystemDirectoryDatabase::FileInfo::FileInfo() : parent_id(0) { 397 FileSystemDirectoryDatabase::FileInfo::FileInfo() : parent_id(0) {
398 } 398 }
399 399
400 FileSystemDirectoryDatabase::FileInfo::~FileInfo() { 400 FileSystemDirectoryDatabase::FileInfo::~FileInfo() {
401 } 401 }
402 402
403 FileSystemDirectoryDatabase::FileSystemDirectoryDatabase( 403 FileSystemDirectoryDatabase::FileSystemDirectoryDatabase(
404 const FilePath& filesystem_data_directory) 404 const base::FilePath& filesystem_data_directory)
405 : filesystem_data_directory_(filesystem_data_directory) { 405 : filesystem_data_directory_(filesystem_data_directory) {
406 } 406 }
407 407
408 FileSystemDirectoryDatabase::~FileSystemDirectoryDatabase() { 408 FileSystemDirectoryDatabase::~FileSystemDirectoryDatabase() {
409 } 409 }
410 410
411 bool FileSystemDirectoryDatabase::GetChildWithName( 411 bool FileSystemDirectoryDatabase::GetChildWithName(
412 FileId parent_id, const FilePath::StringType& name, FileId* child_id) { 412 FileId parent_id, const base::FilePath::StringType& name, FileId* child_id) {
413 if (!Init(REPAIR_ON_CORRUPTION)) 413 if (!Init(REPAIR_ON_CORRUPTION))
414 return false; 414 return false;
415 DCHECK(child_id); 415 DCHECK(child_id);
416 std::string child_key = GetChildLookupKey(parent_id, name); 416 std::string child_key = GetChildLookupKey(parent_id, name);
417 std::string child_id_string; 417 std::string child_id_string;
418 leveldb::Status status = 418 leveldb::Status status =
419 db_->Get(leveldb::ReadOptions(), child_key, &child_id_string); 419 db_->Get(leveldb::ReadOptions(), child_key, &child_id_string);
420 if (status.IsNotFound()) 420 if (status.IsNotFound())
421 return false; 421 return false;
422 if (status.ok()) { 422 if (status.ok()) {
423 if (!base::StringToInt64(child_id_string, child_id)) { 423 if (!base::StringToInt64(child_id_string, child_id)) {
424 LOG(ERROR) << "Hit database corruption!"; 424 LOG(ERROR) << "Hit database corruption!";
425 return false; 425 return false;
426 } 426 }
427 return true; 427 return true;
428 } 428 }
429 HandleError(FROM_HERE, status); 429 HandleError(FROM_HERE, status);
430 return false; 430 return false;
431 } 431 }
432 432
433 bool FileSystemDirectoryDatabase::GetFileWithPath( 433 bool FileSystemDirectoryDatabase::GetFileWithPath(
434 const FilePath& path, FileId* file_id) { 434 const base::FilePath& path, FileId* file_id) {
435 std::vector<FilePath::StringType> components; 435 std::vector<base::FilePath::StringType> components;
436 VirtualPath::GetComponents(path, &components); 436 VirtualPath::GetComponents(path, &components);
437 FileId local_id = 0; 437 FileId local_id = 0;
438 std::vector<FilePath::StringType>::iterator iter; 438 std::vector<base::FilePath::StringType>::iterator iter;
439 for (iter = components.begin(); iter != components.end(); ++iter) { 439 for (iter = components.begin(); iter != components.end(); ++iter) {
440 FilePath::StringType name; 440 base::FilePath::StringType name;
441 name = *iter; 441 name = *iter;
442 if (name == FILE_PATH_LITERAL("/")) 442 if (name == FILE_PATH_LITERAL("/"))
443 continue; 443 continue;
444 if (!GetChildWithName(local_id, name, &local_id)) 444 if (!GetChildWithName(local_id, name, &local_id))
445 return false; 445 return false;
446 } 446 }
447 *file_id = local_id; 447 *file_id = local_id;
448 return true; 448 return true;
449 } 449 }
450 450
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 LOG(ERROR) << "Resolved data path is invalid: " 490 LOG(ERROR) << "Resolved data path is invalid: "
491 << info->data_path.value(); 491 << info->data_path.value();
492 return false; 492 return false;
493 } 493 }
494 return true; 494 return true;
495 } 495 }
496 // Special-case the root, for databases that haven't been initialized yet. 496 // Special-case the root, for databases that haven't been initialized yet.
497 // Without this, a query for the root's file info, made before creating the 497 // Without this, a query for the root's file info, made before creating the
498 // first file in the database, will fail and confuse callers. 498 // first file in the database, will fail and confuse callers.
499 if (status.IsNotFound() && !file_id) { 499 if (status.IsNotFound() && !file_id) {
500 info->name = FilePath::StringType(); 500 info->name = base::FilePath::StringType();
501 info->data_path = FilePath(); 501 info->data_path = base::FilePath();
502 info->modification_time = base::Time::Now(); 502 info->modification_time = base::Time::Now();
503 info->parent_id = 0; 503 info->parent_id = 0;
504 return true; 504 return true;
505 } 505 }
506 HandleError(FROM_HERE, status); 506 HandleError(FROM_HERE, status);
507 return false; 507 return false;
508 } 508 }
509 509
510 bool FileSystemDirectoryDatabase::AddFileInfo( 510 bool FileSystemDirectoryDatabase::AddFileInfo(
511 const FileInfo& info, FileId* file_id) { 511 const FileInfo& info, FileId* file_id) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 return false; 679 return false;
680 } 680 }
681 // The database must not yet exist; initialize it. 681 // The database must not yet exist; initialize it.
682 if (!StoreDefaultValues()) 682 if (!StoreDefaultValues())
683 return false; 683 return false;
684 684
685 return GetNextInteger(next); 685 return GetNextInteger(next);
686 } 686 }
687 687
688 // static 688 // static
689 bool FileSystemDirectoryDatabase::DestroyDatabase(const FilePath& path) { 689 bool FileSystemDirectoryDatabase::DestroyDatabase(const base::FilePath& path) {
690 std::string name = FilePathToString(path.Append(kDirectoryDatabaseName)); 690 std::string name = FilePathToString(path.Append(kDirectoryDatabaseName));
691 leveldb::Status status = leveldb::DestroyDB(name, leveldb::Options()); 691 leveldb::Status status = leveldb::DestroyDB(name, leveldb::Options());
692 if (status.ok()) 692 if (status.ok())
693 return true; 693 return true;
694 LOG(WARNING) << "Failed to destroy a database with status " << 694 LOG(WARNING) << "Failed to destroy a database with status " <<
695 status.ToString(); 695 status.ToString();
696 return false; 696 return false;
697 } 697 }
698 698
699 bool FileSystemDirectoryDatabase::Init(RecoveryOption recovery_option) { 699 bool FileSystemDirectoryDatabase::Init(RecoveryOption recovery_option) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 897
898 void FileSystemDirectoryDatabase::HandleError( 898 void FileSystemDirectoryDatabase::HandleError(
899 const tracked_objects::Location& from_here, 899 const tracked_objects::Location& from_here,
900 const leveldb::Status& status) { 900 const leveldb::Status& status) {
901 LOG(ERROR) << "FileSystemDirectoryDatabase failed at: " 901 LOG(ERROR) << "FileSystemDirectoryDatabase failed at: "
902 << from_here.ToString() << " with error: " << status.ToString(); 902 << from_here.ToString() << " with error: " << status.ToString();
903 db_.reset(); 903 db_.reset();
904 } 904 }
905 905
906 } // namespace fileapi 906 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/file_system_directory_database.h ('k') | webkit/fileapi/file_system_directory_database_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698