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