]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance the sqlite3_load_extension() API so that the first parameter (the "db" persistent-extensions
authordrh <drh@noemail.net>
Sat, 28 May 2016 15:03:06 +0000 (15:03 +0000)
committerdrh <drh@noemail.net>
Sat, 28 May 2016 15:03:06 +0000 (15:03 +0000)
parameter) can be NULL.  An extension that is not associated with any
database connection remains loaded for the life of the process.

FossilOrigin-Name: 3a461043898a77b14ffc12b5e332b3d65a8dca1d

manifest
manifest.uuid
src/loadext.c
src/shell.c

index 98076dc0c34cb029091a4d3c286929af99afebcc..ff5f50c228393997acbcfbe09aeaebf56e229577 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\svfsstat.c\sloadable\sextension\s-\sa\sVFS\sshim\sthat\smeasures\sthe\samount\nof\sI/O,\sand\san\seponymous\svirtual\stable\sthat\sis\sused\sto\sextract\sand\sview\nthe\smeasurements.
-D 2016-05-28T14:53:48.676
+C Enhance\sthe\ssqlite3_load_extension()\sAPI\sso\sthat\sthe\sfirst\sparameter\s(the\s"db"\nparameter)\scan\sbe\sNULL.\s\sAn\sextension\sthat\sis\snot\sassociated\swith\sany\s\ndatabase\sconnection\sremains\sloaded\sfor\sthe\slife\sof\sthe\sprocess.
+D 2016-05-28T15:03:06.118
 F Makefile.in f59e0763ff448719fc1bd25513882b0567286317
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 306d73e854b1a92ea06e5d1e637faa5c44de53c7
@@ -344,7 +344,7 @@ F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
 F src/insert.c 8f4e9fcbd8e95e85f15647ba8b413b18d556ec2b
 F src/legacy.c 75d3023be8f0d2b99d60f905090341a03358c58e
-F src/loadext.c 8b3a73f0624c5f7cadbd5cb89940783bee1d39a6
+F src/loadext.c f2316d5ccd905d86260392fb8d2b5fd67335ed77
 F src/main.c 405d13e3a4f7c5add9fb27702ae70ed0a6e32cca
 F src/malloc.c 1443d1ad95d67c21d77af7ae3f44678252f0efec
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
@@ -381,7 +381,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
 F src/resolve.c cca3aa77b95706df5d635a2141a4d1de60ae6598
 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
 F src/select.c a0c4abf54bc6bd3a9c77a36ef3d1676045706cb2
-F src/shell.c 14ff7f660530a52b117d110ba3390b7b2eb719b6
+F src/shell.c c80b8d562b66d27172b0e98333f2f27876d8b4aa
 F src/sqlite.h.in 9984129d86243424b765fcb3f147c697bd20bb54
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2
@@ -1496,7 +1496,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 71087c12bc75a82f5d1051600a442ef6efc5e899
-R 3d452eed48a36d85ceafabad1e13a1b0
+P 0987487dd4ebfcf66ddeec8ceca47775216a0887
+R e12f783957b755fbf23064ac37b7305b
+T *branch * persistent-extensions
+T *sym-persistent-extensions *
+T -sym-trunk *
 U drh
-Z 226f41fb99617919dc67fcf97f9a5431
+Z 7c91f0eea3a925fa49de1662b44330b3
index 4270f95914dab8ff6f73a2f3043d4d938d4f1d81..3d281059fa47c160301b660e9e80d6728eb7c1e0 100644 (file)
@@ -1 +1 @@
-0987487dd4ebfcf66ddeec8ceca47775216a0887
\ No newline at end of file
+3a461043898a77b14ffc12b5e332b3d65a8dca1d
\ No newline at end of file
index f881d997103300e7d2748cbc18326147eb8ab506..32be3e6d058e4e942f03bb4ca30ba215834fc8b7 100644 (file)
@@ -437,7 +437,7 @@ static int sqlite3LoadExtension(
   const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */
   char **pzErrMsg       /* Put error message here if not 0 */
 ){
-  sqlite3_vfs *pVfs = db->pVfs;
+  sqlite3_vfs *pVfs = db ? db->pVfs : sqlite3_vfs_find(0);
   void *handle;
   int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
   char *zErrmsg = 0;
@@ -468,7 +468,7 @@ static int sqlite3LoadExtension(
   ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0)
   ** to turn on extension loading.
   */
-  if( (db->flags & SQLITE_LoadExtension)==0 ){
+  if( db && (db->flags & SQLITE_LoadExtension)==0 ){
     if( pzErrMsg ){
       *pzErrMsg = sqlite3_mprintf("not authorized");
     }
@@ -558,17 +558,18 @@ static int sqlite3LoadExtension(
   }
 
   /* Append the new shared library handle to the db->aExtension array. */
-  aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
-  if( aHandle==0 ){
-    return SQLITE_NOMEM_BKPT;
-  }
-  if( db->nExtension>0 ){
-    memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
+  if( db ){
+    aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
+    if( aHandle==0 ){
+      return SQLITE_NOMEM_BKPT;
+    }
+    if( db->nExtension>0 ){
+      memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
+    }
+    sqlite3DbFree(db, db->aExtension);
+    db->aExtension = aHandle;
+    db->aExtension[db->nExtension++] = handle;
   }
-  sqlite3DbFree(db, db->aExtension);
-  db->aExtension = aHandle;
-
-  db->aExtension[db->nExtension++] = handle;
   return SQLITE_OK;
 }
 int sqlite3_load_extension(
@@ -578,6 +579,7 @@ int sqlite3_load_extension(
   char **pzErrMsg       /* Put error message here if not 0 */
 ){
   int rc;
+  if( db==0 ) return sqlite3LoadExtension(0, zFile, zProc, pzErrMsg);
   sqlite3_mutex_enter(db->mutex);
   rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);
   rc = sqlite3ApiExit(db, rc);
index 5148177372eba42a04006f15344f3d8f1b0f379c..4559d4734c772795055e32052ac0a2c5ac8747c0 100644 (file)
@@ -3755,7 +3755,7 @@ static int do_meta_command(char *zLine, ShellState *p){
     }
     zFile = azArg[1];
     zProc = nArg>=3 ? azArg[2] : 0;
-    open_db(p, 0);
+    /*    open_db(p, 0); */
     rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg);
     if( rc!=SQLITE_OK ){
       utf8_printf(stderr, "Error: %s\n", zErrMsg);