>s2: extension-functions.c
>-------------------------
>add compilation instructions for windows
>
>q1:
>----
>I used gcc version 3.4.5 (mingw-vista special r3) to compile
>"extension-functions.c" with the following options
>
>gcc -shared -fPIC -I "c:\Programme\SQLite" -o libsqlitefunctions.so
>extension-functions.c
>(I copied sqlite3ext.h before to "c:\Programme\SQLite")
I built several Windows extensions and always use:
gcc -O2 -lm -shared xyz.c -o xyz.dll
You need sqlite3.h as well. Add -I "c:\Programme\SQLite" as required.
Don't forget to invoke sqlite3_enable_load_extension() before loading.
Since you're new to this, there is something that AFAIK is not
documented at all. Depending on your execution context, it can lead to
extreme frustration and wasted hours.
It is plain impossible to override any native SQLite function with
custom functions declared as using UTF-8 encoding: the override won't
work and return SQLITE_BUSY _if_ you are loading with SQL "select
sqlite3_load_extension(...).
Loading from the C interface will work if there are no other SQL being
processed on the same connection by the time of loading.
Loading + overriding from SQL _will_ work for functions not explicitely
declared for the UTF-8 encoding. Loading new functions works like a charm.
This may look like anectodical, but implies a series of consequences
that prove to be a delicious nightmare in practice. You compiled
application may work well (calling from C works in all cases), but you
won't be able to load the same extension in most SQLite managers from
SQL (and then provide no way to invoke loading from C). Using any
wrapper not explicitely having a special SQLite device for loading from
C is hopeless, so no JDBC, ODBC, AOD, a.s.o.
These are serious limitations that you must be aware of beforehand.
There exists "half" a workaround, but it also has drawbacks. You can
load an extension using the sqlite3_auto_extension() mecanism, even
from SQL! Of course, the extension need to be prepared for that.
Have a C function, going like that:
DLL_EXPORT int auto_load(
sqlite3 *db,
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
UNUSED_PARAMETER(db);
UNUSED_PARAMETER(pzErrMsg);
UNUSED_PARAMETER(pApi);
sqlite3_auto_extension((void*)sqlite3_extension_init);
return SQLITE_OK;
}
By entering select sqlite_load_extension("mydll.dll",
"auto_load"); you can make SQLite perform the C call to
sqlite3_auto_extension() for you. This of course is an SQL statement
that must be entered using an open connection. At this point, your
real extension entry point has been remembered by SQLite and will be
used when opening any new database connection. In short, you need to
first make a dummy connection, issue your SQL loading select and then
open your real connection.
Doing so means that your extension will be loaded for _all_ new
connections, so once this is done, there is no way, in the same SQLite
session, to avoid having the extension loaded. Also having different
custom functions overriding native functions at the same time is
impossible.
Because of sacred politicorrectness self-limitation, I won't describe
here what a royal pain in the ass all of this is, with all the due
respect I owe to the SQLite team.
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users