modernc.org/cc@v1.0.1/v2/testdata/_sqlite/src/loadext.c (about)

     1  /*
     2  ** 2006 June 7
     3  **
     4  ** The author disclaims copyright to this source code.  In place of
     5  ** a legal notice, here is a blessing:
     6  **
     7  **    May you do good and not evil.
     8  **    May you find forgiveness for yourself and forgive others.
     9  **    May you share freely, never taking more than you give.
    10  **
    11  *************************************************************************
    12  ** This file contains code used to dynamically load extensions into
    13  ** the SQLite library.
    14  */
    15  
    16  #ifndef SQLITE_CORE
    17    #define SQLITE_CORE 1  /* Disable the API redefinition in sqlite3ext.h */
    18  #endif
    19  #include "sqlite3ext.h"
    20  #include "sqliteInt.h"
    21  
    22  #ifndef SQLITE_OMIT_LOAD_EXTENSION
    23  /*
    24  ** Some API routines are omitted when various features are
    25  ** excluded from a build of SQLite.  Substitute a NULL pointer
    26  ** for any missing APIs.
    27  */
    28  #ifndef SQLITE_ENABLE_COLUMN_METADATA
    29  # define sqlite3_column_database_name   0
    30  # define sqlite3_column_database_name16 0
    31  # define sqlite3_column_table_name      0
    32  # define sqlite3_column_table_name16    0
    33  # define sqlite3_column_origin_name     0
    34  # define sqlite3_column_origin_name16   0
    35  #endif
    36  
    37  #ifdef SQLITE_OMIT_AUTHORIZATION
    38  # define sqlite3_set_authorizer         0
    39  #endif
    40  
    41  #ifdef SQLITE_OMIT_UTF16
    42  # define sqlite3_bind_text16            0
    43  # define sqlite3_collation_needed16     0
    44  # define sqlite3_column_decltype16      0
    45  # define sqlite3_column_name16          0
    46  # define sqlite3_column_text16          0
    47  # define sqlite3_complete16             0
    48  # define sqlite3_create_collation16     0
    49  # define sqlite3_create_function16      0
    50  # define sqlite3_errmsg16               0
    51  # define sqlite3_open16                 0
    52  # define sqlite3_prepare16              0
    53  # define sqlite3_prepare16_v2           0
    54  # define sqlite3_prepare16_v3           0
    55  # define sqlite3_result_error16         0
    56  # define sqlite3_result_text16          0
    57  # define sqlite3_result_text16be        0
    58  # define sqlite3_result_text16le        0
    59  # define sqlite3_value_text16           0
    60  # define sqlite3_value_text16be         0
    61  # define sqlite3_value_text16le         0
    62  # define sqlite3_column_database_name16 0
    63  # define sqlite3_column_table_name16    0
    64  # define sqlite3_column_origin_name16   0
    65  #endif
    66  
    67  #ifdef SQLITE_OMIT_COMPLETE
    68  # define sqlite3_complete 0
    69  # define sqlite3_complete16 0
    70  #endif
    71  
    72  #ifdef SQLITE_OMIT_DECLTYPE
    73  # define sqlite3_column_decltype16      0
    74  # define sqlite3_column_decltype        0
    75  #endif
    76  
    77  #ifdef SQLITE_OMIT_PROGRESS_CALLBACK
    78  # define sqlite3_progress_handler 0
    79  #endif
    80  
    81  #ifdef SQLITE_OMIT_VIRTUALTABLE
    82  # define sqlite3_create_module 0
    83  # define sqlite3_create_module_v2 0
    84  # define sqlite3_declare_vtab 0
    85  # define sqlite3_vtab_config 0
    86  # define sqlite3_vtab_on_conflict 0
    87  #endif
    88  
    89  #ifdef SQLITE_OMIT_SHARED_CACHE
    90  # define sqlite3_enable_shared_cache 0
    91  #endif
    92  
    93  #if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED)
    94  # define sqlite3_profile       0
    95  # define sqlite3_trace         0
    96  #endif
    97  
    98  #ifdef SQLITE_OMIT_GET_TABLE
    99  # define sqlite3_free_table    0
   100  # define sqlite3_get_table     0
   101  #endif
   102  
   103  #ifdef SQLITE_OMIT_INCRBLOB
   104  #define sqlite3_bind_zeroblob  0
   105  #define sqlite3_blob_bytes     0
   106  #define sqlite3_blob_close     0
   107  #define sqlite3_blob_open      0
   108  #define sqlite3_blob_read      0
   109  #define sqlite3_blob_write     0
   110  #define sqlite3_blob_reopen    0
   111  #endif
   112  
   113  #if defined(SQLITE_OMIT_TRACE)
   114  # define sqlite3_trace_v2      0
   115  #endif
   116  
   117  /*
   118  ** The following structure contains pointers to all SQLite API routines.
   119  ** A pointer to this structure is passed into extensions when they are
   120  ** loaded so that the extension can make calls back into the SQLite
   121  ** library.
   122  **
   123  ** When adding new APIs, add them to the bottom of this structure
   124  ** in order to preserve backwards compatibility.
   125  **
   126  ** Extensions that use newer APIs should first call the
   127  ** sqlite3_libversion_number() to make sure that the API they
   128  ** intend to use is supported by the library.  Extensions should
   129  ** also check to make sure that the pointer to the function is
   130  ** not NULL before calling it.
   131  */
   132  static const sqlite3_api_routines sqlite3Apis = {
   133    sqlite3_aggregate_context,
   134  #ifndef SQLITE_OMIT_DEPRECATED
   135    sqlite3_aggregate_count,
   136  #else
   137    0,
   138  #endif
   139    sqlite3_bind_blob,
   140    sqlite3_bind_double,
   141    sqlite3_bind_int,
   142    sqlite3_bind_int64,
   143    sqlite3_bind_null,
   144    sqlite3_bind_parameter_count,
   145    sqlite3_bind_parameter_index,
   146    sqlite3_bind_parameter_name,
   147    sqlite3_bind_text,
   148    sqlite3_bind_text16,
   149    sqlite3_bind_value,
   150    sqlite3_busy_handler,
   151    sqlite3_busy_timeout,
   152    sqlite3_changes,
   153    sqlite3_close,
   154    sqlite3_collation_needed,
   155    sqlite3_collation_needed16,
   156    sqlite3_column_blob,
   157    sqlite3_column_bytes,
   158    sqlite3_column_bytes16,
   159    sqlite3_column_count,
   160    sqlite3_column_database_name,
   161    sqlite3_column_database_name16,
   162    sqlite3_column_decltype,
   163    sqlite3_column_decltype16,
   164    sqlite3_column_double,
   165    sqlite3_column_int,
   166    sqlite3_column_int64,
   167    sqlite3_column_name,
   168    sqlite3_column_name16,
   169    sqlite3_column_origin_name,
   170    sqlite3_column_origin_name16,
   171    sqlite3_column_table_name,
   172    sqlite3_column_table_name16,
   173    sqlite3_column_text,
   174    sqlite3_column_text16,
   175    sqlite3_column_type,
   176    sqlite3_column_value,
   177    sqlite3_commit_hook,
   178    sqlite3_complete,
   179    sqlite3_complete16,
   180    sqlite3_create_collation,
   181    sqlite3_create_collation16,
   182    sqlite3_create_function,
   183    sqlite3_create_function16,
   184    sqlite3_create_module,
   185    sqlite3_data_count,
   186    sqlite3_db_handle,
   187    sqlite3_declare_vtab,
   188    sqlite3_enable_shared_cache,
   189    sqlite3_errcode,
   190    sqlite3_errmsg,
   191    sqlite3_errmsg16,
   192    sqlite3_exec,
   193  #ifndef SQLITE_OMIT_DEPRECATED
   194    sqlite3_expired,
   195  #else
   196    0,
   197  #endif
   198    sqlite3_finalize,
   199    sqlite3_free,
   200    sqlite3_free_table,
   201    sqlite3_get_autocommit,
   202    sqlite3_get_auxdata,
   203    sqlite3_get_table,
   204    0,     /* Was sqlite3_global_recover(), but that function is deprecated */
   205    sqlite3_interrupt,
   206    sqlite3_last_insert_rowid,
   207    sqlite3_libversion,
   208    sqlite3_libversion_number,
   209    sqlite3_malloc,
   210    sqlite3_mprintf,
   211    sqlite3_open,
   212    sqlite3_open16,
   213    sqlite3_prepare,
   214    sqlite3_prepare16,
   215    sqlite3_profile,
   216    sqlite3_progress_handler,
   217    sqlite3_realloc,
   218    sqlite3_reset,
   219    sqlite3_result_blob,
   220    sqlite3_result_double,
   221    sqlite3_result_error,
   222    sqlite3_result_error16,
   223    sqlite3_result_int,
   224    sqlite3_result_int64,
   225    sqlite3_result_null,
   226    sqlite3_result_text,
   227    sqlite3_result_text16,
   228    sqlite3_result_text16be,
   229    sqlite3_result_text16le,
   230    sqlite3_result_value,
   231    sqlite3_rollback_hook,
   232    sqlite3_set_authorizer,
   233    sqlite3_set_auxdata,
   234    sqlite3_snprintf,
   235    sqlite3_step,
   236    sqlite3_table_column_metadata,
   237  #ifndef SQLITE_OMIT_DEPRECATED
   238    sqlite3_thread_cleanup,
   239  #else
   240    0,
   241  #endif
   242    sqlite3_total_changes,
   243    sqlite3_trace,
   244  #ifndef SQLITE_OMIT_DEPRECATED
   245    sqlite3_transfer_bindings,
   246  #else
   247    0,
   248  #endif
   249    sqlite3_update_hook,
   250    sqlite3_user_data,
   251    sqlite3_value_blob,
   252    sqlite3_value_bytes,
   253    sqlite3_value_bytes16,
   254    sqlite3_value_double,
   255    sqlite3_value_int,
   256    sqlite3_value_int64,
   257    sqlite3_value_numeric_type,
   258    sqlite3_value_text,
   259    sqlite3_value_text16,
   260    sqlite3_value_text16be,
   261    sqlite3_value_text16le,
   262    sqlite3_value_type,
   263    sqlite3_vmprintf,
   264    /*
   265    ** The original API set ends here.  All extensions can call any
   266    ** of the APIs above provided that the pointer is not NULL.  But
   267    ** before calling APIs that follow, extension should check the
   268    ** sqlite3_libversion_number() to make sure they are dealing with
   269    ** a library that is new enough to support that API.
   270    *************************************************************************
   271    */
   272    sqlite3_overload_function,
   273  
   274    /*
   275    ** Added after 3.3.13
   276    */
   277    sqlite3_prepare_v2,
   278    sqlite3_prepare16_v2,
   279    sqlite3_clear_bindings,
   280  
   281    /*
   282    ** Added for 3.4.1
   283    */
   284    sqlite3_create_module_v2,
   285  
   286    /*
   287    ** Added for 3.5.0
   288    */
   289    sqlite3_bind_zeroblob,
   290    sqlite3_blob_bytes,
   291    sqlite3_blob_close,
   292    sqlite3_blob_open,
   293    sqlite3_blob_read,
   294    sqlite3_blob_write,
   295    sqlite3_create_collation_v2,
   296    sqlite3_file_control,
   297    sqlite3_memory_highwater,
   298    sqlite3_memory_used,
   299  #ifdef SQLITE_MUTEX_OMIT
   300    0, 
   301    0, 
   302    0,
   303    0,
   304    0,
   305  #else
   306    sqlite3_mutex_alloc,
   307    sqlite3_mutex_enter,
   308    sqlite3_mutex_free,
   309    sqlite3_mutex_leave,
   310    sqlite3_mutex_try,
   311  #endif
   312    sqlite3_open_v2,
   313    sqlite3_release_memory,
   314    sqlite3_result_error_nomem,
   315    sqlite3_result_error_toobig,
   316    sqlite3_sleep,
   317    sqlite3_soft_heap_limit,
   318    sqlite3_vfs_find,
   319    sqlite3_vfs_register,
   320    sqlite3_vfs_unregister,
   321  
   322    /*
   323    ** Added for 3.5.8
   324    */
   325    sqlite3_threadsafe,
   326    sqlite3_result_zeroblob,
   327    sqlite3_result_error_code,
   328    sqlite3_test_control,
   329    sqlite3_randomness,
   330    sqlite3_context_db_handle,
   331  
   332    /*
   333    ** Added for 3.6.0
   334    */
   335    sqlite3_extended_result_codes,
   336    sqlite3_limit,
   337    sqlite3_next_stmt,
   338    sqlite3_sql,
   339    sqlite3_status,
   340  
   341    /*
   342    ** Added for 3.7.4
   343    */
   344    sqlite3_backup_finish,
   345    sqlite3_backup_init,
   346    sqlite3_backup_pagecount,
   347    sqlite3_backup_remaining,
   348    sqlite3_backup_step,
   349  #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
   350    sqlite3_compileoption_get,
   351    sqlite3_compileoption_used,
   352  #else
   353    0,
   354    0,
   355  #endif
   356    sqlite3_create_function_v2,
   357    sqlite3_db_config,
   358    sqlite3_db_mutex,
   359    sqlite3_db_status,
   360    sqlite3_extended_errcode,
   361    sqlite3_log,
   362    sqlite3_soft_heap_limit64,
   363    sqlite3_sourceid,
   364    sqlite3_stmt_status,
   365    sqlite3_strnicmp,
   366  #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
   367    sqlite3_unlock_notify,
   368  #else
   369    0,
   370  #endif
   371  #ifndef SQLITE_OMIT_WAL
   372    sqlite3_wal_autocheckpoint,
   373    sqlite3_wal_checkpoint,
   374    sqlite3_wal_hook,
   375  #else
   376    0,
   377    0,
   378    0,
   379  #endif
   380    sqlite3_blob_reopen,
   381    sqlite3_vtab_config,
   382    sqlite3_vtab_on_conflict,
   383    sqlite3_close_v2,
   384    sqlite3_db_filename,
   385    sqlite3_db_readonly,
   386    sqlite3_db_release_memory,
   387    sqlite3_errstr,
   388    sqlite3_stmt_busy,
   389    sqlite3_stmt_readonly,
   390    sqlite3_stricmp,
   391    sqlite3_uri_boolean,
   392    sqlite3_uri_int64,
   393    sqlite3_uri_parameter,
   394    sqlite3_vsnprintf,
   395    sqlite3_wal_checkpoint_v2,
   396    /* Version 3.8.7 and later */
   397    sqlite3_auto_extension,
   398    sqlite3_bind_blob64,
   399    sqlite3_bind_text64,
   400    sqlite3_cancel_auto_extension,
   401    sqlite3_load_extension,
   402    sqlite3_malloc64,
   403    sqlite3_msize,
   404    sqlite3_realloc64,
   405    sqlite3_reset_auto_extension,
   406    sqlite3_result_blob64,
   407    sqlite3_result_text64,
   408    sqlite3_strglob,
   409    /* Version 3.8.11 and later */
   410    (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup,
   411    sqlite3_value_free,
   412    sqlite3_result_zeroblob64,
   413    sqlite3_bind_zeroblob64,
   414    /* Version 3.9.0 and later */
   415    sqlite3_value_subtype,
   416    sqlite3_result_subtype,
   417    /* Version 3.10.0 and later */
   418    sqlite3_status64,
   419    sqlite3_strlike,
   420    sqlite3_db_cacheflush,
   421    /* Version 3.12.0 and later */
   422    sqlite3_system_errno,
   423    /* Version 3.14.0 and later */
   424    sqlite3_trace_v2,
   425    sqlite3_expanded_sql,
   426    /* Version 3.18.0 and later */
   427    sqlite3_set_last_insert_rowid,
   428    /* Version 3.20.0 and later */
   429    sqlite3_prepare_v3,
   430    sqlite3_prepare16_v3,
   431    sqlite3_bind_pointer,
   432    sqlite3_result_pointer,
   433    sqlite3_value_pointer
   434  };
   435  
   436  /*
   437  ** Attempt to load an SQLite extension library contained in the file
   438  ** zFile.  The entry point is zProc.  zProc may be 0 in which case a
   439  ** default entry point name (sqlite3_extension_init) is used.  Use
   440  ** of the default name is recommended.
   441  **
   442  ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong.
   443  **
   444  ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with 
   445  ** error message text.  The calling function should free this memory
   446  ** by calling sqlite3DbFree(db, ).
   447  */
   448  static int sqlite3LoadExtension(
   449    sqlite3 *db,          /* Load the extension into this database connection */
   450    const char *zFile,    /* Name of the shared library containing extension */
   451    const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */
   452    char **pzErrMsg       /* Put error message here if not 0 */
   453  ){
   454    sqlite3_vfs *pVfs = db->pVfs;
   455    void *handle;
   456    sqlite3_loadext_entry xInit;
   457    char *zErrmsg = 0;
   458    const char *zEntry;
   459    char *zAltEntry = 0;
   460    void **aHandle;
   461    u64 nMsg = 300 + sqlite3Strlen30(zFile);
   462    int ii;
   463    int rc;
   464  
   465    /* Shared library endings to try if zFile cannot be loaded as written */
   466    static const char *azEndings[] = {
   467  #if SQLITE_OS_WIN
   468       "dll"   
   469  #elif defined(__APPLE__)
   470       "dylib"
   471  #else
   472       "so"
   473  #endif
   474    };
   475  
   476  
   477    if( pzErrMsg ) *pzErrMsg = 0;
   478  
   479    /* Ticket #1863.  To avoid a creating security problems for older
   480    ** applications that relink against newer versions of SQLite, the
   481    ** ability to run load_extension is turned off by default.  One
   482    ** must call either sqlite3_enable_load_extension(db) or
   483    ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0)
   484    ** to turn on extension loading.
   485    */
   486    if( (db->flags & SQLITE_LoadExtension)==0 ){
   487      if( pzErrMsg ){
   488        *pzErrMsg = sqlite3_mprintf("not authorized");
   489      }
   490      return SQLITE_ERROR;
   491    }
   492  
   493    zEntry = zProc ? zProc : "sqlite3_extension_init";
   494  
   495    handle = sqlite3OsDlOpen(pVfs, zFile);
   496  #if SQLITE_OS_UNIX || SQLITE_OS_WIN
   497    for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){
   498      char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]);
   499      if( zAltFile==0 ) return SQLITE_NOMEM_BKPT;
   500      handle = sqlite3OsDlOpen(pVfs, zAltFile);
   501      sqlite3_free(zAltFile);
   502    }
   503  #endif
   504    if( handle==0 ){
   505      if( pzErrMsg ){
   506        *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg);
   507        if( zErrmsg ){
   508          sqlite3_snprintf(nMsg, zErrmsg, 
   509              "unable to open shared library [%s]", zFile);
   510          sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
   511        }
   512      }
   513      return SQLITE_ERROR;
   514    }
   515    xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);
   516  
   517    /* If no entry point was specified and the default legacy
   518    ** entry point name "sqlite3_extension_init" was not found, then
   519    ** construct an entry point name "sqlite3_X_init" where the X is
   520    ** replaced by the lowercase value of every ASCII alphabetic 
   521    ** character in the filename after the last "/" upto the first ".",
   522    ** and eliding the first three characters if they are "lib".  
   523    ** Examples:
   524    **
   525    **    /usr/local/lib/libExample5.4.3.so ==>  sqlite3_example_init
   526    **    C:/lib/mathfuncs.dll              ==>  sqlite3_mathfuncs_init
   527    */
   528    if( xInit==0 && zProc==0 ){
   529      int iFile, iEntry, c;
   530      int ncFile = sqlite3Strlen30(zFile);
   531      zAltEntry = sqlite3_malloc64(ncFile+30);
   532      if( zAltEntry==0 ){
   533        sqlite3OsDlClose(pVfs, handle);
   534        return SQLITE_NOMEM_BKPT;
   535      }
   536      memcpy(zAltEntry, "sqlite3_", 8);
   537      for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){}
   538      iFile++;
   539      if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3;
   540      for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){
   541        if( sqlite3Isalpha(c) ){
   542          zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c];
   543        }
   544      }
   545      memcpy(zAltEntry+iEntry, "_init", 6);
   546      zEntry = zAltEntry;
   547      xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);
   548    }
   549    if( xInit==0 ){
   550      if( pzErrMsg ){
   551        nMsg += sqlite3Strlen30(zEntry);
   552        *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg);
   553        if( zErrmsg ){
   554          sqlite3_snprintf(nMsg, zErrmsg,
   555              "no entry point [%s] in shared library [%s]", zEntry, zFile);
   556          sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
   557        }
   558      }
   559      sqlite3OsDlClose(pVfs, handle);
   560      sqlite3_free(zAltEntry);
   561      return SQLITE_ERROR;
   562    }
   563    sqlite3_free(zAltEntry);
   564    rc = xInit(db, &zErrmsg, &sqlite3Apis);
   565    if( rc ){
   566      if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK;
   567      if( pzErrMsg ){
   568        *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg);
   569      }
   570      sqlite3_free(zErrmsg);
   571      sqlite3OsDlClose(pVfs, handle);
   572      return SQLITE_ERROR;
   573    }
   574  
   575    /* Append the new shared library handle to the db->aExtension array. */
   576    aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
   577    if( aHandle==0 ){
   578      return SQLITE_NOMEM_BKPT;
   579    }
   580    if( db->nExtension>0 ){
   581      memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
   582    }
   583    sqlite3DbFree(db, db->aExtension);
   584    db->aExtension = aHandle;
   585  
   586    db->aExtension[db->nExtension++] = handle;
   587    return SQLITE_OK;
   588  }
   589  int sqlite3_load_extension(
   590    sqlite3 *db,          /* Load the extension into this database connection */
   591    const char *zFile,    /* Name of the shared library containing extension */
   592    const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */
   593    char **pzErrMsg       /* Put error message here if not 0 */
   594  ){
   595    int rc;
   596    sqlite3_mutex_enter(db->mutex);
   597    rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);
   598    rc = sqlite3ApiExit(db, rc);
   599    sqlite3_mutex_leave(db->mutex);
   600    return rc;
   601  }
   602  
   603  /*
   604  ** Call this routine when the database connection is closing in order
   605  ** to clean up loaded extensions
   606  */
   607  void sqlite3CloseExtensions(sqlite3 *db){
   608    int i;
   609    assert( sqlite3_mutex_held(db->mutex) );
   610    for(i=0; i<db->nExtension; i++){
   611      sqlite3OsDlClose(db->pVfs, db->aExtension[i]);
   612    }
   613    sqlite3DbFree(db, db->aExtension);
   614  }
   615  
   616  /*
   617  ** Enable or disable extension loading.  Extension loading is disabled by
   618  ** default so as not to open security holes in older applications.
   619  */
   620  int sqlite3_enable_load_extension(sqlite3 *db, int onoff){
   621    sqlite3_mutex_enter(db->mutex);
   622    if( onoff ){
   623      db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc;
   624    }else{
   625      db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc);
   626    }
   627    sqlite3_mutex_leave(db->mutex);
   628    return SQLITE_OK;
   629  }
   630  
   631  #endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */
   632  
   633  /*
   634  ** The following object holds the list of automatically loaded
   635  ** extensions.
   636  **
   637  ** This list is shared across threads.  The SQLITE_MUTEX_STATIC_MASTER
   638  ** mutex must be held while accessing this list.
   639  */
   640  typedef struct sqlite3AutoExtList sqlite3AutoExtList;
   641  static SQLITE_WSD struct sqlite3AutoExtList {
   642    u32 nExt;              /* Number of entries in aExt[] */          
   643    void (**aExt)(void);   /* Pointers to the extension init functions */
   644  } sqlite3Autoext = { 0, 0 };
   645  
   646  /* The "wsdAutoext" macro will resolve to the autoextension
   647  ** state vector.  If writable static data is unsupported on the target,
   648  ** we have to locate the state vector at run-time.  In the more common
   649  ** case where writable static data is supported, wsdStat can refer directly
   650  ** to the "sqlite3Autoext" state vector declared above.
   651  */
   652  #ifdef SQLITE_OMIT_WSD
   653  # define wsdAutoextInit \
   654    sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext)
   655  # define wsdAutoext x[0]
   656  #else
   657  # define wsdAutoextInit
   658  # define wsdAutoext sqlite3Autoext
   659  #endif
   660  
   661  
   662  /*
   663  ** Register a statically linked extension that is automatically
   664  ** loaded by every new database connection.
   665  */
   666  int sqlite3_auto_extension(
   667    void (*xInit)(void)
   668  ){
   669    int rc = SQLITE_OK;
   670  #ifndef SQLITE_OMIT_AUTOINIT
   671    rc = sqlite3_initialize();
   672    if( rc ){
   673      return rc;
   674    }else
   675  #endif
   676    {
   677      u32 i;
   678  #if SQLITE_THREADSAFE
   679      sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
   680  #endif
   681      wsdAutoextInit;
   682      sqlite3_mutex_enter(mutex);
   683      for(i=0; i<wsdAutoext.nExt; i++){
   684        if( wsdAutoext.aExt[i]==xInit ) break;
   685      }
   686      if( i==wsdAutoext.nExt ){
   687        u64 nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]);
   688        void (**aNew)(void);
   689        aNew = sqlite3_realloc64(wsdAutoext.aExt, nByte);
   690        if( aNew==0 ){
   691          rc = SQLITE_NOMEM_BKPT;
   692        }else{
   693          wsdAutoext.aExt = aNew;
   694          wsdAutoext.aExt[wsdAutoext.nExt] = xInit;
   695          wsdAutoext.nExt++;
   696        }
   697      }
   698      sqlite3_mutex_leave(mutex);
   699      assert( (rc&0xff)==rc );
   700      return rc;
   701    }
   702  }
   703  
   704  /*
   705  ** Cancel a prior call to sqlite3_auto_extension.  Remove xInit from the
   706  ** set of routines that is invoked for each new database connection, if it
   707  ** is currently on the list.  If xInit is not on the list, then this
   708  ** routine is a no-op.
   709  **
   710  ** Return 1 if xInit was found on the list and removed.  Return 0 if xInit
   711  ** was not on the list.
   712  */
   713  int sqlite3_cancel_auto_extension(
   714    void (*xInit)(void)
   715  ){
   716  #if SQLITE_THREADSAFE
   717    sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
   718  #endif
   719    int i;
   720    int n = 0;
   721    wsdAutoextInit;
   722    sqlite3_mutex_enter(mutex);
   723    for(i=(int)wsdAutoext.nExt-1; i>=0; i--){
   724      if( wsdAutoext.aExt[i]==xInit ){
   725        wsdAutoext.nExt--;
   726        wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt];
   727        n++;
   728        break;
   729      }
   730    }
   731    sqlite3_mutex_leave(mutex);
   732    return n;
   733  }
   734  
   735  /*
   736  ** Reset the automatic extension loading mechanism.
   737  */
   738  void sqlite3_reset_auto_extension(void){
   739  #ifndef SQLITE_OMIT_AUTOINIT
   740    if( sqlite3_initialize()==SQLITE_OK )
   741  #endif
   742    {
   743  #if SQLITE_THREADSAFE
   744      sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
   745  #endif
   746      wsdAutoextInit;
   747      sqlite3_mutex_enter(mutex);
   748      sqlite3_free(wsdAutoext.aExt);
   749      wsdAutoext.aExt = 0;
   750      wsdAutoext.nExt = 0;
   751      sqlite3_mutex_leave(mutex);
   752    }
   753  }
   754  
   755  /*
   756  ** Load all automatic extensions.
   757  **
   758  ** If anything goes wrong, set an error in the database connection.
   759  */
   760  void sqlite3AutoLoadExtensions(sqlite3 *db){
   761    u32 i;
   762    int go = 1;
   763    int rc;
   764    sqlite3_loadext_entry xInit;
   765  
   766    wsdAutoextInit;
   767    if( wsdAutoext.nExt==0 ){
   768      /* Common case: early out without every having to acquire a mutex */
   769      return;
   770    }
   771    for(i=0; go; i++){
   772      char *zErrmsg;
   773  #if SQLITE_THREADSAFE
   774      sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
   775  #endif
   776  #ifdef SQLITE_OMIT_LOAD_EXTENSION
   777      const sqlite3_api_routines *pThunk = 0;
   778  #else
   779      const sqlite3_api_routines *pThunk = &sqlite3Apis;
   780  #endif
   781      sqlite3_mutex_enter(mutex);
   782      if( i>=wsdAutoext.nExt ){
   783        xInit = 0;
   784        go = 0;
   785      }else{
   786        xInit = (sqlite3_loadext_entry)wsdAutoext.aExt[i];
   787      }
   788      sqlite3_mutex_leave(mutex);
   789      zErrmsg = 0;
   790      if( xInit && (rc = xInit(db, &zErrmsg, pThunk))!=0 ){
   791        sqlite3ErrorWithMsg(db, rc,
   792              "automatic extension loading failed: %s", zErrmsg);
   793        go = 0;
   794      }
   795      sqlite3_free(zErrmsg);
   796    }
   797  }