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 16 matching lines...) Expand all Loading... |
27 ** excluded from a build of SQLite. Substitute a NULL pointer | 27 ** excluded from a build of SQLite. Substitute a NULL pointer |
28 ** for any missing APIs. | 28 ** for any missing APIs. |
29 */ | 29 */ |
30 #ifndef SQLITE_ENABLE_COLUMN_METADATA | 30 #ifndef SQLITE_ENABLE_COLUMN_METADATA |
31 # define sqlite3_column_database_name 0 | 31 # define sqlite3_column_database_name 0 |
32 # define sqlite3_column_database_name16 0 | 32 # define sqlite3_column_database_name16 0 |
33 # define sqlite3_column_table_name 0 | 33 # define sqlite3_column_table_name 0 |
34 # define sqlite3_column_table_name16 0 | 34 # define sqlite3_column_table_name16 0 |
35 # define sqlite3_column_origin_name 0 | 35 # define sqlite3_column_origin_name 0 |
36 # define sqlite3_column_origin_name16 0 | 36 # define sqlite3_column_origin_name16 0 |
37 # define sqlite3_table_column_metadata 0 | |
38 #endif | 37 #endif |
39 | 38 |
40 #ifdef SQLITE_OMIT_AUTHORIZATION | 39 #ifdef SQLITE_OMIT_AUTHORIZATION |
41 # define sqlite3_set_authorizer 0 | 40 # define sqlite3_set_authorizer 0 |
42 #endif | 41 #endif |
43 | 42 |
44 #ifdef SQLITE_OMIT_UTF16 | 43 #ifdef SQLITE_OMIT_UTF16 |
45 # define sqlite3_bind_text16 0 | 44 # define sqlite3_bind_text16 0 |
46 # define sqlite3_collation_needed16 0 | 45 # define sqlite3_collation_needed16 0 |
47 # define sqlite3_column_decltype16 0 | 46 # define sqlite3_column_decltype16 0 |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 sqlite3_bind_blob64, | 395 sqlite3_bind_blob64, |
397 sqlite3_bind_text64, | 396 sqlite3_bind_text64, |
398 sqlite3_cancel_auto_extension, | 397 sqlite3_cancel_auto_extension, |
399 sqlite3_load_extension, | 398 sqlite3_load_extension, |
400 sqlite3_malloc64, | 399 sqlite3_malloc64, |
401 sqlite3_msize, | 400 sqlite3_msize, |
402 sqlite3_realloc64, | 401 sqlite3_realloc64, |
403 sqlite3_reset_auto_extension, | 402 sqlite3_reset_auto_extension, |
404 sqlite3_result_blob64, | 403 sqlite3_result_blob64, |
405 sqlite3_result_text64, | 404 sqlite3_result_text64, |
406 sqlite3_strglob | 405 sqlite3_strglob, |
| 406 /* Version 3.8.11 and later */ |
| 407 (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup, |
| 408 sqlite3_value_free, |
| 409 sqlite3_result_zeroblob64, |
| 410 sqlite3_bind_zeroblob64, |
| 411 /* Version 3.9.0 and later */ |
| 412 sqlite3_value_subtype, |
| 413 sqlite3_result_subtype, |
| 414 /* Version 3.10.0 and later */ |
| 415 sqlite3_status64, |
| 416 sqlite3_strlike, |
| 417 sqlite3_db_cacheflush |
407 }; | 418 }; |
408 | 419 |
409 /* | 420 /* |
410 ** Attempt to load an SQLite extension library contained in the file | 421 ** Attempt to load an SQLite extension library contained in the file |
411 ** zFile. The entry point is zProc. zProc may be 0 in which case a | 422 ** zFile. The entry point is zProc. zProc may be 0 in which case a |
412 ** default entry point name (sqlite3_extension_init) is used. Use | 423 ** default entry point name (sqlite3_extension_init) is used. Use |
413 ** of the default name is recommended. | 424 ** of the default name is recommended. |
414 ** | 425 ** |
415 ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. | 426 ** Return SQLITE_OK on success and SQLITE_ERROR if something goes wrong. |
416 ** | 427 ** |
417 ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with | 428 ** If an error occurs and pzErrMsg is not 0, then fill *pzErrMsg with |
418 ** error message text. The calling function should free this memory | 429 ** error message text. The calling function should free this memory |
419 ** by calling sqlite3DbFree(db, ). | 430 ** by calling sqlite3DbFree(db, ). |
420 */ | 431 */ |
421 static int sqlite3LoadExtension( | 432 static int sqlite3LoadExtension( |
422 sqlite3 *db, /* Load the extension into this database connection */ | 433 sqlite3 *db, /* Load the extension into this database connection */ |
423 const char *zFile, /* Name of the shared library containing extension */ | 434 const char *zFile, /* Name of the shared library containing extension */ |
424 const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ | 435 const char *zProc, /* Entry point. Use "sqlite3_extension_init" if 0 */ |
425 char **pzErrMsg /* Put error message here if not 0 */ | 436 char **pzErrMsg /* Put error message here if not 0 */ |
426 ){ | 437 ){ |
427 sqlite3_vfs *pVfs = db->pVfs; | 438 sqlite3_vfs *pVfs = db->pVfs; |
428 void *handle; | 439 void *handle; |
429 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); | 440 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); |
430 char *zErrmsg = 0; | 441 char *zErrmsg = 0; |
431 const char *zEntry; | 442 const char *zEntry; |
432 char *zAltEntry = 0; | 443 char *zAltEntry = 0; |
433 void **aHandle; | 444 void **aHandle; |
434 int nMsg = 300 + sqlite3Strlen30(zFile); | 445 u64 nMsg = 300 + sqlite3Strlen30(zFile); |
435 int ii; | 446 int ii; |
436 | 447 |
437 /* Shared library endings to try if zFile cannot be loaded as written */ | 448 /* Shared library endings to try if zFile cannot be loaded as written */ |
438 static const char *azEndings[] = { | 449 static const char *azEndings[] = { |
439 #if SQLITE_OS_WIN | 450 #if SQLITE_OS_WIN |
440 "dll" | 451 "dll" |
441 #elif defined(__APPLE__) | 452 #elif defined(__APPLE__) |
442 "dylib" | 453 "dylib" |
443 #else | 454 #else |
444 "so" | 455 "so" |
(...skipping 22 matching lines...) Expand all Loading... |
467 #if SQLITE_OS_UNIX || SQLITE_OS_WIN | 478 #if SQLITE_OS_UNIX || SQLITE_OS_WIN |
468 for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){ | 479 for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){ |
469 char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]); | 480 char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]); |
470 if( zAltFile==0 ) return SQLITE_NOMEM; | 481 if( zAltFile==0 ) return SQLITE_NOMEM; |
471 handle = sqlite3OsDlOpen(pVfs, zAltFile); | 482 handle = sqlite3OsDlOpen(pVfs, zAltFile); |
472 sqlite3_free(zAltFile); | 483 sqlite3_free(zAltFile); |
473 } | 484 } |
474 #endif | 485 #endif |
475 if( handle==0 ){ | 486 if( handle==0 ){ |
476 if( pzErrMsg ){ | 487 if( pzErrMsg ){ |
477 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); | 488 *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); |
478 if( zErrmsg ){ | 489 if( zErrmsg ){ |
479 sqlite3_snprintf(nMsg, zErrmsg, | 490 sqlite3_snprintf(nMsg, zErrmsg, |
480 "unable to open shared library [%s]", zFile); | 491 "unable to open shared library [%s]", zFile); |
481 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); | 492 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); |
482 } | 493 } |
483 } | 494 } |
484 return SQLITE_ERROR; | 495 return SQLITE_ERROR; |
485 } | 496 } |
486 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) | 497 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) |
487 sqlite3OsDlSym(pVfs, handle, zEntry); | 498 sqlite3OsDlSym(pVfs, handle, zEntry); |
488 | 499 |
489 /* If no entry point was specified and the default legacy | 500 /* If no entry point was specified and the default legacy |
490 ** entry point name "sqlite3_extension_init" was not found, then | 501 ** entry point name "sqlite3_extension_init" was not found, then |
491 ** construct an entry point name "sqlite3_X_init" where the X is | 502 ** construct an entry point name "sqlite3_X_init" where the X is |
492 ** replaced by the lowercase value of every ASCII alphabetic | 503 ** replaced by the lowercase value of every ASCII alphabetic |
493 ** character in the filename after the last "/" upto the first ".", | 504 ** character in the filename after the last "/" upto the first ".", |
494 ** and eliding the first three characters if they are "lib". | 505 ** and eliding the first three characters if they are "lib". |
495 ** Examples: | 506 ** Examples: |
496 ** | 507 ** |
497 ** /usr/local/lib/libExample5.4.3.so ==> sqlite3_example_init | 508 ** /usr/local/lib/libExample5.4.3.so ==> sqlite3_example_init |
498 ** C:/lib/mathfuncs.dll ==> sqlite3_mathfuncs_init | 509 ** C:/lib/mathfuncs.dll ==> sqlite3_mathfuncs_init |
499 */ | 510 */ |
500 if( xInit==0 && zProc==0 ){ | 511 if( xInit==0 && zProc==0 ){ |
501 int iFile, iEntry, c; | 512 int iFile, iEntry, c; |
502 int ncFile = sqlite3Strlen30(zFile); | 513 int ncFile = sqlite3Strlen30(zFile); |
503 zAltEntry = sqlite3_malloc(ncFile+30); | 514 zAltEntry = sqlite3_malloc64(ncFile+30); |
504 if( zAltEntry==0 ){ | 515 if( zAltEntry==0 ){ |
505 sqlite3OsDlClose(pVfs, handle); | 516 sqlite3OsDlClose(pVfs, handle); |
506 return SQLITE_NOMEM; | 517 return SQLITE_NOMEM; |
507 } | 518 } |
508 memcpy(zAltEntry, "sqlite3_", 8); | 519 memcpy(zAltEntry, "sqlite3_", 8); |
509 for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} | 520 for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} |
510 iFile++; | 521 iFile++; |
511 if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; | 522 if( sqlite3_strnicmp(zFile+iFile, "lib", 3)==0 ) iFile += 3; |
512 for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ | 523 for(iEntry=8; (c = zFile[iFile])!=0 && c!='.'; iFile++){ |
513 if( sqlite3Isalpha(c) ){ | 524 if( sqlite3Isalpha(c) ){ |
514 zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; | 525 zAltEntry[iEntry++] = (char)sqlite3UpperToLower[(unsigned)c]; |
515 } | 526 } |
516 } | 527 } |
517 memcpy(zAltEntry+iEntry, "_init", 6); | 528 memcpy(zAltEntry+iEntry, "_init", 6); |
518 zEntry = zAltEntry; | 529 zEntry = zAltEntry; |
519 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) | 530 xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) |
520 sqlite3OsDlSym(pVfs, handle, zEntry); | 531 sqlite3OsDlSym(pVfs, handle, zEntry); |
521 } | 532 } |
522 if( xInit==0 ){ | 533 if( xInit==0 ){ |
523 if( pzErrMsg ){ | 534 if( pzErrMsg ){ |
524 nMsg += sqlite3Strlen30(zEntry); | 535 nMsg += sqlite3Strlen30(zEntry); |
525 *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); | 536 *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); |
526 if( zErrmsg ){ | 537 if( zErrmsg ){ |
527 sqlite3_snprintf(nMsg, zErrmsg, | 538 sqlite3_snprintf(nMsg, zErrmsg, |
528 "no entry point [%s] in shared library [%s]", zEntry, zFile); | 539 "no entry point [%s] in shared library [%s]", zEntry, zFile); |
529 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); | 540 sqlite3OsDlError(pVfs, nMsg-1, zErrmsg); |
530 } | 541 } |
531 } | 542 } |
532 sqlite3OsDlClose(pVfs, handle); | 543 sqlite3OsDlClose(pVfs, handle); |
533 sqlite3_free(zAltEntry); | 544 sqlite3_free(zAltEntry); |
534 return SQLITE_ERROR; | 545 return SQLITE_ERROR; |
535 } | 546 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 | 625 |
615 /* | 626 /* |
616 ** The following object holds the list of automatically loaded | 627 ** The following object holds the list of automatically loaded |
617 ** extensions. | 628 ** extensions. |
618 ** | 629 ** |
619 ** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER | 630 ** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER |
620 ** mutex must be held while accessing this list. | 631 ** mutex must be held while accessing this list. |
621 */ | 632 */ |
622 typedef struct sqlite3AutoExtList sqlite3AutoExtList; | 633 typedef struct sqlite3AutoExtList sqlite3AutoExtList; |
623 static SQLITE_WSD struct sqlite3AutoExtList { | 634 static SQLITE_WSD struct sqlite3AutoExtList { |
624 int nExt; /* Number of entries in aExt[] */ | 635 u32 nExt; /* Number of entries in aExt[] */ |
625 void (**aExt)(void); /* Pointers to the extension init functions */ | 636 void (**aExt)(void); /* Pointers to the extension init functions */ |
626 } sqlite3Autoext = { 0, 0 }; | 637 } sqlite3Autoext = { 0, 0 }; |
627 | 638 |
628 /* The "wsdAutoext" macro will resolve to the autoextension | 639 /* The "wsdAutoext" macro will resolve to the autoextension |
629 ** state vector. If writable static data is unsupported on the target, | 640 ** state vector. If writable static data is unsupported on the target, |
630 ** we have to locate the state vector at run-time. In the more common | 641 ** we have to locate the state vector at run-time. In the more common |
631 ** case where writable static data is supported, wsdStat can refer directly | 642 ** case where writable static data is supported, wsdStat can refer directly |
632 ** to the "sqlite3Autoext" state vector declared above. | 643 ** to the "sqlite3Autoext" state vector declared above. |
633 */ | 644 */ |
634 #ifdef SQLITE_OMIT_WSD | 645 #ifdef SQLITE_OMIT_WSD |
(...skipping 12 matching lines...) Expand all Loading... |
647 */ | 658 */ |
648 int sqlite3_auto_extension(void (*xInit)(void)){ | 659 int sqlite3_auto_extension(void (*xInit)(void)){ |
649 int rc = SQLITE_OK; | 660 int rc = SQLITE_OK; |
650 #ifndef SQLITE_OMIT_AUTOINIT | 661 #ifndef SQLITE_OMIT_AUTOINIT |
651 rc = sqlite3_initialize(); | 662 rc = sqlite3_initialize(); |
652 if( rc ){ | 663 if( rc ){ |
653 return rc; | 664 return rc; |
654 }else | 665 }else |
655 #endif | 666 #endif |
656 { | 667 { |
657 int i; | 668 u32 i; |
658 #if SQLITE_THREADSAFE | 669 #if SQLITE_THREADSAFE |
659 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); | 670 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
660 #endif | 671 #endif |
661 wsdAutoextInit; | 672 wsdAutoextInit; |
662 sqlite3_mutex_enter(mutex); | 673 sqlite3_mutex_enter(mutex); |
663 for(i=0; i<wsdAutoext.nExt; i++){ | 674 for(i=0; i<wsdAutoext.nExt; i++){ |
664 if( wsdAutoext.aExt[i]==xInit ) break; | 675 if( wsdAutoext.aExt[i]==xInit ) break; |
665 } | 676 } |
666 if( i==wsdAutoext.nExt ){ | 677 if( i==wsdAutoext.nExt ){ |
667 int nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]); | 678 u64 nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]); |
668 void (**aNew)(void); | 679 void (**aNew)(void); |
669 aNew = sqlite3_realloc(wsdAutoext.aExt, nByte); | 680 aNew = sqlite3_realloc64(wsdAutoext.aExt, nByte); |
670 if( aNew==0 ){ | 681 if( aNew==0 ){ |
671 rc = SQLITE_NOMEM; | 682 rc = SQLITE_NOMEM; |
672 }else{ | 683 }else{ |
673 wsdAutoext.aExt = aNew; | 684 wsdAutoext.aExt = aNew; |
674 wsdAutoext.aExt[wsdAutoext.nExt] = xInit; | 685 wsdAutoext.aExt[wsdAutoext.nExt] = xInit; |
675 wsdAutoext.nExt++; | 686 wsdAutoext.nExt++; |
676 } | 687 } |
677 } | 688 } |
678 sqlite3_mutex_leave(mutex); | 689 sqlite3_mutex_leave(mutex); |
679 assert( (rc&0xff)==rc ); | 690 assert( (rc&0xff)==rc ); |
(...skipping 11 matching lines...) Expand all Loading... |
691 ** was not on the list. | 702 ** was not on the list. |
692 */ | 703 */ |
693 int sqlite3_cancel_auto_extension(void (*xInit)(void)){ | 704 int sqlite3_cancel_auto_extension(void (*xInit)(void)){ |
694 #if SQLITE_THREADSAFE | 705 #if SQLITE_THREADSAFE |
695 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); | 706 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
696 #endif | 707 #endif |
697 int i; | 708 int i; |
698 int n = 0; | 709 int n = 0; |
699 wsdAutoextInit; | 710 wsdAutoextInit; |
700 sqlite3_mutex_enter(mutex); | 711 sqlite3_mutex_enter(mutex); |
701 for(i=wsdAutoext.nExt-1; i>=0; i--){ | 712 for(i=(int)wsdAutoext.nExt-1; i>=0; i--){ |
702 if( wsdAutoext.aExt[i]==xInit ){ | 713 if( wsdAutoext.aExt[i]==xInit ){ |
703 wsdAutoext.nExt--; | 714 wsdAutoext.nExt--; |
704 wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; | 715 wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; |
705 n++; | 716 n++; |
706 break; | 717 break; |
707 } | 718 } |
708 } | 719 } |
709 sqlite3_mutex_leave(mutex); | 720 sqlite3_mutex_leave(mutex); |
710 return n; | 721 return n; |
711 } | 722 } |
(...skipping 17 matching lines...) Expand all Loading... |
729 sqlite3_mutex_leave(mutex); | 740 sqlite3_mutex_leave(mutex); |
730 } | 741 } |
731 } | 742 } |
732 | 743 |
733 /* | 744 /* |
734 ** Load all automatic extensions. | 745 ** Load all automatic extensions. |
735 ** | 746 ** |
736 ** If anything goes wrong, set an error in the database connection. | 747 ** If anything goes wrong, set an error in the database connection. |
737 */ | 748 */ |
738 void sqlite3AutoLoadExtensions(sqlite3 *db){ | 749 void sqlite3AutoLoadExtensions(sqlite3 *db){ |
739 int i; | 750 u32 i; |
740 int go = 1; | 751 int go = 1; |
741 int rc; | 752 int rc; |
742 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); | 753 int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); |
743 | 754 |
744 wsdAutoextInit; | 755 wsdAutoextInit; |
745 if( wsdAutoext.nExt==0 ){ | 756 if( wsdAutoext.nExt==0 ){ |
746 /* Common case: early out without every having to acquire a mutex */ | 757 /* Common case: early out without every having to acquire a mutex */ |
747 return; | 758 return; |
748 } | 759 } |
749 for(i=0; go; i++){ | 760 for(i=0; go; i++){ |
(...skipping 12 matching lines...) Expand all Loading... |
762 sqlite3_mutex_leave(mutex); | 773 sqlite3_mutex_leave(mutex); |
763 zErrmsg = 0; | 774 zErrmsg = 0; |
764 if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){ | 775 if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){ |
765 sqlite3ErrorWithMsg(db, rc, | 776 sqlite3ErrorWithMsg(db, rc, |
766 "automatic extension loading failed: %s", zErrmsg); | 777 "automatic extension loading failed: %s", zErrmsg); |
767 go = 0; | 778 go = 0; |
768 } | 779 } |
769 sqlite3_free(zErrmsg); | 780 sqlite3_free(zErrmsg); |
770 } | 781 } |
771 } | 782 } |
OLD | NEW |