]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add interfaces sqlite3_uri_boolean() and sqlite3_uri_int64() which are
authordrh <drh@noemail.net>
Fri, 23 Dec 2011 00:07:33 +0000 (00:07 +0000)
committerdrh <drh@noemail.net>
Fri, 23 Dec 2011 00:07:33 +0000 (00:07 +0000)
wrappers around sqlite3_uri_parameter() combined with internal routines for
converting strings to booleans and 64-bit integers.

FossilOrigin-Name: 83d26b9a9115eadac9e59a33d608bca0ab2519e3

manifest
manifest.uuid
src/main.c
src/os_unix.c
src/sqlite.h.in
src/test_multiplex.c
src/util.c

index 1d52fc88146e222f75ab8d0c58912034a55bd423..2f08ae4c31f0fa156dc532eb0e50babe8b92d33e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sminor\sissues\swith\sFTS\sand\sRTREE\sdiscovered\sby\scoverity.
-D 2011-12-22T17:31:17.125
+C Add\sinterfaces\ssqlite3_uri_boolean()\sand\ssqlite3_uri_int64()\swhich\sare\nwrappers\saround\ssqlite3_uri_parameter()\scombined\swith\sinternal\sroutines\sfor\nconverting\sstrings\sto\sbooleans\sand\s64-bit\sintegers.
+D 2011-12-23T00:07:33.075
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -147,7 +147,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e
 F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
 F src/lempar.c 0ee69fca0be54cd93939df98d2aca4ca46f44416
 F src/loadext.c f20382fbaeec832438a1ba7797bee3d3c8a6d51d
-F src/main.c c837e24182e8ec7121c61e44f547b59cbe413e7f
+F src/main.c e2e3fb34be05658f41ac65ee5d9a44e00a358b48
 F src/malloc.c 15afac5e59b6584efe072e9933aefb4230e74f97
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 7998e7003a3047e323c849a26dda004debc04d03
@@ -166,7 +166,7 @@ F src/os.c 28bbdab2170dfce84d86c45456a18eab1d0f99a9
 F src/os.h 549b1a2e5e0ed1e1499f252dac126c4973e7379c
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
 F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440
-F src/os_unix.c 7dc7df10331942b139032328449a3723e051979e
+F src/os_unix.c ee4ea557de196798bafba1ac69f76a755035ebbb
 F src/os_win.c 197d23ce8a0dff748e766e034bf95ff756dd3884
 F src/pager.c 523c64f6ca707e820d5cf10ed8371238ecac8333
 F src/pager.h 5cd760857707529b403837d813d86b68938d6183
@@ -182,7 +182,7 @@ F src/resolve.c 3d3e80a98f203ac6b9329e9621e29eda85ddfd40
 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
 F src/select.c a1d075db66a0ea42807353501b62997969e5be79
 F src/shell.c aa4183d4a5243d8110b1d3d77faa4aea7e9c9c2d
-F src/sqlite.h.in e884dffa91721080e1792e73a2260485c9d2ffc1
+F src/sqlite.h.in db834f87316a1422051a97cba5beac31c0cb1b2d
 F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477
 F src/sqliteInt.h 165409fa8adc8701148830804febeded3f2e4448
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
@@ -214,7 +214,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207
 F src/test_journal.c 2c06e4be6584d51b935dc8b353980a9388de62ef
 F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e
 F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5
-F src/test_multiplex.c 6e07b94e2fe430f7f4f0d7d67b5e58f504dea655
+F src/test_multiplex.c 7a41891cda4c6b43298656d88e37e3c6244a90ff
 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d
 F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e
 F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec
@@ -238,7 +238,7 @@ F src/tokenize.c c819d9f72168a035d545a5bdafe9b085b20df705
 F src/trigger.c ee7e178fb9188f44b532cebd449a7c1df90fb684
 F src/update.c d3076782c887c10e882996550345da9c4c9f9dea
 F src/utf.c 890c67dcfcc7a74623c95baac7535aadfe265e84
-F src/util.c 343508d359df65685b62e63964a40e7af4cfbe05
+F src/util.c 19ae3ee0dfa88e6054838afc5920327c5918fa2b
 F src/vacuum.c 0c0ba2242355c6048d65e2b333abe0f7c06348fa
 F src/vdbe.c 029add0c5197a61db588824a58570547330b9d8f
 F src/vdbe.h 18f581cac1f4339ec3299f3e0cc6e11aec654cdb
