From 67024286d2719aec049605896ef0afec6932f184 Mon Sep 17 00:00:00 2001
From: dumi <dumi@chromium.org>
Date: Mon, 20 Jul 2009 23:40:51 +0000
Subject: [PATCH 05/16] 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 | 95 ++++++++++++++++++++++++++++++------
 third_party/sqlite/src/src/os_win.c  |  7 +++
 2 files changed, 86 insertions(+), 16 deletions(-)

diff --git a/third_party/sqlite/src/src/os_unix.c b/third_party/sqlite/src/src/os_unix.c
index a9344ee..1624f6a 100644
--- a/third_party/sqlite/src/src/os_unix.c
+++ b/third_party/sqlite/src/src/os_unix.c
@@ -1321,6 +1321,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 || buf.st_ino!=pFile->pInode->fileId.ino);
 #endif
@@ -5615,6 +5621,73 @@ static int findCreateFileMode(
 }
 
 /*
+** 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 ctrlFlags = (noLock ? UNIXFILE_NOLOCK : 0);
+  return fillInUnixFile(vfs, fd, file, fileName, ctrlFlags);
+}
+
+/*
+** 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
@@ -5715,20 +5788,13 @@ static int unixOpen(
     sqlite3_randomness(0,0);
   }
 
-  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;
 
     /* Database filenames are double-zero terminated if they are not
     ** URIs with parameters.  Hence, they can always be passed into
@@ -5798,10 +5864,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
@@ -5893,7 +5956,7 @@ static int unixOpen(
 
 open_finished:
   if( rc!=SQLITE_OK ){
-    sqlite3_free(p->pUnused);
+    chromium_sqlite3_destroy_reusable_file_handle(pFile);
   }
   return rc;
 }
diff --git a/third_party/sqlite/src/src/os_win.c b/third_party/sqlite/src/src/os_win.c
index 8ca2107..5b0a296 100644
--- a/third_party/sqlite/src/src/os_win.c
+++ b/third_party/sqlite/src/src/os_win.c
@@ -5546,4 +5546,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 */
-- 
2.2.1

