Hi,
I have just finished an SQL function for SQLite which will allow to call
exported function form a Win32 DLL.
This is an example of the calling syntax
update UserPassword set Password =
se_fn("mydll_01","Encrypt",'NewPassword');
or
select se_fn("mydll_01","Encrypt",[Message]) from UserMessages
The function is called se_fn (SQLite Extension)
Parameter One: DLL name
Parameter Two: Function Name
All other parameter are passed to the extension DLL
My thoughts behind this function was to help the many people who are using
wrappers or who use languages that don't support points or c type strings
(like VB ASP PHP,..). These languages can't use the sqlite_create_function.
By using this function they can still extend SQLite for more power.
Some of the uses I can see are compression , encryption, scientific
calculations , basically any thing.
At the moment I have written the WIN32 function and I would not know where
to start for any other platform.
This is the function as it appear in func.c, any comments would be welcome
#if WIN_32
#include "Winbase.h"
#include "windows.h"
/***************************************************************************
This is an extesion Function which allows the loading and execution of
exported
functions from DLL's. The main purpose of this function is to provide
extensions
to SQLite to enviroments that don't support C type pointer or strings.
i.e VB ASP PHP and the like.
The external DLL must be a standard WIN32 DLL which exports two function
This is the first function, which is used to release the memory allocated by
the second function
void FreeMemory(char **argr) {
if (argr[0] == NULL) {
return;
}
free(argr[0]);
}
This is a prototype of the second function (the one you wnat to call) The
first two parameter
are your calling parameter as pssed in the SQL statement. The third
parameter is the return parameter
for results. You must allocate the memory for that and NULL terminate the
value.
void TestFunction_01(int argc, const char **argv, char **argr) {
// Test to see if we have a pointer for argr
// Do some processing
argr[0]=(char *)malloc(100);
sprintf(argr[0],"Done");
return;
}
***************************************************************************/
typedef void (*SE_ExternalFunction)(int , const char **, char **);
typedef void (*SE_FreeMemory)(char **);
static void SE_fnFunc (sqlite_func *context, int argc, const char **argv){
HINSTANCE hinstLib;
BOOL fFreeResult;
SE_ExternalFunction LocalFunction;
SE_FreeMemory FreeMemoryFunction;
char *argr=NULL;
if (argc < 2 ) {
// Return is not enough parameters
return;
}
hinstLib=LoadLibrary(argv[0]);
if (hinstLib != NULL) {
// We have loaded the DLL now lets map the function call
// Load the extenal function
LocalFunction=(SE_ExternalFunction)GetProcAddress(hinstLib, argv[1]);
// Load the Release memory fuction
FreeMemoryFunction=(SE_FreeMemory)GetProcAddress(hinstLib, "FreeMemory");
if (LocalFunction != NULL && FreeMemoryFunction != NULL) {
// We have mapped the Function
// Allocate argr;
LocalFunction(argc, argv, &argr);
if (argr != NULL) {
sqlite_set_result_string(context, argr, -1);
}
else
{
sqlite_set_result_string(context, NULL, -1);
}
// Free the memory allocated to argr on the other heap.
//Must do this by using the FreeMemeory function in the DLL
FreeMemoryFunction(&argr);
}
else
{
// Error Loading Function
sqlite_set_result_string(context, "Error Mapping Functions", -1);
}
// Free library
fFreeResult = FreeLibrary(hinstLib);
}
else
{
// Error loading Library
sqlite_set_result_string(context, "Error Loading Library", -1);
return;
}
}
#endif
Kind regards
Greg