]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Progress toward implementation of sqlite3_config() and a rework of the
authordrh <drh@noemail.net>
Fri, 13 Jun 2008 18:24:27 +0000 (18:24 +0000)
committerdrh <drh@noemail.net>
Fri, 13 Jun 2008 18:24:27 +0000 (18:24 +0000)
mutex and memory allocation subsystems.  This is an incremental check-in. (CVS 5218)

FossilOrigin-Name: a03c5af115889f477e17187a198a7d2d40bc76bf

26 files changed:
Makefile.in
main.mk
manifest
manifest.uuid
src/complete.c
src/global.c [new file with mode: 0644]
src/loadext.c
src/main.c
src/mem1.c
src/mem2.c
src/mem3.c
src/mem5.c
src/mutex.c
src/mutex.h
src/mutex_os2.c
src/mutex_unix.c
src/mutex_w32.c
src/os.c
src/os_os2.c
src/os_unix.c
src/os_win.c
src/sqlite.h.in
src/sqliteInt.h
src/util.c
test/zeroblob.test
tool/mksqlite3c.tcl

index 6b3aba7d07101cf1529dc1bfbe46f14855844390..22d200b10de9d1dd9ecc94177f3593b3a1ffde47 100644 (file)
@@ -151,7 +151,7 @@ NAWK = @AWK@
 #
 OBJS0 = alter.lo analyze.lo attach.lo auth.lo bitvec.lo btmutex.lo \
         btree.lo build.lo callback.lo complete.lo date.lo \
-        delete.lo expr.lo fault.lo func.lo \
+        delete.lo expr.lo fault.lo func.lo global.lo \
         hash.lo journal.lo insert.lo loadext.lo \
         main.lo malloc.lo mem1.lo mem2.lo mem3.lo mem4.lo mem5.lo mutex.lo \
         mutex_os2.lo mutex_unix.lo mutex_w32.lo \
@@ -192,6 +192,7 @@ SRC = \
   $(TOP)/src/expr.c \
   $(TOP)/src/fault.c \
   $(TOP)/src/func.c \
+  $(TOP)/src/global.c \
   $(TOP)/src/hash.c \
   $(TOP)/src/hash.h \
   $(TOP)/src/hwtime.h \
@@ -508,6 +509,9 @@ fault.lo:   $(TOP)/src/fault.c $(HDR)
 func.lo:       $(TOP)/src/func.c $(HDR)
        $(LTCOMPILE) -c $(TOP)/src/func.c
 
+global.lo:     $(TOP)/src/global.c $(HDR)
+       $(LTCOMPILE) -c $(TOP)/src/global.c
+
 hash.lo:       $(TOP)/src/hash.c $(HDR)
        $(LTCOMPILE) -c $(TOP)/src/hash.c
 
diff --git a/main.mk b/main.mk
index 28bc51f14c24eee6be4d1fa2dd2d54ab11abf703..15da94ed74c52ef60681a145d699670fce8016f8 100644 (file)
--- a/main.mk
+++ b/main.mk
@@ -50,7 +50,7 @@ TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src -I$(TOP)
 #
 LIBOBJ+= alter.o analyze.o attach.o auth.o bitvec.o btmutex.o btree.o build.o \
          callback.o complete.o date.o delete.o \
-         expr.o fault.o func.o hash.o insert.o journal.o loadext.o \
+         expr.o fault.o func.o global.o hash.o insert.o journal.o loadext.o \
          main.o malloc.o mem1.o mem2.o mem3.o mem4.o mem5.o \
          mutex.o mutex_os2.o mutex_unix.o mutex_w32.o \
          opcodes.o os.o os_os2.o os_unix.o os_win.o \
@@ -99,6 +99,7 @@ SRC = \
   $(TOP)/src/expr.c \
   $(TOP)/src/fault.c \
   $(TOP)/src/func.c \
+  $(TOP)/src/global.c \
   $(TOP)/src/hash.c \
   $(TOP)/src/hash.h \
   $(TOP)/src/hwtime.h \
index c1c0f29608a813c41198db103295cffbc7f11d09..9c2e55197b589c8141ba44d052cc9d15075c1021 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,7 +1,7 @@
-C Enhance\szeroblob\stests\sto\suse\sthe\ssqlite3_memory_highwater\sin\sorder\sto\ndouble-check\sthat\sno\slarge\sallocations\sare\soccurring.\s(CVS\s5217)
-D 2008-06-12T18:17:40
+C Progress\stoward\simplementation\sof\ssqlite3_config()\sand\sa\srework\sof\sthe\nmutex\sand\smemory\sallocation\ssubsystems.\s\sThis\sis\san\sincremental\scheck-in.\s(CVS\s5218)
+D 2008-06-13T18:24:27
 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
-F Makefile.in ce92ea8dc7adfb743757794f51c10d1b0d9c55e4
+F Makefile.in dc5608df93faf4406cfd7a1c8ed9ab93d8bfbfd5
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
 F README b974cdc3f9f12b87e851b04e75996d720ebf81ac
 F VERSION d739ba532eddc5c09ef9a55151328cd6a8a102c6
@@ -76,7 +76,7 @@ F ext/rtree/rtree_util.tcl ee0a0311eb12175319d78bfb37302320496cee6e
 F ext/rtree/viewrtree.tcl 09526398dae87a5a87c5aac2b3854dbaf8376869
 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
 F ltmain.sh 09fe5815427dc7d0abb188bbcdf0e34896577210
-F main.mk 254bdf904af5869178e6b333be5729bf24ff3f77
+F main.mk 5ef9aba69a7c8a585348d1ce77bfc927e456fbc7
 F mkdll.sh 712e74f3efe08a6ba12b2945d018a29a89d7fe3b
 F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f
 F mkextw.sh 1a866b53637dab137191341cc875575a5ca110fb
@@ -101,38 +101,39 @@ F src/btree.h b1bd7e0b8c2e33658aaf447cb0d1d94f74664b6b
 F src/btreeInt.h dc04ee33d8eb84714b2acdf81336fbbf6e764530
 F src/build.c a52d9d51341444a2131e3431608f245db80d9591
 F src/callback.c 77b302b0d41468dcda78c70e706e5b84577f0fa0
-F src/complete.c 4cf68fd75d60257524cbe74f87351b9848399131
+F src/complete.c cb14e06dbe79dee031031f0d9e686ff306afe07c
 F src/date.c 76a5ba94772346efedf0c412c47e67891bbb266c
 F src/delete.c d3fc5987f2eb88f7b9549d58a5dfea079a83fe8b
 F src/expr.c ecb3b23d3543427cba3e2ac12a6c6ae4bb20d39b
 F src/fault.c 1f6177188edb00641673e462f3fab8cba9f7422b
 F src/func.c 77a910a1ca7613d291fd0b5cba3be14c02f0dce0
