| 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 |