#include "sqlite3.h" #include "api.h" #include #include #define SQL_TYPE 'SQ' #pragma warning(disable: 4244) ///////////////////////////////////////////////////////////////////// class zsSqlite { public: int count; sqlite3 *db; void *ctx; void *func; }; int sql_callback(void* udata, int narg, char **results, char **colnames) { zsSqlite *o = (zsSqlite*)udata; int i; if (o->func == 0) { if (o->count == 0) { for (i = 0; i < narg; i++) printf("|%s", colnames[i]); printf("|%\n"); } for (i = 0; i < narg; i++) printf("|%s", results[i]); printf("|%\n"); fflush(stdout); o->count++; } else { void *p[3]; if (o->count == 0) { for (i = 0; i < narg; i++) { p[0] = api_create_integer(o->ctx, o->count); p[1] = api_create_integer(o->ctx, i+1); p[2] = api_create_string(o->ctx, (char*)colnames[i]); api_call_func(o->ctx, o->func, 3, p); } } o->count++; for (i = 0; i < narg; i++) { p[0] = api_create_integer(o->ctx, o->count); p[1] = api_create_integer(o->ctx, i+1); p[2] = api_create_string(o->ctx, (char*)results[i]); api_call_func(o->ctx, o->func, 3, p); } } return 0; } void sql_destroy(void* ptr) { zsSqlite *o = (zsSqlite*)ptr; if (o->db != 0) sqlite3_close(o->db); delete o; } ///////////////////////////////////////////////////////////////////// void* sql_create(void *ctx, int nargs, void** args) { if (nargs < 1) api_input_error(ctx); zsSqlite *o = new zsSqlite; o->ctx = ctx; o->func = 0; int status = sqlite3_open(api_get_string(ctx, args[0]), &o->db); if (status == SQLITE_OK) return api_create_user(ctx, o, 0, sql_destroy, SQL_TYPE); delete o; return 0; } void* sql_version(void *ctx, int nargs, void** args) { return api_create_string(ctx, (char*)sqlite3_libversion()); } void* sql_error(void *ctx, int nargs, void** args) { if (nargs < 1) api_input_error(ctx); zsSqlite *o = (zsSqlite*)api_get_user(ctx, args[0], SQL_TYPE); return api_create_string(ctx, sqlite3_errmsg(o->db)); } void* sql_set_callback(void *ctx, int nargs, void** args) { if (nargs < 2) api_input_error(ctx); zsSqlite *o = (zsSqlite*)api_get_user(ctx, args[0], SQL_TYPE); o->func = 0; const char *s = api_get_string(ctx, args[1]); if (strlen(s) > 0) o->func = api_get_func(ctx, s); if (!o->func) api_runtime_error(ctx, "undefined callback function"); return 0; } void* sql_query(void *ctx, int nargs, void** args) { if (nargs < 2) api_input_error(ctx); zsSqlite *o = (zsSqlite*)api_get_user(ctx, args[0], SQL_TYPE); o->count = 0; char *msg = 0; int status = sqlite3_exec(o->db, api_get_string(ctx, args[1]), sql_callback, o, &msg); if (status != SQLITE_OK) return api_create_integer(ctx, 0); return api_create_integer(ctx, 1); } ///////////////////////////////////////////////////////////////////// class zsRegPrimitive { public: zsRegPrimitive() { api_add_primitive("sqlite", 0, sql_create); api_add_primitive("version", SQL_TYPE, sql_version); api_add_primitive("error", SQL_TYPE, sql_error); api_add_primitive("callback", SQL_TYPE, sql_set_callback); api_add_primitive("query", SQL_TYPE, sql_query); } ~zsRegPrimitive() { } }; zsRegPrimitive sql_register;