OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "components/leveldb/env_mojo.h" | 5 #include "components/leveldb/env_mojo.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
12 #include "third_party/leveldatabase/chromium_logger.h" | 12 #include "third_party/leveldatabase/chromium_logger.h" |
13 #include "third_party/leveldatabase/src/include/leveldb/status.h" | 13 #include "third_party/leveldatabase/src/include/leveldb/status.h" |
14 | 14 |
15 namespace leveldb { | 15 namespace leveldb { |
16 | 16 |
17 namespace { | 17 namespace { |
18 | 18 |
19 const base::FilePath::CharType table_extension[] = FILE_PATH_LITERAL(".ldb"); | 19 const base::FilePath::CharType table_extension[] = FILE_PATH_LITERAL(".ldb"); |
20 | 20 |
21 base::File::Error LastFileError() { | 21 base::File::Error LastFileError() { |
22 #if defined(OS_WIN) | 22 #if defined(OS_WIN) |
23 return base::File::OSErrorToFileError(GetLastError()); | 23 return base::File::OSErrorToFileError(GetLastError()); |
24 #else | 24 #else |
25 return base::File::OSErrorToFileError(errno); | 25 return base::File::OSErrorToFileError(errno); |
26 #endif | 26 #endif |
27 } | 27 } |
28 | 28 |
29 Status FilesystemErrorToStatus(filesystem::FileError error, | 29 Status FilesystemErrorToStatus(filesystem::mojom::FileError error, |
30 const std::string& filename, | 30 const std::string& filename, |
31 leveldb_env::MethodID method) { | 31 leveldb_env::MethodID method) { |
32 if (error == filesystem::FileError::OK) | 32 if (error == filesystem::mojom::FileError::OK) |
33 return Status::OK(); | 33 return Status::OK(); |
34 | 34 |
35 std::string err_str = | 35 std::string err_str = |
36 base::File::ErrorToString(base::File::Error(static_cast<int>(error))); | 36 base::File::ErrorToString(base::File::Error(static_cast<int>(error))); |
37 | 37 |
38 char buf[512]; | 38 char buf[512]; |
39 snprintf(buf, sizeof(buf), "%s (MojoFSError: %d::%s)", err_str.c_str(), | 39 snprintf(buf, sizeof(buf), "%s (MojoFSError: %d::%s)", err_str.c_str(), |
40 method, MethodIDToString(method)); | 40 method, MethodIDToString(method)); |
41 return Status::IOError(filename, buf); | 41 return Status::IOError(filename, buf); |
42 } | 42 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 if (file_type_ == kManifest) | 186 if (file_type_ == kManifest) |
187 return SyncParent(); | 187 return SyncParent(); |
188 | 188 |
189 return Status::OK(); | 189 return Status::OK(); |
190 } | 190 } |
191 | 191 |
192 private: | 192 private: |
193 enum Type { kManifest, kTable, kOther }; | 193 enum Type { kManifest, kTable, kOther }; |
194 | 194 |
195 leveldb::Status SyncParent() { | 195 leveldb::Status SyncParent() { |
196 filesystem::FileError error = thread_->SyncDirectory(dir_, parent_dir_); | 196 filesystem::mojom::FileError error = |
197 return error == filesystem::FileError::OK | 197 thread_->SyncDirectory(dir_, parent_dir_); |
| 198 return error == filesystem::mojom::FileError::OK |
198 ? Status::OK() | 199 ? Status::OK() |
199 : Status::IOError(filename_, | 200 : Status::IOError(filename_, |
200 base::File::ErrorToString(base::File::Error( | 201 base::File::ErrorToString(base::File::Error( |
201 static_cast<int>(error)))); | 202 static_cast<int>(error)))); |
202 } | 203 } |
203 | 204 |
204 std::string filename_; | 205 std::string filename_; |
205 base::File file_; | 206 base::File file_; |
206 Type file_type_; | 207 Type file_type_; |
207 LevelDBMojoProxy::OpaqueDir* dir_; | 208 LevelDBMojoProxy::OpaqueDir* dir_; |
(...skipping 11 matching lines...) Expand all Loading... |
219 | 220 |
220 MojoEnv::~MojoEnv() { | 221 MojoEnv::~MojoEnv() { |
221 thread_->UnregisterDirectory(dir_); | 222 thread_->UnregisterDirectory(dir_); |
222 } | 223 } |
223 | 224 |
224 Status MojoEnv::NewSequentialFile(const std::string& fname, | 225 Status MojoEnv::NewSequentialFile(const std::string& fname, |
225 SequentialFile** result) { | 226 SequentialFile** result) { |
226 TRACE_EVENT1("leveldb", "MojoEnv::NewSequentialFile", "fname", fname); | 227 TRACE_EVENT1("leveldb", "MojoEnv::NewSequentialFile", "fname", fname); |
227 base::File f = thread_->OpenFileHandle( | 228 base::File f = thread_->OpenFileHandle( |
228 dir_, mojo::String::From(fname), | 229 dir_, mojo::String::From(fname), |
229 filesystem::kFlagOpen | filesystem::kFlagRead); | 230 filesystem::mojom::kFlagOpen | filesystem::mojom::kFlagRead); |
230 if (!f.IsValid()) { | 231 if (!f.IsValid()) { |
231 *result = nullptr; | 232 *result = nullptr; |
232 return MakeIOError(fname, "Unable to create sequential file", | 233 return MakeIOError(fname, "Unable to create sequential file", |
233 leveldb_env::kNewSequentialFile, f.error_details()); | 234 leveldb_env::kNewSequentialFile, f.error_details()); |
234 } | 235 } |
235 | 236 |
236 *result = new MojoSequentialFile(fname, std::move(f)); | 237 *result = new MojoSequentialFile(fname, std::move(f)); |
237 return Status::OK(); | 238 return Status::OK(); |
238 } | 239 } |
239 | 240 |
240 Status MojoEnv::NewRandomAccessFile(const std::string& fname, | 241 Status MojoEnv::NewRandomAccessFile(const std::string& fname, |
241 RandomAccessFile** result) { | 242 RandomAccessFile** result) { |
242 TRACE_EVENT1("leveldb", "MojoEnv::NewRandomAccessFile", "fname", fname); | 243 TRACE_EVENT1("leveldb", "MojoEnv::NewRandomAccessFile", "fname", fname); |
243 base::File f = thread_->OpenFileHandle( | 244 base::File f = thread_->OpenFileHandle( |
244 dir_, mojo::String::From(fname), | 245 dir_, mojo::String::From(fname), |
245 filesystem::kFlagRead | filesystem::kFlagOpen); | 246 filesystem::mojom::kFlagRead | filesystem::mojom::kFlagOpen); |
246 if (!f.IsValid()) { | 247 if (!f.IsValid()) { |
247 *result = nullptr; | 248 *result = nullptr; |
248 base::File::Error error_code = f.error_details(); | 249 base::File::Error error_code = f.error_details(); |
249 return MakeIOError(fname, FileErrorString(error_code), | 250 return MakeIOError(fname, FileErrorString(error_code), |
250 leveldb_env::kNewRandomAccessFile, error_code); | 251 leveldb_env::kNewRandomAccessFile, error_code); |
251 } | 252 } |
252 | 253 |
253 *result = new MojoRandomAccessFile(fname, std::move(f)); | 254 *result = new MojoRandomAccessFile(fname, std::move(f)); |
254 return Status::OK(); | 255 return Status::OK(); |
255 } | 256 } |
256 | 257 |
257 Status MojoEnv::NewWritableFile(const std::string& fname, | 258 Status MojoEnv::NewWritableFile(const std::string& fname, |
258 WritableFile** result) { | 259 WritableFile** result) { |
259 TRACE_EVENT1("leveldb", "MojoEnv::NewWritableFile", "fname", fname); | 260 TRACE_EVENT1("leveldb", "MojoEnv::NewWritableFile", "fname", fname); |
260 base::File f = thread_->OpenFileHandle( | 261 base::File f = thread_->OpenFileHandle( |
261 dir_, mojo::String::From(fname), | 262 dir_, mojo::String::From(fname), |
262 filesystem::kCreateAlways | filesystem::kFlagWrite); | 263 filesystem::mojom::kCreateAlways | filesystem::mojom::kFlagWrite); |
263 if (!f.IsValid()) { | 264 if (!f.IsValid()) { |
264 *result = nullptr; | 265 *result = nullptr; |
265 return MakeIOError(fname, "Unable to create writable file", | 266 return MakeIOError(fname, "Unable to create writable file", |
266 leveldb_env::kNewWritableFile, f.error_details()); | 267 leveldb_env::kNewWritableFile, f.error_details()); |
267 } | 268 } |
268 | 269 |
269 *result = new MojoWritableFile(dir_, fname, std::move(f), thread_); | 270 *result = new MojoWritableFile(dir_, fname, std::move(f), thread_); |
270 return Status::OK(); | 271 return Status::OK(); |
271 } | 272 } |
272 | 273 |
273 Status MojoEnv::NewAppendableFile(const std::string& fname, | 274 Status MojoEnv::NewAppendableFile(const std::string& fname, |
274 WritableFile** result) { | 275 WritableFile** result) { |
275 TRACE_EVENT1("leveldb", "MojoEnv::NewAppendableFile", "fname", fname); | 276 TRACE_EVENT1("leveldb", "MojoEnv::NewAppendableFile", "fname", fname); |
276 base::File f = thread_->OpenFileHandle( | 277 base::File f = thread_->OpenFileHandle( |
277 dir_, mojo::String::From(fname), | 278 dir_, mojo::String::From(fname), |
278 filesystem::kFlagOpenAlways | filesystem::kFlagAppend); | 279 filesystem::mojom::kFlagOpenAlways | filesystem::mojom::kFlagAppend); |
279 if (!f.IsValid()) { | 280 if (!f.IsValid()) { |
280 *result = nullptr; | 281 *result = nullptr; |
281 return MakeIOError(fname, "Unable to create appendable file", | 282 return MakeIOError(fname, "Unable to create appendable file", |
282 leveldb_env::kNewAppendableFile, f.error_details()); | 283 leveldb_env::kNewAppendableFile, f.error_details()); |
283 } | 284 } |
284 | 285 |
285 *result = new MojoWritableFile(dir_, fname, std::move(f), thread_); | 286 *result = new MojoWritableFile(dir_, fname, std::move(f), thread_); |
286 return Status::OK(); | 287 return Status::OK(); |
287 } | 288 } |
288 | 289 |
(...skipping 17 matching lines...) Expand all Loading... |
306 | 307 |
307 Status MojoEnv::CreateDir(const std::string& dirname) { | 308 Status MojoEnv::CreateDir(const std::string& dirname) { |
308 TRACE_EVENT1("leveldb", "MojoEnv::CreateDir", "dirname", dirname); | 309 TRACE_EVENT1("leveldb", "MojoEnv::CreateDir", "dirname", dirname); |
309 return FilesystemErrorToStatus(thread_->CreateDir(dir_, dirname), dirname, | 310 return FilesystemErrorToStatus(thread_->CreateDir(dir_, dirname), dirname, |
310 leveldb_env::kCreateDir); | 311 leveldb_env::kCreateDir); |
311 } | 312 } |
312 | 313 |
313 Status MojoEnv::DeleteDir(const std::string& dirname) { | 314 Status MojoEnv::DeleteDir(const std::string& dirname) { |
314 TRACE_EVENT1("leveldb", "MojoEnv::DeleteDir", "dirname", dirname); | 315 TRACE_EVENT1("leveldb", "MojoEnv::DeleteDir", "dirname", dirname); |
315 return FilesystemErrorToStatus( | 316 return FilesystemErrorToStatus( |
316 thread_->Delete(dir_, dirname, filesystem::kDeleteFlagRecursive), dirname, | 317 thread_->Delete(dir_, dirname, filesystem::mojom::kDeleteFlagRecursive), |
317 leveldb_env::kDeleteDir); | 318 dirname, leveldb_env::kDeleteDir); |
318 } | 319 } |
319 | 320 |
320 Status MojoEnv::GetFileSize(const std::string& fname, uint64_t* file_size) { | 321 Status MojoEnv::GetFileSize(const std::string& fname, uint64_t* file_size) { |
321 TRACE_EVENT1("leveldb", "MojoEnv::GetFileSize", "fname", fname); | 322 TRACE_EVENT1("leveldb", "MojoEnv::GetFileSize", "fname", fname); |
322 return FilesystemErrorToStatus(thread_->GetFileSize(dir_, fname, file_size), | 323 return FilesystemErrorToStatus(thread_->GetFileSize(dir_, fname, file_size), |
323 fname, | 324 fname, |
324 leveldb_env::kGetFileSize); | 325 leveldb_env::kGetFileSize); |
325 } | 326 } |
326 | 327 |
327 Status MojoEnv::RenameFile(const std::string& src, const std::string& target) { | 328 Status MojoEnv::RenameFile(const std::string& src, const std::string& target) { |
328 TRACE_EVENT2("leveldb", "MojoEnv::RenameFile", "src", src, "target", target); | 329 TRACE_EVENT2("leveldb", "MojoEnv::RenameFile", "src", src, "target", target); |
329 return FilesystemErrorToStatus(thread_->RenameFile(dir_, src, target), src, | 330 return FilesystemErrorToStatus(thread_->RenameFile(dir_, src, target), src, |
330 leveldb_env::kRenameFile); | 331 leveldb_env::kRenameFile); |
331 } | 332 } |
332 | 333 |
333 Status MojoEnv::LockFile(const std::string& fname, FileLock** lock) { | 334 Status MojoEnv::LockFile(const std::string& fname, FileLock** lock) { |
334 TRACE_EVENT1("leveldb", "MojoEnv::LockFile", "fname", fname); | 335 TRACE_EVENT1("leveldb", "MojoEnv::LockFile", "fname", fname); |
335 | 336 |
336 std::pair<filesystem::FileError, LevelDBMojoProxy::OpaqueLock*> p = | 337 std::pair<filesystem::mojom::FileError, LevelDBMojoProxy::OpaqueLock*> p = |
337 thread_->LockFile(dir_, mojo::String::From(fname)); | 338 thread_->LockFile(dir_, mojo::String::From(fname)); |
338 | 339 |
339 if (p.second) | 340 if (p.second) |
340 *lock = new MojoFileLock(p.second, fname); | 341 *lock = new MojoFileLock(p.second, fname); |
341 | 342 |
342 return FilesystemErrorToStatus(p.first, fname, leveldb_env::kLockFile); | 343 return FilesystemErrorToStatus(p.first, fname, leveldb_env::kLockFile); |
343 } | 344 } |
344 | 345 |
345 Status MojoEnv::UnlockFile(FileLock* lock) { | 346 Status MojoEnv::UnlockFile(FileLock* lock) { |
346 MojoFileLock* my_lock = reinterpret_cast<MojoFileLock*>(lock); | 347 MojoFileLock* my_lock = reinterpret_cast<MojoFileLock*>(lock); |
347 | 348 |
348 std::string fname = my_lock ? my_lock->name() : "(invalid)"; | 349 std::string fname = my_lock ? my_lock->name() : "(invalid)"; |
349 TRACE_EVENT1("leveldb", "MojoEnv::UnlockFile", "fname", fname); | 350 TRACE_EVENT1("leveldb", "MojoEnv::UnlockFile", "fname", fname); |
350 | 351 |
351 filesystem::FileError err = thread_->UnlockFile(my_lock->TakeLock()); | 352 filesystem::mojom::FileError err = thread_->UnlockFile(my_lock->TakeLock()); |
352 delete my_lock; | 353 delete my_lock; |
353 return FilesystemErrorToStatus(err, fname, leveldb_env::kUnlockFile); | 354 return FilesystemErrorToStatus(err, fname, leveldb_env::kUnlockFile); |
354 } | 355 } |
355 | 356 |
356 Status MojoEnv::GetTestDirectory(std::string* path) { | 357 Status MojoEnv::GetTestDirectory(std::string* path) { |
357 // TODO(erg): This method is actually only used from the test harness in | 358 // TODO(erg): This method is actually only used from the test harness in |
358 // leveldb. And when we go and port that test stuff to a mojo apptest, we | 359 // leveldb. And when we go and port that test stuff to a mojo apptest, we |
359 // probably won't use it since the mojo filesystem actually handles temporary | 360 // probably won't use it since the mojo filesystem actually handles temporary |
360 // filesystems just fine. | 361 // filesystems just fine. |
361 NOTREACHED(); | 362 NOTREACHED(); |
362 return Status::OK(); | 363 return Status::OK(); |
363 } | 364 } |
364 | 365 |
365 Status MojoEnv::NewLogger(const std::string& fname, Logger** result) { | 366 Status MojoEnv::NewLogger(const std::string& fname, Logger** result) { |
366 TRACE_EVENT1("leveldb", "MojoEnv::NewLogger", "fname", fname); | 367 TRACE_EVENT1("leveldb", "MojoEnv::NewLogger", "fname", fname); |
367 std::unique_ptr<base::File> f(new base::File(thread_->OpenFileHandle( | 368 std::unique_ptr<base::File> f(new base::File(thread_->OpenFileHandle( |
368 dir_, mojo::String::From(fname), | 369 dir_, mojo::String::From(fname), |
369 filesystem::kCreateAlways | filesystem::kFlagWrite))); | 370 filesystem::mojom::kCreateAlways | filesystem::mojom::kFlagWrite))); |
370 if (!f->IsValid()) { | 371 if (!f->IsValid()) { |
371 *result = NULL; | 372 *result = NULL; |
372 return MakeIOError(fname, "Unable to create log file", | 373 return MakeIOError(fname, "Unable to create log file", |
373 leveldb_env::kNewLogger, f->error_details()); | 374 leveldb_env::kNewLogger, f->error_details()); |
374 } else { | 375 } else { |
375 *result = new leveldb::ChromiumLogger(f.release()); | 376 *result = new leveldb::ChromiumLogger(f.release()); |
376 return Status::OK(); | 377 return Status::OK(); |
377 } | 378 } |
378 } | 379 } |
379 | 380 |
380 } // namespace leveldb | 381 } // namespace leveldb |
OLD | NEW |