| OLD | NEW |
| 1 From 67024286d2719aec049605896ef0afec6932f184 Mon Sep 17 00:00:00 2001 | 1 From 4b957c2c198a53498fe18ad9668e2817ace98b1e Mon Sep 17 00:00:00 2001 |
| 2 From: dumi <dumi@chromium.org> | 2 From: dumi <dumi@chromium.org> |
| 3 Date: Mon, 20 Jul 2009 23:40:51 +0000 | 3 Date: Mon, 20 Jul 2009 23:40:51 +0000 |
| 4 Subject: [PATCH 05/16] Modify default VFS to support WebDatabase. | 4 Subject: [PATCH 05/11] Modify default VFS to support WebDatabase. |
| 5 | 5 |
| 6 The renderer WebDatabase implementation needs to broker certain requests | 6 The renderer WebDatabase implementation needs to broker certain requests |
| 7 to the browser. This modifies SQLite to allow monkey-patching the VFS | 7 to the browser. This modifies SQLite to allow monkey-patching the VFS |
| 8 to support this. | 8 to support this. |
| 9 | 9 |
| 10 NOTE(shess): This patch relies on core SQLite implementation details | 10 NOTE(shess): This patch relies on core SQLite implementation details |
| 11 remaining unchanged. When importing a new version of SQLite, pay very | 11 remaining unchanged. When importing a new version of SQLite, pay very |
| 12 close attention to whether the change is still doing what is intended. | 12 close attention to whether the change is still doing what is intended. |
| 13 | 13 |
| 14 Original review URLs: | 14 Original review URLs: |
| 15 https://codereview.chromium.org/159044 | 15 https://codereview.chromium.org/159044 |
| 16 https://codereview.chromium.org/384075 | 16 https://codereview.chromium.org/384075 |
| 17 https://codereview.chromium.org/377039 | 17 https://codereview.chromium.org/377039 |
| 18 [Possibly not a complete list.] | 18 [Possibly not a complete list.] |
| 19 --- | 19 --- |
| 20 third_party/sqlite/src/src/os_unix.c | 95 ++++++++++++++++++++++++++++++------ | 20 third_party/sqlite/src/src/os_unix.c | 100 +++++++++++++++++++++++++++------ |
| 21 third_party/sqlite/src/src/os_win.c | 7 +++ | 21 third_party/sqlite/src/src/os_win.c | 8 +++ |
| 22 2 files changed, 86 insertions(+), 16 deletions(-) | 22 third_party/sqlite/src/src/sqlite.h.in | 36 ++++++++++++ |
| 23 3 files changed, 128 insertions(+), 16 deletions(-) |
| 23 | 24 |
| 24 diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/o
s_unix.c | 25 diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/o
s_unix.c |
| 25 index a9344ee..1624f6a 100644 | 26 index a9344ee..75b71dc 100644 |
| 26 --- a/third_party/sqlite/src/src/os_unix.c | 27 --- a/third_party/sqlite/src/src/os_unix.c |
| 27 +++ b/third_party/sqlite/src/src/os_unix.c | 28 +++ b/third_party/sqlite/src/src/os_unix.c |
| 28 @@ -1321,6 +1321,12 @@ static int fileHasMoved(unixFile *pFile){ | 29 @@ -1321,6 +1321,12 @@ static int fileHasMoved(unixFile *pFile){ |
| 29 return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; | 30 return pFile->pInode!=0 && pFile->pId!=pFile->pInode->fileId.pId; |
| 30 #else | 31 #else |
| 31 struct stat buf; | 32 struct stat buf; |
| 32 + | 33 + |
| 33 + /* TODO(shess): This check doesn't work when the Chromium's WebDB code is | 34 + /* TODO(shess): This check doesn't work when the Chromium's WebDB code is |
| 34 + ** running in the sandbox. | 35 + ** running in the sandbox. |
| 35 + */ | 36 + */ |
| 36 + return 0; | 37 + return 0; |
| 37 + | 38 + |
| 38 return pFile->pInode!=0 && | 39 return pFile->pInode!=0 && |
| 39 (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); | 40 (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); |
| 40 #endif | 41 #endif |
| 41 @@ -5615,6 +5621,73 @@ static int findCreateFileMode( | 42 @@ -5615,6 +5621,78 @@ static int findCreateFileMode( |
| 42 } | 43 } |
| 43 | 44 |
| 44 /* | 45 /* |
| 45 +** Initializes a unixFile structure with zeros. | 46 +** Initializes a unixFile structure with zeros. |
| 46 +*/ | 47 +*/ |
| 48 +CHROMIUM_SQLITE_API |
| 47 +void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) { | 49 +void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) { |
| 48 + memset(file, 0, sizeof(unixFile)); | 50 + memset(file, 0, sizeof(unixFile)); |
| 49 +} | 51 +} |
| 50 + | 52 + |
| 53 +CHROMIUM_SQLITE_API |
| 51 +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, | 54 +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, |
| 52 + int fd, | 55 + int fd, |
| 53 + int dirfd, | 56 + int dirfd, |
| 54 + sqlite3_file* file, | 57 + sqlite3_file* file, |
| 55 + const char* fileName, | 58 + const char* fileName, |
| 56 + int noLock) { | 59 + int noLock) { |
| 57 + int ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0); | 60 + int ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0); |
| 58 + return fillInUnixFile(vfs, fd, file, fileName, ctrlFlags); | 61 + return fillInUnixFile(vfs, fd, file, fileName, ctrlFlags); |
| 59 +} | 62 +} |
| 60 + | 63 + |
| 61 +/* | 64 +/* |
| 62 +** Search for an unused file descriptor that was opened on the database file. | 65 +** Search for an unused file descriptor that was opened on the database file. |
| 63 +** If a suitable file descriptor if found, then it is stored in *fd; otherwise, | 66 +** If a suitable file descriptor if found, then it is stored in *fd; otherwise, |
| 64 +** *fd is not modified. | 67 +** *fd is not modified. |
| 65 +** | 68 +** |
| 66 +** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot | 69 +** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot |
| 67 +** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned. | 70 +** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned. |
| 68 +*/ | 71 +*/ |
| 72 +CHROMIUM_SQLITE_API |
| 69 +int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, | 73 +int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, |
| 70 + const char* fileName, | 74 + const char* fileName, |
| 71 + int flags, | 75 + int flags, |
| 72 + int* fd) { | 76 + int* fd) { |
| 73 + unixFile* unixSQLite3File = (unixFile*)file; | 77 + unixFile* unixSQLite3File = (unixFile*)file; |
| 74 + int fileType = flags & 0xFFFFFF00; | 78 + int fileType = flags & 0xFFFFFF00; |
| 75 + if (fileType == SQLITE_OPEN_MAIN_DB) { | 79 + if (fileType == SQLITE_OPEN_MAIN_DB) { |
| 76 + UnixUnusedFd *unusedFd = findReusableFd(fileName, flags); | 80 + UnixUnusedFd *unusedFd = findReusableFd(fileName, flags); |
| 77 + if (unusedFd) { | 81 + if (unusedFd) { |
| 78 + *fd = unusedFd->fd; | 82 + *fd = unusedFd->fd; |
| 79 + } else { | 83 + } else { |
| 80 + unusedFd = sqlite3_malloc(sizeof(*unusedFd)); | 84 + unusedFd = sqlite3_malloc(sizeof(*unusedFd)); |
| 81 + if (!unusedFd) { | 85 + if (!unusedFd) { |
| 82 + return SQLITE_NOMEM; | 86 + return SQLITE_NOMEM; |
| 83 + } | 87 + } |
| 84 + } | 88 + } |
| 85 + unixSQLite3File->pUnused = unusedFd; | 89 + unixSQLite3File->pUnused = unusedFd; |
| 86 + } | 90 + } |
| 87 + return SQLITE_OK; | 91 + return SQLITE_OK; |
| 88 +} | 92 +} |
| 89 + | 93 + |
| 90 +/* | 94 +/* |
| 91 +** Marks 'fd' as the unused file descriptor for 'pFile'. | 95 +** Marks 'fd' as the unused file descriptor for 'pFile'. |
| 92 +*/ | 96 +*/ |
| 97 +CHROMIUM_SQLITE_API |
| 93 +void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, | 98 +void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, |
| 94 + int fd, | 99 + int fd, |
| 95 + int flags) { | 100 + int flags) { |
| 96 + unixFile* unixSQLite3File = (unixFile*)file; | 101 + unixFile* unixSQLite3File = (unixFile*)file; |
| 97 + if (unixSQLite3File->pUnused) { | 102 + if (unixSQLite3File->pUnused) { |
| 98 + unixSQLite3File->pUnused->fd = fd; | 103 + unixSQLite3File->pUnused->fd = fd; |
| 99 + unixSQLite3File->pUnused->flags = flags; | 104 + unixSQLite3File->pUnused->flags = flags; |
| 100 + } | 105 + } |
| 101 +} | 106 +} |
| 102 + | 107 + |
| 103 +/* | 108 +/* |
| 104 +** Destroys pFile's field that keeps track of the unused file descriptor. | 109 +** Destroys pFile's field that keeps track of the unused file descriptor. |
| 105 +*/ | 110 +*/ |
| 111 +CHROMIUM_SQLITE_API |
| 106 +void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) { | 112 +void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) { |
| 107 + unixFile* unixSQLite3File = (unixFile*)file; | 113 + unixFile* unixSQLite3File = (unixFile*)file; |
| 108 + sqlite3_free(unixSQLite3File->pUnused); | 114 + sqlite3_free(unixSQLite3File->pUnused); |
| 109 +} | 115 +} |
| 110 + | 116 + |
| 111 +/* | 117 +/* |
| 112 ** Open the file zPath. | 118 ** Open the file zPath. |
| 113 ** | 119 ** |
| 114 ** Previously, the SQLite OS layer used three functions in place of this | 120 ** Previously, the SQLite OS layer used three functions in place of this |
| 115 @@ -5715,20 +5788,13 @@ static int unixOpen( | 121 @@ -5715,20 +5793,13 @@ static int unixOpen( |
| 116 sqlite3_randomness(0,0); | 122 sqlite3_randomness(0,0); |
| 117 } | 123 } |
| 118 | 124 |
| 119 - memset(p, 0, sizeof(unixFile)); | 125 - memset(p, 0, sizeof(unixFile)); |
| 120 + chromium_sqlite3_initialize_unix_sqlite3_file(pFile); | 126 + chromium_sqlite3_initialize_unix_sqlite3_file(pFile); |
| 121 | 127 |
| 122 if( eType==SQLITE_OPEN_MAIN_DB ){ | 128 if( eType==SQLITE_OPEN_MAIN_DB ){ |
| 123 - UnixUnusedFd *pUnused; | 129 - UnixUnusedFd *pUnused; |
| 124 - pUnused = findReusableFd(zName, flags); | 130 - pUnused = findReusableFd(zName, flags); |
| 125 - if( pUnused ){ | 131 - if( pUnused ){ |
| 126 - fd = pUnused->fd; | 132 - fd = pUnused->fd; |
| 127 - }else{ | 133 - }else{ |
| 128 - pUnused = sqlite3_malloc(sizeof(*pUnused)); | 134 - pUnused = sqlite3_malloc(sizeof(*pUnused)); |
| 129 - if( !pUnused ){ | 135 - if( !pUnused ){ |
| 130 - return SQLITE_NOMEM; | 136 - return SQLITE_NOMEM; |
| 131 - } | 137 - } |
| 132 + rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd); | 138 + rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd); |
| 133 + if( rc!=SQLITE_OK ){ | 139 + if( rc!=SQLITE_OK ){ |
| 134 + return rc; | 140 + return rc; |
| 135 } | 141 } |
| 136 - p->pUnused = pUnused; | 142 - p->pUnused = pUnused; |
| 137 | 143 |
| 138 /* Database filenames are double-zero terminated if they are not | 144 /* Database filenames are double-zero terminated if they are not |
| 139 ** URIs with parameters. Hence, they can always be passed into | 145 ** URIs with parameters. Hence, they can always be passed into |
| 140 @@ -5798,10 +5864,7 @@ static int unixOpen( | 146 @@ -5798,10 +5869,7 @@ static int unixOpen( |
| 141 *pOutFlags = flags; | 147 *pOutFlags = flags; |
| 142 } | 148 } |
| 143 | 149 |
| 144 - if( p->pUnused ){ | 150 - if( p->pUnused ){ |
| 145 - p->pUnused->fd = fd; | 151 - p->pUnused->fd = fd; |
| 146 - p->pUnused->flags = flags; | 152 - p->pUnused->flags = flags; |
| 147 - } | 153 - } |
| 148 + chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags); | 154 + chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags); |
| 149 | 155 |
| 150 if( isDelete ){ | 156 if( isDelete ){ |
| 151 #if OS_VXWORKS | 157 #if OS_VXWORKS |
| 152 @@ -5893,7 +5956,7 @@ static int unixOpen( | 158 @@ -5893,7 +5961,7 @@ static int unixOpen( |
| 153 | 159 |
| 154 open_finished: | 160 open_finished: |
| 155 if( rc!=SQLITE_OK ){ | 161 if( rc!=SQLITE_OK ){ |
| 156 - sqlite3_free(p->pUnused); | 162 - sqlite3_free(p->pUnused); |
| 157 + chromium_sqlite3_destroy_reusable_file_handle(pFile); | 163 + chromium_sqlite3_destroy_reusable_file_handle(pFile); |
| 158 } | 164 } |
| 159 return rc; | 165 return rc; |
| 160 } | 166 } |
| 161 diff --git a/third_party/sqlite/src/src/os_win.c b/third_party/sqlite/src/src/os
_win.c | 167 diff --git a/third_party/sqlite/src/src/os_win.c b/third_party/sqlite/src/src/os
_win.c |
| 162 index 8ca2107..5b0a296 100644 | 168 index 8ca2107..9320bfc 100644 |
| 163 --- a/third_party/sqlite/src/src/os_win.c | 169 --- a/third_party/sqlite/src/src/os_win.c |
| 164 +++ b/third_party/sqlite/src/src/os_win.c | 170 +++ b/third_party/sqlite/src/src/os_win.c |
| 165 @@ -5546,4 +5546,11 @@ int sqlite3_os_end(void){ | 171 @@ -5546,4 +5546,12 @@ int sqlite3_os_end(void){ |
| 166 return SQLITE_OK; | 172 return SQLITE_OK; |
| 167 } | 173 } |
| 168 | 174 |
| 175 +CHROMIUM_SQLITE_API |
| 169 +void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE ha
ndle) { | 176 +void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE ha
ndle) { |
| 170 + winFile* winSQLite3File = (winFile*)file; | 177 + winFile* winSQLite3File = (winFile*)file; |
| 171 + memset(file, 0, sizeof(*file)); | 178 + memset(file, 0, sizeof(*file)); |
| 172 + winSQLite3File->pMethod = &winIoMethod; | 179 + winSQLite3File->pMethod = &winIoMethod; |
| 173 + winSQLite3File->h = handle; | 180 + winSQLite3File->h = handle; |
| 174 +} | 181 +} |
| 175 + | 182 + |
| 176 #endif /* SQLITE_OS_WIN */ | 183 #endif /* SQLITE_OS_WIN */ |
| 184 diff --git a/third_party/sqlite/src/src/sqlite.h.in b/third_party/sqlite/src/src
/sqlite.h.in |
| 185 index f1d4e40..36aa999 100644 |
| 186 --- a/third_party/sqlite/src/src/sqlite.h.in |
| 187 +++ b/third_party/sqlite/src/src/sqlite.h.in |
| 188 @@ -7408,6 +7408,42 @@ int sqlite3_vtab_on_conflict(sqlite3 *); |
| 189 |
| 190 |
| 191 |
| 192 +/* Begin WebDatabase patch for Chromium */ |
| 193 +/* Expose some SQLite internals for the WebDatabase vfs. |
| 194 +** DO NOT EXTEND THE USE OF THIS. |
| 195 +*/ |
| 196 +#ifndef CHROMIUM_SQLITE_API |
| 197 +#define CHROMIUM_SQLITE_API SQLITE_API |
| 198 +#endif |
| 199 +#if defined(CHROMIUM_SQLITE_INTERNALS) |
| 200 +#ifdef _WIN32 |
| 201 +CHROMIUM_SQLITE_API |
| 202 +void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE ha
ndle); |
| 203 +#else /* _WIN32 */ |
| 204 +CHROMIUM_SQLITE_API |
| 205 +void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file); |
| 206 +CHROMIUM_SQLITE_API |
| 207 +int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, |
| 208 + int fd, |
| 209 + int dirfd, |
| 210 + sqlite3_file* file, |
| 211 + const char* fileName, |
| 212 + int noLock); |
| 213 +CHROMIUM_SQLITE_API |
| 214 +int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, |
| 215 + const char* fileName, |
| 216 + int flags, |
| 217 + int* fd); |
| 218 +CHROMIUM_SQLITE_API |
| 219 +void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, |
| 220 + int fd, |
| 221 + int flags); |
| 222 +CHROMIUM_SQLITE_API |
| 223 +void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file); |
| 224 +#endif /* _WIN32 */ |
| 225 +#endif /* CHROMIUM_SQLITE_INTERNALS */ |
| 226 +/* End WebDatabase patch for Chromium */ |
| 227 + |
| 228 /* |
| 229 ** Undo the hack that converts floating point types to integer for |
| 230 ** builds on processors without floating point support. |
| 177 -- | 231 -- |
| 178 2.2.1 | 232 2.4.5 |
| 179 | 233 |
| OLD | NEW |