Index: third_party/sqlite/webdb.patch |
diff --git a/third_party/sqlite/webdb.patch b/third_party/sqlite/webdb.patch |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6a4e934f46561fb50e20e4a0b1146b53453d1155 |
--- /dev/null |
+++ b/third_party/sqlite/webdb.patch |
@@ -0,0 +1,163 @@ |
+The WebDatabase implementation in the renderer users a custom vfs to |
+broker file open and other requests. This modifies the built-in vfs |
+implementation to let that code share much of the implementation |
+details. |
+ |
+diff --git src/os_unix.c src/os_unix.c |
+index ef04a72..e5e1509 100644 |
+--- src/os_unix.c |
++++ src/os_unix.c |
+@@ -3496,9 +3496,16 @@ typedef const sqlite3_io_methods *(*finder_type)(const char*,unixFile*); |
+ */ |
+ |
+ /* |
++** Initializes a unixFile structure with zeros. |
++*/ |
++void initUnixFile(sqlite3_file* file) { |
++ memset(file, 0, sizeof(unixFile)); |
++} |
++ |
++/* |
+ ** Initialize the contents of the unixFile structure pointed to by pId. |
+ */ |
+-static int fillInUnixFile( |
++int fillInUnixFile( |
+ sqlite3_vfs *pVfs, /* Pointer to vfs object */ |
+ int h, /* Open file descriptor of file being opened */ |
+ int dirfd, /* Directory file descriptor */ |
+@@ -3812,6 +3819,73 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ |
+ } |
+ |
+ /* |
++** Initializes a unixFile structure with zeros. |
++*/ |
++void chromium_sqlite3_initialize_unix_sqlite3_file(sqlite3_file* file) { |
++ memset(file, 0, sizeof(unixFile)); |
++} |
++ |
++int chromium_sqlite3_fill_in_unix_sqlite3_file(sqlite3_vfs* vfs, |
++ int fd, |
++ int dirfd, |
++ sqlite3_file* file, |
++ const char* fileName, |
++ int noLock, |
++ int isDelete) { |
++ return fillInUnixFile(vfs, fd, dirfd, file, fileName, noLock, isDelete, 0); |
++} |
++ |
++/* |
++** Search for an unused file descriptor that was opened on the database file. |
++** If a suitable file descriptor if found, then it is stored in *fd; otherwise, |
++** *fd is not modified. |
++** |
++** If a reusable file descriptor is not found, and a new UnixUnusedFd cannot |
++** be allocated, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK is returned. |
++*/ |
++int chromium_sqlite3_get_reusable_file_handle(sqlite3_file* file, |
++ const char* fileName, |
++ int flags, |
++ int* fd) { |
++ unixFile* unixSQLite3File = (unixFile*)file; |
++ int fileType = flags & 0xFFFFFF00; |
++ if (fileType == SQLITE_OPEN_MAIN_DB) { |
++ UnixUnusedFd *unusedFd = findReusableFd(fileName, flags); |
++ if (unusedFd) { |
++ *fd = unusedFd->fd; |
++ } else { |
++ unusedFd = sqlite3_malloc(sizeof(*unusedFd)); |
++ if (!unusedFd) { |
++ return SQLITE_NOMEM; |
++ } |
++ } |
++ unixSQLite3File->pUnused = unusedFd; |
++ } |
++ return SQLITE_OK; |
++} |
++ |
++/* |
++** Marks 'fd' as the unused file descriptor for 'pFile'. |
++*/ |
++void chromium_sqlite3_update_reusable_file_handle(sqlite3_file* file, |
++ int fd, |
++ int flags) { |
++ unixFile* unixSQLite3File = (unixFile*)file; |
++ if (unixSQLite3File->pUnused) { |
++ unixSQLite3File->pUnused->fd = fd; |
++ unixSQLite3File->pUnused->flags = flags; |
++ } |
++} |
++ |
++/* |
++** Destroys pFile's field that keeps track of the unused file descriptor. |
++*/ |
++void chromium_sqlite3_destroy_reusable_file_handle(sqlite3_file* file) { |
++ unixFile* unixSQLite3File = (unixFile*)file; |
++ sqlite3_free(unixSQLite3File->pUnused); |
++} |
++ |
++/* |
+ ** Open the file zPath. |
+ ** |
+ ** Previously, the SQLite OS layer used three functions in place of this |
+@@ -3893,20 +3967,13 @@ static int unixOpen( |
+ || eType==SQLITE_OPEN_TRANSIENT_DB |
+ ); |
+ |
+- memset(p, 0, sizeof(unixFile)); |
++ chromium_sqlite3_initialize_unix_sqlite3_file(pFile); |
+ |
+ if( eType==SQLITE_OPEN_MAIN_DB ){ |
+- UnixUnusedFd *pUnused; |
+- pUnused = findReusableFd(zName, flags); |
+- if( pUnused ){ |
+- fd = pUnused->fd; |
+- }else{ |
+- pUnused = sqlite3_malloc(sizeof(*pUnused)); |
+- if( !pUnused ){ |
+- return SQLITE_NOMEM; |
+- } |
++ rc = chromium_sqlite3_get_reusable_file_handle(pFile, zName, flags, &fd); |
++ if( rc!=SQLITE_OK ){ |
++ return rc; |
+ } |
+- p->pUnused = pUnused; |
+ }else if( !zName ){ |
+ /* If zName is NULL, the upper layer is requesting a temp file. */ |
+ assert(isDelete && !isOpenDirectory); |
+@@ -3949,10 +4016,7 @@ static int unixOpen( |
+ *pOutFlags = flags; |
+ } |
+ |
+- if( p->pUnused ){ |
+- p->pUnused->fd = fd; |
+- p->pUnused->flags = flags; |
+- } |
++ chromium_sqlite3_update_reusable_file_handle(pFile, fd, flags); |
+ |
+ if( isDelete ){ |
+ #if OS_VXWORKS |
+@@ -4028,7 +4092,7 @@ static int unixOpen( |
+ rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock, isDelete); |
+ open_finished: |
+ if( rc!=SQLITE_OK ){ |
+- sqlite3_free(p->pUnused); |
++ chromium_sqlite3_destroy_reusable_file_handle(pFile); |
+ } |
+ return rc; |
+ } |
+diff --git src/os_win.c src/os_win.c |
+index bc03a4b..06539d7 100644 |
+--- src/os_win.c |
++++ src/os_win.c |
+@@ -1890,4 +1890,11 @@ int sqlite3_os_end(void){ |
+ return SQLITE_OK; |
+ } |
+ |
++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 */ |