| Index: third_party/sqlite/misc.patch
|
| diff --git a/third_party/sqlite/misc.patch b/third_party/sqlite/misc.patch
|
| index b90eba5d08b3b6fe2b00efad30be29c652587bab..10fe084e339e2ac95a253950b5be5987c95f97cf 100644
|
| --- a/third_party/sqlite/misc.patch
|
| +++ b/third_party/sqlite/misc.patch
|
| @@ -1,100 +1,3 @@
|
| -Index: Makefile.linux-gcc
|
| -===================================================================
|
| ---- Makefile.linux-gcc 2009-09-03 13:32:06.000000000 -0700
|
| -+++ Makefile.linux-gcc 2009-07-01 12:08:39.000000000 -0700
|
| -@@ -14,7 +14,7 @@
|
| - #### The toplevel directory of the source tree. This is the directory
|
| - # that contains this "Makefile.in" and the "configure.in" script.
|
| - #
|
| --TOP = ../sqlite
|
| -+TOP = ..
|
| -
|
| - #### C Compiler and options for use in building executables that
|
| - # will run on the platform that is doing the build.
|
| -@@ -33,13 +33,13 @@
|
| - # appropriately:
|
| - #
|
| - #THREADSAFE = -DTHREADSAFE=1
|
| --THREADSAFE = -DTHREADSAFE=0
|
| -+THREADSAFE = -DTHREADSAFE=1
|
| -
|
| - #### Specify any extra linker options needed to make the library
|
| - # thread safe
|
| - #
|
| - #THREADLIB = -lpthread
|
| --THREADLIB =
|
| -+THREADLIB = -lpthread
|
| -
|
| - #### Specify any extra libraries needed to access required functions.
|
| - #
|
| -@@ -57,8 +57,29 @@
|
| - #OPTS = -DSQLITE_DEBUG=2
|
| - #OPTS = -DSQLITE_DEBUG=1
|
| - #OPTS =
|
| --OPTS = -DNDEBUG=1
|
| --OPTS += -DHAVE_FDATASYNC=1
|
| -+
|
| -+# These flags match those for SQLITE_CFLAGS in config.mk.
|
| -+
|
| -+OPTS += -DNDEBUG
|
| -+OPTS += -DSQLITE_CORE
|
| -+OPTS += -DSQLITE_ENABLE_FTS1 -DSQLITE_ENABLE_BROKEN_FTS1
|
| -+OPTS += -DSQLITE_ENABLE_FTS2 -DSQLITE_ENABLE_BROKEN_FTS2
|
| -+OPTS += -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600
|
| -+OPTS += -DHAVE_USLEEP=1
|
| -+
|
| -+# Additional SQLite tests.
|
| -+OPTS += -DSQLITE_MEMDEBUG=1
|
| -+
|
| -+# Don't include these ones, they break the SQLite tests.
|
| -+# -DSQLITE_OMIT_ATTACH=1 \
|
| -+# -DSQLITE_OMIT_LOAD_EXTENSION=1 \
|
| -+# -DSQLITE_OMIT_VACUUM=1 \
|
| -+# -DSQLITE_TRANSACTION_DEFAULT_IMMEDIATE=1 \
|
| -+
|
| -+SHELL_ICU = $(TOP)/src/shell_icu_linux.c -licuuc
|
| -+
|
| -+# TODO(shess) I can't see why I need this setting.
|
| -+OPTS += -DOS_UNIX=1
|
| -
|
| - #### The suffix to add to executable files. ".exe" for windows.
|
| - # Nothing for unix.
|
| -@@ -91,16 +112,16 @@
|
| -
|
| - #### Extra compiler options needed for programs that use the TCL library.
|
| - #
|
| --#TCL_FLAGS =
|
| -+TCL_FLAGS = -I/usr/include/tcl8.4
|
| - #TCL_FLAGS = -DSTATIC_BUILD=1
|
| --TCL_FLAGS = -I/home/drh/tcltk/8.4linux
|
| -+#TCL_FLAGS = -I/home/drh/tcltk/8.4linux
|
| - #TCL_FLAGS = -I/home/drh/tcltk/8.4win -DSTATIC_BUILD=1
|
| - #TCL_FLAGS = -I/home/drh/tcltk/8.3hpux
|
| -
|
| - #### Linker options needed to link against the TCL library.
|
| - #
|
| --#LIBTCL = -ltcl -lm -ldl
|
| --LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
|
| -+LIBTCL = -ltcl8.4 -lm -ldl
|
| -+#LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
|
| - #LIBTCL = /home/drh/tcltk/8.4win/libtcl84s.a -lmsvcrt
|
| - #LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc
|
| -
|
| -Index: ext/fts1/fts1.c
|
| -===================================================================
|
| ---- ext/fts1/fts1.c 2009-09-04 13:37:41.000000000 -0700
|
| -+++ ext/fts1/fts1.c 2009-09-14 18:16:55.000000000 -0700
|
| -@@ -1225,10 +1225,6 @@
|
| - break;
|
| - }
|
| - return rc;
|
| --
|
| -- err:
|
| -- sqlite3_finalize(s);
|
| -- return rc;
|
| - }
|
| -
|
| - /* Like sql_step_statement(), but convert SQLITE_DONE to SQLITE_OK.
|
| Index: ext/icu/icu.c
|
| ===================================================================
|
| --- ext/icu/icu.c 2009-09-03 13:32:06.000000000 -0700
|
| @@ -111,101 +14,6 @@ Index: ext/icu/icu.c
|
| #ifndef SQLITE_CORE
|
| #include "sqlite3ext.h"
|
| SQLITE_EXTENSION_INIT1
|
| -Index: main.mk
|
| -===================================================================
|
| ---- main.mk 2009-09-10 12:18:17.000000000 -0700
|
| -+++ main.mk 2009-09-15 11:45:21.000000000 -0700
|
| -@@ -69,6 +69,16 @@
|
| - walker.o where.o utf.o vtab.o
|
| -
|
| -
|
| -+LIBOBJ += fts1.o \
|
| -+ fts1_hash.o \
|
| -+ fts1_tokenizer1.o \
|
| -+ fts1_porter.o
|
| -+LIBOBJ += fts2.o \
|
| -+ fts2_hash.o \
|
| -+ fts2_icu.o \
|
| -+ fts2_porter.o \
|
| -+ fts2_tokenizer.o \
|
| -+ fts2_tokenizer1.o
|
| -
|
| - # All of the source code files.
|
| - #
|
| -@@ -243,6 +253,25 @@
|
| - $(TOP)/src/test_thread.c \
|
| - $(TOP)/src/test_wsd.c
|
| -
|
| -+TESTSRC += \
|
| -+ $(TOP)/ext/fts1/fts1.c \
|
| -+ $(TOP)/ext/fts1/fts1.h \
|
| -+ $(TOP)/ext/fts1/fts1_hash.c \
|
| -+ $(TOP)/ext/fts1/fts1_hash.h \
|
| -+ $(TOP)/ext/fts1/fts1_porter.c \
|
| -+ $(TOP)/ext/fts1/fts1_tokenizer.h \
|
| -+ $(TOP)/ext/fts1/fts1_tokenizer1.c
|
| -+TESTSRC += \
|
| -+ $(TOP)/ext/fts2/fts2.c \
|
| -+ $(TOP)/ext/fts2/fts2.h \
|
| -+ $(TOP)/ext/fts2/fts2_hash.c \
|
| -+ $(TOP)/ext/fts2/fts2_hash.h \
|
| -+ $(TOP)/ext/fts2/fts2_icu.c \
|
| -+ $(TOP)/ext/fts2/fts2_porter.c \
|
| -+ $(TOP)/ext/fts2/fts2_tokenizer.h \
|
| -+ $(TOP)/ext/fts2/fts2_tokenizer.c \
|
| -+ $(TOP)/ext/fts2/fts2_tokenizer1.c
|
| -+
|
| - #TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c
|
| - #TESTSRC += $(TOP)/ext/fts3/fts3_tokenizer.c
|
| -
|
| -@@ -314,8 +343,8 @@
|
| -
|
| - sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h
|
| - $(TCCX) $(READLINE_FLAGS) -o sqlite3$(EXE) \
|
| -- $(TOP)/src/shell.c \
|
| -- libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB)
|
| -+ $(TOP)/src/shell.c $(SHELL_ICU) \
|
| -+ libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB) -ldl
|
| -
|
| - objects: $(LIBOBJ_ORIG)
|
| -
|
| -@@ -447,6 +476,20 @@
|
| - $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/rtree/rtree.c
|
| -
|
| -
|
| -+
|
| -+
|
| -+fts1.o: $(TOP)/ext/fts1/fts1.c $(HDR) $(EXTHDR)
|
| -+ $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts1/fts1.c
|
| -+
|
| -+fts1_hash.o: $(TOP)/ext/fts1/fts1_hash.c $(HDR) $(EXTHDR)
|
| -+ $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts1/fts1_hash.c
|
| -+
|
| -+fts1_tokenizer1.o: $(TOP)/ext/fts1/fts1_tokenizer1.c $(HDR) $(EXTHDR)
|
| -+ $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts1/fts1_tokenizer1.c
|
| -+
|
| -+fts1_porter.o: $(TOP)/ext/fts1/fts1_porter.c $(HDR) $(EXTHDR)
|
| -+ $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts1/fts1_porter.c
|
| -+
|
| - # Rules for building test programs and for running tests
|
| - #
|
| - tclsqlite3: $(TOP)/src/tclsqlite.c libsqlite3.a
|
| -@@ -484,6 +527,15 @@
|
| - test: testfixture$(EXE) sqlite3$(EXE)
|
| - ./testfixture$(EXE) $(TOP)/test/veryquick.test
|
| -
|
| -+ftstest: testfixture$(EXE) sqlite3$(EXE)
|
| -+ ./testfixture$(EXE) $(TOP)/test/fts.test
|
| -+
|
| -+fts1test: testfixture$(EXE) sqlite3$(EXE)
|
| -+ ./testfixture$(EXE) $(TOP)/test/fts1.test
|
| -+
|
| -+fts2test: testfixture$(EXE) sqlite3$(EXE)
|
| -+ ./testfixture$(EXE) $(TOP)/test/fts2.test
|
| -+
|
| - sqlite3_analyzer$(EXE): $(TOP)/src/tclsqlite.c sqlite3.c $(TESTSRC) \
|
| - $(TOP)/tool/spaceanal.tcl
|
| - sed \
|
| Index: src/expr.c
|
| ===================================================================
|
| --- src/expr.c 2009-09-08 12:16:11.000000000 -0700
|
| @@ -234,953 +42,3 @@ Index: src/func.c
|
| }
|
| }
|
| sqlite3_result_text(context, (char*)zIn, nIn, SQLITE_TRANSIENT);
|
| -Index: src/os.h
|
| -===================================================================
|
| ---- src/os.h 2009-09-04 13:37:42.000000000 -0700
|
| -+++ src/os.h 2009-09-14 18:18:24.000000000 -0700
|
| -@@ -29,6 +29,10 @@
|
| - ** will defined to either 1 or 0. One of the four will be 1. The other
|
| - ** three will be 0.
|
| - */
|
| -+#ifdef OS_SYMBIAN
|
| -+# define SQLITE_OS_SYMBIAN 1
|
| -+# define SQLITE_OS_OTHER 1
|
| -+#endif
|
| - #if defined(SQLITE_OS_OTHER)
|
| - # if SQLITE_OS_OTHER==1
|
| - # undef SQLITE_OS_UNIX
|
| -Index: src/os_unix.c
|
| -===================================================================
|
| ---- src/os_unix.c 2009-09-10 12:14:55.000000000 -0700
|
| -+++ src/os_unix.c 2009-09-15 16:50:43.000000000 -0700
|
| -@@ -3215,6 +3215,7 @@
|
| - ********************** End sqlite3_file Methods *******************************
|
| - ******************************************************************************/
|
| -
|
| -+
|
| - /*
|
| - ** This division contains definitions of sqlite3_io_methods objects that
|
| - ** implement various file locking strategies. It also contains definitions
|
| -@@ -3496,9 +3497,16 @@
|
| - */
|
| -
|
| - /*
|
| -+** 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 */
|
| -Index: src/os_win.c
|
| -===================================================================
|
| ---- src/os_win.c 2009-09-10 15:08:39.000000000 -0700
|
| -+++ src/os_win.c 2009-09-14 18:26:16.000000000 -0700
|
| -@@ -1890,4 +1890,11 @@
|
| - 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 */
|
| -Index: src/pcache.c
|
| -===================================================================
|
| ---- src/pcache.c 2009-09-04 13:37:42.000000000 -0700
|
| -+++ src/pcache.c 2009-09-15 16:41:55.000000000 -0700
|
| -@@ -542,14 +542,12 @@
|
| - return nPage;
|
| - }
|
| -
|
| --#ifdef SQLITE_TEST
|
| - /*
|
| - ** Get the suggested cache-size value.
|
| - */
|
| - int sqlite3PcacheGetCachesize(PCache *pCache){
|
| - return pCache->nMax;
|
| - }
|
| --#endif
|
| -
|
| - /*
|
| - ** Set the suggested cache-size value.
|
| -Index: src/pcache.h
|
| -===================================================================
|
| ---- src/pcache.h 2009-09-04 13:37:42.000000000 -0700
|
| -+++ src/pcache.h 2009-09-15 16:41:52.000000000 -0700
|
| -@@ -139,9 +139,7 @@
|
| - ** of the suggested cache-sizes.
|
| - */
|
| - void sqlite3PcacheSetCachesize(PCache *, int);
|
| --#ifdef SQLITE_TEST
|
| - int sqlite3PcacheGetCachesize(PCache *);
|
| --#endif
|
| -
|
| - #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
|
| - /* Try to return memory used by the pcache module to the main memory heap */
|
| -Index: src/shell.c
|
| -===================================================================
|
| ---- src/shell.c 2009-09-04 13:37:43.000000000 -0700
|
| -+++ src/shell.c 2009-09-15 11:32:08.000000000 -0700
|
| -@@ -3007,6 +3007,18 @@
|
| - int i;
|
| - int rc = 0;
|
| -
|
| -+ /* Begin evanm patch. */
|
| -+#ifdef SQLITE_GEARS_DISABLE_SHELL_ICU
|
| -+ /* Gears doesn't use this. */
|
| -+#else
|
| -+ extern int sqlite_shell_init_icu();
|
| -+ if( !sqlite_shell_init_icu() ){
|
| -+ fprintf(stderr, "%s: warning: couldn't find icudt38.dll; "
|
| -+ "queries against ICU FTS tables will fail.\n", argv[0]);
|
| -+ }
|
| -+#endif
|
| -+ /* End evanm patch. */
|
| -+
|
| - Argv0 = argv[0];
|
| - main_init(&data);
|
| - stdin_is_interactive = isatty(0);
|
| -Index: src/sqlite3ext.h
|
| -===================================================================
|
| ---- src/sqlite3ext.h 2009-09-03 13:32:06.000000000 -0700
|
| -+++ src/sqlite3ext.h 2009-09-15 11:34:43.000000000 -0700
|
| -@@ -372,9 +372,15 @@
|
| - #define sqlite3_next_stmt sqlite3_api->next_stmt
|
| - #define sqlite3_sql sqlite3_api->sql
|
| - #define sqlite3_status sqlite3_api->status
|
| --#endif /* SQLITE_CORE */
|
| -
|
| - #define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api = 0;
|
| - #define SQLITE_EXTENSION_INIT2(v) sqlite3_api = v;
|
| -
|
| -+#else
|
| -+
|
| -+#define SQLITE_EXTENSION_INIT1
|
| -+#define SQLITE_EXTENSION_INIT2(v)
|
| -+
|
| -+#endif /* SQLITE_CORE */
|
| -+
|
| - #endif /* _SQLITE3EXT_H_ */
|
| -Index: src/test_autoext.c
|
| -===================================================================
|
| ---- src/test_autoext.c 2009-09-03 13:32:06.000000000 -0700
|
| -+++ src/test_autoext.c 2009-09-15 18:14:35.000000000 -0700
|
| -@@ -17,7 +17,9 @@
|
| - #include "sqlite3ext.h"
|
| -
|
| - #ifndef SQLITE_OMIT_LOAD_EXTENSION
|
| -+#ifndef SQLITE_CORE
|
| - static SQLITE_EXTENSION_INIT1
|
| -+#endif
|
| -
|
| - /*
|
| - ** The sqr() SQL function returns the square of its input value.
|
| -Index: src/quick.test
|
| -===================================================================
|
| ---- test/quick.test 2009-09-04 13:37:44.000000000 -0700
|
| -+++ test/quick.test 2009-09-15 11:34:54.000000000 -0700
|
| -@@ -58,6 +58,9 @@
|
| - crash7.test
|
| - delete3.test
|
| - fts3.test
|
| -+ fts.test
|
| -+ fts1.test
|
| -+ fts2.test
|
| - fuzz.test
|
| - fuzz3.test
|
| - fuzz_malloc.test
|
| -Index: src/os_symbian.cc
|
| -===================================================================
|
| ---- src/os_symbian.cc 1969-12-31 16:00:00.000000000 -0800
|
| -+++ src/os_symbian.cc 2009-07-01 12:08:37.000000000 -0700
|
| -@@ -0,0 +1,579 @@
|
| -+// Copyright 2008, Google Inc.
|
| -+//
|
| -+// Redistribution and use in source and binary forms, with or without
|
| -+// modification, are permitted provided that the following conditions are met:
|
| -+//
|
| -+// 1. Redistributions of source code must retain the above copyright notice,
|
| -+// this list of conditions and the following disclaimer.
|
| -+// 2. Redistributions in binary form must reproduce the above copyright notice,
|
| -+// this list of conditions and the following disclaimer in the documentation
|
| -+// and/or other materials provided with the distribution.
|
| -+// 3. Neither the name of Google Inc. nor the names of its contributors may be
|
| -+// used to endorse or promote products derived from this software without
|
| -+// specific prior written permission.
|
| -+//
|
| -+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| -+// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| -+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| -+// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| -+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| -+// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| -+// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| -+// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| -+// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -+
|
| -+// This file contains code that is specific to Symbian.
|
| -+// Differently from the rest of SQLite, it is implemented in C++ as this is
|
| -+// the native language of the OS and all interfaces we need to use are C++.
|
| -+//
|
| -+// This file follows the Gears code style guidelines.
|
| -+
|
| -+#ifdef OS_SYMBIAN
|
| -+#include <coemain.h>
|
| -+#include <e32math.h>
|
| -+#include <f32file.h>
|
| -+#include <utf.h>
|
| -+
|
| -+extern "C" {
|
| -+#include "sqliteInt.h"
|
| -+#include "os_common.h"
|
| -+}
|
| -+
|
| -+const TInt kFileLockAttempts = 3;
|
| -+
|
| -+// The global file system session.
|
| -+RFs g_fs_session;
|
| -+
|
| -+static TInt UTF8ToUTF16(const char *in, TDes *out16) {
|
| -+ assert(in);
|
| -+ TPtrC8 in_des(reinterpret_cast<const unsigned char*>(in));
|
| -+ return CnvUtfConverter::ConvertToUnicodeFromUtf8(*out16, in_des);
|
| -+}
|
| -+
|
| -+static TInt UTF16ToUTF8(const TDesC16& in16, TDes8 *out8) {
|
| -+ return CnvUtfConverter::ConvertFromUnicodeToUtf8(*out8, in16);
|
| -+}
|
| -+
|
| -+// The SymbianFile structure is a subclass of sqlite3_file* specific to the
|
| -+// Symbian portability layer.
|
| -+struct SymbianFile {
|
| -+ const sqlite3_io_methods *methods;
|
| -+ RFile handle; // The file handle
|
| -+ TUint8 lock_type; // Type of lock currently held on this file
|
| -+ TUint16 shared_lock_byte; // Randomly chosen byte used as a shared lock
|
| -+};
|
| -+
|
| -+static SymbianFile* ConvertToSymbianFile(sqlite3_file* const id) {
|
| -+ assert(id);
|
| -+ return reinterpret_cast<SymbianFile*>(id);
|
| -+}
|
| -+
|
| -+static int SymbianClose(sqlite3_file *id) {
|
| -+ SymbianFile *file_id = ConvertToSymbianFile(id);
|
| -+ file_id->handle.Close();
|
| -+ OpenCounter(-1);
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianRead(sqlite3_file *id,
|
| -+ void *buffer,
|
| -+ int amount,
|
| -+ sqlite3_int64 offset) {
|
| -+ assert(buffer);
|
| -+ assert(amount >=0);
|
| -+ assert(offset >=0);
|
| -+
|
| -+ SymbianFile* file_id = ConvertToSymbianFile(id);
|
| -+ TPtr8 dest(static_cast<unsigned char*>(buffer), amount);
|
| -+
|
| -+ if (KErrNone == file_id->handle.Read(offset, dest, amount)) {
|
| -+ if (dest.Length() == amount) {
|
| -+ return SQLITE_OK;
|
| -+ } else {
|
| -+ return SQLITE_IOERR_SHORT_READ;
|
| -+ }
|
| -+ } else {
|
| -+ return SQLITE_IOERR;
|
| -+ }
|
| -+}
|
| -+
|
| -+static int SymbianWrite(sqlite3_file *id,
|
| -+ const void *buffer,
|
| -+ int amount,
|
| -+ sqlite3_int64 offset) {
|
| -+ assert(buffer);
|
| -+ assert(amount >=0);
|
| -+ assert(offset >=0);
|
| -+
|
| -+ SymbianFile *file_id = ConvertToSymbianFile(id);
|
| -+ TPtrC8 src(static_cast<const unsigned char*>(buffer), amount);
|
| -+ if (file_id->handle.Write(offset, src) != KErrNone) {
|
| -+ return SQLITE_IOERR_WRITE;
|
| -+ }
|
| -+
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianTruncate(sqlite3_file *id, sqlite3_int64 bytes) {
|
| -+ assert(bytes >=0);
|
| -+
|
| -+ SymbianFile *file_id = ConvertToSymbianFile(id);
|
| -+ if (file_id->handle.SetSize(bytes) != KErrNone) {
|
| -+ return SQLITE_IOERR;
|
| -+ }
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianSync(sqlite3_file *id, int /*flags*/) {
|
| -+ SymbianFile *file_id = ConvertToSymbianFile(id);
|
| -+ if (file_id->handle.Flush() != KErrNone) {
|
| -+ return SQLITE_IOERR;
|
| -+ } else {
|
| -+ return SQLITE_OK;
|
| -+ }
|
| -+}
|
| -+
|
| -+static int SymbianFileSize(sqlite3_file *id, sqlite3_int64 *size) {
|
| -+ assert(size);
|
| -+
|
| -+ SymbianFile *file_id = ConvertToSymbianFile(id);
|
| -+ TInt size_tmp;
|
| -+ if (file_id->handle.Size(size_tmp) != KErrNone) {
|
| -+ return SQLITE_IOERR;
|
| -+ }
|
| -+ *size = size_tmp;
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+// File lock/unlock functions; see os_win.c for a description
|
| -+// of the algorithm used.
|
| -+static int GetReadLock(SymbianFile *file) {
|
| -+ file->shared_lock_byte = Math::Random() % (SHARED_SIZE - 1);
|
| -+ return file->handle.Lock(SHARED_FIRST + file->shared_lock_byte, 1);
|
| -+}
|
| -+
|
| -+static int UnlockReadLock(SymbianFile *file) {
|
| -+ return file->handle.UnLock(SHARED_FIRST + file->shared_lock_byte, 1);
|
| -+}
|
| -+
|
| -+static int SymbianLock(sqlite3_file *id, int lock_type) {
|
| -+ SymbianFile *file = ConvertToSymbianFile(id);
|
| -+ if (file->lock_type >= lock_type) {
|
| -+ return SQLITE_OK;
|
| -+ }
|
| -+
|
| -+ // Make sure the locking sequence is correct
|
| -+ assert(file->lock_type != NO_LOCK || lock_type == SHARED_LOCK);
|
| -+ assert(lock_type != PENDING_LOCK);
|
| -+ assert(lock_type != RESERVED_LOCK || file->lock_type == SHARED_LOCK);
|
| -+
|
| -+ // Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or
|
| -+ // a SHARED lock. If we are acquiring a SHARED lock, the acquisition of
|
| -+ // the PENDING_LOCK byte is temporary.
|
| -+ int new_lock_type = file->lock_type;
|
| -+ int got_pending_lock = 0;
|
| -+ int res = KErrNone;
|
| -+ if (file->lock_type == NO_LOCK ||
|
| -+ (lock_type == EXCLUSIVE_LOCK && file->lock_type == RESERVED_LOCK)) {
|
| -+ int count = kFileLockAttempts;
|
| -+ while (count-- > 0 &&
|
| -+ (res = file->handle.Lock(PENDING_BYTE, 1)) != KErrNone ) {
|
| -+ // Try 3 times to get the pending lock. The pending lock might be
|
| -+ // held by another reader process who will release it momentarily.
|
| -+ OSTRACE2("could not get a PENDING lock. cnt=%d\n", cnt);
|
| -+ User::After(1000);
|
| -+ }
|
| -+ got_pending_lock = (res == KErrNone? 1 : 0);
|
| -+ }
|
| -+
|
| -+ // Acquire a shared lock
|
| -+ if (lock_type == SHARED_LOCK && res == KErrNone) {
|
| -+ assert(file->lock_type == NO_LOCK);
|
| -+ res = GetReadLock(file);
|
| -+ if (res == KErrNone) {
|
| -+ new_lock_type = SHARED_LOCK;
|
| -+ }
|
| -+ }
|
| -+
|
| -+ // Acquire a RESERVED lock
|
| -+ if (lock_type == RESERVED_LOCK && res == KErrNone) {
|
| -+ assert(file->lock_type == SHARED_LOCK);
|
| -+ res = file->handle.Lock(RESERVED_BYTE, 1);
|
| -+ if (res == KErrNone) {
|
| -+ new_lock_type = RESERVED_LOCK;
|
| -+ }
|
| -+ }
|
| -+
|
| -+ // Acquire a PENDING lock
|
| -+ if (lock_type == EXCLUSIVE_LOCK && res == KErrNone) {
|
| -+ new_lock_type = PENDING_LOCK;
|
| -+ got_pending_lock = 0;
|
| -+ }
|
| -+
|
| -+ // Acquire an EXCLUSIVE lock
|
| -+ if (lock_type == EXCLUSIVE_LOCK && res == KErrNone) {
|
| -+ assert(file->lock_type >= SHARED_LOCK);
|
| -+ res = UnlockReadLock(file);
|
| -+ OSTRACE2("unreadlock = %d\n", res);
|
| -+ res = file->handle.Lock(SHARED_FIRST, SHARED_SIZE);
|
| -+ if (res == KErrNone) {
|
| -+ new_lock_type = EXCLUSIVE_LOCK;
|
| -+ } else {
|
| -+ OSTRACE2("error-code = %d\n", GetLastError());
|
| -+ GetReadLock(file);
|
| -+ }
|
| -+ }
|
| -+
|
| -+ // If we are holding a PENDING lock that ought to be released, then
|
| -+ // release it now.
|
| -+ if (got_pending_lock && lock_type == SHARED_LOCK) {
|
| -+ file->handle.UnLock(PENDING_BYTE, 1);
|
| -+ }
|
| -+
|
| -+ // Update the state of the lock held in the file descriptor, then
|
| -+ // return the appropriate result code.
|
| -+ file->lock_type = new_lock_type;
|
| -+ if (res == KErrNone) {
|
| -+ return SQLITE_OK;
|
| -+ } else {
|
| -+ OSTRACE4("LOCK FAILED %d trying for %d but got %d\n", file->handle,
|
| -+ lock_type, new_lock_type);
|
| -+ return SQLITE_BUSY;
|
| -+ }
|
| -+}
|
| -+
|
| -+static int SymbianUnlock(sqlite3_file *id, int lock_type) {
|
| -+ int type;
|
| -+ int rc = SQLITE_OK;
|
| -+ SymbianFile *file = ConvertToSymbianFile(id);
|
| -+ assert(lock_type <= SHARED_LOCK);
|
| -+ OSTRACE5("UNLOCK %d to %d was %d(%d)\n", file->handle, lock_type,
|
| -+ file->lock_type, file->shared_lock_byte);
|
| -+ type = file->lock_type;
|
| -+ if (type >= EXCLUSIVE_LOCK) {
|
| -+ file->handle.UnLock(SHARED_FIRST, SHARED_SIZE);
|
| -+ if (lock_type == SHARED_LOCK && GetReadLock(file) != KErrNone) {
|
| -+ // This should never happen. We should always be able to
|
| -+ // reacquire the read lock
|
| -+ rc = SQLITE_IOERR_UNLOCK;
|
| -+ }
|
| -+ }
|
| -+ if (type >= RESERVED_LOCK) {
|
| -+ file->handle.UnLock(RESERVED_BYTE, 1);
|
| -+ }
|
| -+ if (lock_type == NO_LOCK && type >= SHARED_LOCK) {
|
| -+ UnlockReadLock(file);
|
| -+ }
|
| -+ if (type >= PENDING_LOCK) {
|
| -+ file->handle.UnLock(PENDING_BYTE, 1);
|
| -+ }
|
| -+ file->lock_type = lock_type;
|
| -+ return rc;
|
| -+}
|
| -+
|
| -+static int SymbianCheckReservedLock(sqlite3_file *id, int *result) {
|
| -+ int rc;
|
| -+ SymbianFile *file = ConvertToSymbianFile(id);
|
| -+ if (file->lock_type >= RESERVED_LOCK) {
|
| -+ rc = 1;
|
| -+ OSTRACE3("TEST WR-LOCK %d %d (local)\n", pFile->h, rc);
|
| -+ } else {
|
| -+ rc = file->handle.Lock(RESERVED_BYTE, 1);
|
| -+ if (rc == KErrNone) {
|
| -+ file->handle.UnLock(RESERVED_BYTE, 1);
|
| -+ }
|
| -+ rc = !rc;
|
| -+ OSTRACE3("TEST WR-LOCK %d %d (remote)\n", file->handle, rc);
|
| -+ }
|
| -+ *result = rc;
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianFileControl(sqlite3_file */*id*/,
|
| -+ int /*op*/,
|
| -+ void */*arg*/) {
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianSectorSize(sqlite3_file */*id*/) {
|
| -+ return SQLITE_DEFAULT_SECTOR_SIZE;
|
| -+}
|
| -+
|
| -+static int SymbianDeviceCharacteristics(sqlite3_file */*id*/) {
|
| -+ return 0;
|
| -+}
|
| -+
|
| -+/*
|
| -+** This vector defines all the methods that can operate on a
|
| -+** sqlite3_file for Symbian.
|
| -+*/
|
| -+static const sqlite3_io_methods SymbianIoMethod = {
|
| -+ 1, // iVersion
|
| -+ SymbianClose,
|
| -+ SymbianRead,
|
| -+ SymbianWrite,
|
| -+ SymbianTruncate,
|
| -+ SymbianSync,
|
| -+ SymbianFileSize,
|
| -+ SymbianLock,
|
| -+ SymbianUnlock,
|
| -+ SymbianCheckReservedLock,
|
| -+ SymbianFileControl,
|
| -+ SymbianSectorSize,
|
| -+ SymbianDeviceCharacteristics
|
| -+};
|
| -+
|
| -+// ============================================================================
|
| -+// vfs methods begin here
|
| -+// ============================================================================
|
| -+static int SymbianOpen(sqlite3_vfs */*vfs*/,
|
| -+ const char *name,
|
| -+ sqlite3_file *id,
|
| -+ int flags,
|
| -+ int *out_flags) {
|
| -+ TUint desired_access;
|
| -+ TUint share_mode;
|
| -+ TInt err = KErrNone;
|
| -+ TFileName name_utf16;
|
| -+ SymbianFile *file = ConvertToSymbianFile(id);
|
| -+
|
| -+ if (out_flags) {
|
| -+ *out_flags = flags;
|
| -+ }
|
| -+
|
| -+ // if the name is NULL we have to open a temporary file.
|
| -+ if (!name) {
|
| -+ TPath private_path;
|
| -+ TFileName file_name;
|
| -+ if (g_fs_session.PrivatePath(private_path) != KErrNone) {
|
| -+ return SQLITE_CANTOPEN;
|
| -+ }
|
| -+ if (file->handle.Temp(g_fs_session,
|
| -+ private_path,
|
| -+ file_name,
|
| -+ EFileWrite) !=
|
| -+ KErrNone) {
|
| -+ return SQLITE_CANTOPEN;
|
| -+ }
|
| -+ file->methods = &SymbianIoMethod;
|
| -+ file->lock_type = NO_LOCK;
|
| -+ file->shared_lock_byte = 0;
|
| -+ OpenCounter(+1);
|
| -+ return SQLITE_OK;
|
| -+ }
|
| -+
|
| -+ if (UTF8ToUTF16(name, &name_utf16) != KErrNone)
|
| -+ return SQLITE_CANTOPEN;
|
| -+
|
| -+ if (flags & SQLITE_OPEN_READWRITE) {
|
| -+ desired_access = EFileWrite;
|
| -+ } else {
|
| -+ desired_access = EFileRead;
|
| -+ }
|
| -+ if (flags & SQLITE_OPEN_MAIN_DB) {
|
| -+ share_mode = EFileShareReadersOrWriters;
|
| -+ } else {
|
| -+ share_mode = 0;
|
| -+ }
|
| -+
|
| -+ if (flags & SQLITE_OPEN_CREATE) {
|
| -+ err = file->handle.Create(g_fs_session,
|
| -+ name_utf16,
|
| -+ desired_access | share_mode);
|
| -+ if (err != KErrNone && err != KErrAlreadyExists) {
|
| -+ return SQLITE_CANTOPEN;
|
| -+ }
|
| -+ }
|
| -+
|
| -+ if (err != KErrNone) {
|
| -+ err = file->handle.Open(g_fs_session,
|
| -+ name_utf16,
|
| -+ desired_access | share_mode);
|
| -+ if (err != KErrNone && flags & SQLITE_OPEN_READWRITE) {
|
| -+ if (out_flags) {
|
| -+ *out_flags = (flags | SQLITE_OPEN_READONLY) & ~SQLITE_OPEN_READWRITE;
|
| -+ }
|
| -+ desired_access = EFileRead;
|
| -+ err = file->handle.Open(g_fs_session,
|
| -+ name_utf16,
|
| -+ desired_access | share_mode);
|
| -+ }
|
| -+ if (err != KErrNone) {
|
| -+ return SQLITE_CANTOPEN;
|
| -+ }
|
| -+ }
|
| -+ file->methods = &SymbianIoMethod;
|
| -+ file->lock_type = NO_LOCK;
|
| -+ file->shared_lock_byte = 0;
|
| -+ OpenCounter(+1);
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianDelete(sqlite3_vfs */*vfs*/,
|
| -+ const char *file_name,
|
| -+ int /*sync_dir*/) {
|
| -+ assert(file_name);
|
| -+ TFileName file_name_utf16;
|
| -+
|
| -+ if (UTF8ToUTF16(file_name, &file_name_utf16) != KErrNone) {
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ TInt result = g_fs_session.Delete(file_name_utf16);
|
| -+ return (result == KErrNone || result == KErrPathNotFound)?
|
| -+ SQLITE_OK : SQLITE_IOERR_DELETE;
|
| -+}
|
| -+
|
| -+static int SymbianAccess(sqlite3_vfs */*vfs*/,
|
| -+ const char *file_name,
|
| -+ int flags,
|
| -+ int *result) {
|
| -+ assert(file_name);
|
| -+ TEntry entry;
|
| -+ TFileName file_name_utf16;
|
| -+
|
| -+ if (UTF8ToUTF16(file_name, &file_name_utf16) != KErrNone) {
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ if (g_fs_session.Entry(file_name_utf16, entry) != KErrNone) {
|
| -+ *result = 0;
|
| -+ return SQLITE_OK;
|
| -+ }
|
| -+
|
| -+ switch (flags) {
|
| -+ case SQLITE_ACCESS_READ:
|
| -+ case SQLITE_ACCESS_EXISTS:
|
| -+ *result = !entry.IsDir();
|
| -+ break;
|
| -+ case SQLITE_ACCESS_READWRITE:
|
| -+ *result = !entry.IsDir() && !entry.IsReadOnly();
|
| -+ break;
|
| -+ default:
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianFullPathname(sqlite3_vfs */*vfs*/,
|
| -+ const char *relative,
|
| -+ int full_len,
|
| -+ char *full) {
|
| -+ assert(relative);
|
| -+ assert(full);
|
| -+
|
| -+ TParse parse;
|
| -+ TPath relative_utf16;
|
| -+ TPath base_path;
|
| -+ TPtr8 full_utf8(reinterpret_cast<unsigned char*>(full), full_len);
|
| -+
|
| -+ g_fs_session.PrivatePath(base_path);
|
| -+
|
| -+ if (UTF8ToUTF16(relative, &relative_utf16) != KErrNone) {
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ if (parse.Set(relative_utf16, &base_path, NULL) != KErrNone) {
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ TDesC full_utf16(parse.FullName());
|
| -+ if (UTF16ToUTF8(relative_utf16, &full_utf8) != KErrNone) {
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ full_utf8.PtrZ();
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianRandomness(sqlite3_vfs */*vfs*/, int buf_len, char *buffer) {
|
| -+ assert(buffer);
|
| -+ TInt64 seed = User::TickCount();
|
| -+ for (TInt i = 0; i < buf_len; i++) {
|
| -+ buffer[i] = Math::Rand(seed) % 255;
|
| -+ }
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianSleep(sqlite3_vfs */*vfs*/, int microsec) {
|
| -+ User::After(microsec);
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+int SymbianCurrentTime(sqlite3_vfs */*vfs*/, double *now) {
|
| -+ _LIT(kEpoch, "19700101:000000.000000");
|
| -+ assert(now);
|
| -+ TTime time;
|
| -+ TTime epoch_time(kEpoch);
|
| -+ TTimeIntervalSeconds interval;
|
| -+
|
| -+ time.HomeTime();
|
| -+ // calculate seconds elapsed since 1-1-1970
|
| -+ time.SecondsFrom(epoch_time, interval);
|
| -+
|
| -+ // Julian date @ 1-1-1970 = 2440587.5
|
| -+ // seconds per day = 86400.0
|
| -+ *now = interval.Int()/86400.0 + 2440587.5;
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+static int SymbianGetLastError(sqlite3_vfs */*vfs*/,
|
| -+ int /*buf_len*/,
|
| -+ char */*buf*/) {
|
| -+ assert(buf[0] == '\0');
|
| -+ return 0;
|
| -+}
|
| -+
|
| -+// Interfaces for opening a shared library, finding entry points
|
| -+// within the shared library, and closing the shared library.
|
| -+// TODO(marcogelmi): implement.
|
| -+#define SymbianDlOpen 0
|
| -+#define SymbianDlError 0
|
| -+#define SymbianDlSym 0
|
| -+#define SymbianDlClose 0
|
| -+
|
| -+// Initialize and deinitialize the operating system interface.
|
| -+int sqlite3_os_init(void) {
|
| -+ static sqlite3_vfs symbian_vfs = {
|
| -+ 1, // iVersion
|
| -+ sizeof(SymbianFile), // szOsFile
|
| -+ KMaxPath, // mxPathname
|
| -+ 0, // pNext
|
| -+ "symbian", // name
|
| -+ 0, // pAppData
|
| -+
|
| -+ SymbianOpen, // xOpen
|
| -+ SymbianDelete, // xDelete
|
| -+ SymbianAccess, // xAccess
|
| -+ SymbianFullPathname, // xFullPathname
|
| -+ SymbianDlOpen, // xDlOpen
|
| -+ SymbianDlError, // xDlError
|
| -+ SymbianDlSym, // xDlSym
|
| -+ SymbianDlClose, // xDlClose
|
| -+ SymbianRandomness, // xRandomness
|
| -+ SymbianSleep, // xSleep
|
| -+ SymbianCurrentTime, // xCurrentTime
|
| -+ SymbianGetLastError // xGetLastError
|
| -+ };
|
| -+
|
| -+ if (g_fs_session.Connect() != KErrNone) {
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ if (g_fs_session.ShareAuto() != KErrNone) {
|
| -+ g_fs_session.Close();
|
| -+ return SQLITE_ERROR;
|
| -+ }
|
| -+
|
| -+ sqlite3_vfs_register(&symbian_vfs, 1);
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+int sqlite3_os_end(void) {
|
| -+ g_fs_session.Close();
|
| -+ return SQLITE_OK;
|
| -+}
|
| -+
|
| -+#endif /* OS_SYMBIAN*/
|
| -Index: src/shell_icu_linux.c
|
| -===================================================================
|
| ---- src/shell_icu_linux.c 1969-12-31 16:00:00.000000000 -0800
|
| -+++ src/shell_icu_linux.c 2009-09-17 13:48:49.000000000 -0700
|
| -@@ -0,0 +1,26 @@
|
| -+/* Copyright 2007 Google Inc. All Rights Reserved.
|
| -+**/
|
| -+
|
| -+#include <limits.h>
|
| -+#include <unistd.h>
|
| -+#include "unicode/udata.h"
|
| -+
|
| -+/*
|
| -+** This function attempts to load the ICU data tables from a data file.
|
| -+** Returns 0 on failure, nonzero on success.
|
| -+** This a hack job of icu_utils.cc:Initialize(). It's Chrome-specific code.
|
| -+*/
|
| -+int sqlite_shell_init_icu() {
|
| -+ char bin_dir[PATH_MAX + 1];
|
| -+ int bin_dir_size = readlink("/proc/self/exe", bin_dir, PATH_MAX);
|
| -+ if (bin_dir_size < 0 || bin_dir_size > PATH_MAX)
|
| -+ return 0;
|
| -+ bin_dir[bin_dir_size] = 0;;
|
| -+
|
| -+ u_setDataDirectory(bin_dir);
|
| -+ // Only look for the packaged data file;
|
| -+ // the default behavior is to look for individual files.
|
| -+ UErrorCode err = U_ZERO_ERROR;
|
| -+ udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
|
| -+ return err == U_ZERO_ERROR;
|
| -+}
|
| -Index: src/shell_icu_win.c
|
| -===================================================================
|
| ---- src/shell_icu_win.c 1969-12-31 16:00:00.000000000 -0800
|
| -+++ src/shell_icu_win.c 2011-03-03 14:29:11.000000000 -0700
|
| -@@ -0,0 +1,32 @@
|
| -+/* Copyright 2011 Google Inc. All Rights Reserved.
|
| -+**/
|
| -+
|
| -+#include <windows.h>
|
| -+#include "unicode/udata.h"
|
| -+
|
| -+/*
|
| -+** This function attempts to load the ICU data tables from a DLL.
|
| -+** Returns 0 on failure, nonzero on success.
|
| -+** This a hack job of icu_utils.cc:Initialize(). It's Chrome-specific code.
|
| -+*/
|
| -+
|
| -+#define ICU_DATA_SYMBOL "icudt" U_ICU_VERSION_SHORT "_dat"
|
| -+int sqlite_shell_init_icu() {
|
| -+ HMODULE module;
|
| -+ FARPROC addr;
|
| -+ UErrorCode err;
|
| -+
|
| -+ // Chrome dropped U_ICU_VERSION_SHORT from the icu data dll name.
|
| -+ module = LoadLibrary(L"icudt.dll");
|
| -+ if (!module)
|
| -+ return 0;
|
| -+
|
| -+ addr = GetProcAddress(module, ICU_DATA_SYMBOL);
|
| -+ if (!addr)
|
| -+ return 0;
|
| -+
|
| -+ err = U_ZERO_ERROR;
|
| -+ udata_setCommonData(addr, &err);
|
| -+
|
| -+ return 1;
|
| -+}
|
| -Index: test/fts.test
|
| -===================================================================
|
| ---- test/fts.test 1969-12-31 16:00:00.000000000 -0800
|
| -+++ test/fts.test 2009-07-01 12:08:39.000000000 -0700
|
| -@@ -0,0 +1,61 @@
|
| -+#
|
| -+# May you do good and not evil.
|
| -+# May you find forgiveness for yourself and forgive others.
|
| -+# May you share freely, never taking more than you give.
|
| -+#
|
| -+#***********************************************************************
|
| -+# This file runs the fts tests.
|
| -+#
|
| -+# $Id$
|
| -+
|
| -+proc lshift {lvar} {
|
| -+ upvar $lvar l
|
| -+ set ret [lindex $l 0]
|
| -+ set l [lrange $l 1 end]
|
| -+ return $ret
|
| -+}
|
| -+while {[set arg [lshift argv]] != ""} {
|
| -+ switch -- $arg {
|
| -+ -sharedpagercache {
|
| -+ sqlite3_enable_shared_cache 1
|
| -+ }
|
| -+ default {
|
| -+ set argv [linsert $argv 0 $arg]
|
| -+ break
|
| -+ }
|
| -+ }
|
| -+}
|
| -+
|
| -+set testdir [file dirname $argv0]
|
| -+source $testdir/tester.tcl
|
| -+rename finish_test really_finish_test
|
| -+proc finish_test {} {}
|
| -+set ISQUICK 1
|
| -+
|
| -+set EXCLUDE {
|
| -+ fts.test
|
| -+ fts1.test
|
| -+ fts2.test
|
| -+}
|
| -+
|
| -+if {[sqlite3 -has-codec]} {
|
| -+ # lappend EXCLUDE \
|
| -+ # conflict.test
|
| -+}
|
| -+
|
| -+foreach testfile [lsort -dictionary [glob $testdir/fts*.test]] {
|
| -+ set tail [file tail $testfile]
|
| -+ puts "test: $tail"
|
| -+ if {[lsearch -exact $EXCLUDE $tail]>=0} continue
|
| -+ source $testfile
|
| -+ catch {db close}
|
| -+ if {$sqlite_open_file_count>0} {
|
| -+ puts "$tail did not close all files: $sqlite_open_file_count"
|
| -+ incr nErr
|
| -+ lappend ::failList $tail
|
| -+ }
|
| -+}
|
| -+source $testdir/misuse.test
|
| -+
|
| -+set sqlite_open_file_count 0
|
| -+really_finish_test
|
| -Index: test/fts1.test
|
| -===================================================================
|
| ---- test/fts1.test 1969-12-31 16:00:00.000000000 -0800
|
| -+++ test/fts1.test 2009-07-01 12:08:39.000000000 -0700
|
| -@@ -0,0 +1,61 @@
|
| -+#
|
| -+# May you do good and not evil.
|
| -+# May you find forgiveness for yourself and forgive others.
|
| -+# May you share freely, never taking more than you give.
|
| -+#
|
| -+#***********************************************************************
|
| -+# This file runs the fts tests.
|
| -+#
|
| -+# $Id$
|
| -+
|
| -+proc lshift {lvar} {
|
| -+ upvar $lvar l
|
| -+ set ret [lindex $l 0]
|
| -+ set l [lrange $l 1 end]
|
| -+ return $ret
|
| -+}
|
| -+while {[set arg [lshift argv]] != ""} {
|
| -+ switch -- $arg {
|
| -+ -sharedpagercache {
|
| -+ sqlite3_enable_shared_cache 1
|
| -+ }
|
| -+ default {
|
| -+ set argv [linsert $argv 0 $arg]
|
| -+ break
|
| -+ }
|
| -+ }
|
| -+}
|
| -+
|
| -+set testdir [file dirname $argv0]
|
| -+source $testdir/tester.tcl
|
| -+rename finish_test really_finish_test
|
| -+proc finish_test {} {}
|
| -+set ISQUICK 1
|
| -+
|
| -+set EXCLUDE {
|
| -+ fts.test
|
| -+ fts1.test
|
| -+ fts2.test
|
| -+}
|
| -+
|
| -+if {[sqlite3 -has-codec]} {
|
| -+ # lappend EXCLUDE \
|
| -+ # conflict.test
|
| -+}
|
| -+
|
| -+foreach testfile [lsort -dictionary [glob $testdir/fts1*.test]] {
|
| -+ set tail [file tail $testfile]
|
| -+ puts "test: $tail"
|
| -+ if {[lsearch -exact $EXCLUDE $tail]>=0} continue
|
| -+ source $testfile
|
| -+ catch {db close}
|
| -+ if {$sqlite_open_file_count>0} {
|
| -+ puts "$tail did not close all files: $sqlite_open_file_count"
|
| -+ incr nErr
|
| -+ lappend ::failList $tail
|
| -+ }
|
| -+}
|
| -+source $testdir/misuse.test
|
| -+
|
| -+set sqlite_open_file_count 0
|
| -+really_finish_test
|
|
|