@@ -985,7 +985,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 676acce274fec692a1eb34d27ee4b1327b4b3334
-R 8a1d21156d0abc4e02d468720492bfd4
+P 1c27d842163e27c39bbe9409f50657b9de9ade6e
+R 712ad6ea662046687d3fa2e6906d477a
 U drh
-Z d6b64802c9259af408f51c1ca44ff382
+Z dfef488f9835a38d5955098b906ef223
index fbfcdbf0a5519e5fe1698806b54c8a209a348e24..0daedf9dabe988a219d137f4d623a4b715760e1d 100644 (file)
@@ -1 +1 @@
-1c27d842163e27c39bbe9409f50657b9de9ade6e
\ No newline at end of file
+83d26b9a9115eadac9e59a33d608bca0ab2519e3
\ No newline at end of file
index 690b73c2e7b0d574f723263a03792881c7778533..94ea2fa2e5ef25e1ee93db7a73ff23fb74e54053 100644 (file)
@@ -2977,6 +2977,7 @@ int sqlite3_test_control(int op, ...){
 ** returns a NULL pointer.
 */
 const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){
+  if( zFilename==0 ) return 0;
   zFilename += sqlite3Strlen30(zFilename) + 1;
   while( zFilename[0] ){
     int x = strcmp(zFilename, zParam);
@@ -2987,6 +2988,30 @@ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){
   return 0;
 }
 
+/*
+** Return a boolean value for a query parameter.
+*/
+int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){
+  const char *z = sqlite3_uri_parameter(zFilename, zParam);
+  return z ? sqlite3GetBoolean(z) : (bDflt!=0);
+}
+
+/*
+** Return a 64-bit integer value for a query parameter.
+*/
+sqlite3_int64 sqlite3_uri_int64(
+  const char *zFilename,    /* Filename as passed to xOpen */
+  const char *zParam,       /* URI parameter sought */
+  sqlite3_int64 bDflt       /* return if parameter is missing */
+){
+  const char *z = sqlite3_uri_parameter(zFilename, zParam);
+  sqlite3_int64 v;
+  if( z && sqlite3Atoi64(z, &v, sqlite3Strlen30(z), SQLITE_UTF8)==SQLITE_OK ){
+    bDflt = v;
+  }
+  return bDflt;
+}
+
 /*
 ** Return the filename of the database associated with a database
 ** connection.
index ee5971f10eedd0630ab0e69eea34b3af5eea5a49..5f26017b027ccc8816610336eb70b8ecf9a951e9 100644 (file)
@@ -3866,10 +3866,8 @@ static int unixOpenSharedMemory(unixFile *pDbFd){
     }
 
     if( pInode->bProcessLock==0 ){
-      const char *zRO;
       int openFlags = O_RDWR | O_CREAT;
-      zRO = sqlite3_uri_parameter(pDbFd->zPath, "readonly_shm");
-      if( zRO && sqlite3GetBoolean(zRO) ){
+      if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
         openFlags = O_RDONLY;
         pShmNode->isReadonly = 1;
       }
index 5bb1cb5323621755603c42c02bdd8dbaa8d57776..ca0d7e320800568f6ff3994cdb931a36dd3fb346 100644 (file)
@@ -2608,21 +2608,37 @@ int sqlite3_open_v2(
 /*
 ** CAPI3REF: Obtain Values For URI Parameters
 **
-** This is a utility routine, useful to VFS implementations, that checks
+** These are utility routines, useful to VFS implementations, that check
 ** to see if a database file was a URI that contained a specific query 
-** parameter, and if so obtains the value of the query parameter.
-**
-** The zFilename argument is the filename pointer passed into the xOpen()
-** method of a VFS implementation.  The zParam argument is the name of the
-** query parameter we seek.  This routine returns the value of the zParam
-** parameter if it exists.  If the parameter does not exist, this routine
-** returns a NULL pointer.
-**
-** If the zFilename argument to this function is not a pointer that SQLite
-** passed into the xOpen VFS method, then the behavior of this routine
-** is undefined and probably undesirable.
+** parameter, and if so obtains the value of that query parameter.
+**
+** If F is the filename pointer passed into the xOpen() method of a VFS
+** implementation and P is the name of the query parameter, then
+** sqlite3_uri_parameter(F,P) returns the value of the P
+** parameter if it exists or a NULL pointer if P does not appear as a 
+** query parameter on F.  If P is a query parameter of F
+** has no explicit value, then sqlite3_uri_parameter(F,P) returns
+** a pointer to an empty string.
+**
+** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean
+** parameter and returns true (1) or false (0) according to the value
+** of P.  The value of P is true if it is "yes" or "true" or "on" or 
+** a non-zero number and is false otherwise.  If P is not a query parameter
+** on F then sqlite3_uri_boolean(F,P,B) returns (B!=0).
+**
+** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a
+** 64-bit signed integer and returns that integer, or D if P does not
+** exist.  If the value of P is something other than an integer, then
+** zero is returned.
+** 
+** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and
+** sqlite3_uri_boolean(F,P,B) returns B.  If F is not a NULL pointer and
+** is not a pathname pointer that SQLite passed into the xOpen VFS method,
+** then the behavior of this routine is undefined and probably undesirable.
 */
 const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam);