+F src/global.c 8a5c66b6e61c38072c697179dbc2d708e39ddc96
 F src/hash.c fd8cb06fb54c2fe7d48c9195792059a2e5be8b70
 F src/hash.h 031cd9f915aff27e12262cb9eb570ac1b8326b53
 F src/hwtime.h 745961687a65ef8918cd551c02e5ccb4b8e772de
 F src/insert.c c2ead6c36566de8e3f130e7ab1431723a269d5d7
 F src/journal.c cffd2cd214e58c0e99c3ff632b3bee6c7cbb260e
 F src/legacy.c 8f5a2b25d9673b4004287cf2bf51dbf7d0738406
-F src/loadext.c eac6c61810a3b531808774bec7f3d238cfe261f3
-F src/main.c 25358a404194d7571cdd3be001919a53b80106db
+F src/loadext.c f99a75534a53e281fa2461239ee4a4b4bf6ad564
+F src/main.c 88caac737f4bdc646c7b298ebca867e9f3828208
 F src/malloc.c 12c1ae98ef1eff34b13c9eb526e0b7b479e1e820
 F src/md5.c 008216bbb5d34c6fbab5357aa68575ad8a31516a
-F src/mem1.c fc716ff521b6dd3e43eaa211967383308800e70a
-F src/mem2.c 3656205111208a847e21d81a1d5b09a010164096
-F src/mem3.c 52547678a2ae50c203d54be1a5bf51eb02438a3f
+F src/mem1.c 18ca1e2543252ce13cd9c1ba67853b2d8fece3dd
+F src/mem2.c cb99d152253ae11cc2ccc4073611925e81c2212d
+F src/mem3.c 617c2e2a72a10ecc5c01af14efc8c2596d2c2e87
 F src/mem4.c 45c328ec6dcb7e8d319cb383615b5fe547ca5409
-F src/mem5.c 11d98b76f77873aab86b543cbd1a8ddc4e680d58
-F src/mutex.c d455f0876d5aad9935a23d01e6ae1bf4bd462d6a
-F src/mutex.h 079fa6fe9da18ceb89e79012c010594c6672addb
-F src/mutex_os2.c 2911ea96955ab6cba734cc4ad903fe76f834b39e
-F src/mutex_unix.c 466d20378a0645fea64c3f2e2669c33b7802df56
-F src/mutex_w32.c 133698096a2c4e81cd11ea6f4de7891c66f7b9f7
-F src/os.c 284abcb97ffdaf5f0b08fa4c5fe1fe93dd86b416
+F src/mem5.c 3d2ff00c6e3bc37f5d82cd82e1a123b246fb7b39
+F src/mutex.c 1ff43a9f9a8e5a0d98ffccd77f56859d9fd9ffcf
+F src/mutex.h 91292a8351b5844f7d622b0da83df4e651a8f40b
+F src/mutex_os2.c b8c1231319e966875f251a7ec137bea353546b87
+F src/mutex_unix.c 28588d08a2221623d66655e536880003fd5234d6
+F src/mutex_w32.c 36fbcf9f50bf0cd9be2c106cd69e5f59021402be
+F src/os.c 4f253152aefa4ba54ac7e2dc389a503862a9016c
 F src/os.h c9a7f94e80193fd4cf27f5c5698eb56753f1b05a
 F src/os_common.h 24525d8b7bce66c374dfc1810a6c9043f3359b60
-F src/os_os2.c 6cc3ff5e934eecfa078b5b7bf1d0bdc7ac3f5a2e
-F src/os_unix.c 47936aee8265e482faa626141d97d896aa981ef4
-F src/os_win.c 0d975b131b2b104d6d69d9f16bdf3c8cec28e81d
+F src/os_os2.c 9f74147f1899793a106827f6bc770363ec377912
+F src/os_unix.c dd4a7b19ec00869764c389560c3faf566cf98a71
+F src/os_win.c 0b90d9a1ce18bfd2a5f3c4a6bdb13ec369c805a9
 F src/pager.c be98ceeb55bbcda9251c1a846d28c3d323885708
 F src/pager.h 6aa3050a3c684475a5a9dbad5ff1cebad612acba
 F src/parse.y 8c2c3145eebe1964eb279cb3c4e502eae28bb0fa
@@ -142,9 +143,9 @@ F src/printf.c f2d4f6c5b0ec24b643e85fe60258adad8b1f6acc
 F src/random.c 2b2db2de4ab491f5a14d3480466f8f4b5a5db74a
 F src/select.c 669687459e7d0193c89de06c5dbed55b4a41191c
 F src/shell.c a12ea645271b7876c8f080146f48e20b00d367ec
-F src/sqlite.h.in c7e356869c27312291d929322b26f3cc74028299
+F src/sqlite.h.in 487f5490a9677ef0c105c21a9595bb587be1da6a
 F src/sqlite3ext.h faacd0e6a81aabee0861c6d7883c9172e74ef5b3
-F src/sqliteInt.h 1593404d8aee13687ca7b5d552cb153de7441bef
+F src/sqliteInt.h c7b8bfb55381f62962eafd9826846c9e6e8bd429
 F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
 F src/table.c 1fa8f8113ac9cbc09ae4801c6d2a7f0af82c5822
 F src/tclsqlite.c c57e740e30bd6dda678796eed62c7f0e64689834
@@ -177,7 +178,7 @@ F src/tokenize.c d07c7482a59dd8e02f3f73e86ff55eccdc0d8f26
 F src/trigger.c 1e751f8d5ceeb328d26bf1ccfb2de50653670d49
 F src/update.c 2d7143b9014e955509cc4f323f9a9584fb898f34
 F src/utf.c 8c94fa10efc78c2568d08d436acc59df4df7191b
-F src/util.c 512027b58e8b9b11743e5ae70837c45b53696b26
+F src/util.c 920d6d5dfdf25f7b85d2093705d8716f9b387e3b
 F src/vacuum.c a5c289e561ed72283e97d2485491986bc7d684eb
 F src/vdbe.c 1936425c3455535a1a20e26a65c470fb009a1ed8
 F src/vdbe.h 1e3722d471739c2b213c6283b60373290e52f7ea
@@ -568,7 +569,7 @@ F test/where3.test 97d3936e6a443b968f1a61cdcc0f673252000e94
 F test/where4.test e9b9e2f2f98f00379e6031db6a6fca29bae782a2
 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2
 F test/where6.test 42c4373595f4409d9c6a9987b4a60000ad664faf
-F test/zeroblob.test 92c3e7dabd2a5ceabc305f7ff5f4441a913366ca
+F test/zeroblob.test 792124852ec61458a2eb527b5091791215e0be95
 F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b
 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439
 F tool/lemon.c a9c51c1ede7f35dc8746894e7f8cc7e3704ecef8
@@ -578,7 +579,7 @@ F tool/memleak2.awk 9cc20c8e8f3c675efac71ea0721ee6874a1566e8
 F tool/memleak3.tcl 7707006ee908cffff210c98158788d85bb3fcdbf
 F tool/mkkeywordhash.c ef93810fc41fb3d3dbacf9a33a29be88ea99ffa9
 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e x
