X-Git-Url: https://git.webkit.org/?p=WebKit-https.git;a=blobdiff_plain;f=WebCore%2Fplatform%2Fsql%2Fchromium%2FSQLiteFileSystemChromiumPosix.cpp;h=0050a430a56291a74429284c470abd90d2478034;hp=2960a5f738731f3b9593c7191dbda18059ac4843;hb=656c3f67229f46a23882c613007ef338f3ad01da;hpb=14a90caf4a34c93366ca5b29e2934b367dad1de7;ds=sidebyside diff --git a/WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp b/WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp index 2960a5f73873..0050a430a562 100644 --- a/WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp +++ b/WebCore/platform/sql/chromium/SQLiteFileSystemChromiumPosix.cpp @@ -42,8 +42,11 @@ using namespace WebCore; // Defined in Chromium's codebase in third_party/sqlite/src/os_unix.c extern "C" { -void initUnixFile(sqlite3_file* file); -int fillInUnixFile(sqlite3_vfs* vfs, int fd, int dirfd, sqlite3_file* file, const char* fileName, int noLock); +void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file); +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, int fd, int dirfd, sqlite3_file* file, const char* fileName, int noLock); +int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, const char* fileName, int flags, int* fd); +void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, int fd, int flags); +void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file); } // Chromium's Posix implementation of SQLite VFS @@ -59,18 +62,28 @@ namespace { int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, sqlite3_file* id, int desiredFlags, int* usedFlags) { - initUnixFile(id); + chromium_sqlite3_initialize_unix_sqlite3_file(id); + int fd = -1; int dirfd = -1; - int fd = ChromiumBridge::databaseOpenFile(fileName, desiredFlags, &dirfd); + int result = chromium_sqlite3_get_reusable_file_handle(id, fileName, desiredFlags, &fd); + if (result != SQLITE_OK) + return result; + if (fd < 0) { - if (desiredFlags & SQLITE_OPEN_READWRITE) { + fd = ChromiumBridge::databaseOpenFile(fileName, desiredFlags, &dirfd); + if ((fd < 0) && (desiredFlags & SQLITE_OPEN_READWRITE)) { int newFlags = (desiredFlags & ~(SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE)) | SQLITE_OPEN_READONLY; - return chromiumOpen(vfs, fileName, id, newFlags, usedFlags); - } else - return SQLITE_CANTOPEN; + fd = ChromiumBridge::databaseOpenFile(fileName, newFlags, &dirfd); + } + } + if (fd < 0) { + chromium_sqlite3_destroy_reusable_file_handle(id); + return SQLITE_CANTOPEN; } + if (usedFlags) *usedFlags = desiredFlags; + chromium_sqlite3_update_reusable_file_handle(id, fd, desiredFlags); fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); if (dirfd >= 0) @@ -79,7 +92,10 @@ int chromiumOpen(sqlite3_vfs* vfs, const char* fileName, // The mask 0x00007F00 gives us the 7 bits that determine the type of the file SQLite is trying to open. int fileType = desiredFlags & 0x00007F00; int noLock = (fileType != SQLITE_OPEN_MAIN_DB); - return fillInUnixFile(vfs, fd, dirfd, id, fileName, noLock); + result = chromium_sqlite3_fill_in_unix_sqlite3_file(vfs, fd, dirfd, id, fileName, noLock); + if (result != SQLITE_OK) + chromium_sqlite3_destroy_reusable_file_handle(id); + return result; } // Deletes the given file. @@ -184,7 +200,7 @@ void SQLiteFileSystem::registerSQLiteVFS() unix_vfs->xCurrentTime, unix_vfs->xGetLastError }; - sqlite3_vfs_register(&chromium_vfs, 1); + sqlite3_vfs_register(&chromium_vfs, 0); } } // namespace WebCore