| OLD | NEW | 
|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "sql/mojo/mojo_vfs.h" | 5 #include "sql/mojo/mojo_vfs.h" | 
| 6 | 6 | 
| 7 #include <stddef.h> | 7 #include <stddef.h> | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
|  | 9 #include <utility> | 
| 9 | 10 | 
| 10 #include "base/logging.h" | 11 #include "base/logging.h" | 
| 11 #include "base/rand_util.h" | 12 #include "base/rand_util.h" | 
| 12 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" | 
| 13 #include "base/trace_event/trace_event.h" | 14 #include "base/trace_event/trace_event.h" | 
| 14 #include "components/filesystem/public/interfaces/file.mojom.h" | 15 #include "components/filesystem/public/interfaces/file.mojom.h" | 
| 15 #include "components/filesystem/public/interfaces/file_system.mojom.h" | 16 #include "components/filesystem/public/interfaces/file_system.mojom.h" | 
| 16 #include "components/filesystem/public/interfaces/types.mojom.h" | 17 #include "components/filesystem/public/interfaces/types.mojom.h" | 
| 17 #include "mojo/public/cpp/bindings/lib/template_util.h" | 18 #include "mojo/public/cpp/bindings/lib/template_util.h" | 
| 18 #include "mojo/util/capture_util.h" | 19 #include "mojo/util/capture_util.h" | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 109                  const void* buffer, | 110                  const void* buffer, | 
| 110                  int size, | 111                  int size, | 
| 111                  sqlite_int64 offset) { | 112                  sqlite_int64 offset) { | 
| 112   DVLOG(1) << "MojoVFSWrite(*, " << size << ", " << offset << ")"; | 113   DVLOG(1) << "MojoVFSWrite(*, " << size << ", " << offset << ")"; | 
| 113   TRACE_EVENT0("sql", "MojoVFSWrite"); | 114   TRACE_EVENT0("sql", "MojoVFSWrite"); | 
| 114   mojo::Array<uint8_t> mojo_data(size); | 115   mojo::Array<uint8_t> mojo_data(size); | 
| 115   memcpy(&mojo_data.front(), buffer, size); | 116   memcpy(&mojo_data.front(), buffer, size); | 
| 116 | 117 | 
| 117   filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 118   filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 
| 118   uint32_t num_bytes_written = 0; | 119   uint32_t num_bytes_written = 0; | 
| 119   GetFSFile(sql_file)->Write(mojo_data.Pass(), offset, | 120   GetFSFile(sql_file)->Write(std::move(mojo_data), offset, | 
| 120                              filesystem::WHENCE_FROM_BEGIN, | 121                              filesystem::WHENCE_FROM_BEGIN, | 
| 121                              Capture(&error, &num_bytes_written)); | 122                              Capture(&error, &num_bytes_written)); | 
| 122   GetFSFile(sql_file).WaitForIncomingResponse(); | 123   GetFSFile(sql_file).WaitForIncomingResponse(); | 
| 123   if (error != filesystem::FILE_ERROR_OK) { | 124   if (error != filesystem::FILE_ERROR_OK) { | 
| 124     // TODO(erg): Better implementation here. | 125     // TODO(erg): Better implementation here. | 
| 125     NOTIMPLEMENTED(); | 126     NOTIMPLEMENTED(); | 
| 126     return SQLITE_IOERR_WRITE; | 127     return SQLITE_IOERR_WRITE; | 
| 127   } | 128   } | 
| 128   if (num_bytes_written != static_cast<uint32_t>(size)) { | 129   if (num_bytes_written != static_cast<uint32_t>(size)) { | 
| 129     NOTIMPLEMENTED(); | 130     NOTIMPLEMENTED(); | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 292     return SQLITE_CANTOPEN; | 293     return SQLITE_CANTOPEN; | 
| 293   } | 294   } | 
| 294 | 295 | 
| 295   // Set the method table so we can be closed (and run the manual dtor call to | 296   // Set the method table so we can be closed (and run the manual dtor call to | 
| 296   // match the following placement news). | 297   // match the following placement news). | 
| 297   file->pMethods = &mojo_vfs_io_methods; | 298   file->pMethods = &mojo_vfs_io_methods; | 
| 298 | 299 | 
| 299   // |file| is actually a malloced buffer of size szOsFile. This means that we | 300   // |file| is actually a malloced buffer of size szOsFile. This means that we | 
| 300   // need to manually use placement new to construct the C++ object which owns | 301   // need to manually use placement new to construct the C++ object which owns | 
| 301   // the pipe to our file. | 302   // the pipe to our file. | 
| 302   new (&GetFSFile(file)) filesystem::FilePtr(file_ptr.Pass()); | 303   new (&GetFSFile(file)) filesystem::FilePtr(std::move(file_ptr)); | 
| 303 | 304 | 
| 304   return SQLITE_OK; | 305   return SQLITE_OK; | 
| 305 } | 306 } | 
| 306 | 307 | 
| 307 int MojoVFSDelete(sqlite3_vfs* mojo_vfs, const char* filename, int sync_dir) { | 308 int MojoVFSDelete(sqlite3_vfs* mojo_vfs, const char* filename, int sync_dir) { | 
| 308   DVLOG(1) << "MojoVFSDelete(*, " << filename << ", " << sync_dir << ")"; | 309   DVLOG(1) << "MojoVFSDelete(*, " << filename << ", " << sync_dir << ")"; | 
| 309   TRACE_EVENT2("sql", "MojoVFSDelete", | 310   TRACE_EVENT2("sql", "MojoVFSDelete", | 
| 310                "name", filename, | 311                "name", filename, | 
| 311                "sync_dir", sync_dir); | 312                "sync_dir", sync_dir); | 
| 312   // TODO(erg): The default windows sqlite VFS has retry code to work around | 313   // TODO(erg): The default windows sqlite VFS has retry code to work around | 
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 424     MojoVFSCurrentTime,     /* xCurrentTime */ | 425     MojoVFSCurrentTime,     /* xCurrentTime */ | 
| 425     MojoVFSGetLastError,    /* xGetLastError */ | 426     MojoVFSGetLastError,    /* xGetLastError */ | 
| 426     MojoVFSCurrentTimeInt64 /* xCurrentTimeInt64 */ | 427     MojoVFSCurrentTimeInt64 /* xCurrentTimeInt64 */ | 
| 427 }; | 428 }; | 
| 428 | 429 | 
| 429 }  // namespace | 430 }  // namespace | 
| 430 | 431 | 
| 431 ScopedMojoFilesystemVFS::ScopedMojoFilesystemVFS( | 432 ScopedMojoFilesystemVFS::ScopedMojoFilesystemVFS( | 
| 432     filesystem::DirectoryPtr root_directory) | 433     filesystem::DirectoryPtr root_directory) | 
| 433     : parent_(sqlite3_vfs_find(NULL)), | 434     : parent_(sqlite3_vfs_find(NULL)), | 
| 434       root_directory_(root_directory.Pass()) { | 435       root_directory_(std::move(root_directory)) { | 
| 435   CHECK(!mojo_vfs.pAppData); | 436   CHECK(!mojo_vfs.pAppData); | 
| 436   mojo_vfs.pAppData = this; | 437   mojo_vfs.pAppData = this; | 
| 437   mojo_vfs.mxPathname = parent_->mxPathname; | 438   mojo_vfs.mxPathname = parent_->mxPathname; | 
| 438 | 439 | 
| 439   CHECK(sqlite3_vfs_register(&mojo_vfs, 1) == SQLITE_OK); | 440   CHECK(sqlite3_vfs_register(&mojo_vfs, 1) == SQLITE_OK); | 
| 440 } | 441 } | 
| 441 | 442 | 
| 442 ScopedMojoFilesystemVFS::~ScopedMojoFilesystemVFS() { | 443 ScopedMojoFilesystemVFS::~ScopedMojoFilesystemVFS() { | 
| 443   CHECK(mojo_vfs.pAppData); | 444   CHECK(mojo_vfs.pAppData); | 
| 444   mojo_vfs.pAppData = nullptr; | 445   mojo_vfs.pAppData = nullptr; | 
| 445 | 446 | 
| 446   CHECK(sqlite3_vfs_register(parent_, 1) == SQLITE_OK); | 447   CHECK(sqlite3_vfs_register(parent_, 1) == SQLITE_OK); | 
| 447   CHECK(sqlite3_vfs_unregister(&mojo_vfs) == SQLITE_OK); | 448   CHECK(sqlite3_vfs_unregister(&mojo_vfs) == SQLITE_OK); | 
| 448 } | 449 } | 
| 449 | 450 | 
| 450 filesystem::DirectoryPtr& ScopedMojoFilesystemVFS::GetDirectory() { | 451 filesystem::DirectoryPtr& ScopedMojoFilesystemVFS::GetDirectory() { | 
| 451   return root_directory_; | 452   return root_directory_; | 
| 452 } | 453 } | 
| 453 | 454 | 
| 454 }  // namespace sql | 455 }  // namespace sql | 
| OLD | NEW | 
|---|