Small. Fast. Reliable.
Choose any three.
I have a preview of womething like that, http://dad-it.com:8080/sqlite3.dll is the 3.3.10 with minor modifications and with lsqlite3.5 (lua sqlite3 bindings), where every opened database has Lua 5.1.1 as procedural language, in Lua we have a global var 'db' that refers to the actual database, we can use anything that can be used with lsqlite3, as well http://dad-it.com:8080/sqlite3.exe is the sqlite3 shell with the same additions as the sqlite3.dll, a small example is at http://dad-it.com:8080/test-lua-sqlite3.sql.

  select install_lua_script('
  local function udf1_scalar(ctx, v)
    local ud = ctx:user_data()
    ud.r = (ud.r or '''') .. tostring(v)
    ctx:result_text(ud.r)
  end

  db:create_function(''udf1'', 1, udf1_scalar, { })');

  select 'Udf1 result :' || udf1(549);

  select install_lua_script('sequence_number = 0
  function sequencial_number(ctx)
    local ud = ctx:user_data()
    sequence_number = sequence_number + 1
    ud.r = sequence_number
    ctx:result_text(ud.r)
  end

  function set_sequencial_number(ctx,v)
    local ud = ctx:user_data()
    sequence_number = v
    ud.r = sequence_number
    ctx:result_text(ud.r)
  end

  db:create_function(''seqnr'', 0, sequencial_number, { })
  db:create_function(''set_seqnr'', 1, set_sequencial_number, { })')"

  select seqnr(),* from day_slots limit 10;

  in main.c:
  ---------
  #ifdef LUA_SQLITE_PROCEDURAL
  #include "lua_procedural.h"
  #endif

/* ** Close an existing SQLite database / int sqlite3_close(sqlite3 *db){ HashElem *i; int j; #ifdef LUA_SQLITE_PROCEDURAL lua_State *L; #endif if( !db ){ return SQLITE_OK; } if( sqlite3SafetyCheck(db) ){ return SQLITE_MISUSE; } #ifdef LUA_SQLITE_PROCEDURAL L = (lua_State) sqlite3_get_db_user_data(db); #endif ...... #ifdef LUA_SQLITE_PROCEDURAL if (L) lua_close(L); #endif return SQLITE_OK; } ..... /* ** This routine does the work of opening a database on behalf of ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" ** is UTF-8 encoded. */

static int openDatabase( const char zFilename, / Database filename UTF-8 encoded / sqlite3 **ppDb / OUT: Returned database handle */ ){ sqlite3 *db; int rc; CollSeq *pColl; ....... opendb_out: if( SQLITE_NOMEM==(rc = sqlite3_errcode(db)) ){ sqlite3_close(db); db = 0; } *ppDb = db; #ifdef LUA_SQLITE_PROCEDURAL install_lua_procedural(db); #endif return sqlite3ApiExit(0, rc); }

void sqlite3_set_db_user_data(sqlite3 *db, void *data){ assert( db ); db->pDBUserData = data; }

void *sqlite3_get_db_user_data(sqlite3 *db){ assert( db ); return db->pDBUserData; }


sqlit3Int.h:
struct sqlite3 { int nDb; /* Number of backends currently in use */ ......... void *pDBUserData; };

struct sqlite3_context { FuncDef pFunc; / Pointer to function information. MUST BE FIRST / VdbeFunc *pVdbeFunc; / Auxilary data, if created. / Mem s; / The return value is stored here / Mem *pMem; / Memory cell used to store aggregate context / u8 isError; / Set to true for an error / CollSeq *pColl; / Collating sequence */ void *pDBUserData; };


lua_procedural.h:
#ifdef LUA_SQLITE_PROCEDURAL //lua includes #include "lua.h" #include "lauxlib.h" extern int luaopen_lsqlite3(lua_State *L); extern int lsqlite_register_db(lua_State *L, sqlite3 *db, const char *name);

/* Install the main interpreter function / static void install_lua_script( sqlite3_context *context, int argc, sqlite3_value **argv ){ assert( argc==1 ); lua_State *L = (lua_State) sqlite3_db_user_data(context); if(L && sqlite3_value_type(argv[0]) == SQLITE_TEXT){ int res = luaL_dostring(L, sqlite3_value_text(argv[0])); sqlite3_result_int(context,res); } else sqlite3_result_null(context); }

static int install_lua_procedural(sqlite3 db){ lua_State *L = lua_open(); if(L){ luaL_openlibs(L); / Load Lua libraries */ sqlite3_set_db_user_data(db,(void*)L); lua_state_set_user_data(L,(void*)db); luaopen_lsqlite3(L); lsqlite_register_db(L, db, "db"); sqlite3_create_function(db, "install_lua_script", 1, SQLITE_UTF8, 0, install_lua_script, 0, 0); return 0; } else { //fprintf(stderr,"Unable to register lua scripting engine !\n"); return -1; } } #endif

Attachments:

  • lsqlite3.c 55387 bytes added by anonymous on 2007-Jan-11 21:42:25 UTC.
    This is the main file from lsqlite3.5 with some modifications.