+int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault);
+sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64);
 
 
 /*
index 25bfcdddd2bd5636b88c978b392d4d05fce1ffd5..45f7310361fde9345dc07832c4b9040b132504a2 100644 (file)
@@ -495,35 +495,19 @@ static int multiplexOpen(
     memset(pGroup, 0, sz);
     pMultiplexOpen->pGroup = pGroup;
     pGroup->bEnabled = -1;
-    pGroup->bTruncate = (flags & SQLITE_OPEN_MAIN_DB)==0;
-    pGroup->szChunk = SQLITE_MULTIPLEX_CHUNK_SIZE;
-
+    pGroup->bTruncate = sqlite3_uri_boolean(zName, "truncate", 
+                                 (flags & SQLITE_OPEN_MAIN_DB)==0);
+    pGroup->szChunk = sqlite3_uri_int64(zName, "chunksize",
+                                        SQLITE_MULTIPLEX_CHUNK_SIZE);
+    pGroup->szChunk = (pGroup->szChunk+0xffff)&~0xffff;
     if( zName ){
       char *p = (char *)&pGroup[1];
-      if( flags & SQLITE_OPEN_URI ){
-        const char *zChunkSize;
-        zChunkSize = sqlite3_uri_parameter(zName, "chunksize");
-        if( zChunkSize ){
-          unsigned int n = 0;
-          int i;
-          for(i=0; zChunkSize[i]>='0' && zChunkSize[i]<='9'; i++){
-            n = n*10 + zChunkSize[i] - '0';
-          }
-          if( n>0 ){
-            pGroup->szChunk = (n+0xffff)&~0xffff;
-          }else{
-            /* A zero or negative chunksize disabled the multiplexor */
-            pGroup->bEnabled = 0;
-          }
-        }
-        if( sqlite3_uri_parameter(zName, "truncate") ) pGroup->bTruncate = 1;
-      }
       pGroup->zName = p;
       memcpy(pGroup->zName, zName, nName+1);
       pGroup->nName = nName;
     }
     if( pGroup->bEnabled ){
-      /* Make sure that the chunksize is not such that the pending byte
+      /* Make sure that the chunksize is such that the pending byte does not
       ** falls at the end of a chunk.  A region of up to 64K following
       ** the pending byte is never written, so if the pending byte occurs
       ** near the end of a chunk, that chunk will be too small. */
index d27f6fdf26f3597eabc049360522f474c8ba8400..a80b89a4ad04f1e759d38611c2f70908729bc465 100644 (file)
@@ -1173,9 +1173,7 @@ int sqlite3AbsInt32(int x){
 */
 void sqlite3FileSuffix3(const char *zBaseFilename, char *z){
 #if SQLITE_ENABLE_8_3_NAMES<2
-  const char *zOk;
-  zOk = sqlite3_uri_parameter(zBaseFilename, "8_3_names");
-  if( zOk && sqlite3GetBoolean(zOk) )
+  if( sqlite3_uri_boolean(zBaseFilename, "8_3_names") )
 #endif
   {
     int i, sz;