Annotation of embedaddon/sqlite3/src/loadext.c, revision 1.1

1.1     ! misho       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: #include <string.h>
        !            22: 
        !            23: #ifndef SQLITE_OMIT_LOAD_EXTENSION
        !            24: 
        !            25: /*
        !            26: ** Some API routines are omitted when various features are
        !            27: ** excluded from a build of SQLite.  Substitute a NULL pointer
        !            28: ** for any missing APIs.
        !            29: */
        !            30: #ifndef SQLITE_ENABLE_COLUMN_METADATA
        !            31: # define sqlite3_column_database_name   0
        !            32: # define sqlite3_column_database_name16 0
        !            33: # define sqlite3_column_table_name      0
        !            34: # define sqlite3_column_table_name16    0
        !            35: # define sqlite3_column_origin_name     0
        !            36: # define sqlite3_column_origin_name16   0
        !            37: # define sqlite3_table_column_metadata  0
        !            38: #endif
        !            39: 
        !            40: #ifdef SQLITE_OMIT_AUTHORIZATION
        !            41: # define sqlite3_set_authorizer         0
        !            42: #endif
        !            43: 
        !            44: #ifdef SQLITE_OMIT_UTF16
        !            45: # define sqlite3_bind_text16            0
        !            46: # define sqlite3_collation_needed16     0
        !            47: # define sqlite3_column_decltype16      0
        !            48: # define sqlite3_column_name16          0
        !            49: # define sqlite3_column_text16          0
        !            50: # define sqlite3_complete16             0
        !            51: # define sqlite3_create_collation16     0
        !            52: # define sqlite3_create_function16      0
        !            53: # define sqlite3_errmsg16               0
        !            54: # define sqlite3_open16                 0
        !            55: # define sqlite3_prepare16              0
        !            56: # define sqlite3_prepare16_v2           0
        !            57: # define sqlite3_result_error16         0
        !            58: # define sqlite3_result_text16          0
        !            59: # define sqlite3_result_text16be        0
        !            60: # define sqlite3_result_text16le        0
        !            61: # define sqlite3_value_text16           0
        !            62: # define sqlite3_value_text16be         0
        !            63: # define sqlite3_value_text16le         0
        !            64: # define sqlite3_column_database_name16 0
        !            65: # define sqlite3_column_table_name16    0
        !            66: # define sqlite3_column_origin_name16   0
        !            67: #endif
        !            68: 
        !            69: #ifdef SQLITE_OMIT_COMPLETE
        !            70: # define sqlite3_complete 0
        !            71: # define sqlite3_complete16 0
        !            72: #endif
        !            73: 
        !            74: #ifdef SQLITE_OMIT_DECLTYPE
        !            75: # define sqlite3_column_decltype16      0
        !            76: # define sqlite3_column_decltype        0
        !            77: #endif
        !            78: 
        !            79: #ifdef SQLITE_OMIT_PROGRESS_CALLBACK
        !            80: # define sqlite3_progress_handler 0
        !            81: #endif
        !            82: 
        !            83: #ifdef SQLITE_OMIT_VIRTUALTABLE
        !            84: # define sqlite3_create_module 0
        !            85: # define sqlite3_create_module_v2 0
        !            86: # define sqlite3_declare_vtab 0
        !            87: # define sqlite3_vtab_config 0
        !            88: # define sqlite3_vtab_on_conflict 0
        !            89: #endif
        !            90: 
        !            91: #ifdef SQLITE_OMIT_SHARED_CACHE
        !            92: # define sqlite3_enable_shared_cache 0
        !            93: #endif
        !            94: 
        !            95: #ifdef SQLITE_OMIT_TRACE
        !            96: # define sqlite3_profile       0
        !            97: # define sqlite3_trace         0
        !            98: #endif
        !            99: 
        !           100: #ifdef SQLITE_OMIT_GET_TABLE
        !           101: # define sqlite3_free_table    0
        !           102: # define sqlite3_get_table     0
        !           103: #endif
        !           104: 
        !           105: #ifdef SQLITE_OMIT_INCRBLOB
        !           106: #define sqlite3_bind_zeroblob  0
        !           107: #define sqlite3_blob_bytes     0
        !           108: #define sqlite3_blob_close     0
        !           109: #define sqlite3_blob_open      0
        !           110: #define sqlite3_blob_read      0
        !           111: #define sqlite3_blob_write     0
        !           112: #define sqlite3_blob_reopen    0
        !           113: #endif
        !           114: 
        !           115: /*
        !           116: ** The following structure contains pointers to all SQLite API routines.
        !           117: ** A pointer to this structure is passed into extensions when they are
        !           118: ** loaded so that the extension can make calls back into the SQLite
        !           119: ** library.
        !           120: **
        !           121: ** When adding new APIs, add them to the bottom of this structure
        !           122: ** in order to preserve backwards compatibility.
        !           123: **
        !           124: ** Extensions that use newer APIs should first call the
        !           125: ** sqlite3_libversion_number() to make sure that the API they
        !           126: ** intend to use is supported by the library.  Extensions should
        !           127: ** also check to make sure that the pointer to the function is
        !           128: ** not NULL before calling it.
        !           129: */
        !           130: static const sqlite3_api_routines sqlite3Apis = {
        !           131:   sqlite3_aggregate_context,
        !           132: #ifndef SQLITE_OMIT_DEPRECATED
        !           133:   sqlite3_aggregate_count,
        !           134: #else
        !           135:   0,
        !           136: #endif
        !           137:   sqlite3_bind_blob,
        !           138:   sqlite3_bind_double,
        !           139:   sqlite3_bind_int,
        !           140:   sqlite3_bind_int64,
        !           141:   sqlite3_bind_null,
        !           142:   sqlite3_bind_parameter_count,
        !           143:   sqlite3_bind_parameter_index,
        !           144:   sqlite3_bind_parameter_name,
        !           145:   sqlite3_bind_text,
        !           146:   sqlite3_bind_text16,
        !           147:   sqlite3_bind_value,
        !           148:   sqlite3_busy_handler,
        !           149:   sqlite3_busy_timeout,
        !           150:   sqlite3_changes,
        !           151:   sqlite3_close,
        !           152:   sqlite3_collation_needed,
        !           153:   sqlite3_collation_needed16,
        !           154:   sqlite3_column_blob,
        !           155:   sqlite3_column_bytes,
        !           156:   sqlite3_column_bytes16,
        !           157:   sqlite3_column_count,
        !           158:   sqlite3_column_database_name,
        !           159:   sqlite3_column_database_name16,
        !           160:   sqlite3_column_decltype,
        !           161:   sqlite3_column_decltype16,
        !           162:   sqlite3_column_double,
        !           163:   sqlite3_column_int,
        !           164:   sqlite3_column_int64,
        !           165:   sqlite3_column_name,
        !           166:   sqlite3_column_name16,
        !           167:   sqlite3_column_origin_name,
        !           168:   sqlite3_column_origin_name16,
        !           169:   sqlite3_column_table_name,
        !           170:   sqlite3_column_table_name16,
        !           171:   sqlite3_column_text,
        !           172:   sqlite3_column_text16,
        !           173:   sqlite3_column_type,
        !           174:   sqlite3_column_value,
        !           175:   sqlite3_commit_hook,
        !           176:   sqlite3_complete,
        !           177:   sqlite3_complete16,
        !           178:   sqlite3_create_collation,
        !           179:   sqlite3_create_collation16,
        !           180:   sqlite3_create_function,
        !           181:   sqlite3_create_function16,
        !           182:   sqlite3_create_module,
        !           183:   sqlite3_data_count,
        !           184:   sqlite3_db_handle,
        !           185:   sqlite3_declare_vtab,
        !           186:   sqlite3_enable_shared_cache,
        !           187:   sqlite3_errcode,
        !           188:   sqlite3_errmsg,
        !           189:   sqlite3_errmsg16,
        !           190:   sqlite3_exec,
        !           191: #ifndef SQLITE_OMIT_DEPRECATED
        !           192:   sqlite3_expired,
        !           193: #else
        !           194:   0,
        !           195: #endif
        !           196:   sqlite3_finalize,
        !           197:   sqlite3_free,
        !           198:   sqlite3_free_table,
        !           199:   sqlite3_get_autocommit,
        !           200:   sqlite3_get_auxdata,
        !           201:   sqlite3_get_table,
        !           202:   0,     /* Was sqlite3_global_recover(), but that function is deprecated */
        !           203:   sqlite3_interrupt,
        !           204:   sqlite3_last_insert_rowid,
        !           205:   sqlite3_libversion,
        !           206:   sqlite3_libversion_number,
        !           207:   sqlite3_malloc,
        !           208:   sqlite3_mprintf,
        !           209:   sqlite3_open,
        !           210:   sqlite3_open16,
        !           211:   sqlite3_prepare,
        !           212:   sqlite3_prepare16,
        !           213:   sqlite3_profile,
        !           214:   sqlite3_progress_handler,
        !           215:   sqlite3_realloc,
        !           216:   sqlite3_reset,
        !           217:   sqlite3_result_blob,
        !           218:   sqlite3_result_double,
        !           219:   sqlite3_result_error,
        !           220:   sqlite3_result_error16,
        !           221:   sqlite3_result_int,
        !           222:   sqlite3_result_int64,
        !           223:   sqlite3_result_null,
        !           224:   sqlite3_result_text,
        !           225:   sqlite3_result_text16,
        !           226:   sqlite3_result_text16be,
        !           227:   sqlite3_result_text16le,
        !           228:   sqlite3_result_value,
        !           229:   sqlite3_rollback_hook,
        !           230:   sqlite3_set_authorizer,
        !           231:   sqlite3_set_auxdata,
        !           232:   sqlite3_snprintf,
        !           233:   sqlite3_step,
        !           234:   sqlite3_table_column_metadata,
        !           235: #ifndef SQLITE_OMIT_DEPRECATED
        !           236:   sqlite3_thread_cleanup,
        !           237: #else
        !           238:   0,
        !           239: #endif
        !           240:   sqlite3_total_changes,
        !           241:   sqlite3_trace,
        !           242: #ifndef SQLITE_OMIT_DEPRECATED
        !           243:   sqlite3_transfer_bindings,
        !           244: #else
        !           245:   0,
        !           246: #endif
        !           247:   sqlite3_update_hook,
        !           248:   sqlite3_user_data,
        !           249:   sqlite3_value_blob,
        !           250:   sqlite3_value_bytes,
        !           251:   sqlite3_value_bytes16,
        !           252:   sqlite3_value_double,
        !           253:   sqlite3_value_int,
        !           254:   sqlite3_value_int64,
        !           255:   sqlite3_value_numeric_type,
        !           256:   sqlite3_value_text,
        !           257:   sqlite3_value_text16,
        !           258:   sqlite3_value_text16be,
        !           259:   sqlite3_value_text16le,
        !           260:   sqlite3_value_type,
        !           261:   sqlite3_vmprintf,
        !           262:   /*
        !           263:   ** The original API set ends here.  All extensions can call any
        !           264:   ** of the APIs above provided that the pointer is not NULL.  But
        !           265:   ** before calling APIs that follow, extension should check the
        !           266:   ** sqlite3_libversion_number() to make sure they are dealing with
        !           267:   ** a library that is new enough to support that API.
        !           268:   *************************************************************************
        !           269:   */
        !           270:   sqlite3_overload_function,
        !           271: 
        !           272:   /*
        !           273:   ** Added after 3.3.13
        !           274:   */
        !           275:   sqlite3_prepare_v2,
        !           276:   sqlite3_prepare16_v2,
        !           277:   sqlite3_clear_bindings,
        !           278: 
        !           279:   /*
        !           280:   ** Added for 3.4.1
        !           281:   */
        !           282:   sqlite3_create_module_v2,
        !           283: 
        !           284:   /*
        !           285:   ** Added for 3.5.0
        !           286:   */
        !           287:   sqlite3_bind_zeroblob,
        !           288:   sqlite3_blob_bytes,
        !           289:   sqlite3_blob_close,
        !           290:   sqlite3_blob_open,
        !           291:   sqlite3_blob_read,
        !           292:   sqlite3_blob_write,
        !           293:   sqlite3_create_collation_v2,
        !           294:   sqlite3_file_control,
        !           295:   sqlite3_memory_highwater,
        !           296:   sqlite3_memory_used,
        !           297: #ifdef SQLITE_MUTEX_OMIT
        !           298:   0, 
        !           299:   0, 
        !           300:   0,
        !           301:   0,
        !           302:   0,
        !           303: #else
        !           304:   sqlite3_mutex_alloc,
        !           305:   sqlite3_mutex_enter,
        !           306:   sqlite3_mutex_free,
        !           307:   sqlite3_mutex_leave,
        !           308:   sqlite3_mutex_try,
        !           309: #endif
        !           310:   sqlite3_open_v2,
        !           311:   sqlite3_release_memory,
        !           312:   sqlite3_result_error_nomem,
        !           313:   sqlite3_result_error_toobig,
        !           314:   sqlite3_sleep,
        !           315:   sqlite3_soft_heap_limit,
        !           316:   sqlite3_vfs_find,
        !           317:   sqlite3_vfs_register,
        !           318:   sqlite3_vfs_unregister,
        !           319: 
        !           320:   /*
        !           321:   ** Added for 3.5.8
        !           322:   */
        !           323:   sqlite3_threadsafe,
        !           324:   sqlite3_result_zeroblob,
        !           325:   sqlite3_result_error_code,
        !           326:   sqlite3_test_control,
        !           327:   sqlite3_randomness,
        !           328:   sqlite3_context_db_handle,
        !           329: 
        !           330:   /*
        !           331:   ** Added for 3.6.0
        !           332:   */
        !           333:   sqlite3_extended_result_codes,
        !           334:   sqlite3_limit,
        !           335:   sqlite3_next_stmt,
        !           336:   sqlite3_sql,
        !           337:   sqlite3_status,
        !           338: 
        !           339:   /*
        !           340:   ** Added for 3.7.4
        !           341:   */
        !           342:   sqlite3_backup_finish,
        !           343:   sqlite3_backup_init,
        !           344:   sqlite3_backup_pagecount,
        !           345:   sqlite3_backup_remaining,
        !           346:   sqlite3_backup_step,
        !           347: #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
        !           348:   sqlite3_compileoption_get,
        !           349:   sqlite3_compileoption_used,
        !           350: #else
        !           351:   0,
        !           352:   0,
        !           353: #endif
        !           354:   sqlite3_create_function_v2,
        !           355:   sqlite3_db_config,
        !           356:   sqlite3_db_mutex,
        !           357:   sqlite3_db_status,
        !           358:   sqlite3_extended_errcode,
        !           359:   sqlite3_log,
        !           360:   sqlite3_soft_heap_limit64,
        !           361:   sqlite3_sourceid,
        !           362:   sqlite3_stmt_status,
        !           363:   sqlite3_strnicmp,
        !           364: #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
        !           365:   sqlite3_unlock_notify,
        !           366: #else
        !           367:   0,
        !           368: #endif
        !           369: #ifndef SQLITE_OMIT_WAL
        !           370:   sqlite3_wal_autocheckpoint,
        !           371:   sqlite3_wal_checkpoint,
        !           372:   sqlite3_wal_hook,
        !           373: #else
        !           374:   0,
        !           375:   0,
        !           376:   0,
        !           377: #endif
        !           378:   sqlite3_blob_reopen,
        !           379:   sqlite3_vtab_config,
        !           380:   sqlite3_vtab_on_conflict,
        !           381: };
        !           382: 
        !           383: /*
        !           384: ** Attempt to load an SQLite extension library contained in the file
        !           385: ** zFile.  The entry point is zProc.  zProc may be 0 in which case a
        !           386: ** default entry point name (sqlite3_extension_init) is used.  Use
        !           387: ** of the default name is recommended.
        !           388: **
        !           389: ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong.
        !           390: **
        !           391: ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with 
        !           392: ** error message text.  The calling function should free this memory
        !           393: ** by calling sqlite3DbFree(db, ).
        !           394: */
        !           395: static int sqlite3LoadExtension(
        !           396:   sqlite3 *db,          /* Load the extension into this database connection */
        !           397:   const char *zFile,    /* Name of the shared library containing extension */
        !           398:   const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */
        !           399:   char **pzErrMsg       /* Put error message here if not 0 */
        !           400: ){
        !           401:   sqlite3_vfs *pVfs = db->pVfs;
        !           402:   void *handle;
        !           403:   int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
        !           404:   char *zErrmsg = 0;
        !           405:   void **aHandle;
        !           406:   int nMsg = 300 + sqlite3Strlen30(zFile);
        !           407: 
        !           408:   if( pzErrMsg ) *pzErrMsg = 0;
        !           409: 
        !           410:   /* Ticket #1863.  To avoid a creating security problems for older
        !           411:   ** applications that relink against newer versions of SQLite, the
        !           412:   ** ability to run load_extension is turned off by default.  One
        !           413:   ** must call sqlite3_enable_load_extension() to turn on extension
        !           414:   ** loading.  Otherwise you get the following error.
        !           415:   */
        !           416:   if( (db->flags & SQLITE_LoadExtension)==0 ){
        !           417:     if( pzErrMsg ){
        !           418:       *pzErrMsg = sqlite3_mprintf("not authorized");
        !           419:     }
        !           420:     return SQLITE_ERROR;
        !           421:   }
        !           422: 
        !           423:   if( zProc==0 ){
        !           424:     zProc = "sqlite3_extension_init";
        !           425:   }
        !           426: 
        !           427:   handle = sqlite3OsDlOpen(pVfs, zFile);
        !           428:   if( handle==0 ){
        !           429:     if( pzErrMsg ){
        !           430:       *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
        !           431:       if( zErrmsg ){
        !           432:         sqlite3_snprintf(nMsg, zErrmsg, 
        !           433:             "unable to open shared library [%s]", zFile);
        !           434:         sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
        !           435:       }
        !           436:     }
        !           437:     return SQLITE_ERROR;
        !           438:   }
        !           439:   xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
        !           440:                    sqlite3OsDlSym(pVfs, handle, zProc);
        !           441:   if( xInit==0 ){
        !           442:     if( pzErrMsg ){
        !           443:       nMsg += sqlite3Strlen30(zProc);
        !           444:       *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg);
        !           445:       if( zErrmsg ){
        !           446:         sqlite3_snprintf(nMsg, zErrmsg,
        !           447:             "no entry point [%s] in shared library [%s]", zProc,zFile);
        !           448:         sqlite3OsDlError(pVfs, nMsg-1, zErrmsg);
        !           449:       }
        !           450:       sqlite3OsDlClose(pVfs, handle);
        !           451:     }
        !           452:     return SQLITE_ERROR;
        !           453:   }else if( xInit(db, &zErrmsg, &sqlite3Apis) ){
        !           454:     if( pzErrMsg ){
        !           455:       *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg);
        !           456:     }
        !           457:     sqlite3_free(zErrmsg);
        !           458:     sqlite3OsDlClose(pVfs, handle);
        !           459:     return SQLITE_ERROR;
        !           460:   }
        !           461: 
        !           462:   /* Append the new shared library handle to the db->aExtension array. */
        !           463:   aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1));
        !           464:   if( aHandle==0 ){
        !           465:     return SQLITE_NOMEM;
        !           466:   }
        !           467:   if( db->nExtension>0 ){
        !           468:     memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension);
        !           469:   }
        !           470:   sqlite3DbFree(db, db->aExtension);
        !           471:   db->aExtension = aHandle;
        !           472: 
        !           473:   db->aExtension[db->nExtension++] = handle;
        !           474:   return SQLITE_OK;
        !           475: }
        !           476: int sqlite3_load_extension(
        !           477:   sqlite3 *db,          /* Load the extension into this database connection */
        !           478:   const char *zFile,    /* Name of the shared library containing extension */
        !           479:   const char *zProc,    /* Entry point.  Use "sqlite3_extension_init" if 0 */
        !           480:   char **pzErrMsg       /* Put error message here if not 0 */
        !           481: ){
        !           482:   int rc;
        !           483:   sqlite3_mutex_enter(db->mutex);
        !           484:   rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg);
        !           485:   rc = sqlite3ApiExit(db, rc);
        !           486:   sqlite3_mutex_leave(db->mutex);
        !           487:   return rc;
        !           488: }
        !           489: 
        !           490: /*
        !           491: ** Call this routine when the database connection is closing in order
        !           492: ** to clean up loaded extensions
        !           493: */
        !           494: void sqlite3CloseExtensions(sqlite3 *db){
        !           495:   int i;
        !           496:   assert( sqlite3_mutex_held(db->mutex) );
        !           497:   for(i=0; i<db->nExtension; i++){
        !           498:     sqlite3OsDlClose(db->pVfs, db->aExtension[i]);
        !           499:   }
        !           500:   sqlite3DbFree(db, db->aExtension);
        !           501: }
        !           502: 
        !           503: /*
        !           504: ** Enable or disable extension loading.  Extension loading is disabled by
        !           505: ** default so as not to open security holes in older applications.
        !           506: */
        !           507: int sqlite3_enable_load_extension(sqlite3 *db, int onoff){
        !           508:   sqlite3_mutex_enter(db->mutex);
        !           509:   if( onoff ){
        !           510:     db->flags |= SQLITE_LoadExtension;
        !           511:   }else{
        !           512:     db->flags &= ~SQLITE_LoadExtension;
        !           513:   }
        !           514:   sqlite3_mutex_leave(db->mutex);
        !           515:   return SQLITE_OK;
        !           516: }
        !           517: 
        !           518: #endif /* SQLITE_OMIT_LOAD_EXTENSION */
        !           519: 
        !           520: /*
        !           521: ** The auto-extension code added regardless of whether or not extension
        !           522: ** loading is supported.  We need a dummy sqlite3Apis pointer for that
        !           523: ** code if regular extension loading is not available.  This is that
        !           524: ** dummy pointer.
        !           525: */
        !           526: #ifdef SQLITE_OMIT_LOAD_EXTENSION
        !           527: static const sqlite3_api_routines sqlite3Apis = { 0 };
        !           528: #endif
        !           529: 
        !           530: 
        !           531: /*
        !           532: ** The following object holds the list of automatically loaded
        !           533: ** extensions.
        !           534: **
        !           535: ** This list is shared across threads.  The SQLITE_MUTEX_STATIC_MASTER
        !           536: ** mutex must be held while accessing this list.
        !           537: */
        !           538: typedef struct sqlite3AutoExtList sqlite3AutoExtList;
        !           539: static SQLITE_WSD struct sqlite3AutoExtList {
        !           540:   int nExt;              /* Number of entries in aExt[] */          
        !           541:   void (**aExt)(void);   /* Pointers to the extension init functions */
        !           542: } sqlite3Autoext = { 0, 0 };
        !           543: 
        !           544: /* The "wsdAutoext" macro will resolve to the autoextension
        !           545: ** state vector.  If writable static data is unsupported on the target,
        !           546: ** we have to locate the state vector at run-time.  In the more common
        !           547: ** case where writable static data is supported, wsdStat can refer directly
        !           548: ** to the "sqlite3Autoext" state vector declared above.
        !           549: */
        !           550: #ifdef SQLITE_OMIT_WSD
        !           551: # define wsdAutoextInit \
        !           552:   sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext)
        !           553: # define wsdAutoext x[0]
        !           554: #else
        !           555: # define wsdAutoextInit
        !           556: # define wsdAutoext sqlite3Autoext
        !           557: #endif
        !           558: 
        !           559: 
        !           560: /*
        !           561: ** Register a statically linked extension that is automatically
        !           562: ** loaded by every new database connection.
        !           563: */
        !           564: int sqlite3_auto_extension(void (*xInit)(void)){
        !           565:   int rc = SQLITE_OK;
        !           566: #ifndef SQLITE_OMIT_AUTOINIT
        !           567:   rc = sqlite3_initialize();
        !           568:   if( rc ){
        !           569:     return rc;
        !           570:   }else
        !           571: #endif
        !           572:   {
        !           573:     int i;
        !           574: #if SQLITE_THREADSAFE
        !           575:     sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
        !           576: #endif
        !           577:     wsdAutoextInit;
        !           578:     sqlite3_mutex_enter(mutex);
        !           579:     for(i=0; i<wsdAutoext.nExt; i++){
        !           580:       if( wsdAutoext.aExt[i]==xInit ) break;
        !           581:     }
        !           582:     if( i==wsdAutoext.nExt ){
        !           583:       int nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]);
        !           584:       void (**aNew)(void);
        !           585:       aNew = sqlite3_realloc(wsdAutoext.aExt, nByte);
        !           586:       if( aNew==0 ){
        !           587:         rc = SQLITE_NOMEM;
        !           588:       }else{
        !           589:         wsdAutoext.aExt = aNew;
        !           590:         wsdAutoext.aExt[wsdAutoext.nExt] = xInit;
        !           591:         wsdAutoext.nExt++;
        !           592:       }
        !           593:     }
        !           594:     sqlite3_mutex_leave(mutex);
        !           595:     assert( (rc&0xff)==rc );
        !           596:     return rc;
        !           597:   }
        !           598: }
        !           599: 
        !           600: /*
        !           601: ** Reset the automatic extension loading mechanism.
        !           602: */
        !           603: void sqlite3_reset_auto_extension(void){
        !           604: #ifndef SQLITE_OMIT_AUTOINIT
        !           605:   if( sqlite3_initialize()==SQLITE_OK )
        !           606: #endif
        !           607:   {
        !           608: #if SQLITE_THREADSAFE
        !           609:     sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
        !           610: #endif
        !           611:     wsdAutoextInit;
        !           612:     sqlite3_mutex_enter(mutex);
        !           613:     sqlite3_free(wsdAutoext.aExt);
        !           614:     wsdAutoext.aExt = 0;
        !           615:     wsdAutoext.nExt = 0;
        !           616:     sqlite3_mutex_leave(mutex);
        !           617:   }
        !           618: }
        !           619: 
        !           620: /*
        !           621: ** Load all automatic extensions.
        !           622: **
        !           623: ** If anything goes wrong, set an error in the database connection.
        !           624: */
        !           625: void sqlite3AutoLoadExtensions(sqlite3 *db){
        !           626:   int i;
        !           627:   int go = 1;
        !           628:   int rc;
        !           629:   int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*);
        !           630: 
        !           631:   wsdAutoextInit;
        !           632:   if( wsdAutoext.nExt==0 ){
        !           633:     /* Common case: early out without every having to acquire a mutex */
        !           634:     return;
        !           635:   }
        !           636:   for(i=0; go; i++){
        !           637:     char *zErrmsg;
        !           638: #if SQLITE_THREADSAFE
        !           639:     sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
        !           640: #endif
        !           641:     sqlite3_mutex_enter(mutex);
        !           642:     if( i>=wsdAutoext.nExt ){
        !           643:       xInit = 0;
        !           644:       go = 0;
        !           645:     }else{
        !           646:       xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*))
        !           647:               wsdAutoext.aExt[i];
        !           648:     }
        !           649:     sqlite3_mutex_leave(mutex);
        !           650:     zErrmsg = 0;
        !           651:     if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){
        !           652:       sqlite3Error(db, rc,
        !           653:             "automatic extension loading failed: %s", zErrmsg);
        !           654:       go = 0;
        !           655:     }
        !           656:     sqlite3_free(zErrmsg);
        !           657:   }
        !           658: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>