OLD | NEW |
1 /* | 1 /* |
2 ** 2006 June 7 | 2 ** 2006 June 7 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 #endif | 77 #endif |
78 | 78 |
79 #ifdef SQLITE_OMIT_PROGRESS_CALLBACK | 79 #ifdef SQLITE_OMIT_PROGRESS_CALLBACK |
80 # define sqlite3_progress_handler 0 | 80 # define sqlite3_progress_handler 0 |
81 #endif | 81 #endif |
82 | 82 |
83 #ifdef SQLITE_OMIT_VIRTUALTABLE | 83 #ifdef SQLITE_OMIT_VIRTUALTABLE |
84 # define sqlite3_create_module 0 | 84 # define sqlite3_create_module 0 |
85 # define sqlite3_create_module_v2 0 | 85 # define sqlite3_create_module_v2 0 |
86 # define sqlite3_declare_vtab 0 | 86 # define sqlite3_declare_vtab 0 |
| 87 # define sqlite3_vtab_config 0 |
| 88 # define sqlite3_vtab_on_conflict 0 |
87 #endif | 89 #endif |
88 | 90 |
89 #ifdef SQLITE_OMIT_SHARED_CACHE | 91 #ifdef SQLITE_OMIT_SHARED_CACHE |
90 # define sqlite3_enable_shared_cache 0 | 92 # define sqlite3_enable_shared_cache 0 |
91 #endif | 93 #endif |
92 | 94 |
93 #ifdef SQLITE_OMIT_TRACE | 95 #ifdef SQLITE_OMIT_TRACE |
94 # define sqlite3_profile 0 | 96 # define sqlite3_profile 0 |
95 # define sqlite3_trace 0 | 97 # define sqlite3_trace 0 |
96 #endif | 98 #endif |
97 | 99 |
98 #ifdef SQLITE_OMIT_GET_TABLE | 100 #ifdef SQLITE_OMIT_GET_TABLE |
99 # define sqlite3_free_table 0 | 101 # define sqlite3_free_table 0 |
100 # define sqlite3_get_table 0 | 102 # define sqlite3_get_table 0 |
101 #endif | 103 #endif |
102 | 104 |
103 #ifdef SQLITE_OMIT_INCRBLOB | 105 #ifdef SQLITE_OMIT_INCRBLOB |
104 #define sqlite3_bind_zeroblob 0 | 106 #define sqlite3_bind_zeroblob 0 |
105 #define sqlite3_blob_bytes 0 | 107 #define sqlite3_blob_bytes 0 |
106 #define sqlite3_blob_close 0 | 108 #define sqlite3_blob_close 0 |
107 #define sqlite3_blob_open 0 | 109 #define sqlite3_blob_open 0 |
108 #define sqlite3_blob_read 0 | 110 #define sqlite3_blob_read 0 |
109 #define sqlite3_blob_write 0 | 111 #define sqlite3_blob_write 0 |
| 112 #define sqlite3_blob_reopen 0 |
110 #endif | 113 #endif |
111 | 114 |
112 /* | 115 /* |
113 ** The following structure contains pointers to all SQLite API routines. | 116 ** The following structure contains pointers to all SQLite API routines. |
114 ** A pointer to this structure is passed into extensions when they are | 117 ** A pointer to this structure is passed into extensions when they are |
115 ** loaded so that the extension can make calls back into the SQLite | 118 ** loaded so that the extension can make calls back into the SQLite |
116 ** library. | 119 ** library. |
117 ** | 120 ** |
118 ** When adding new APIs, add them to the bottom of this structure | 121 ** When adding new APIs, add them to the bottom of this structure |
119 ** in order to preserve backwards compatibility. | 122 ** in order to preserve backwards compatibility. |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 #endif | 368 #endif |
366 #ifndef SQLITE_OMIT_WAL | 369 #ifndef SQLITE_OMIT_WAL |
367 sqlite3_wal_autocheckpoint, | 370 sqlite3_wal_autocheckpoint, |
368 sqlite3_wal_checkpoint, | 371 sqlite3_wal_checkpoint, |
369 sqlite3_wal_hook, | 372 sqlite3_wal_hook, |
370 #else | 373 #else |
371 0, | 374 0, |
372 0, | 375 0, |
373 0, | 376 0, |
374 #endif | 377 #endif |
| 378 sqlite3_blob_reopen, |
| 379 sqlite3_vtab_config, |
| 380 sqlite3_vtab_on_conflict, |
| 381 sqlite3_close_v2, |
| 382 sqlite3_db_filename, |
| 383 sqlite3_db_readonly, |
| 384 sqlite3_db_release_memory, |
| 385 sqlite3_errstr, |
| 386 sqlite3_stmt_busy, |
| 387 sqlite3_stmt_readonly, |
| 388 sqlite3_stricmp, |
| 389 sqlite3_uri_boolean, |
| 390 sqlite3_uri_int64, |
| 391 sqlite3_uri_parameter, |
| 392 sqlite3_vsnprintf, |
| 393 sqlite3_wal_checkpoint_v2, |
| 394 /* Version 3.8.7 and later */ |
| 395 sqlite3_auto_extension, |
| 396 sqlite3_bind_blob64, |
| 397 sqlite3_bind_text64, |
| 398 sqlite3_cancel_auto_extension, |
| 399 sqlite3_load_extension, |
| 400 sqlite3_malloc64, |
| 401 sqlite3_msize, |
| 402 sqlite3_realloc64, |
| 403 sqlite3_reset_auto_extension, |
| 404 sqlite3_result_blob64, |
| 405 sqlite3_result_text64, |
| 406 sqlite3_strglob |
375 }; | 407 }; |
376 | 408 |
377 /* | 409 /* |
378 ** Attempt to load an SQLite extension library contained in the file | 410 ** Attempt to load an SQLite extension library contained in the file |
379 ** zFile. The entry point is zProc. zProc may be 0 in which case a | 411 ** zFile. The entry point is zProc. zProc may be 0 in which case a |
380 ** default entry point name (sqlite3_extension_init) is used. Use | 412 ** default entry point name (sqlite3_extension_init) is used. Use |
381 ** of the default name is recommended. | 413 ** of the default name is recommended. |
382 ** | 414 ** |
383 ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. | 415 ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. |
384 ** | 416 ** |
385 ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with | 417 ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with |
386 ** error message text. The calling function should free this memory | 418 ** error message text. The calling function should free this memory |
387 ** by calling sqlite3DbFree(db, ). | 419 ** by calling sqlite3DbFree(db, ). |
388 */ | 420 */ |
389 static int sqlite3LoadExtension( | 421 static int sqlite3LoadExtension( |
390 sqlite3 *db, /* Load the extension into this database connection */ | 422 sqlite3 *db, /* Load the extension into this database connection */ |
391 const char *zFile, /* Name of the shared library containing extension */ | 423 const char *zFile, /* Name of the shared library containing extension */ |
392 const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ | 424 const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ |
393 char **pzErrMsg /* Put error message here if not 0 */ | 425 char **pzErrMsg /* Put error message here if not 0 */ |
394 ){ | 426 ){ |
395 sqlite3_vfs *pVfs = db->pVfs; | 427 sqlite3_vfs *pVfs = db->pVfs; |
396 void *handle; | 428 void *handle; |
397 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); | 429 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); |
398 char *zErrmsg = 0; | 430 char *zErrmsg = 0; |
| 431 const char *zEntry; |
| 432 char *zAltEntry = 0; |
399 void **aHandle; | 433 void **aHandle; |
400 const int nMsg = 300; | 434 int nMsg = 300 + sqlite3Strlen30(zFile); |
| 435 int ii; |
| 436 |
| 437 /* Shared library endings to try if zFile cannot be loaded as written */ |
| 438 static const char *azEndings[] = { |
| 439 #if SQLITE_OS_WIN |
| 440 "dll" |
| 441 #elif defined(__APPLE__) |
| 442 "dylib" |
| 443 #else |
| 444 "so" |
| 445 #endif |
| 446 }; |
| 447 |
401 | 448 |
402 if( pzErrMsg ) *pzErrMsg = 0; | 449 if( pzErrMsg ) *pzErrMsg = 0; |
403 | 450 |
404 /* Ticket #1863. To avoid a creating security problems for older | 451 /* Ticket #1863. To avoid a creating security problems for older |
405 ** applications that relink against newer versions of SQLite, the | 452 ** applications that relink against newer versions of SQLite, the |
406 ** ability to run load_extension is turned off by default. One | 453 ** ability to run load_extension is turned off by default. One |
407 ** must call sqlite3_enable_load_extension() to turn on extension | 454 ** must call sqlite3_enable_load_extension() to turn on extension |
408 ** loading. Otherwise you get the following error. | 455 ** loading. Otherwise you get the following error. |
409 */ | 456 */ |
410 if( (db->flags & SQLITE_LoadExtension)==0 ){ | 457 if( (db->flags & SQLITE_LoadExtension)==0 ){ |
411 if( pzErrMsg ){ | 458 if( pzErrMsg ){ |
412 *pzErrMsg = sqlite3_mprintf("not authorized"); | 459 *pzErrMsg = sqlite3_mprintf("not authorized"); |
413 } | 460 } |
414 return SQLITE_ERROR; | 461 return SQLITE_ERROR; |
415 } | 462 } |
416 | 463 |
417 if( zProc==0 ){ | 464 zEntry = zProc ? zProc : "sqlite3_extension_init"; |
418 zProc = "sqlite3_extension_init"; | |
419 } | |
420 | 465 |
421 handle = sqlite3OsDlOpen(pVfs, zFile); | 466 handle = sqlite3OsDlOpen(pVfs, zFile); |
| 467 #if SQLITE_OS_UNIX || SQLITE_OS_WIN |
| 468 for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){ |
| 469 char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]); |
| 470 if( zAltFile==0 ) return SQLITE_NOMEM; |
| 471 handle = sqlite3OsDlOpen(pVfs, zAltFile); |
| 472 sqlite3_free(zAltFile); |
| 473 } |
| 474 #endif |
422 if( handle==0 ){ | 475 if( handle==0 ){ |
423 if( pzErrMsg ){ | 476 if( pzErrMsg ){ |
424 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); | 477 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); |
425 if( zErrmsg ){ | 478 if( zErrmsg ){ |
426 sqlite3_snprintf(nMsg, zErrmsg, | 479 sqlite3_snprintf(nMsg, zErrmsg, |
427 "unable to open shared library [%s]", zFile); | 480 "unable to open shared library [%s]", zFile); |
428 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); | 481 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); |
429 } | 482 } |
430 } | 483 } |
431 return SQLITE_ERROR; | 484 return SQLITE_ERROR; |
432 } | 485 } |
433 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) | 486 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) |
434 sqlite3OsDlSym(pVfs, handle, zProc); | 487 sqlite3OsDlSym(pVfs, handle, zEntry); |
| 488 |
| 489 /* If no entry point was specified and the default legacy |
| 490 ** entry point name "sqlite3_extension_init" was not found, then |
| 491 ** construct an entry point name "sqlite3_X_init" where the X is |
| 492 ** replaced by the lowercase value of every ASCII alphabetic |
| 493 ** character in the filename after the last "/" upto the first ".", |
| 494 ** and eliding the first three characters if they are "lib". |
| 495 ** Examples: |
| 496 ** |
| 497 ** /usr/local/lib/libExample5.4.3.so ==> sqlite3_example_init |
| 498 ** C:/lib/mathfuncs.dll ==> sqlite3_mathfuncs_init |
| 499 */ |
| 500 if( xInit==0 && zProc==0 ){ |
| 501 int iFile, iEntry, c; |
| 502 int ncFile = sqlite3Strlen30(zFile); |
| 503 zAltEntry = sqlite3_malloc(ncFile+30); |
| 504 if( zAltEntry==0 ){ |
| 505 sqlite3OsDlClose(pVfs, handle); |
| 506 return SQLITE_NOMEM; |
| 507 } |
| 508 memcpy(zAltEntry, "sqlite3_", 8); |
| 509 for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} |
| 510 iFile++; |
| 511 if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; |
| 512 for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ |
| 513 if( sqlite3Isalpha(c) ){ |
| 514 zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; |
| 515 } |
| 516 } |
| 517 memcpy(zAltEntry+iEntry, "_init", 6); |
| 518 zEntry = zAltEntry; |
| 519 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) |
| 520 sqlite3OsDlSym(pVfs, handle, zEntry); |
| 521 } |
435 if( xInit==0 ){ | 522 if( xInit==0 ){ |
436 if( pzErrMsg ){ | 523 if( pzErrMsg ){ |
| 524 nMsg += sqlite3Strlen30(zEntry); |
437 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); | 525 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); |
438 if( zErrmsg ){ | 526 if( zErrmsg ){ |
439 sqlite3_snprintf(nMsg, zErrmsg, | 527 sqlite3_snprintf(nMsg, zErrmsg, |
440 "no entry point [%s] in shared library [%s]", zProc,zFile); | 528 "no entry point [%s] in shared library [%s]", zEntry, zFile); |
441 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); | 529 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); |
442 } | 530 } |
443 sqlite3OsDlClose(pVfs, handle); | |
444 } | 531 } |
| 532 sqlite3OsDlClose(pVfs, handle); |
| 533 sqlite3_free(zAltEntry); |
445 return SQLITE_ERROR; | 534 return SQLITE_ERROR; |
446 }else if( xInit(db, &zErrmsg, &sqlite3Apis) ){ | 535 } |
| 536 sqlite3_free(zAltEntry); |
| 537 if( xInit(db, &zErrmsg, &sqlite3Apis) ){ |
447 if( pzErrMsg ){ | 538 if( pzErrMsg ){ |
448 *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); | 539 *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); |
449 } | 540 } |
450 sqlite3_free(zErrmsg); | 541 sqlite3_free(zErrmsg); |
451 sqlite3OsDlClose(pVfs, handle); | 542 sqlite3OsDlClose(pVfs, handle); |
452 return SQLITE_ERROR; | 543 return SQLITE_ERROR; |
453 } | 544 } |
454 | 545 |
455 /* Append the new shared library handle to the db->aExtension array. */ | 546 /* Append the new shared library handle to the db->aExtension array. */ |
456 aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); | 547 aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 wsdAutoext.nExt++; | 675 wsdAutoext.nExt++; |
585 } | 676 } |
586 } | 677 } |
587 sqlite3_mutex_leave(mutex); | 678 sqlite3_mutex_leave(mutex); |
588 assert( (rc&0xff)==rc ); | 679 assert( (rc&0xff)==rc ); |
589 return rc; | 680 return rc; |
590 } | 681 } |
591 } | 682 } |
592 | 683 |
593 /* | 684 /* |
| 685 ** Cancel a prior call to sqlite3_auto_extension. Remove xInit from the |
| 686 ** set of routines that is invoked for each new database connection, if it |
| 687 ** is currently on the list. If xInit is not on the list, then this |
| 688 ** routine is a no-op. |
| 689 ** |
| 690 ** Return 1 if xInit was found on the list and removed. Return 0 if xInit |
| 691 ** was not on the list. |
| 692 */ |
| 693 int sqlite3_cancel_auto_extension(void (*xInit)(void)){ |
| 694 #if SQLITE_THREADSAFE |
| 695 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
| 696 #endif |
| 697 int i; |
| 698 int n = 0; |
| 699 wsdAutoextInit; |
| 700 sqlite3_mutex_enter(mutex); |
| 701 for(i=wsdAutoext.nExt-1; i>=0; i--){ |
| 702 if( wsdAutoext.aExt[i]==xInit ){ |
| 703 wsdAutoext.nExt--; |
| 704 wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; |
| 705 n++; |
| 706 break; |
| 707 } |
| 708 } |
| 709 sqlite3_mutex_leave(mutex); |
| 710 return n; |
| 711 } |
| 712 |
| 713 /* |
594 ** Reset the automatic extension loading mechanism. | 714 ** Reset the automatic extension loading mechanism. |
595 */ | 715 */ |
596 void sqlite3_reset_auto_extension(void){ | 716 void sqlite3_reset_auto_extension(void){ |
597 #ifndef SQLITE_OMIT_AUTOINIT | 717 #ifndef SQLITE_OMIT_AUTOINIT |
598 if( sqlite3_initialize()==SQLITE_OK ) | 718 if( sqlite3_initialize()==SQLITE_OK ) |
599 #endif | 719 #endif |
600 { | 720 { |
601 #if SQLITE_THREADSAFE | 721 #if SQLITE_THREADSAFE |
602 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); | 722 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
603 #endif | 723 #endif |
604 wsdAutoextInit; | 724 wsdAutoextInit; |
605 sqlite3_mutex_enter(mutex); | 725 sqlite3_mutex_enter(mutex); |
606 sqlite3_free(wsdAutoext.aExt); | 726 sqlite3_free(wsdAutoext.aExt); |
607 wsdAutoext.aExt = 0; | 727 wsdAutoext.aExt = 0; |
608 wsdAutoext.nExt = 0; | 728 wsdAutoext.nExt = 0; |
609 sqlite3_mutex_leave(mutex); | 729 sqlite3_mutex_leave(mutex); |
610 } | 730 } |
611 } | 731 } |
612 | 732 |
613 /* | 733 /* |
614 ** Load all automatic extensions. | 734 ** Load all automatic extensions. |
615 ** | 735 ** |
616 ** If anything goes wrong, set an error in the database connection. | 736 ** If anything goes wrong, set an error in the database connection. |
617 */ | 737 */ |
618 void sqlite3AutoLoadExtensions(sqlite3 *db){ | 738 void sqlite3AutoLoadExtensions(sqlite3 *db){ |
619 int i; | 739 int i; |
620 int go = 1; | 740 int go = 1; |
| 741 int rc; |
621 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); | 742 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); |
622 | 743 |
623 wsdAutoextInit; | 744 wsdAutoextInit; |
624 if( wsdAutoext.nExt==0 ){ | 745 if( wsdAutoext.nExt==0 ){ |
625 /* Common case: early out without every having to acquire a mutex */ | 746 /* Common case: early out without every having to acquire a mutex */ |
626 return; | 747 return; |
627 } | 748 } |
628 for(i=0; go; i++){ | 749 for(i=0; go; i++){ |
629 char *zErrmsg; | 750 char *zErrmsg; |
630 #if SQLITE_THREADSAFE | 751 #if SQLITE_THREADSAFE |
631 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); | 752 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
632 #endif | 753 #endif |
633 sqlite3_mutex_enter(mutex); | 754 sqlite3_mutex_enter(mutex); |
634 if( i>=wsdAutoext.nExt ){ | 755 if( i>=wsdAutoext.nExt ){ |
635 xInit = 0; | 756 xInit = 0; |
636 go = 0; | 757 go = 0; |
637 }else{ | 758 }else{ |
638 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) | 759 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) |
639 wsdAutoext.aExt[i]; | 760 wsdAutoext.aExt[i]; |
640 } | 761 } |
641 sqlite3_mutex_leave(mutex); | 762 sqlite3_mutex_leave(mutex); |
642 zErrmsg = 0; | 763 zErrmsg = 0; |
643 if( xInit && xInit(db, &zErrmsg, &sqlite3Apis) ){ | 764 if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){ |
644 sqlite3Error(db, SQLITE_ERROR, | 765 sqlite3ErrorWithMsg(db, rc, |
645 "automatic extension loading failed: %s", zErrmsg); | 766 "automatic extension loading failed: %s", zErrmsg); |
646 go = 0; | 767 go = 0; |
647 } | 768 } |
648 sqlite3_free(zErrmsg); | 769 sqlite3_free(zErrmsg); |
649 } | 770 } |
650 } | 771 } |
OLD | NEW |