Index: Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp |
diff --git a/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp b/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp |
index e2e57aa633ea53237bb23b54aa3cf075db159c15..3a96c0e959ccdd904ef60432d1e04b90e051a31e 100644 |
--- a/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp |
+++ b/Source/modules/webdatabase/sqlite/SQLiteFileSystemPosix.cpp |
@@ -52,6 +52,93 @@ namespace blink { |
// Chromium's Posix implementation of SQLite VFS |
namespace { |
+struct chromiumVfsFile { |
+ sqlite3_io_methods* pMethods; |
+ sqlite3_file* wrappedFile; |
+ char* wrappedFileName; |
+}; |
+ |
+int chromiumClose(sqlite3_file* sqliteFile) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ int r = chromiumFile->wrappedFile->pMethods->xClose(chromiumFile->wrappedFile); |
+ sqlite3_free(chromiumFile->wrappedFileName); |
+ sqlite3_free(chromiumFile->wrappedFile); |
+ memset(chromiumFile, 0, sizeof(*chromiumFile)); |
+ return r; |
+} |
+ |
+int chromiumRead(sqlite3_file* sqliteFile, void* pBuf, int iAmt, sqlite3_int64 iOfst) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xRead(chromiumFile->wrappedFile, pBuf, iAmt, iOfst); |
+} |
+ |
+int chromiumWrite(sqlite3_file* sqliteFile, const void* pBuf, int iAmt, sqlite3_int64 iOfst) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xWrite(chromiumFile->wrappedFile, pBuf, iAmt, iOfst); |
+} |
+ |
+int chromiumTruncate(sqlite3_file* sqliteFile, sqlite3_int64 size) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ |
+ // The OSX and Linux sandboxes block ftruncate(), proxy to the browser |
+ // process. |
+ if (Platform::current()->databaseSetFileSize(String(chromiumFile->wrappedFileName), size)) |
+ return SQLITE_OK; |
+ return SQLITE_IOERR_TRUNCATE; |
+} |
+ |
+int chromiumSync(sqlite3_file* sqliteFile, int flags) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xSync(chromiumFile->wrappedFile, flags); |
+} |
+ |
+int chromiumFileSize(sqlite3_file* sqliteFile, sqlite3_int64* pSize) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xFileSize(chromiumFile->wrappedFile, pSize); |
+} |
+ |
+int chromiumLock(sqlite3_file* sqliteFile, int eFileLock) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xLock(chromiumFile->wrappedFile, eFileLock); |
+} |
+ |
+int chromiumUnlock(sqlite3_file* sqliteFile, int eFileLock) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xUnlock(chromiumFile->wrappedFile, eFileLock); |
+} |
+ |
+int chromiumCheckReservedLock(sqlite3_file* sqliteFile, int* pResOut) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xCheckReservedLock(chromiumFile->wrappedFile, pResOut); |
+} |
+ |
+int chromiumFileControl(sqlite3_file* sqliteFile, int op, void* pArg) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xFileControl(chromiumFile->wrappedFile, op, pArg); |
+} |
+ |
+int chromiumSectorSize(sqlite3_file* sqliteFile) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xSectorSize(chromiumFile->wrappedFile); |
+} |
+ |
+int chromiumDeviceCharacteristics(sqlite3_file* sqliteFile) |
+{ |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(sqliteFile); |
+ return chromiumFile->wrappedFile->pMethods->xDeviceCharacteristics(chromiumFile->wrappedFile); |
+} |
+ |
// Opens a file. |
// |
// vfs - pointer to the sqlite3_vfs object. |
@@ -59,7 +146,7 @@ namespace { |
// id - the structure that will manipulate the newly opened file. |
// desiredFlags - the desired open mode flags. |
// usedFlags - the actual open mode flags that were used. |
-int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int desiredFlags, int* usedFlags) |
+int chromiumOpenInternal(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int desiredFlags, int* usedFlags) |
{ |
chromium_sqlite3_initialize_unix_sqlite3_file(id); |
int fd = -1; |
@@ -95,6 +182,53 @@ int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int d |
return result; |
} |
+int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int desiredFlags, int* usedFlags) |
+{ |
+ sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData); |
+ sqlite3_file* wrappedFile = static_cast<sqlite3_file*>(sqlite3_malloc(wrappedVfs->szOsFile)); |
+ if (!wrappedFile) |
+ return SQLITE_NOMEM; |
+ |
+ // Make a local copy of the file name. SQLite's os_unix.c appears to be written to allow caching the pointer passed |
+ // in to this function, but that seems brittle. |
+ char* wrappedFileName = sqlite3_mprintf("%s", fileName); |
+ if (!wrappedFileName) { |
+ sqlite3_free(wrappedFile); |
+ return SQLITE_NOMEM; |
+ } |
+ |
+ // SQLite's unixOpen() makes assumptions about the structure of |fileName|. Our local copy may not answer those |
+ // assumptions correctly. |
+ int rc = chromiumOpenInternal(vfs, fileName, wrappedFile, desiredFlags, usedFlags); |
+ if (rc != SQLITE_OK) { |
+ sqlite3_free(wrappedFileName); |
+ sqlite3_free(wrappedFile); |
+ return rc; |
+ } |
+ |
+ static sqlite3_io_methods chromiumIoMethods = { |
+ 1, |
+ chromiumClose, |
+ chromiumRead, |
+ chromiumWrite, |
+ chromiumTruncate, |
+ chromiumSync, |
+ chromiumFileSize, |
+ chromiumLock, |
+ chromiumUnlock, |
+ chromiumCheckReservedLock, |
+ chromiumFileControl, |
+ chromiumSectorSize, |
+ chromiumDeviceCharacteristics, |
+ // Methods above are valid for version 1. |
+ }; |
+ chromiumVfsFile* chromiumFile = reinterpret_cast<chromiumVfsFile*>(id); |
+ chromiumFile->pMethods = &chromiumIoMethods; |
+ chromiumFile->wrappedFile = wrappedFile; |
+ chromiumFile->wrappedFileName = wrappedFileName; |
+ return SQLITE_OK; |
+} |
+ |
// Deletes the given file. |
// |
// vfs - pointer to the sqlite3_vfs object. |
@@ -161,7 +295,7 @@ void chromiumDlError(sqlite3_vfs*, int bufSize, char* errorBuffer) |
sqlite3_snprintf(bufSize, errorBuffer, "Dynamic loading not supported"); |
} |
-void(*chromiumDlSym(sqlite3_vfs*, void *, const char*))(void) |
+void(*chromiumDlSym(sqlite3_vfs*, void*, const char*))(void) |
{ |
return 0; |
} |
@@ -170,25 +304,25 @@ void chromiumDlClose(sqlite3_vfs*, void*) |
{ |
} |
-int chromiumRandomness(sqlite3_vfs *vfs, int bufSize, char *buffer) |
+int chromiumRandomness(sqlite3_vfs* vfs, int bufSize, char* buffer) |
{ |
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData); |
return wrappedVfs->xRandomness(wrappedVfs, bufSize, buffer); |
} |
-int chromiumSleep(sqlite3_vfs *vfs, int microseconds) |
+int chromiumSleep(sqlite3_vfs* vfs, int microseconds) |
{ |
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData); |
return wrappedVfs->xSleep(wrappedVfs, microseconds); |
} |
-int chromiumCurrentTime(sqlite3_vfs *vfs, double *prNow) |
+int chromiumCurrentTime(sqlite3_vfs* vfs, double* prNow) |
{ |
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData); |
return wrappedVfs->xCurrentTime(wrappedVfs, prNow); |
} |
-int chromiumGetLastError(sqlite3_vfs *vfs, int e, char* s) |
+int chromiumGetLastError(sqlite3_vfs* vfs, int e, char* s) |
{ |
sqlite3_vfs* wrappedVfs = static_cast<sqlite3_vfs*>(vfs->pAppData); |
return wrappedVfs->xGetLastError(wrappedVfs, e, s); |
@@ -201,7 +335,7 @@ void SQLiteFileSystem::registerSQLiteVFS() |
sqlite3_vfs* wrappedVfs = sqlite3_vfs_find("unix"); |
static sqlite3_vfs chromium_vfs = { |
1, |
- wrappedVfs->szOsFile, |
+ sizeof(chromiumVfsFile), |
wrappedVfs->mxPathname, |
0, |
"chromium_vfs", |