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 #include <utility> |
10 | 10 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 }; | 60 }; |
61 | 61 |
62 filesystem::FilePtr& GetFSFile(sqlite3_file* vfs_file) { | 62 filesystem::FilePtr& GetFSFile(sqlite3_file* vfs_file) { |
63 return reinterpret_cast<MojoVFSFile*>(vfs_file)->file_ptr; | 63 return reinterpret_cast<MojoVFSFile*>(vfs_file)->file_ptr; |
64 } | 64 } |
65 | 65 |
66 int MojoVFSClose(sqlite3_file* file) { | 66 int MojoVFSClose(sqlite3_file* file) { |
67 DVLOG(1) << "MojoVFSClose(*)"; | 67 DVLOG(1) << "MojoVFSClose(*)"; |
68 TRACE_EVENT0("sql", "MojoVFSClose"); | 68 TRACE_EVENT0("sql", "MojoVFSClose"); |
69 using filesystem::FilePtr; | 69 using filesystem::FilePtr; |
70 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 70 filesystem::FileError error = filesystem::FileError::FAILED; |
71 // Must call File::Close explicitly instead of just deleting the file, since | 71 // Must call File::Close explicitly instead of just deleting the file, since |
72 // otherwise we wouldn't have an object to wait on. | 72 // otherwise we wouldn't have an object to wait on. |
73 GetFSFile(file)->Close(mojo::Capture(&error)); | 73 GetFSFile(file)->Close(mojo::Capture(&error)); |
74 GetFSFile(file).WaitForIncomingResponse(); | 74 GetFSFile(file).WaitForIncomingResponse(); |
75 GetFSFile(file).~FilePtr(); | 75 GetFSFile(file).~FilePtr(); |
76 return SQLITE_OK; | 76 return SQLITE_OK; |
77 } | 77 } |
78 | 78 |
79 int MojoVFSRead(sqlite3_file* sql_file, | 79 int MojoVFSRead(sqlite3_file* sql_file, |
80 void* buffer, | 80 void* buffer, |
81 int size, | 81 int size, |
82 sqlite3_int64 offset) { | 82 sqlite3_int64 offset) { |
83 DVLOG(1) << "MojoVFSRead (" << size << " @ " << offset << ")"; | 83 DVLOG(1) << "MojoVFSRead (" << size << " @ " << offset << ")"; |
84 TRACE_EVENT0("sql", "MojoVFSRead"); | 84 TRACE_EVENT0("sql", "MojoVFSRead"); |
85 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 85 filesystem::FileError error = filesystem::FileError::FAILED; |
86 mojo::Array<uint8_t> mojo_data; | 86 mojo::Array<uint8_t> mojo_data; |
87 GetFSFile(sql_file)->Read(size, offset, filesystem::WHENCE_FROM_BEGIN, | 87 GetFSFile(sql_file)->Read(size, offset, filesystem::Whence::FROM_BEGIN, |
88 Capture(&error, &mojo_data)); | 88 Capture(&error, &mojo_data)); |
89 GetFSFile(sql_file).WaitForIncomingResponse(); | 89 GetFSFile(sql_file).WaitForIncomingResponse(); |
90 | 90 |
91 if (error != filesystem::FILE_ERROR_OK) { | 91 if (error != filesystem::FileError::OK) { |
92 // TODO(erg): Better implementation here. | 92 // TODO(erg): Better implementation here. |
93 NOTIMPLEMENTED(); | 93 NOTIMPLEMENTED(); |
94 return SQLITE_IOERR_READ; | 94 return SQLITE_IOERR_READ; |
95 } | 95 } |
96 | 96 |
97 if (mojo_data.size()) | 97 if (mojo_data.size()) |
98 memcpy(buffer, &mojo_data.front(), mojo_data.size()); | 98 memcpy(buffer, &mojo_data.front(), mojo_data.size()); |
99 if (mojo_data.size() == static_cast<size_t>(size)) | 99 if (mojo_data.size() == static_cast<size_t>(size)) |
100 return SQLITE_OK; | 100 return SQLITE_OK; |
101 | 101 |
102 // We didn't read the entire buffer. Fill the rest of the buffer with zeros. | 102 // We didn't read the entire buffer. Fill the rest of the buffer with zeros. |
103 memset(reinterpret_cast<char*>(buffer) + mojo_data.size(), 0, | 103 memset(reinterpret_cast<char*>(buffer) + mojo_data.size(), 0, |
104 size - mojo_data.size()); | 104 size - mojo_data.size()); |
105 | 105 |
106 return SQLITE_IOERR_SHORT_READ; | 106 return SQLITE_IOERR_SHORT_READ; |
107 } | 107 } |
108 | 108 |
109 int MojoVFSWrite(sqlite3_file* sql_file, | 109 int MojoVFSWrite(sqlite3_file* sql_file, |
110 const void* buffer, | 110 const void* buffer, |
111 int size, | 111 int size, |
112 sqlite_int64 offset) { | 112 sqlite_int64 offset) { |
113 DVLOG(1) << "MojoVFSWrite(*, " << size << ", " << offset << ")"; | 113 DVLOG(1) << "MojoVFSWrite(*, " << size << ", " << offset << ")"; |
114 TRACE_EVENT0("sql", "MojoVFSWrite"); | 114 TRACE_EVENT0("sql", "MojoVFSWrite"); |
115 mojo::Array<uint8_t> mojo_data(size); | 115 mojo::Array<uint8_t> mojo_data(size); |
116 memcpy(&mojo_data.front(), buffer, size); | 116 memcpy(&mojo_data.front(), buffer, size); |
117 | 117 |
118 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 118 filesystem::FileError error = filesystem::FileError::FAILED; |
119 uint32_t num_bytes_written = 0; | 119 uint32_t num_bytes_written = 0; |
120 GetFSFile(sql_file)->Write(std::move(mojo_data), offset, | 120 GetFSFile(sql_file)->Write(std::move(mojo_data), offset, |
121 filesystem::WHENCE_FROM_BEGIN, | 121 filesystem::Whence::FROM_BEGIN, |
122 Capture(&error, &num_bytes_written)); | 122 Capture(&error, &num_bytes_written)); |
123 GetFSFile(sql_file).WaitForIncomingResponse(); | 123 GetFSFile(sql_file).WaitForIncomingResponse(); |
124 if (error != filesystem::FILE_ERROR_OK) { | 124 if (error != filesystem::FileError::OK) { |
125 // TODO(erg): Better implementation here. | 125 // TODO(erg): Better implementation here. |
126 NOTIMPLEMENTED(); | 126 NOTIMPLEMENTED(); |
127 return SQLITE_IOERR_WRITE; | 127 return SQLITE_IOERR_WRITE; |
128 } | 128 } |
129 if (num_bytes_written != static_cast<uint32_t>(size)) { | 129 if (num_bytes_written != static_cast<uint32_t>(size)) { |
130 NOTIMPLEMENTED(); | 130 NOTIMPLEMENTED(); |
131 return SQLITE_IOERR_WRITE; | 131 return SQLITE_IOERR_WRITE; |
132 } | 132 } |
133 | 133 |
134 return SQLITE_OK; | 134 return SQLITE_OK; |
135 } | 135 } |
136 | 136 |
137 int MojoVFSTruncate(sqlite3_file* sql_file, sqlite_int64 size) { | 137 int MojoVFSTruncate(sqlite3_file* sql_file, sqlite_int64 size) { |
138 DVLOG(1) << "MojoVFSTruncate(*, " << size << ")"; | 138 DVLOG(1) << "MojoVFSTruncate(*, " << size << ")"; |
139 TRACE_EVENT0("sql", "MojoVFSTruncate"); | 139 TRACE_EVENT0("sql", "MojoVFSTruncate"); |
140 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 140 filesystem::FileError error = filesystem::FileError::FAILED; |
141 GetFSFile(sql_file)->Truncate(size, Capture(&error)); | 141 GetFSFile(sql_file)->Truncate(size, Capture(&error)); |
142 GetFSFile(sql_file).WaitForIncomingResponse(); | 142 GetFSFile(sql_file).WaitForIncomingResponse(); |
143 if (error != filesystem::FILE_ERROR_OK) { | 143 if (error != filesystem::FileError::OK) { |
144 // TODO(erg): Better implementation here. | 144 // TODO(erg): Better implementation here. |
145 NOTIMPLEMENTED(); | 145 NOTIMPLEMENTED(); |
146 return SQLITE_IOERR_TRUNCATE; | 146 return SQLITE_IOERR_TRUNCATE; |
147 } | 147 } |
148 | 148 |
149 return SQLITE_OK; | 149 return SQLITE_OK; |
150 } | 150 } |
151 | 151 |
152 int MojoVFSSync(sqlite3_file* sql_file, int flags) { | 152 int MojoVFSSync(sqlite3_file* sql_file, int flags) { |
153 DVLOG(1) << "MojoVFSSync(*, " << flags << ")"; | 153 DVLOG(1) << "MojoVFSSync(*, " << flags << ")"; |
154 TRACE_EVENT0("sql", "MojoVFSSync"); | 154 TRACE_EVENT0("sql", "MojoVFSSync"); |
155 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 155 filesystem::FileError error = filesystem::FileError::FAILED; |
156 GetFSFile(sql_file)->Flush(Capture(&error)); | 156 GetFSFile(sql_file)->Flush(Capture(&error)); |
157 GetFSFile(sql_file).WaitForIncomingResponse(); | 157 GetFSFile(sql_file).WaitForIncomingResponse(); |
158 if (error != filesystem::FILE_ERROR_OK) { | 158 if (error != filesystem::FileError::OK) { |
159 // TODO(erg): Better implementation here. | 159 // TODO(erg): Better implementation here. |
160 NOTIMPLEMENTED(); | 160 NOTIMPLEMENTED(); |
161 return SQLITE_IOERR_FSYNC; | 161 return SQLITE_IOERR_FSYNC; |
162 } | 162 } |
163 | 163 |
164 return SQLITE_OK; | 164 return SQLITE_OK; |
165 } | 165 } |
166 | 166 |
167 int MojoVFSFileSize(sqlite3_file* sql_file, sqlite_int64* size) { | 167 int MojoVFSFileSize(sqlite3_file* sql_file, sqlite_int64* size) { |
168 DVLOG(1) << "MojoVFSFileSize(*)"; | 168 DVLOG(1) << "MojoVFSFileSize(*)"; |
169 TRACE_EVENT0("sql", "MojoVFSFileSize"); | 169 TRACE_EVENT0("sql", "MojoVFSFileSize"); |
170 | 170 |
171 filesystem::FileError err = filesystem::FILE_ERROR_FAILED; | 171 filesystem::FileError err = filesystem::FileError::FAILED; |
172 filesystem::FileInformationPtr file_info; | 172 filesystem::FileInformationPtr file_info; |
173 GetFSFile(sql_file)->Stat(Capture(&err, &file_info)); | 173 GetFSFile(sql_file)->Stat(Capture(&err, &file_info)); |
174 GetFSFile(sql_file).WaitForIncomingResponse(); | 174 GetFSFile(sql_file).WaitForIncomingResponse(); |
175 | 175 |
176 if (err != filesystem::FILE_ERROR_OK) { | 176 if (err != filesystem::FileError::OK) { |
177 // TODO(erg): Better implementation here. | 177 // TODO(erg): Better implementation here. |
178 NOTIMPLEMENTED(); | 178 NOTIMPLEMENTED(); |
179 return SQLITE_IOERR_FSTAT; | 179 return SQLITE_IOERR_FSTAT; |
180 } | 180 } |
181 | 181 |
182 *size = file_info->size; | 182 *size = file_info->size; |
183 return SQLITE_OK; | 183 return SQLITE_OK; |
184 } | 184 } |
185 | 185 |
186 // TODO(erg): The current base::File interface isn't sufficient to handle | 186 // TODO(erg): The current base::File interface isn't sufficient to handle |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 CHECK(strncmp("Temp_", name, 5) != 0); | 276 CHECK(strncmp("Temp_", name, 5) != 0); |
277 mojo_name = name; | 277 mojo_name = name; |
278 } else { | 278 } else { |
279 DCHECK(flags & SQLITE_OPEN_DELETEONCLOSE); | 279 DCHECK(flags & SQLITE_OPEN_DELETEONCLOSE); |
280 static int temp_number = 0; | 280 static int temp_number = 0; |
281 mojo_name = base::StringPrintf("Temp_%d.db", temp_number++); | 281 mojo_name = base::StringPrintf("Temp_%d.db", temp_number++); |
282 } | 282 } |
283 | 283 |
284 // Grab the incoming file | 284 // Grab the incoming file |
285 filesystem::FilePtr file_ptr; | 285 filesystem::FilePtr file_ptr; |
286 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 286 filesystem::FileError error = filesystem::FileError::FAILED; |
287 GetRootDirectory(mojo_vfs)->OpenFile(mojo_name, GetProxy(&file_ptr), | 287 GetRootDirectory(mojo_vfs)->OpenFile(mojo_name, GetProxy(&file_ptr), |
288 open_flags, Capture(&error)); | 288 open_flags, Capture(&error)); |
289 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); | 289 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); |
290 if (error != filesystem::FILE_ERROR_OK) { | 290 if (error != filesystem::FileError::OK) { |
291 // TODO(erg): Translate more of the mojo error codes into sqlite error | 291 // TODO(erg): Translate more of the mojo error codes into sqlite error |
292 // codes. | 292 // codes. |
293 return SQLITE_CANTOPEN; | 293 return SQLITE_CANTOPEN; |
294 } | 294 } |
295 | 295 |
296 // 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 |
297 // match the following placement news). | 297 // match the following placement news). |
298 file->pMethods = &mojo_vfs_io_methods; | 298 file->pMethods = &mojo_vfs_io_methods; |
299 | 299 |
300 // |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 |
301 // 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 |
302 // the pipe to our file. | 302 // the pipe to our file. |
303 new (&GetFSFile(file)) filesystem::FilePtr(std::move(file_ptr)); | 303 new (&GetFSFile(file)) filesystem::FilePtr(std::move(file_ptr)); |
304 | 304 |
305 return SQLITE_OK; | 305 return SQLITE_OK; |
306 } | 306 } |
307 | 307 |
308 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) { |
309 DVLOG(1) << "MojoVFSDelete(*, " << filename << ", " << sync_dir << ")"; | 309 DVLOG(1) << "MojoVFSDelete(*, " << filename << ", " << sync_dir << ")"; |
310 TRACE_EVENT2("sql", "MojoVFSDelete", | 310 TRACE_EVENT2("sql", "MojoVFSDelete", |
311 "name", filename, | 311 "name", filename, |
312 "sync_dir", sync_dir); | 312 "sync_dir", sync_dir); |
313 // 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 |
314 // antivirus software keeping files open. We'll probably have to do something | 314 // antivirus software keeping files open. We'll probably have to do something |
315 // like that in the far future if we ever support Windows. | 315 // like that in the far future if we ever support Windows. |
316 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 316 filesystem::FileError error = filesystem::FileError::FAILED; |
317 GetRootDirectory(mojo_vfs)->Delete(filename, 0, Capture(&error)); | 317 GetRootDirectory(mojo_vfs)->Delete(filename, 0, Capture(&error)); |
318 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); | 318 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); |
319 | 319 |
320 if (error == filesystem::FILE_ERROR_OK && sync_dir) { | 320 if (error == filesystem::FileError::OK && sync_dir) { |
321 GetRootDirectory(mojo_vfs)->Flush(Capture(&error)); | 321 GetRootDirectory(mojo_vfs)->Flush(Capture(&error)); |
322 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); | 322 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); |
323 } | 323 } |
324 | 324 |
325 return error == filesystem::FILE_ERROR_OK ? SQLITE_OK : SQLITE_IOERR_DELETE; | 325 return error == filesystem::FileError::OK ? SQLITE_OK : SQLITE_IOERR_DELETE; |
326 } | 326 } |
327 | 327 |
328 int MojoVFSAccess(sqlite3_vfs* mojo_vfs, | 328 int MojoVFSAccess(sqlite3_vfs* mojo_vfs, |
329 const char* filename, | 329 const char* filename, |
330 int flags, | 330 int flags, |
331 int* result) { | 331 int* result) { |
332 DVLOG(1) << "MojoVFSAccess(*, " << filename << ", " << flags << ", *)"; | 332 DVLOG(1) << "MojoVFSAccess(*, " << filename << ", " << flags << ", *)"; |
333 TRACE_EVENT2("sql", "MojoVFSAccess", | 333 TRACE_EVENT2("sql", "MojoVFSAccess", |
334 "name", filename, | 334 "name", filename, |
335 "flags", flags); | 335 "flags", flags); |
336 filesystem::FileError error = filesystem::FILE_ERROR_FAILED; | 336 filesystem::FileError error = filesystem::FileError::FAILED; |
337 | 337 |
338 if (flags == SQLITE_ACCESS_READWRITE || flags == SQLITE_ACCESS_READ) { | 338 if (flags == SQLITE_ACCESS_READWRITE || flags == SQLITE_ACCESS_READ) { |
339 bool is_writable = false; | 339 bool is_writable = false; |
340 GetRootDirectory(mojo_vfs) | 340 GetRootDirectory(mojo_vfs) |
341 ->IsWritable(filename, Capture(&error, &is_writable)); | 341 ->IsWritable(filename, Capture(&error, &is_writable)); |
342 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); | 342 GetRootDirectory(mojo_vfs).WaitForIncomingResponse(); |
343 *result = is_writable; | 343 *result = is_writable; |
344 return SQLITE_OK; | 344 return SQLITE_OK; |
345 } | 345 } |
346 | 346 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 | 446 |
447 CHECK(sqlite3_vfs_register(parent_, 1) == SQLITE_OK); | 447 CHECK(sqlite3_vfs_register(parent_, 1) == SQLITE_OK); |
448 CHECK(sqlite3_vfs_unregister(&mojo_vfs) == SQLITE_OK); | 448 CHECK(sqlite3_vfs_unregister(&mojo_vfs) == SQLITE_OK); |
449 } | 449 } |
450 | 450 |
451 filesystem::DirectoryPtr& ScopedMojoFilesystemVFS::GetDirectory() { | 451 filesystem::DirectoryPtr& ScopedMojoFilesystemVFS::GetDirectory() { |
452 return root_directory_; | 452 return root_directory_; |
453 } | 453 } |
454 | 454 |
455 } // namespace sql | 455 } // namespace sql |
OLD | NEW |