| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: dumi <dumi@chromium.org> |
| Date: Mon, 20 Jul 2009 23:40:51 +0000 |
| Subject: [PATCH 1/6] Modify default VFS to support WebDatabase. |
| |
| The renderer WebDatabase implementation needs to broker certain requests |
| to the browser. This modifies SQLite to allow monkey-patching the VFS |
| to support this. |
| |
| NOTE(shess): This patch relies on core SQLite implementation details |
| remaining unchanged. When importing a new version of SQLite, pay very |
| close attention to whether the change is still doing what is intended. |
| |
| Original review URLs: |
| https://codereview.chromium.org/159044 |
| https://codereview.chromium.org/384075 |
| https://codereview.chromium.org/377039 |
| [Possibly not a complete list.] |
| --- |
| third_party/sqlite/src/src/os_unix.c | 51 ++++++++++++++++++++++++++ |
| third_party/sqlite/src/src/os_win.c | 8 ++++ |
| third_party/sqlite/src/src/sqlite.h.in | 23 ++++++++++++ |
| 3 files changed, 82 insertions(+) |
| |
| diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c |
| index 52ef64116444..d0e1c39bc4b8 100644 |
| --- a/third_party/sqlite/src/src/os_unix.c |
| +++ b/third_party/sqlite/src/src/os_unix.c |
| @@ -1437,6 +1437,12 @@ static int fileHasMoved(unixFile *pFile){ |
| return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; |
| #else |
| struct stat buf; |
| + |
| + /* TODO(shess): This check doesn't work when the Chromium's WebDB code is |
| + ** running in the sandbox. |
| + */ |
| + return 0; |
| + |
| return pFile->pInode!=0 && |
| (osStat(pFile->zPath, &buf)!=0 |
| || (u64)buf.st_ino!=pFile->pInode->fileId.ino); |
| @@ -5879,6 +5885,45 @@ static int findCreateFileMode( |
| return rc; |
| } |
| |
| +/* |
| +** Initialize |unixFile| internals of |file| on behalf of chromiumOpen() in |
| +** WebDatabase SQLiteFileSystemPosix.cpp. Function is a subset of unixOpen(), |
| +** each duplicated piece is marked by "Duplicated in" comment in unixOpen(). |
| +*/ |
| +CHROMIUM_SQLITE_API |
| +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* pVfs, |
| + int fd, |
| + sqlite3_file* pFile, |
| + const char* zPath, |
| + int noLock, |
| + int flags) { |
| + unixFile *p = (unixFile *)pFile; |
| + const int eType = flags&0xFFFFFF00; /* Type of file to open */ |
| + const int ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0); |
| + int rc; |
| + |
| + memset(p, 0, sizeof(unixFile)); |
| + |
| + /* osStat() will not work in the sandbox, so findReusableFd() will always |
| + ** fail, so directly include the failure-case setup then initialize |
| + ** pPreallocatedUnused. |
| + */ |
| + if( eType==SQLITE_OPEN_MAIN_DB ){ |
| + p->pPreallocatedUnused = sqlite3_malloc(sizeof(*p->pPreallocatedUnused)); |
| + if (!p->pPreallocatedUnused) { |
| + return SQLITE_NOMEM_BKPT; |
| + } |
| + p->pPreallocatedUnused->fd = fd; |
| + p->pPreallocatedUnused->flags = flags; |
| + } |
| + |
| + rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); |
| + if( rc!=SQLITE_OK ){ |
| + sqlite3_free(p->pPreallocatedUnused); |
| + } |
| + return rc; |
| +} |
| + |
| /* |
| ** Open the file zPath. |
| ** |
| @@ -5979,6 +6024,8 @@ static int unixOpen( |
| randomnessPid = osGetpid(0); |
| sqlite3_randomness(0,0); |
| } |
| + |
| + /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ |
| memset(p, 0, sizeof(unixFile)); |
| |
| if( eType==SQLITE_OPEN_MAIN_DB ){ |
| @@ -5987,6 +6034,7 @@ static int unixOpen( |
| if( pUnused ){ |
| fd = pUnused->fd; |
| }else{ |
| + /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ |
| pUnused = sqlite3_malloc64(sizeof(*pUnused)); |
| if( !pUnused ){ |
| return SQLITE_NOMEM_BKPT; |
| @@ -6071,6 +6119,7 @@ static int unixOpen( |
| } |
| |
| if( p->pPreallocatedUnused ){ |
| + /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ |
| p->pPreallocatedUnused->fd = fd; |
| p->pPreallocatedUnused->flags = flags; |
| } |
| @@ -6152,10 +6201,12 @@ static int unixOpen( |
| assert( zPath==0 || zPath[0]=='/' |
| || eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL |
| ); |
| + /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ |
| rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); |
| |
| open_finished: |
| if( rc!=SQLITE_OK ){ |
| + /* Duplicated in chromium_sqlite3_fill_in_unix_sqlite3_file(). */ |
| sqlite3_free(p->pPreallocatedUnused); |
| } |
| return rc; |
| diff --git a/third_party/sqlite/src/src/os_win.c b/third_party/sqlite/src/src/os_win.c |
| index aafc89f7d2d5..76743781a019 100644 |
| --- a/third_party/sqlite/src/src/os_win.c |
| +++ b/third_party/sqlite/src/src/os_win.c |
| @@ -6130,4 +6130,12 @@ int sqlite3_os_end(void){ |
| return SQLITE_OK; |
| } |
| |
| +CHROMIUM_SQLITE_API |
| +void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE handle) { |
| + winFile* winSQLite3File = (winFile*)file; |
| + memset(file, 0, sizeof(*file)); |
| + winSQLite3File->pMethod = &winIoMethod; |
| + winSQLite3File->h = handle; |
| +} |
| + |
| #endif /* SQLITE_OS_WIN */ |
| diff --git a/third_party/sqlite/src/src/sqlite.h.in b/third_party/sqlite/src/src/sqlite.h.in |
| index cf17bc015fa7..11622a49697f 100644 |
| --- a/third_party/sqlite/src/src/sqlite.h.in |
| +++ b/third_party/sqlite/src/src/sqlite.h.in |
| @@ -8378,6 +8378,29 @@ int sqlite3_strnicmp(const char *, const char *, int); |
| */ |
| int sqlite3_strglob(const char *zGlob, const char *zStr); |
| |
| +/* Begin WebDatabase patch for Chromium */ |
| +/* Expose some SQLite internals for the WebDatabase vfs. |
| +** DO NOT EXTEND THE USE OF THIS. |
| +*/ |
| +#ifndef CHROMIUM_SQLITE_API |
| +#define CHROMIUM_SQLITE_API SQLITE_API |
| +#endif |
| +#if defined(CHROMIUM_SQLITE_INTERNALS) |
| +#ifdef _WIN32 |
| +CHROMIUM_SQLITE_API |
| +void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE handle); |
| +#else /* _WIN32 */ |
| +CHROMIUM_SQLITE_API |
| +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* pVfs, |
| + int fd, |
| + sqlite3_file* pFile, |
| + const char* zPath, |
| + int noLock, |
| + int flags); |
| +#endif /* _WIN32 */ |
| +#endif /* CHROMIUM_SQLITE_INTERNALS */ |
| +/* End WebDatabase patch for Chromium */ |
| + |
| /* |
| ** CAPI3REF: String LIKE Matching |
| * |
| -- |
| 2.18.0 |
| |