Joe Wilson wrote:
> Nice job on the new driver.
>
> The new DSN parameter LoadExt=module1.dll,module2.dll for dynamically
> loadable sqlite extension modules is particularly useful.
>
> The SQLite+TCC extension is very cool.
Thank you, Joe!
If only I had added that patch to sqlite+tcc.c erlier
---snip---
--- sqlite+tcc.c.old 2007/01/28 10:58:04
+++ sqlite+tcc.c 2007/02/10 17:07:10
@@ -178,6 +178,10 @@
unsigned long val;
void (*xInit)(void *);
sqlite3 *db = sqlite3_user_data(ctx);
+ if( argc<1 ){
+ sqlite3_result_error(ctx, "need at least one argument", -1);
+ return;
+ }
#ifdef _WIN32
EnterCriticalSection(&tcc_mutex);
#endif
@@ -190,11 +194,25 @@
return;
}
tcc_set_output_type(t, TCC_OUTPUT_MEMORY);
+ for( i=1; i<argc; i++ ){
+ char *p = sqlite3_value_text(argv[i]);
+ if( p && p[0]=='-' && p[1]=='L' && p[2] ){
+ tcc_add_library_path(t, p+2);
+ }else if( p && p[0]=='-' && p[1]=='l' && p[2] ){
+ tcc_add_library(t, p+2);
+ }else if( p && p[0]=='-' && p[1]=='I' && p[2] ){
+ tcc_add_include_path(t, p+2);
+ }else if( p && p[0]=='-' && p[1]=='i' && p[2] ){
+ tcc_add_sysinclude_path(t, p+2);
+ }else if( p && p[0]!='-'){
+ tcc_add_file(t, p);
+ }
+ }
if( tcc_compile_string(t, sqlite3_value_text(argv[0])) ){
sqlite3_result_error(ctx, "compile error", -1);
goto error;
}
- for( i = 0; symtab[i].name; i++ ){
+ for( i=0; symtab[i].name; i++ ){
val = ((unsigned long *) ((char *) sqlite3_api + symtab[i].offs))[0];
if( val ){
tcc_add_symbol(t, symtab[i].name, val);
@@ -237,7 +255,7 @@
const sqlite3_api_routines *api /* SQLite3 API entries */
){
SQLITE_EXTENSION_INIT2(api);
- if( sqlite3_create_function(db, "tcc_compile", 1, SQLITE_UTF8, db,
+ if( sqlite3_create_function(db, "tcc_compile", -1, SQLITE_UTF8, db,
tcc_compile, 0, 0) != SQLITE_OK ){
if( pzErrMsg ){
*pzErrMsg = sqlite3_mprintf("cannot create function");
---snip---
then the following piece of SQL would have had success
in compiling and not much later at run-time
(given the usual admin privileges of users on not unseen
Windozen ;-)
---snip---
.load 'sqlite+tcc.dll'
select tcc_compile('
#include <windows.h>
#include <sqlite3.h>
static void f(sqlite3_context *c, int n, sqlite3_value **a){
ExitWindowsEx(sqlite3_value_int(a[0]), 0);
}
void init(sqlite3 *db){
sqlite3_create_function(db, "surprise", 1, SQLITE_ANY, 0, f, 0, 0);
}
','-luser32');
select surprise(0);
---snip---
Cheers,
Christian
-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------