OLD | NEW |
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 #ifndef WEBKIT_FILEAPI_FILE_SYSTEM_DIRECTORY_DATABASE_H_ | 5 #ifndef WEBKIT_FILEAPI_FILE_SYSTEM_DIRECTORY_DATABASE_H_ |
6 #define WEBKIT_FILEAPI_FILE_SYSTEM_DIRECTORY_DATABASE_H_ | 6 #define WEBKIT_FILEAPI_FILE_SYSTEM_DIRECTORY_DATABASE_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 namespace fileapi { | 25 namespace fileapi { |
26 | 26 |
27 // This class WILL NOT protect you against producing directory loops, giving an | 27 // This class WILL NOT protect you against producing directory loops, giving an |
28 // empty directory a backing data file, giving two files the same backing file, | 28 // empty directory a backing data file, giving two files the same backing file, |
29 // or pointing to a nonexistent backing file. It does no file IO other than | 29 // or pointing to a nonexistent backing file. It does no file IO other than |
30 // that involved with talking to its underlying database. It does not create or | 30 // that involved with talking to its underlying database. It does not create or |
31 // in any way touch real files; it only creates path entries in its database. | 31 // in any way touch real files; it only creates path entries in its database. |
32 | 32 |
33 // TODO(ericu): Safe mode, which does more checks such as the above on debug | 33 // TODO(ericu): Safe mode, which does more checks such as the above on debug |
34 // builds. | 34 // builds. |
35 // TODO(ericu): FSCK, for a full-database check [data file validation possibly | |
36 // done elsewhere]. | |
37 // TODO(ericu): Add a method that will give a unique filename for a data file. | 35 // TODO(ericu): Add a method that will give a unique filename for a data file. |
38 class FileSystemDirectoryDatabase { | 36 class FileSystemDirectoryDatabase { |
39 public: | 37 public: |
40 typedef int64 FileId; | 38 typedef int64 FileId; |
41 | 39 |
42 struct FileInfo { | 40 struct FileInfo { |
43 FileInfo(); | 41 FileInfo(); |
44 ~FileInfo(); | 42 ~FileInfo(); |
45 | 43 |
46 bool is_directory() const { | 44 bool is_directory() const { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 // another file [also not a directory]; we need to alter two files' info in a | 77 // another file [also not a directory]; we need to alter two files' info in a |
80 // single transaction to avoid weird backing file references in the event of a | 78 // single transaction to avoid weird backing file references in the event of a |
81 // partial failure. | 79 // partial failure. |
82 bool OverwritingMoveFile(FileId src_file_id, FileId dest_file_id); | 80 bool OverwritingMoveFile(FileId src_file_id, FileId dest_file_id); |
83 | 81 |
84 // This produces the series 0, 1, 2..., starting at 0 when the underlying | 82 // This produces the series 0, 1, 2..., starting at 0 when the underlying |
85 // filesystem is first created, and maintaining state across | 83 // filesystem is first created, and maintaining state across |
86 // creation/destruction of FileSystemDirectoryDatabase objects. | 84 // creation/destruction of FileSystemDirectoryDatabase objects. |
87 bool GetNextInteger(int64* next); | 85 bool GetNextInteger(int64* next); |
88 | 86 |
| 87 // Returns true if the database looks consistent with local filesystem. |
| 88 bool IsFileSystemConsistent(); |
| 89 |
89 static bool DestroyDatabase(const FilePath& path); | 90 static bool DestroyDatabase(const FilePath& path); |
90 | 91 |
91 private: | 92 private: |
92 enum RecoveryOption { | 93 enum RecoveryOption { |
93 DELETE_ON_CORRUPTION, | 94 DELETE_ON_CORRUPTION, |
| 95 REPAIR_ON_CORRUPTION, |
94 FAIL_ON_CORRUPTION, | 96 FAIL_ON_CORRUPTION, |
95 }; | 97 }; |
96 | 98 |
| 99 friend class FileSystemDirectoryDatabaseTest; |
| 100 |
97 bool Init(RecoveryOption recovery_option); | 101 bool Init(RecoveryOption recovery_option); |
| 102 bool RepairDatabase(const std::string& db_path); |
98 void ReportInitStatus(const leveldb::Status& status); | 103 void ReportInitStatus(const leveldb::Status& status); |
99 bool StoreDefaultValues(); | 104 bool StoreDefaultValues(); |
100 bool GetLastFileId(FileId* file_id); | 105 bool GetLastFileId(FileId* file_id); |
101 bool VerifyIsDirectory(FileId file_id); | 106 bool VerifyIsDirectory(FileId file_id); |
102 bool AddFileInfoHelper( | 107 bool AddFileInfoHelper( |
103 const FileInfo& info, FileId file_id, leveldb::WriteBatch* batch); | 108 const FileInfo& info, FileId file_id, leveldb::WriteBatch* batch); |
104 bool RemoveFileInfoHelper(FileId file_id, leveldb::WriteBatch* batch); | 109 bool RemoveFileInfoHelper(FileId file_id, leveldb::WriteBatch* batch); |
105 void HandleError(const tracked_objects::Location& from_here, | 110 void HandleError(const tracked_objects::Location& from_here, |
106 const leveldb::Status& status); | 111 const leveldb::Status& status); |
107 | 112 |
108 FilePath filesystem_data_directory_; | 113 FilePath filesystem_data_directory_; |
109 scoped_ptr<leveldb::DB> db_; | 114 scoped_ptr<leveldb::DB> db_; |
110 base::Time last_reported_time_; | 115 base::Time last_reported_time_; |
111 DISALLOW_COPY_AND_ASSIGN(FileSystemDirectoryDatabase); | 116 DISALLOW_COPY_AND_ASSIGN(FileSystemDirectoryDatabase); |
112 }; | 117 }; |
113 | 118 |
114 } // namespace fileapi | 119 } // namespace fileapi |
115 | 120 |
116 #endif // WEBKIT_FILEAPI_FILE_SYSTEM_DIRECTORY_DATABASE_H_ | 121 #endif // WEBKIT_FILEAPI_FILE_SYSTEM_DIRECTORY_DATABASE_H_ |
OLD | NEW |