-F tool/mksqlite3c.tcl 927b9d6ccd05690f75eb67bce7cca9a90b65ceeb
+F tool/mksqlite3c.tcl 687ae979ba47db01d3a6296b2e7a678a161be392
 F tool/mksqlite3internalh.tcl 7b43894e21bcb1bb39e11547ce7e38a063357e87
 F tool/omittest.tcl 7d1fdf469e2f4d175f70c36e469db64a1626fabb
 F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c
@@ -593,7 +594,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P c1006fb1c817bc0b7fada873edb772abbf972012
-R dc9288951ccf4af2026b613e380c37a1
+P e93079be83a9df7328d9b910fcbdb762be7ec815
+R b8763d642b06205a0aac83d31a5eaad0
 U drh
-Z a943c68dc8f656dcf324d2907bc83041
+Z 7798430e342a4a876c2baf52ecfbbead
index 9a4fe9d60713a4cca2245283143a2a5cfcac52bd..dd6c30a8b33c1b0fe7f51cc69d1c66bd76d5207c 100644 (file)
@@ -1 +1 @@
-e93079be83a9df7328d9b910fcbdb762be7ec815
\ No newline at end of file
+a03c5af115889f477e17187a198a7d2d40bc76bf
\ No newline at end of file
index ae61d8ab06bc66a8a84439a9baa097f09d89c21d..8e2dbc234328d390e2292323f38e4d364d3a4e54 100644 (file)
@@ -16,7 +16,7 @@
 ** separating it out, the code will be automatically omitted from
 ** static links that do not use it.
 **
