15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2006 June 7 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains code used to dynamically load extensions into 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the SQLite library. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_CORE 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define SQLITE_CORE 1 /* Disable the API redefinition in sqlite3ext.h */ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqlite3ext.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_LOAD_EXTENSION 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Some API routines are omitted when various features are 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** excluded from a build of SQLite. Substitute a NULL pointer 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for any missing APIs. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_ENABLE_COLUMN_METADATA 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_database_name 0 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_database_name16 0 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_table_name 0 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_table_name16 0 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_origin_name 0 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_origin_name16 0 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_table_column_metadata 0 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_AUTHORIZATION 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_set_authorizer 0 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_UTF16 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_bind_text16 0 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_collation_needed16 0 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_decltype16 0 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_name16 0 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_text16 0 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_complete16 0 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_create_collation16 0 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_create_function16 0 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_errmsg16 0 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_open16 0 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_prepare16 0 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_prepare16_v2 0 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_result_error16 0 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_result_text16 0 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_result_text16be 0 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_result_text16le 0 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_value_text16 0 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_value_text16be 0 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_value_text16le 0 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_database_name16 0 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_table_name16 0 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_origin_name16 0 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_COMPLETE 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_complete 0 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_complete16 0 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_DECLTYPE 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_decltype16 0 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_column_decltype 0 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_PROGRESS_CALLBACK 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_progress_handler 0 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_VIRTUALTABLE 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_create_module 0 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_create_module_v2 0 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_declare_vtab 0 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_SHARED_CACHE 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_enable_shared_cache 0 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_TRACE 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_profile 0 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_trace 0 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_GET_TABLE 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_free_table 0 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3_get_table 0 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_INCRBLOB 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sqlite3_bind_zeroblob 0 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sqlite3_blob_bytes 0 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sqlite3_blob_close 0 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sqlite3_blob_open 0 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sqlite3_blob_read 0 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define sqlite3_blob_write 0 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following structure contains pointers to all SQLite API routines. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A pointer to this structure is passed into extensions when they are 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loaded so that the extension can make calls back into the SQLite 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** library. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When adding new APIs, add them to the bottom of this structure 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in order to preserve backwards compatibility. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Extensions that use newer APIs should first call the 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_libversion_number() to make sure that the API they 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** intend to use is supported by the library. Extensions should 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** also check to make sure that the pointer to the function is 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not NULL before calling it. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const sqlite3_api_routines sqlite3Apis = { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_aggregate_context, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_aggregate_count, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_blob, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_double, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_int, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_int64, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_null, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_parameter_count, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_parameter_index, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_parameter_name, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_text, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_text16, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_value, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_busy_handler, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_busy_timeout, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_changes, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_close, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_collation_needed, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_collation_needed16, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_blob, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_bytes, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_bytes16, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_count, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_database_name, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_database_name16, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_decltype, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_decltype16, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_double, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_int, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_int64, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_name, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_name16, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_origin_name, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_origin_name16, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_table_name, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_table_name16, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_text, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_text16, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_type, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_column_value, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_commit_hook, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_complete, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_complete16, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_collation, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_collation16, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_function, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_function16, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_module, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_data_count, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_db_handle, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_declare_vtab, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_enable_shared_cache, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_errcode, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_errmsg, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_errmsg16, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_exec, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_expired, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_finalize, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free_table, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_get_autocommit, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_get_auxdata, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_get_table, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* Was sqlite3_global_recover(), but that function is deprecated */ 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_interrupt, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_last_insert_rowid, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_libversion, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_libversion_number, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_malloc, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mprintf, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_open, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_open16, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_prepare, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_prepare16, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_profile, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_progress_handler, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_realloc, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_reset, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_blob, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_double, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error16, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_int64, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_null, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16be, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_text16le, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_value, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_rollback_hook, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_set_authorizer, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_set_auxdata, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_step, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_table_column_metadata, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_thread_cleanup, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_total_changes, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_trace, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DEPRECATED 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_transfer_bindings, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_update_hook, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_user_data, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_blob, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_bytes, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_bytes16, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_double, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_int, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_int64, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_numeric_type, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_text, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_text16, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_text16be, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_text16le, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_value_type, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vmprintf, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The original API set ends here. All extensions can call any 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the APIs above provided that the pointer is not NULL. But 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** before calling APIs that follow, extension should check the 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqlite3_libversion_number() to make sure they are dealing with 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a library that is new enough to support that API. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************* 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_overload_function, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Added after 3.3.13 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_prepare_v2, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_prepare16_v2, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_clear_bindings, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Added for 3.4.1 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_module_v2, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Added for 3.5.0 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_bind_zeroblob, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob_bytes, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob_close, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob_open, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob_read, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_blob_write, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_collation_v2, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_file_control, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_memory_highwater, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_memory_used, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_MUTEX_OMIT 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_alloc, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_free, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_try, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_open_v2, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_release_memory, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error_nomem, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error_toobig, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_sleep, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_soft_heap_limit, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_find, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_register, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs_unregister, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Added for 3.5.8 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_threadsafe, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_zeroblob, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_result_error_code, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_test_control, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_randomness, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_context_db_handle, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Added for 3.6.0 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_extended_result_codes, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_limit, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_next_stmt, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_sql, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_status, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Added for 3.7.4 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_backup_finish, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_backup_init, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_backup_pagecount, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_backup_remaining, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_backup_step, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_compileoption_get, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_compileoption_used, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_create_function_v2, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_db_config, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_db_mutex, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_db_status, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_extended_errcode, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_log, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_soft_heap_limit64, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_sourceid, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_stmt_status, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_strnicmp, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_unlock_notify, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_wal_autocheckpoint, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_wal_checkpoint, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_wal_hook, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attempt to load an SQLite extension library contained in the file 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** zFile. The entry point is zProc. zProc may be 0 in which case a 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** default entry point name (sqlite3_extension_init) is used. Use 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the default name is recommended. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** error message text. The calling function should free this memory 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by calling sqlite3DbFree(db, ). 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqlite3LoadExtension( 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Load the extension into this database connection */ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zFile, /* Name of the shared library containing extension */ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **pzErrMsg /* Put error message here if not 0 */ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_vfs *pVfs = db->pVfs; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *handle; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErrmsg = 0; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void **aHandle; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int nMsg = 300; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzErrMsg ) *pzErrMsg = 0; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Ticket #1863. To avoid a creating security problems for older 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** applications that relink against newer versions of SQLite, the 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ability to run load_extension is turned off by default. One 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** must call sqlite3_enable_load_extension() to turn on extension 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** loading. Otherwise you get the following error. 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (db->flags & SQLITE_LoadExtension)==0 ){ 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzErrMsg ){ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzErrMsg = sqlite3_mprintf("not authorized"); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zProc==0 ){ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zProc = "sqlite3_extension_init"; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle = sqlite3OsDlOpen(pVfs, zFile); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( handle==0 ){ 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzErrMsg ){ 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErrmsg ){ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(nMsg, zErrmsg, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "unable to open shared library [%s]", zFile); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlSym(pVfs, handle, zProc); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( xInit==0 ){ 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzErrMsg ){ 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zErrmsg ){ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_snprintf(nMsg, zErrmsg, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "no entry point [%s] in shared library [%s]", zProc,zFile); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlClose(pVfs, handle); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( xInit(db, &zErrmsg, &sqlite3Apis) ){ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzErrMsg ){ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zErrmsg); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlClose(pVfs, handle); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Append the new shared library handle to the db->aExtension array. */ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aHandle==0 ){ 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_NOMEM; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->nExtension>0 ){ 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, db->aExtension); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->aExtension = aHandle; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->aExtension[db->nExtension++] = handle; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_load_extension( 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Load the extension into this database connection */ 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zFile, /* Name of the shared library containing extension */ 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char **pzErrMsg /* Put error message here if not 0 */ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3LoadExtension(db, zFile, zProc, pzErrMsg); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3ApiExit(db, rc); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call this routine when the database connection is closing in order 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to clean up loaded extensions 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3CloseExtensions(sqlite3 *db){ 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3_mutex_held(db->mutex) ); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<db->nExtension; i++){ 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OsDlClose(db->pVfs, db->aExtension[i]); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, db->aExtension); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Enable or disable extension loading. Extension loading is disabled by 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** default so as not to open security holes in older applications. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(db->mutex); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( onoff ){ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags |= SQLITE_LoadExtension; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags &= ~SQLITE_LoadExtension; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(db->mutex); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_LOAD_EXTENSION */ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The auto-extension code added regardless of whether or not extension 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loading is supported. We need a dummy sqlite3Apis pointer for that 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code if regular extension loading is not available. This is that 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** dummy pointer. 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_LOAD_EXTENSION 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const sqlite3_api_routines sqlite3Apis = { 0 }; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following object holds the list of automatically loaded 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** extensions. 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mutex must be held while accessing this list. 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct sqlite3AutoExtList sqlite3AutoExtList; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static SQLITE_WSD struct sqlite3AutoExtList { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExt; /* Number of entries in aExt[] */ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (**aExt)(void); /* Pointers to the extension init functions */ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} sqlite3Autoext = { 0, 0 }; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The "wsdAutoext" macro will resolve to the autoextension 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** state vector. If writable static data is unsupported on the target, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** we have to locate the state vector at run-time. In the more common 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** case where writable static data is supported, wsdStat can refer directly 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the "sqlite3Autoext" state vector declared above. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_WSD 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdAutoextInit \ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3AutoExtList *x = &GLOBAL(sqlite3AutoExtList,sqlite3Autoext) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdAutoext x[0] 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdAutoextInit 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define wsdAutoext sqlite3Autoext 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register a statically linked extension that is automatically 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loaded by every new database connection. 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_auto_extension(void (*xInit)(void)){ 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = SQLITE_OK; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINIT 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3_initialize(); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_THREADSAFE 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoextInit; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(mutex); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<wsdAutoext.nExt; i++){ 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( wsdAutoext.aExt[i]==xInit ) break; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i==wsdAutoext.nExt ){ 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void (**aNew)(void); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aNew = sqlite3_realloc(wsdAutoext.aExt, nByte); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aNew==0 ){ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_NOMEM; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoext.aExt = aNew; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoext.aExt[wsdAutoext.nExt] = xInit; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoext.nExt++; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(mutex); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (rc&0xff)==rc ); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reset the automatic extension loading mechanism. 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3_reset_auto_extension(void){ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINIT 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3_initialize()==SQLITE_OK ) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_THREADSAFE 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoextInit; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(mutex); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(wsdAutoext.aExt); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoext.aExt = 0; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoext.nExt = 0; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(mutex); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Load all automatic extensions. 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If anything goes wrong, set an error in the database connection. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3AutoLoadExtensions(sqlite3 *db){ 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int go = 1; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoextInit; 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( wsdAutoext.nExt==0 ){ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Common case: early out without every having to acquire a mutex */ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; go; i++){ 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zErrmsg; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_THREADSAFE 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_enter(mutex); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=wsdAutoext.nExt ){ 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xInit = 0; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) go = 0; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wsdAutoext.aExt[i]; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_mutex_leave(mutex); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zErrmsg = 0; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( xInit && xInit(db, &zErrmsg, &sqlite3Apis) ){ 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3Error(db, SQLITE_ERROR, 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "automatic extension loading failed: %s", zErrmsg); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) go = 0; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3_free(zErrmsg); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 651