Cleanup SQLite 3.6.18 import.

Get things spic-n-span for converting to the amalgamation, then SQLite
3.7.x.

sqlite3Preload -> sqlite3_preload because in the amalgamation, sqlite3_ is the key bit to make sure things aren't marked static.

AFAICT, SQLite 3.6.18 was not imported correctly last time, throwing
up spurious deltas.  Re-import and re-apply patches.

Remove a bunch of Gears-related stuff.  Quite some time ago the
Chromium and Gears SQLite imports were brought into line, but they
were never fully shared.  Nowadays these are completely useless:
 - remove fts1 patches.
 - add a Chromium test to make sure fts1 doesn't sneak in.
 - drop the Symbian stuff.
 - drop database poisoning.

Pull out the WebDatabase patch into a patch file.  Move ICU shell
changes into a distinct patch file.  Pull out testing patches into a
separate test.patch.

BUG=71731
TEST=automated testing and watching closely.

Review URL: http://codereview.chromium.org/6823057

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81296 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/third_party/sqlite/webdb.patch b/third_party/sqlite/webdb.patch
new file mode 100644
index 0000000..226ca5bb
--- /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);
++}
++
++/*
++** 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 */