-** $Id: complete.c,v 1.6 2007/08/27 23:26:59 drh Exp $
+** $Id: complete.c,v 1.7 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 #ifndef SQLITE_OMIT_COMPLETE
@@ -258,11 +258,17 @@ int sqlite3_complete16(const void *zSql){
   char const *zSql8;
   int rc = SQLITE_NOMEM;
 
+#ifndef SQLITE_OMIT_AUTOINIT
+  rc = sqlite3_initialize();
+  if( rc ) return rc;
+#endif
   pVal = sqlite3ValueNew(0);
   sqlite3ValueSetStr(pVal, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC);
   zSql8 = sqlite3ValueText(pVal, SQLITE_UTF8);
   if( zSql8 ){
     rc = sqlite3_complete(zSql8);
+  }else{
+    rc = SQLITE_NOMEM;
   }
   sqlite3ValueFree(pVal);
   return sqlite3ApiExit(0, rc);
diff --git a/src/global.c b/src/global.c
new file mode 100644 (file)
index 0000000..6c21d89
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+** 2008 June 13
+**
+** The author disclaims copyright to this source code.  In place of
+** a legal notice, here is a blessing:
+**
+**    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 contains definitions of global variables and contants.
+**
+** $Id: global.c,v 1.1 2008/06/13 18:24:27 drh Exp $
+*/
+#include "sqliteInt.h"
+
+
+/* An array to map all upper-case characters into their corresponding
+** lower-case character. 
+**
+** SQLite only considers US-ASCII (or EBCDIC) characters.  We do not
+** handle case conversions for the UTF character set since the tables
+** involved are nearly as big or bigger than SQLite itself.
+*/
+const unsigned char sqlite3UpperToLower[] = {
+#ifdef SQLITE_ASCII
+      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
+     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+     36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+     54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
+    104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
+    122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
+    108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
+    126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+    144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
+    162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+    180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
+    198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
+    216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
+    234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
+    252,253,254,255
+#endif
+#ifdef SQLITE_EBCDIC
+      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* 0x */
+     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */
+     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */
+     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */
+     64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */
+     80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */
+     96, 97, 66, 67, 68, 69, 70, 71, 72, 73,106,107,108,109,110,111, /* 6x */
+    112, 81, 82, 83, 84, 85, 86, 87, 88, 89,122,123,124,125,126,127, /* 7x */
+    128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */
+    144,145,146,147,148,149,150,151,152,153,154,155,156,157,156,159, /* 9x */
+    160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */
+    176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */
+    192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */
+    208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */
+    224,225,162,163,164,165,166,167,168,169,232,203,204,205,206,207, /* Ex */
+    239,240,241,242,243,244,245,246,247,248,249,219,220,221,222,255, /* Fx */
+#endif
+};
+
+/*
+** The following singleton contains the global configuration for
+** the SQLite library.
+*/
+struct Sqlite3Config sqlite3Config;
index 3ad0ab1677a6eb0ae237d09dfb70eee8fa648012..828d71ef89bd98e859cbf988f43ad67343901425 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains code used to dynamically load extensions into
 ** the SQLite library.
 **
-** $Id: loadext.c,v 1.47 2008/05/15 19:43:53 drh Exp $
+** $Id: loadext.c,v 1.48 2008/06/13 18:24:27 drh Exp $
 */
 
 #ifndef SQLITE_CORE
@@ -469,44 +469,56 @@ static struct {
 ** loaded by every new database connection.
 */
 int sqlite3_auto_extension(void *xInit){
-  int i;
-  int rc = SQLITE_OK;
+#ifndef SQLITE_OMIT_AUTOINIT
+  int rc = sqlite3_initialize();
+  if( rc ){
+    return rc;
+  }else
+#endif
+  {
+    int i;
 #ifndef SQLITE_MUTEX_NOOP
-  sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+    sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
 #endif
-  sqlite3_mutex_enter(mutex);
-  for(i=0; i<autoext.nExt; i++){
-    if( autoext.aExt[i]==xInit ) break;
-  }
-  if( i==autoext.nExt ){
-    int nByte = (autoext.nExt+1)*sizeof(autoext.aExt[0]);
-    void **aNew;
-    aNew = sqlite3_realloc(autoext.aExt, nByte);
-    if( aNew==0 ){
-      rc = SQLITE_NOMEM;
-    }else{
-      autoext.aExt = aNew;
-      autoext.aExt[autoext.nExt] = xInit;
-      autoext.nExt++;
+    sqlite3_mutex_enter(mutex);
+    for(i=0; i<autoext.nExt; i++){
+      if( autoext.aExt[i]==xInit ) break;
+    }
+    if( i==autoext.nExt ){
+      int nByte = (autoext.nExt+1)*sizeof(autoext.aExt[0]);
+      void **aNew;
+      aNew = sqlite3_realloc(autoext.aExt, nByte);
+      if( aNew==0 ){
+        rc = SQLITE_NOMEM;
+      }else{
+        autoext.aExt = aNew;
+        autoext.aExt[autoext.nExt] = xInit;
+        autoext.nExt++;
+      }
     }
+    sqlite3_mutex_leave(mutex);
+    assert( (rc&0xff)==rc );
+    return rc;
   }
-  sqlite3_mutex_leave(mutex);
-  assert( (rc&0xff)==rc );
-  return rc;
 }
 
 /*
 ** Reset the automatic extension loading mechanism.
 */
 void sqlite3_reset_auto_extension(void){
+#ifndef SQLITE_OMIT_AUTOINIT
+  if( sqlite3_initialize()==SQLITE_OK )
+#endif
+  {
 #ifndef SQLITE_MUTEX_NOOP
-  sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+    sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
 #endif
-  sqlite3_mutex_enter(mutex);
-  sqlite3_free(autoext.aExt);
-  autoext.aExt = 0;
-  autoext.nExt = 0;
-  sqlite3_mutex_leave(mutex);
+    sqlite3_mutex_enter(mutex);
+    sqlite3_free(autoext.aExt);
+    autoext.aExt = 0;
+    autoext.nExt = 0;
+    sqlite3_mutex_leave(mutex);
+  }
 }
 
 /*
index c80bacb5c9e46d2ea16707d613b42268faac86ab..d98530cfb11df0d7e5705b8c3dbb1bd1799dd2b9 100644 (file)
@@ -14,7 +14,7 @@
 ** other files are for internal use by SQLite and should not be
 ** accessed by users of the library.
 **
-** $Id: main.c,v 1.442 2008/05/26 20:19:26 drh Exp $
+** $Id: main.c,v 1.443 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include <ctype.h>
@@ -53,6 +53,123 @@ void (*sqlite3IoTrace)(const char*, ...) = 0;
 */
 char *sqlite3_temp_directory = 0;
 
+/*
+** Flags to help SQLite determine if it has been initialized.
+*/
+static int sqlite3IsInit = 0;        /* Initialization has started */
+static int sqlite3FullInit = 0;      /* Initialization is complete */
+
+/*
+** Initialize SQLite.  
+**
+** This routine must be called to initialize the memory allocation,
+** VFS, and mutex subsystesms prior to doing any serious work with
+** SQLite.  But as long as you do not compile with SQLITE_OMIT_AUTOINIT
+** this routine will be called automatically by key routines such as
+** sqlite3_open().  
+**
+** This routine is a no-op except on its very first call for the process,
+** or for the first call after a call to sqlite3_shutdown.
+*/
+int sqlite3_initialize(void){
+  int rc;
+  if( sqlite3IsInit ) return SQLITE_OK;
+  rc = sqlite3_mutex_init();
+  if( rc==SQLITE_OK ){
+#ifndef SQLITE_MUTEX_NOOP
+    sqlite3_mutex *pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+#endif
+    sqlite3_mutex_enter(pMutex);
+    if( sqlite3IsInit==0 ){
+      sqlite3IsInit = 1;
+      if( rc==SQLITE_OK ) rc = sqlite3MallocInit();
+      if( rc==SQLITE_OK ) rc = sqlite3_os_init();
+      if( rc!=SQLITE_OK ){
+        sqlite3IsInit = 0;
+      }else{
+        sqlite3FullInit = 1;
+      }
+    }
+    sqlite3_mutex_leave(pMutex);
+  }
+  return rc;
+}
+
+/*
+** Undo the effects of sqlite3_initialize().  Must not be called while
+** there are outstanding database connections or memory allocations or
+** while any part of SQLite is otherwise in use in any thread.  This
+** routine is not threadsafe.  Not by a long shot.
+*/
+int sqlite3_shutdown(void){
+  sqlite3_os_end();
+  sqlite3_mutex_end();
+  sqlite3FullInit = 0;
+  sqlite3IsInit = 0;
+  return SQLITE_OK;
+}
+
+/*
+** This API allows applications to modify the global configuration of
+** the SQLite library at run-time.
+**
+** This routine should only be called when there are no outstanding
+** database connections or memory allocations.  This routine is not
+** threadsafe.  Failure to heed these warnings can lead to unpredictable
+** behavior.
+*/
+int sqlite3_config(int op, ...){
+  va_list ap;
+  int rc = SQLITE_OK;
+
+  /* sqlite3_config() shall return SQLITE_MISUSE if it is invoked while
+  ** the SQLite library is in use. */
+  if( sqlite3FullInit ) return SQLITE_MISUSE;
+
+  va_start(ap, op);
+  switch( op ){
+    case SQLITE_CONFIG_SINGLETHREAD: {
+      /* Disable all mutexing */
+      sqlite3Config.bCoreMutex = 0;
+      sqlite3Config.bFullMutex = 0;
+      break;
+    }
+    case SQLITE_CONFIG_MULTITHREAD: {
+      /* Disable mutexing of database connections */
+      /* Enable mutexing of core data structures */
+      sqlite3Config.bCoreMutex = 1;
+      sqlite3Config.bFullMutex = 0;
+      break;
+    }
+    case SQLITE_CONFIG_SERIALIZED: {
+      /* Enable all mutexing */
+      sqlite3Config.bCoreMutex = 1;
+      sqlite3Config.bFullMutex = 1;
+      break;
+    }
+    case SQLITE_CONFIG_MALLOC: {
+      /* Specify an alternative malloc implementation */
+      sqlite3Config.xMalloc = va_arg(ap, void*(*)(int));
+      sqlite3Config.xFree = va_arg(ap, void(*)(void*));
+      sqlite3Config.xRealloc = va_arg(ap, void*(*)(void*,int));
+      sqlite3Config.xMemsize = va_arg(ap, int(*)(void*));
+      sqlite3Config.xRoundup = va_arg(ap, int(*)(int));
+      break;
+    }
+    case SQLITE_CONFIG_MEMSTATS: {
+      /* Enable or disable the malloc status collection */
+      sqlite3Config.bMemstat = va_arg(ap, int);
+      break;
+    }
+    default: {
+      rc = SQLITE_ERROR;
+      break;
+    }
+  }
+  va_end(ap);
+  return rc;
+}
+
 /*
 ** Routine needed to support the testcase() macro.
 */
@@ -1040,6 +1157,11 @@ static int openDatabase(
   int rc;
   CollSeq *pColl;
 
+#ifndef SQLITE_OMIT_AUTOINIT
+  rc = sqlite3_initialize();
+  if( rc ) return rc;
+#endif
+
   /* Remove harmful bits from the flags parameter */
   flags &=  ~( SQLITE_OPEN_DELETEONCLOSE |
                SQLITE_OPEN_MAIN_DB |
@@ -1249,11 +1371,15 @@ int sqlite3_open16(
 ){
   char const *zFilename8;   /* zFilename encoded in UTF-8 instead of UTF-16 */
   sqlite3_value *pVal;
-  int rc = SQLITE_NOMEM;
+  int rc;
 
   assert( zFilename );
   assert( ppDb );
   *ppDb = 0;
+#ifndef SQLITE_OMIT_AUTOINIT
+  rc = sqlite3_initialize();
+  if( rc ) return rc;
+#endif
   pVal = sqlite3ValueNew(0);
   sqlite3ValueSetStr(pVal, -1, zFilename, SQLITE_UTF16NATIVE, SQLITE_STATIC);
   zFilename8 = sqlite3ValueText(pVal, SQLITE_UTF8);
@@ -1264,6 +1390,8 @@ int sqlite3_open16(
     if( rc==SQLITE_OK && !DbHasProperty(*ppDb, 0, DB_SchemaLoaded) ){
       ENC(*ppDb) = SQLITE_UTF16NATIVE;
     }
+  }else{
+    rc = SQLITE_NOMEM;
   }
   sqlite3ValueFree(pVal);
 
@@ -1536,6 +1664,7 @@ int sqlite3_sleep(int ms){
   sqlite3_vfs *pVfs;
   int rc;
   pVfs = sqlite3_vfs_find(0);
+  if( pVfs==0 ) return 0;
 
   /* This function works in milliseconds, but the underlying OsSleep() 
   ** API uses microseconds. Hence the 1000's.
index 87dd41afc2d545decd7575157080fd91c69f5ab3..296dbe7650deb654aef354cad3261eb675322163 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains the C functions that implement a memory
 ** allocation subsystem for use by SQLite.  
 **
-** $Id: mem1.c,v 1.17 2008/03/18 00:07:11 drh Exp $
+** $Id: mem1.c,v 1.18 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -188,6 +188,13 @@ int sqlite3MallocSize(void *p){
   return pInt[-1];
 }
 
+/*
+** Initialize the memmory allocation subsystem.
+*/
+int sqlite3MallocInit(void){
+  return SQLITE_OK;
+}
+
 /*
 ** Change the size of an existing memory allocation
 */
index 10d68e27ebf47dc8dd79df850fbeace42e0e21cd..ff8c87a1b775c21785402392aba1d7f32490d116 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains the C functions that implement a memory
 ** allocation subsystem for use by SQLite.  
 **
-** $Id: mem2.c,v 1.26 2008/04/10 14:57:25 drh Exp $
+** $Id: mem2.c,v 1.27 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -240,6 +240,13 @@ int sqlite3MallocSize(void *p){
   return pHdr->iSize;
 }
 
+/*
+** Initialize the memmory allocation subsystem.
+*/
+int sqlite3MallocInit(void){
+  return SQLITE_OK;
+}
+
 /*
 ** Allocate nByte bytes of memory.
 */
index 9f15bc64241934cb0db5ec74d66234eae81f86b7..e74cb8f036fc14242a66b2bef7604e7791fcc8bd 100644 (file)
@@ -20,7 +20,7 @@
 ** This version of the memory allocation subsystem is used if
 ** and only if SQLITE_MEMORY_SIZE is defined.
 **
-** $Id: mem3.c,v 1.12 2008/02/19 15:15:16 drh Exp $
+** $Id: mem3.c,v 1.13 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -297,6 +297,13 @@ int sqlite3MallocSize(void *p){
   return iSize;
 }
 
+/*
+** Initialize the memmory allocation subsystem.
+*/
+int sqlite3MallocInit(void){
+  return SQLITE_OK;
+}
+
 /*
 ** Chunk i is a free chunk that has been unlinked.  Adjust its 
 ** size parameters for check-out and return a pointer to the 
index 4250cfa94976f2cf106093d3941cb8c54ffdad1f..fbea0ef8983010f69d941fbcbbf8a04a36915539 100644 (file)
@@ -20,7 +20,7 @@
 ** This version of the memory allocation subsystem is used if
 ** and only if SQLITE_POW2_MEMORY_SIZE is defined.
 **
-** $Id: mem5.c,v 1.4 2008/02/19 15:15:16 drh Exp $
+** $Id: mem5.c,v 1.5 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -283,6 +283,13 @@ int sqlite3MallocSize(void *p){
   return iSize;
 }
 
+/*
+** Initialize the memmory allocation subsystem.
+*/
+int sqlite3MallocInit(void){
+  return SQLITE_OK;
+}
+
 /*
 ** Find the first entry on the freelist iLogsize.  Unlink that
 ** entry and return its index. 
index f4372c961c54aad391ae01f125764f9dc4cd311e..939f3625585aac90800f9f9a251ca5918663888b 100644 (file)
@@ -19,7 +19,7 @@
 ** implementation is suitable for testing.
 ** debugging purposes
 **
-** $Id: mutex.c,v 1.17 2008/03/26 18:34:43 danielk1977 Exp $
+** $Id: mutex.c,v 1.18 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -38,6 +38,12 @@ struct sqlite3_mutex {
   int cnt;    /* Number of entries without a matching leave */
 };
 
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+int sqlite3_mutex_init(void){ return SQLITE_OK; }
+int sqlite3_mutex_end(void){ return SQLITE_OK; }
+
 /*
 ** The sqlite3_mutex_alloc() routine allocates a new
 ** mutex and returns a pointer to it.  If it returns NULL
index e7ec9d204f3a9824f4db20d2f691c84a41426fe5..f85739d2cf48369d1a04c34633e78d8d5e926e27 100644 (file)
@@ -19,7 +19,7 @@
 ** Source files should #include the sqliteInt.h file and let that file
 ** include this one indirectly.
 **
-** $Id: mutex.h,v 1.2 2007/08/30 14:10:30 drh Exp $
+** $Id: mutex.h,v 1.3 2008/06/13 18:24:27 drh Exp $
 */
 
 
@@ -77,6 +77,8 @@
 #define sqlite3_mutex_leave(X)
 #define sqlite3_mutex_held(X)     1
 #define sqlite3_mutex_notheld(X)  1
+#define sqlite3_mutex_init()
+#define sqlite3_mutex_end()
 #endif
 
 #endif /* SQLITE_MUTEX_APPDEF */
index ed5477a54247a1836aa5d9bc4ee9e9cfd5571ae4..dd1894d24a3c0f320bf2fa49ce9f01b06b0f776a 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains the C functions that implement mutexes for OS/2
 **
-** $Id: mutex_os2.c,v 1.6 2008/03/26 18:34:43 danielk1977 Exp $
+** $Id: mutex_os2.c,v 1.7 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -39,6 +39,12 @@ struct sqlite3_mutex {
 
 #define OS2_MUTEX_INITIALIZER   0,0,0,0
 
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+int sqlite3_mutex_init(void){ return SQLITE_OK; }
+int sqlite3_mutex_end(void){ return SQLITE_OK; }
+
 /*
 ** The sqlite3_mutex_alloc() routine allocates a new
 ** mutex and returns a pointer to it.  If it returns NULL
@@ -147,7 +153,7 @@ sqlite3_mutex *sqlite3_mutex_alloc(int iType){
 ** SQLite is careful to deallocate every mutex that it allocates.
 */
 void sqlite3_mutex_free(sqlite3_mutex *p){
-  assert( p );
+  if( p==0 ) return;
   assert( p->nRef==0 );
   assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
   DosCloseMutexSem( p->mutex );
@@ -169,7 +175,7 @@ void sqlite3_mutex_enter(sqlite3_mutex *p){
   TID tid;
   PID holder1;
   ULONG holder2;
-  assert( p );
+  if( p==0 ) return;
   assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
   DosRequestMutexSem(p->mutex, SEM_INDEFINITE_WAIT);
   DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2);
@@ -181,7 +187,7 @@ int sqlite3_mutex_try(sqlite3_mutex *p){
   TID tid;
   PID holder1;
   ULONG holder2;
-  assert( p );
+  if( p==0 ) return SQLITE_OK;
   assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
   if( DosRequestMutexSem(p->mutex, SEM_IMMEDIATE_RETURN) == NO_ERROR) {
     DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2);
@@ -205,6 +211,7 @@ void sqlite3_mutex_leave(sqlite3_mutex *p){
   TID tid;
   PID holder1;
   ULONG holder2;
+  if( p==0 ) return;
   assert( p->nRef>0 );
   DosQueryMutexSem(p->mutex, &holder1, &tid, &holder2);
   assert( p->owner==tid );
index ebd3217eb4dc60eb5b2b7dcd3a11dc9cd1bb0122..4639a84277e272cecfcbba3920a98c9baea3c551 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains the C functions that implement mutexes for pthreads
 **
-** $Id: mutex_unix.c,v 1.7 2008/03/29 12:47:27 rse Exp $
+** $Id: mutex_unix.c,v 1.8 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -45,6 +45,12 @@ struct sqlite3_mutex {
 #define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0 }
 #endif
 
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+int sqlite3_mutex_init(void){ return SQLITE_OK; }
+int sqlite3_mutex_end(void){ return SQLITE_OK; }
+
 /*
 ** The sqlite3_mutex_alloc() routine allocates a new
 ** mutex and returns a pointer to it.  If it returns NULL
@@ -142,11 +148,12 @@ sqlite3_mutex *sqlite3_mutex_alloc(int iType){
 ** mutex that it allocates.
 */
 void sqlite3_mutex_free(sqlite3_mutex *p){
-  assert( p );
-  assert( p->nRef==0 );
-  assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
-  pthread_mutex_destroy(&p->mutex);
-  sqlite3_free(p);
+  if( p ){
+    assert( p->nRef==0 );
+    assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE );
+    pthread_mutex_destroy(&p->mutex);
+    sqlite3_free(p);
+  }
 }
 
 /*
@@ -161,7 +168,7 @@ void sqlite3_mutex_free(sqlite3_mutex *p){
 ** more than once, the behavior is undefined.
 */
 void sqlite3_mutex_enter(sqlite3_mutex *p){
-  assert( p );
+  if( p==0 ) return;
   assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
 
 #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
@@ -202,7 +209,7 @@ void sqlite3_mutex_enter(sqlite3_mutex *p){
 }
 int sqlite3_mutex_try(sqlite3_mutex *p){
   int rc;
-  assert( p );
+  if( p==0 ) return SQLITE_OK;
   assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
 
 #ifdef SQLITE_HOMEGROWN_RECURSIVE_MUTEX
@@ -257,7 +264,7 @@ int sqlite3_mutex_try(sqlite3_mutex *p){
 ** is not currently allocated.  SQLite will never do either.
 */
 void sqlite3_mutex_leave(sqlite3_mutex *p){
-  assert( p );
+  if( p==0 ) return;
   assert( sqlite3_mutex_held(p) );
   p->nRef--;
   assert( p->nRef==0 || p->id==SQLITE_MUTEX_RECURSIVE );
index 7fc73da12809be681f3401f85dbb707b07b8ff82..fcb468aec5be9155688d01c9487dfcda2ce93a8c 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** This file contains the C functions that implement mutexes for win32
 **
-** $Id: mutex_w32.c,v 1.6 2008/03/26 18:34:43 danielk1977 Exp $
+** $Id: mutex_w32.c,v 1.7 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -58,6 +58,12 @@ struct sqlite3_mutex {
 #endif /* OS_WINCE */
 
 
+/*
+** Initialize and deinitialize the mutex subsystem.
+*/
+int sqlite3_mutex_init(void){ return SQLITE_OK; }
+int sqlite3_mutex_end(void){ return SQLITE_OK; }
+
 /*
 ** The sqlite3_mutex_alloc() routine allocates a new
 ** mutex and returns a pointer to it.  If it returns NULL
@@ -161,7 +167,7 @@ void sqlite3_mutex_free(sqlite3_mutex *p){
 ** more than once, the behavior is undefined.
 */
 void sqlite3_mutex_enter(sqlite3_mutex *p){
-  assert( p );
+  if( p==0 ) return;
   assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
   EnterCriticalSection(&p->mutex);
   p->owner = GetCurrentThreadId(); 
@@ -169,7 +175,7 @@ void sqlite3_mutex_enter(sqlite3_mutex *p){
 }
 int sqlite3_mutex_try(sqlite3_mutex *p){
   int rc = SQLITE_BUSY;
-  assert( p );
+  if( p==0 ) return SQLITE_OK;
   assert( p->id==SQLITE_MUTEX_RECURSIVE || sqlite3_mutex_notheld(p) );
   /*
   ** The sqlite3_mutex_try() routine is very rarely used, and when it
@@ -199,6 +205,7 @@ int sqlite3_mutex_try(sqlite3_mutex *p){
 ** is not currently allocated.  SQLite will never do either.
 */
 void sqlite3_mutex_leave(sqlite3_mutex *p){
+  if( p==0 ) return;
   assert( p->nRef>0 );
   assert( p->owner==GetCurrentThreadId() );
   p->nRef--;
index 834100f0755e26f4b2876ab8d32d519e0e8838ab..b4bcd82e29f34128ed5ab1f0e016a1445ec05c6a 100644 (file)
--- a/src/os.c
+++ b/src/os.c
@@ -13,7 +13,7 @@
 ** This file contains OS interface code that is common to all
 ** architectures.
 **
-** $Id: os.c,v 1.111 2008/06/06 11:11:26 danielk1977 Exp $
+** $Id: os.c,v 1.112 2008/06/13 18:24:27 drh Exp $
 */
 #define _SQLITE_OS_C_ 1
 #include "sqliteInt.h"
@@ -200,7 +200,14 @@ static sqlite3_vfs *vfsList = 0;
 */
 sqlite3_vfs *sqlite3_vfs_find(const char *zVfs){
 #ifndef SQLITE_MUTEX_NOOP
-  sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+  sqlite3_mutex *mutex;
+#endif
+#ifndef SQLITE_OMIT_AUTOINIT
+  int rc = sqlite3_initialize();
+  if( rc ) return 0;
+#endif
+#ifndef SQLITE_MUTEX_NOOP
+  mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
 #endif
   sqlite3_vfs *pVfs = 0;
   static int isInit = 0;
@@ -244,7 +251,14 @@ static void vfsUnlink(sqlite3_vfs *pVfs){
 */
 int sqlite3_vfs_register(sqlite3_vfs *pVfs, int makeDflt){
 #ifndef SQLITE_MUTEX_NOOP
-  sqlite3_mutex *mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
+  sqlite3_mutex *mutex;
+#endif
+#ifndef SQLITE_OMIT_AUTOINIT
+  int rc = sqlite3_initialize();
+  if( rc ) return rc;
+#endif
+#ifndef SQLITE_MUTEX_NOOP
+  mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER);
 #endif
   sqlite3_vfs_find(0);  /* Make sure we are initialized */
   sqlite3_mutex_enter(mutex);
index a20de209014a13e0cc84b9a12be9d19ce2f8caec..827bb533fe1494b737759b75b5c2d28fd8aad570 100644 (file)
@@ -12,7 +12,7 @@
 **
 ** This file contains code that is specific to OS/2.
 **
-** $Id: os_os2.c,v 1.42 2008/06/12 12:38:10 drh Exp $
+** $Id: os_os2.c,v 1.43 2008/06/13 18:24:27 drh Exp $
 */
 
 #include "sqliteInt.h"
@@ -1073,4 +1073,11 @@ sqlite3_vfs *sqlite3OsDefaultVfs(void){
   return &os2Vfs;
 }
 
+/*
+** Initialize and deinitialize the operating system interface.
+** These are stubs for now - populate with real code later...
+*/
+int sqlite3_os_init(void){ return SQLITE_OK; }
+int sqlite3_os_end(void){ return SQLITE_OK; }
+
 #endif /* OS_OS2 */
index 63e1950ccc2ce70abcb2878fce3d2c5bbe46ca96..9b5533983650ca2e403e416744331e993ee1667c 100644 (file)
@@ -12,7 +12,7 @@
 **
 ** This file contains code that is specific to Unix systems.
 **
-** $Id: os_unix.c,v 1.186 2008/06/06 15:49:30 danielk1977 Exp $
+** $Id: os_unix.c,v 1.187 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 #if OS_UNIX              /* This file is used on unix only */
@@ -2810,5 +2810,13 @@ sqlite3_vfs *sqlite3OsDefaultVfs(void){
   
   return &unixVfs;
 }
+
+/*
+** Initialize and deinitialize the operating system interface.
+** These are stubs for now - populate with real code later...
+*/
+int sqlite3_os_init(void){ return SQLITE_OK; }
+int sqlite3_os_end(void){ return SQLITE_OK; }
+
  
 #endif /* OS_UNIX */
index 8f23c67709c7329137d36a476366d46c8c7bfa2e..4193a16209d012fb945426c0de2bd16a48d4d51e 100644 (file)
@@ -12,7 +12,7 @@
 **
 ** This file contains code that is specific to windows.
 **
-** $Id: os_win.c,v 1.126 2008/06/06 15:49:30 danielk1977 Exp $
+** $Id: os_win.c,v 1.127 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 #if OS_WIN               /* This file is used for windows only */
@@ -1584,4 +1584,11 @@ sqlite3_vfs *sqlite3OsDefaultVfs(void){
   return &winVfs;
 }
 
+/*
+** Initialize and deinitialize the operating system interface.
+** These are stubs for now - populate with real code later...
+*/
+int sqlite3_os_init(void){ return SQLITE_OK; }
+int sqlite3_os_end(void){ return SQLITE_OK; }
+
 #endif /* OS_WIN */
index a4648dedf9941e0c05878e638264d6a51607dcc5..3e1cdccc0a7b1540ef975581e60b6eae943f3f63 100644 (file)
@@ -30,7 +30,7 @@
 ** the version number) and changes its name to "sqlite3.h" as
 ** part of the build process.
 **
-** @(#) $Id: sqlite.h.in,v 1.325 2008/06/12 00:07:29 drh Exp $
+** @(#) $Id: sqlite.h.in,v 1.326 2008/06/13 18:24:27 drh Exp $
 */
 #ifndef _SQLITE3_H_
 #define _SQLITE3_H_
@@ -928,7 +928,7 @@ int sqlite3_os_end(void);
 ** may only be invoked prior to library initialization using
 ** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()].
 ** Note, however, that sqlite3_config() can be called as part of the
-** implementation of an application-defined [sqlite3_initialize()].
+** implementation of an application-defined [sqlite3_os_init()].
 **
 ** The first argument to sqlite3_config() is an integer
 ** [SQLITE_CONFIG_SINGLETHREAD | configuration option] that determines
@@ -937,10 +937,8 @@ int sqlite3_os_end(void);
 ** in the first argument.
 **
 ** When a configuration option is set, sqlite3_config() returns SQLITE_OK.
-** If the option is unknown or SQLite is unable to set the option (for
-** example if one attempts to set a threadsafe option when SQLite is
-** compiled with SQLITE_THREADSAFE=0 and is thus incapable of being
-** threadsafe) then this routine returns a non-zero [error code].
+** If the option is unknown or SQLite is unable to set the option 
+** then this routine returns a non-zero [error code].
 */
 int sqlite3_config(int, ...);
 
@@ -975,11 +973,13 @@ int sqlite3_config(int, ...);
 ** same [prepared statement] in different threads at the same time.</dd>
 **
 ** <dt>SQLITE_CONFIG_MALLOC</dt>
-** <dd>This option takes four arguments.  The first three
+** <dd>This option takes five arguments.  The first three
 ** arguments are pointers to functions that emulate malloc(), free(),
 ** and realloc(), respectively.  The fourth argument must be a pointer to
 ** a function that returns the size of a prior allocation when handed a pointer
-** to the allocation. This option is used to replace the default memory
+** to the allocation. The fifth argument is a pointer to a function that
+** returns the rounded-up size of a memory allocation given the requested
+** allocation size.  This option is used to replace the default memory
 ** allocator with an application-defined memory allocator.</dd>
 **
 ** <dt>SQLITE_CONFIG_MEMSTATS</dt>
@@ -990,22 +990,19 @@ int sqlite3_config(int, ...);
 **   <li> [sqlite3_memory_used()]
 **   <li> [sqlite3_memory_highwater()]
 **   <li> [sqlite3_soft_heap_limit()]
+**   <li> sqlite3_memory_status()
 **   </ul>
 ** </dd>
 ** </dl>
 */ 
-#define SQLITE_CONFIG_SINGLETHREAD       1  /* nil */
-#define SQLITE_CONFIG_MULTITHREAD        2  /* nil */
-#define SQLITE_CONFIG_SERIALIZED         3  /* nil */
-#define SQLITE_CONFIG_MALLOC             4  /* malloc, free, realloc, memsize */
-#define SQLITE_CONFIG_MEMSTATS           5  /* boolean */
+#define SQLITE_CONFIG_SINGLETHREAD  1  /* nil */
+#define SQLITE_CONFIG_MULTITHREAD   2  /* nil */
+#define SQLITE_CONFIG_SERIALIZED    3  /* nil */
+#define SQLITE_CONFIG_MALLOC        4  /* malloc,free,realloc,memsize,roundup */
+#define SQLITE_CONFIG_MEMSTATS      5  /* boolean */
 
 /* These options are to be added later.  Currently unused and undocumented. */
-#define SQLITE_CONFIG_PAGEMALLOC         6  /* malloc, free */
-#define SQLITE_CONFIG_TEMPMALLOC         7  /* malloc, free */
-#define SQLITE_CONFIG_HEAP               8  /* void*, int64 */
-#define SQLITE_CONFIG_PAGEHEAP           9  /* void*, int64 */
-#define SQLITE_CONFIG_TEMPHEAP          10  /* void*, int64 */
+#define SQLITE_CONFIG_HEAP          6  /* void*, int64, min, max, tmp */
 
 
 /*
@@ -5723,15 +5720,19 @@ int sqlite3_vfs_unregister(sqlite3_vfs*);
 ** calling thread or is not currently allocated.  {F17033} SQLite will
 ** never do either. {END}
 **
+** If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or
+** sqlite3_mutex_leave() is a NULL pointer, then all three routines
+** behave as no-ops.
+**
 ** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()].
 */
-int sqlite3_mutex_init();
+int sqlite3_mutex_init(void);
 sqlite3_mutex *sqlite3_mutex_alloc(int);
 void sqlite3_mutex_free(sqlite3_mutex*);
 void sqlite3_mutex_enter(sqlite3_mutex*);
 int sqlite3_mutex_try(sqlite3_mutex*);
 void sqlite3_mutex_leave(sqlite3_mutex*);
-int sqlite_mutex_end();
+int sqlite3_mutex_end(void);
 
 /*
 ** CAPI3REF: Mutex Verifcation Routines {F17080}
index 0a3c2a3fe2def8bbfc789f536cbd22bae8ac9a27..d2cb424c199afb56aaaccd7af0a176c4ae444531 100644 (file)
@@ -11,7 +11,7 @@
 *************************************************************************
 ** Internal interface definitions for SQLite.
 **
-** @(#) $Id: sqliteInt.h,v 1.707 2008/06/06 15:04:37 drh Exp $
+** @(#) $Id: sqliteInt.h,v 1.708 2008/06/13 18:24:27 drh Exp $
 */
 #ifndef _SQLITEINT_H_
 #define _SQLITEINT_H_
@@ -1731,6 +1731,24 @@ typedef struct {
   int rc;             /* Result code stored here */
 } InitData;
 
+/*
+** Structure containing global configuration data for the SQLite library.
+*/
+struct Sqlite3Config {
+  void *(*xMalloc)(int);            /* Low-level malloc() */
+  void *(*xRealloc)(void*,int);     /* Low-level realloc() */
+  void (*xFree)(void*);             /* Low-level free() */
+  int (*xMemsize)(void*);           /* Return size of an allocation */
+  int (*xRoundup)(int);             /* Size of allocation given request */
+  void *pHeap;                      /* Heap storage space */
+  sqlite3_int64 nHeap;              /* Size of pHeap[] */
+  int mnReq, mxReq;                 /* Min and max memory request sizes */
+  int nTemp;                        /* Part of pHeap for temporary allos */
+  int bMemstat;                     /* True to enable memory status */
+  int bCoreMutex;                   /* True to enable core mutexing */
+  int bFullMutex;                   /* True to enable full mutexing */
+};
+
 /*
 ** Assuming zIn points to the first byte of a UTF-8 character,
 ** advance zIn to point to the first byte of the next UTF-8 character.
@@ -1763,6 +1781,7 @@ int sqlite3StrICmp(const char *, const char *);
 int sqlite3StrNICmp(const char *, const char *, int);
 int sqlite3IsNumber(const char*, int*, u8);
 
+int sqlite3MallocInit(void);
 void *sqlite3MallocZero(unsigned);
 void *sqlite3DbMallocZero(sqlite3*, unsigned);
 void *sqlite3DbMallocRaw(sqlite3*, unsigned);
@@ -2060,6 +2079,7 @@ int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **);
 void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
 #ifndef SQLITE_AMALGAMATION
 extern const unsigned char sqlite3UpperToLower[];
+extern struct Sqlite3Config sqlite3Config;
 #endif
 void sqlite3RootPageMoved(Db*, int, int);
 void sqlite3Reindex(Parse*, Token*, Token*);
index 234a7fae2c56f1f8e2cebcdf52d30aa7736e1255..2ad141779a366424fe7500ddaee0e683a4306bdf 100644 (file)
@@ -14,7 +14,7 @@
 ** This file contains functions for allocating memory, comparing
 ** strings, and stuff like that.
 **
-** $Id: util.c,v 1.231 2008/06/12 02:16:45 shane Exp $
+** $Id: util.c,v 1.232 2008/06/13 18:24:27 drh Exp $
 */
 #include "sqliteInt.h"
 #include <stdarg.h>
@@ -150,46 +150,7 @@ void sqlite3Dequote(char *z){
   }
 }
 
-/* An array to map all upper-case characters into their corresponding
-** lower-case character. 
-*/
-const unsigned char sqlite3UpperToLower[] = {
-#ifdef SQLITE_ASCII
-      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
-     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
-     36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
-     54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
-    104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
-    122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
-    108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
-    126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
-    144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
-    162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
-    180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
-    198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
-    216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
-    234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
-    252,253,254,255
-#endif
-#ifdef SQLITE_EBCDIC
-      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, /* 0x */
-     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* 1x */
-     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, /* 2x */
-     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */
-     64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */
-     80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */
-     96, 97, 66, 67, 68, 69, 70, 71, 72, 73,106,107,108,109,110,111, /* 6x */
-    112, 81, 82, 83, 84, 85, 86, 87, 88, 89,122,123,124,125,126,127, /* 7x */
-    128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */
-    144,145,146,147,148,149,150,151,152,153,154,155,156,157,156,159, /* 9x */
-    160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */
-    176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */
-    192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */
-    208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */
-    224,225,162,163,164,165,166,167,168,169,232,203,204,205,206,207, /* Ex */
-    239,240,241,242,243,244,245,246,247,248,249,219,220,221,222,255, /* Fx */
-#endif
-};
+/* Convenient short-hand */
 #define UpperToLower sqlite3UpperToLower
 
 /*
index 361df948609258e0afaab37a57290242b051c0b5..79723d4b1ee63b364966edf894b97c50e7e92547 100644 (file)
@@ -13,7 +13,7 @@
 # including the sqlite3_bind_zeroblob(), sqlite3_result_zeroblob(),
 # and the built-in zeroblob() SQL function.
 #
-# $Id: zeroblob.test,v 1.12 2008/06/12 18:17:40 drh Exp $
+# $Id: zeroblob.test,v 1.13 2008/06/13 18:24:28 drh Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -28,7 +28,7 @@ ifcapable !incrblob {
 # But it does get inserted into the database correctly.
 #
 db eval {PRAGMA cache_size=10}
-sqlite3_memory_highwater
+sqlite3_memory_highwater 1
 unset -nocomplain memused
 set memused [sqlite3_memory_used]
 do_test zeroblob-1.1 {
index 04c17e66f6bfd11f8b56c095c5813e3e23f2abca..400e9db235d0ca9ea48a4fafea5f386c2d30b7d5 100644 (file)
@@ -203,6 +203,7 @@ proc copy_file {filename} {
 foreach file {
    sqliteInt.h
 
+   global.c
    date.c
    os.c