--- src/ls_sqlite3.c 2007/10/16 15:36:08 1.7 +++ src/ls_sqlite3.c 2008/04/24 17:37:45 1.10 @@ -28,27 +28,28 @@ typedef struct { - short closed; + short closed; } env_data; typedef struct { - short closed; - int env; /* reference to environment */ - short auto_commit; /* 0 for manual commit */ - unsigned int cur_counter; - sqlite3 *sql_conn; + short closed; + int env; /* reference to environment */ + short auto_commit; /* 0 for manual commit */ + unsigned int cur_counter; + sqlite3 *sql_conn; } conn_data; typedef struct { - short closed; - int conn; /* reference to connection */ - int numcols; /* number of columns */ - int colnames, coltypes; /* reference to column information tables */ - sqlite3_stmt *sql_vm; + short closed; + int conn; /* reference to connection */ + int numcols; /* number of columns */ + int colnames, coltypes; /* reference to column information tables */ + conn_data *conn_data; /* reference to connection for cursor */ + sqlite3_stmt *sql_vm; } cur_data; LUASQL_API int luaopen_luasql_sqlite3(lua_State *L); @@ -58,10 +59,10 @@ LUASQL_API int luaopen_luasql_sqlite3(lu ** Check for valid environment. */ static env_data *getenvironment(lua_State *L) { - env_data *env = (env_data *)luaL_checkudata(L, 1, LUASQL_ENVIRONMENT_SQLITE); - luaL_argcheck(L, env != NULL, 1, LUASQL_PREFIX"environment expected"); - luaL_argcheck(L, !env->closed, 1, LUASQL_PREFIX"environment is closed"); - return env; + env_data *env = (env_data *)luaL_checkudata(L, 1, LUASQL_ENVIRONMENT_SQLITE); + luaL_argcheck(L, env != NULL, 1, LUASQL_PREFIX"environment expected"); + luaL_argcheck(L, !env->closed, 1, LUASQL_PREFIX"environment is closed"); + return env; } @@ -69,10 +70,10 @@ static env_data *getenvironment(lua_Stat ** Check for valid connection. */ static conn_data *getconnection(lua_State *L) { - conn_data *conn = (conn_data *)luaL_checkudata (L, 1, LUASQL_CONNECTION_SQLITE); - luaL_argcheck(L, conn != NULL, 1, LUASQL_PREFIX"connection expected"); - luaL_argcheck(L, !conn->closed, 1, LUASQL_PREFIX"connection is closed"); - return conn; + conn_data *conn = (conn_data *)luaL_checkudata (L, 1, LUASQL_CONNECTION_SQLITE); + luaL_argcheck(L, conn != NULL, 1, LUASQL_PREFIX"connection expected"); + luaL_argcheck(L, !conn->closed, 1, LUASQL_PREFIX"connection is closed"); + return conn; } @@ -80,10 +81,10 @@ static conn_data *getconnection(lua_Stat ** Check for valid cursor. */ static cur_data *getcursor(lua_State *L) { - cur_data *cur = (cur_data *)luaL_checkudata (L, 1, LUASQL_CURSOR_SQLITE); - luaL_argcheck(L, cur != NULL, 1, LUASQL_PREFIX"cursor expected"); - luaL_argcheck(L, !cur->closed, 1, LUASQL_PREFIX"cursor is closed"); - return cur; + cur_data *cur = (cur_data *)luaL_checkudata (L, 1, LUASQL_CURSOR_SQLITE); + luaL_argcheck(L, cur != NULL, 1, LUASQL_PREFIX"cursor expected"); + luaL_argcheck(L, !cur->closed, 1, LUASQL_PREFIX"cursor is closed"); + return cur; } /* @@ -91,80 +92,105 @@ static cur_data *getcursor(lua_State *L) ** Return nil + errmsg or nil in case of sucess */ static int finalize(lua_State *L, cur_data *cur) { - const char *errmsg; - if (sqlite3_finalize(cur->sql_vm) != SQLITE_OK) + const char *errmsg; + if (sqlite3_finalize(cur->sql_vm) != SQLITE_OK) { - errmsg = sqlite3_errmsg(sqlite3_db_handle(cur->sql_vm)); - cur->sql_vm = NULL; - lua_pushnil(L); - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - lua_concat(L, 2); - return 2; + errmsg = sqlite3_errmsg(cur->conn_data->sql_conn); + cur->sql_vm = NULL; + lua_pushnil(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + lua_concat(L, 2); + return 2; } - cur->sql_vm = NULL; - lua_pushnil(L); - return 1; + cur->sql_vm = NULL; + lua_pushnil(L); + return 1; } +static void push_column(lua_State *L, sqlite3_stmt *vm, int column) { + switch (sqlite3_column_type(vm, column)) { + case SQLITE_INTEGER: + lua_pushinteger(L, sqlite3_column_int64(vm, column)); + break; + case SQLITE_FLOAT: + lua_pushnumber(L, sqlite3_column_double(vm, column)); + break; + case SQLITE_TEXT: + lua_pushlstring(L, sqlite3_column_text(vm, column), + sqlite3_column_bytes(vm, column)); + break; + case SQLITE_BLOB: + lua_pushlstring(L, sqlite3_column_blob(vm, column), + sqlite3_column_bytes(vm, column)); + break; + case SQLITE_NULL: + lua_pushnil(L); + break; + default: + luaL_error(L, LUASQL_PREFIX"Unrecognized column type"); + break; + } +} + /* ** Get another row of the given cursor. */ static int cur_fetch (lua_State *L) { - cur_data *cur = getcursor(L); - sqlite3_stmt *vm = cur->sql_vm; - int res; + cur_data *cur = getcursor(L); + sqlite3_stmt *vm = cur->sql_vm; + int res; - if (vm == NULL) - return 0; + if (vm == NULL) + return 0; - res = sqlite3_step(vm); + res = sqlite3_step(vm); - /* no more results? */ - if (res == SQLITE_DONE) - return finalize(L, cur); + /* no more results? */ + if (res == SQLITE_DONE) + return finalize(L, cur); - if (res != SQLITE_ROW) - return finalize(L, cur); + if (res != SQLITE_ROW) + return finalize(L, cur); - if (lua_istable (L, 2)) + if (lua_istable (L, 2)) { - int i; - const char *opts = luaL_optstring(L, 3, "n"); + int i; + const char *opts = luaL_optstring(L, 3, "n"); - if (strchr(opts, 'n') != NULL) + if (strchr(opts, 'n') != NULL) { - /* Copy values to numerical indices */ - for (i = 0; i < cur->numcols;) + /* Copy values to numerical indices */ + for (i = 0; i < cur->numcols;) { - lua_pushstring(L, (const char *)sqlite3_column_text(vm, i)); - lua_rawseti(L, 2, ++i); - } + push_column(L, vm, i); + lua_rawseti(L, 2, ++i); + } } - if (strchr(opts, 'a') != NULL) + if (strchr(opts, 'a') != NULL) { - /* Copy values to alphanumerical indices */ - lua_rawgeti(L, LUA_REGISTRYINDEX, cur->colnames); + /* Copy values to alphanumerical indices */ + lua_rawgeti(L, LUA_REGISTRYINDEX, cur->colnames); - for (i = 0; i < cur->numcols; i++) + for (i = 0; i < cur->numcols; i++) { - lua_rawgeti(L, -1, i+1); - lua_pushstring(L, (const char*)sqlite3_column_text(vm,i)); - lua_rawset (L, 2); - } + lua_rawgeti(L, -1, i+1); + push_column(L, vm, i); + lua_rawset (L, 2); + } } - lua_pushvalue(L, 2); - return 1; /* return table */ - } - else - { - int i; - luaL_checkstack (L, cur->numcols, LUASQL_PREFIX"too many columns"); - for (i = 0; i < cur->numcols; ++i) - lua_pushstring(L, (const char *)sqlite3_column_text(vm, i)); - return cur->numcols; /* return #numcols values */ - } + lua_pushvalue(L, 2); + return 1; /* return table */ + } + else + { + int i; + luaL_checkstack (L, cur->numcols, LUASQL_PREFIX"too many columns"); + for (i = 0; i < cur->numcols; ++i) + push_column(L, vm, i); + return cur->numcols; /* return #numcols values */ + } } @@ -174,28 +200,28 @@ static int cur_fetch (lua_State *L) { */ static int cur_close(lua_State *L) { - conn_data *conn; - cur_data *cur = (cur_data *)luaL_checkudata(L, 1, LUASQL_CURSOR_SQLITE); - luaL_argcheck(L, cur != NULL, 1, LUASQL_PREFIX"cursor expected"); - if (cur->closed) { - lua_pushboolean(L, 0); - return 1; - } - - /* Nullify structure fields. */ - cur->closed = 1; - sqlite3_finalize(cur->sql_vm); - /* Decrement cursor counter on connection object */ - lua_rawgeti (L, LUA_REGISTRYINDEX, cur->conn); - conn = lua_touserdata (L, -1); - conn->cur_counter--; - - luaL_unref(L, LUA_REGISTRYINDEX, cur->conn); - luaL_unref(L, LUA_REGISTRYINDEX, cur->colnames); - luaL_unref(L, LUA_REGISTRYINDEX, cur->coltypes); + conn_data *conn; + cur_data *cur = (cur_data *)luaL_checkudata(L, 1, LUASQL_CURSOR_SQLITE); + luaL_argcheck(L, cur != NULL, 1, LUASQL_PREFIX"cursor expected"); + if (cur->closed) { + lua_pushboolean(L, 0); + return 1; + } - lua_pushboolean(L, 1); - return 1; + /* Nullify structure fields. */ + cur->closed = 1; + sqlite3_finalize(cur->sql_vm); + /* Decrement cursor counter on connection object */ + lua_rawgeti (L, LUA_REGISTRYINDEX, cur->conn); + conn = lua_touserdata (L, -1); + conn->cur_counter--; + + luaL_unref(L, LUA_REGISTRYINDEX, cur->conn); + luaL_unref(L, LUA_REGISTRYINDEX, cur->colnames); + luaL_unref(L, LUA_REGISTRYINDEX, cur->coltypes); + + lua_pushboolean(L, 1); + return 1; } @@ -204,9 +230,9 @@ static int cur_close(lua_State *L) */ static int cur_getcolnames(lua_State *L) { - cur_data *cur = getcursor(L); - lua_rawgeti(L, LUA_REGISTRYINDEX, cur->colnames); - return 1; + cur_data *cur = getcursor(L); + lua_rawgeti(L, LUA_REGISTRYINDEX, cur->colnames); + return 1; } @@ -215,9 +241,9 @@ static int cur_getcolnames(lua_State *L) */ static int cur_getcoltypes(lua_State *L) { - cur_data *cur = getcursor(L); - lua_rawgeti(L, LUA_REGISTRYINDEX, cur->coltypes); - return 1; + cur_data *cur = getcursor(L); + lua_rawgeti(L, LUA_REGISTRYINDEX, cur->coltypes); + return 1; } @@ -225,47 +251,48 @@ static int cur_getcoltypes(lua_State *L) ** Create a new Cursor object and push it on top of the stack. */ /* static int create_cursor(lua_State *L, int conn, sqlite3_stmt *sql_vm, - int numcols, const char **row, const char **col_info)*/ + int numcols, const char **row, const char **col_info)*/ static int create_cursor(lua_State *L, int o, conn_data *conn, - sqlite3_stmt *sql_vm, int numcols) + sqlite3_stmt *sql_vm, int numcols) { - int i; - cur_data *cur = (cur_data*)lua_newuserdata(L, sizeof(cur_data)); - luasql_setmeta (L, LUASQL_CURSOR_SQLITE); - - /* increment cursor count for the connection creating this cursor */ - conn->cur_counter++; - - /* fill in structure */ - cur->closed = 0; - cur->conn = LUA_NOREF; - cur->numcols = numcols; - cur->colnames = LUA_NOREF; - cur->coltypes = LUA_NOREF; - cur->sql_vm = sql_vm; - - lua_pushvalue(L, o); - cur->conn = luaL_ref(L, LUA_REGISTRYINDEX); - - /* create table with column names */ - lua_newtable(L); - for (i = 0; i < numcols;) + int i; + cur_data *cur = (cur_data*)lua_newuserdata(L, sizeof(cur_data)); + luasql_setmeta (L, LUASQL_CURSOR_SQLITE); + + /* increment cursor count for the connection creating this cursor */ + conn->cur_counter++; + + /* fill in structure */ + cur->closed = 0; + cur->conn = LUA_NOREF; + cur->numcols = numcols; + cur->colnames = LUA_NOREF; + cur->coltypes = LUA_NOREF; + cur->sql_vm = sql_vm; + cur->conn_data = conn; + + lua_pushvalue(L, o); + cur->conn = luaL_ref(L, LUA_REGISTRYINDEX); + + /* create table with column names */ + lua_newtable(L); + for (i = 0; i < numcols;) { - lua_pushstring(L, sqlite3_column_name(sql_vm, i)); - lua_rawseti(L, -2, ++i); + lua_pushstring(L, sqlite3_column_name(sql_vm, i)); + lua_rawseti(L, -2, ++i); } - cur->colnames = luaL_ref(L, LUA_REGISTRYINDEX); - - /* create table with column types */ - lua_newtable(L); - for (i = 0; i < numcols;) + cur->colnames = luaL_ref(L, LUA_REGISTRYINDEX); + + /* create table with column types */ + lua_newtable(L); + for (i = 0; i < numcols;) { - lua_pushstring(L, sqlite3_column_decltype(sql_vm, i)); - lua_rawseti(L, -2, ++i); + lua_pushstring(L, sqlite3_column_decltype(sql_vm, i)); + lua_rawseti(L, -2, ++i); } - cur->coltypes = luaL_ref(L, LUA_REGISTRYINDEX); + cur->coltypes = luaL_ref(L, LUA_REGISTRYINDEX); - return 1; + return 1; } @@ -274,39 +301,39 @@ static int create_cursor(lua_State *L, i */ static int conn_close(lua_State *L) { - conn_data *conn = (conn_data *)luaL_checkudata(L, 1, LUASQL_CONNECTION_SQLITE); - luaL_argcheck (L, conn != NULL, 1, LUASQL_PREFIX"connection expected"); - if (conn->closed) - { - lua_pushboolean(L, 0); - return 1; - } - - if (conn->cur_counter > 0) - return luaL_error (L, LUASQL_PREFIX"there are open cursors"); - - /* Nullify structure fields. */ - conn->closed = 1; - luaL_unref(L, LUA_REGISTRYINDEX, conn->env); - sqlite3_close(conn->sql_conn); - lua_pushboolean(L, 1); - return 1; + conn_data *conn = (conn_data *)luaL_checkudata(L, 1, LUASQL_CONNECTION_SQLITE); + luaL_argcheck (L, conn != NULL, 1, LUASQL_PREFIX"connection expected"); + if (conn->closed) + { + lua_pushboolean(L, 0); + return 1; + } + + if (conn->cur_counter > 0) + return luaL_error (L, LUASQL_PREFIX"there are open cursors"); + + /* Nullify structure fields. */ + conn->closed = 1; + luaL_unref(L, LUA_REGISTRYINDEX, conn->env); + sqlite3_close(conn->sql_conn); + lua_pushboolean(L, 1); + return 1; } static int conn_escape(lua_State *L) { - const char *from = luaL_checklstring (L, 2, 0); - char *escaped = sqlite3_mprintf("%q", from); - if (escaped == NULL) + const char *from = luaL_checklstring (L, 2, 0); + char *escaped = sqlite3_mprintf("%q", from); + if (escaped == NULL) { - lua_pushnil(L); + lua_pushnil(L); } - else + else { - lua_pushstring(L, escaped); - sqlite3_free(escaped); + lua_pushstring(L, escaped); + sqlite3_free(escaped); } - return 1; + return 1; } /* @@ -316,52 +343,52 @@ static int conn_escape(lua_State *L) */ static int conn_execute(lua_State *L) { - conn_data *conn = getconnection(L); - const char *statement = luaL_checkstring(L, 2); - int res; - sqlite3_stmt *vm; - const char *errmsg; - int numcols; - const char *tail; - - res = sqlite3_prepare(conn->sql_conn, statement, -1, &vm, &tail); - if (res != SQLITE_OK) - { - errmsg = sqlite3_errmsg(conn->sql_conn); - lua_pushnil(L); - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - lua_concat(L, 2); - return 2; - } - - /* process first result to retrive query information and type */ - res = sqlite3_step(vm); - numcols = sqlite3_column_count(vm); - - /* real query? if empty, must have numcols!=0 */ - if ((res == SQLITE_ROW) || ((res == SQLITE_DONE) && numcols)) - { - sqlite3_reset(vm); - return create_cursor(L, 1, conn, vm, numcols); - } - - if (res == SQLITE_DONE) /* and numcols==0, INSERT,UPDATE,DELETE statement */ - { - sqlite3_finalize(vm); - /* return number of columns changed */ - lua_pushnumber(L, sqlite3_changes(conn->sql_conn)); - return 1; - } - - /* error */ - errmsg = sqlite3_errmsg(sqlite3_db_handle(vm)); - sqlite3_finalize(vm); - lua_pushnil(L); - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - lua_concat(L, 2); - return 2; + conn_data *conn = getconnection(L); + const char *statement = luaL_checkstring(L, 2); + int res; + sqlite3_stmt *vm; + const char *errmsg; + int numcols; + const char *tail; + + res = sqlite3_prepare(conn->sql_conn, statement, -1, &vm, &tail); + if (res != SQLITE_OK) + { + errmsg = sqlite3_errmsg(conn->sql_conn); + lua_pushnil(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + lua_concat(L, 2); + return 2; + } + + /* process first result to retrive query information and type */ + res = sqlite3_step(vm); + numcols = sqlite3_column_count(vm); + + /* real query? if empty, must have numcols!=0 */ + if ((res == SQLITE_ROW) || ((res == SQLITE_DONE) && numcols)) + { + sqlite3_reset(vm); + return create_cursor(L, 1, conn, vm, numcols); + } + + if (res == SQLITE_DONE) /* and numcols==0, INSERT,UPDATE,DELETE statement */ + { + sqlite3_finalize(vm); + /* return number of columns changed */ + lua_pushnumber(L, sqlite3_changes(conn->sql_conn)); + return 1; + } + + /* error */ + errmsg = sqlite3_errmsg(conn->sql_conn); + sqlite3_finalize(vm); + lua_pushnil(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + lua_concat(L, 2); + return 2; } @@ -370,26 +397,26 @@ static int conn_execute(lua_State *L) */ static int conn_commit(lua_State *L) { - char *errmsg; - conn_data *conn = getconnection(L); - int res; - const char *sql = "COMMIT"; - - if (conn->auto_commit == 0) sql = "COMMIT;BEGIN"; - - res = sqlite3_exec(conn->sql_conn, sql, NULL, NULL, &errmsg); - - if (res != SQLITE_OK) - { - lua_pushnil(L); - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - sqlite3_free(errmsg); - lua_concat(L, 2); - return 2; + char *errmsg; + conn_data *conn = getconnection(L); + int res; + const char *sql = "COMMIT"; + + if (conn->auto_commit == 0) sql = "COMMIT;BEGIN"; + + res = sqlite3_exec(conn->sql_conn, sql, NULL, NULL, &errmsg); + + if (res != SQLITE_OK) + { + lua_pushnil(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + sqlite3_free(errmsg); + lua_concat(L, 2); + return 2; } - lua_pushboolean(L, 1); - return 1; + lua_pushboolean(L, 1); + return 1; } @@ -398,25 +425,25 @@ static int conn_commit(lua_State *L) */ static int conn_rollback(lua_State *L) { - char *errmsg; - conn_data *conn = getconnection(L); - int res; - const char *sql = "ROLLBACK"; - - if (conn->auto_commit == 0) sql = "ROLLBACK;BEGIN"; - - res = sqlite3_exec(conn->sql_conn, sql, NULL, NULL, &errmsg); - if (res != SQLITE_OK) - { - lua_pushnil(L); - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - sqlite3_free(errmsg); - lua_concat(L, 2); - return 2; + char *errmsg; + conn_data *conn = getconnection(L); + int res; + const char *sql = "ROLLBACK"; + + if (conn->auto_commit == 0) sql = "ROLLBACK;BEGIN"; + + res = sqlite3_exec(conn->sql_conn, sql, NULL, NULL, &errmsg); + if (res != SQLITE_OK) + { + lua_pushnil(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + sqlite3_free(errmsg); + lua_concat(L, 2); + return 2; } - lua_pushboolean(L, 1); - return 1; + lua_pushboolean(L, 1); + return 1; } static int conn_getlastautoid(lua_State *L) @@ -434,30 +461,30 @@ static int conn_getlastautoid(lua_State */ static int conn_setautocommit(lua_State *L) { - conn_data *conn = getconnection(L); - if (lua_toboolean(L, 2)) + conn_data *conn = getconnection(L); + if (lua_toboolean(L, 2)) + { + conn->auto_commit = 1; + /* undo active transaction - ignore errors */ + sqlite3_exec(conn->sql_conn, "ROLLBACK", NULL, NULL, NULL); + } + else { - conn->auto_commit = 1; - /* undo active transaction - ignore errors */ - sqlite3_exec(conn->sql_conn, "ROLLBACK", NULL, NULL, NULL); - } - else - { - char *errmsg; - int res; - conn->auto_commit = 0; - res = sqlite3_exec(conn->sql_conn, "BEGIN", NULL, NULL, &errmsg); - if (res != SQLITE_OK) + char *errmsg; + int res; + conn->auto_commit = 0; + res = sqlite3_exec(conn->sql_conn, "BEGIN", NULL, NULL, &errmsg); + if (res != SQLITE_OK) { - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - sqlite3_free(errmsg); - lua_concat(L, 2); - lua_error(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + sqlite3_free(errmsg); + lua_concat(L, 2); + lua_error(L); } - } - lua_pushboolean(L, 1); - return 1; + } + lua_pushboolean(L, 1); + return 1; } @@ -466,18 +493,18 @@ static int conn_setautocommit(lua_State */ static int create_connection(lua_State *L, int env, sqlite3 *sql_conn) { - conn_data *conn = (conn_data*)lua_newuserdata(L, sizeof(conn_data)); - luasql_setmeta(L, LUASQL_CONNECTION_SQLITE); + conn_data *conn = (conn_data*)lua_newuserdata(L, sizeof(conn_data)); + luasql_setmeta(L, LUASQL_CONNECTION_SQLITE); - /* fill in structure */ - conn->closed = 0; - conn->env = LUA_NOREF; - conn->auto_commit = 1; - conn->sql_conn = sql_conn; - conn->cur_counter = 0; - lua_pushvalue (L, env); - conn->env = luaL_ref (L, LUA_REGISTRYINDEX); - return 1; + /* fill in structure */ + conn->closed = 0; + conn->env = LUA_NOREF; + conn->auto_commit = 1; + conn->sql_conn = sql_conn; + conn->cur_counter = 0; + lua_pushvalue (L, env); + conn->env = luaL_ref (L, LUA_REGISTRYINDEX); + return 1; } @@ -486,24 +513,24 @@ static int create_connection(lua_State * */ static int env_connect(lua_State *L) { - const char *sourcename; - sqlite3 *conn; - const char *errmsg; - int res; - getenvironment(L); /* validate environment */ - sourcename = luaL_checkstring(L, 2); - res = sqlite3_open(sourcename, &conn); - if (res != SQLITE_OK) - { - errmsg = sqlite3_errmsg(conn); - lua_pushnil(L); - lua_pushliteral(L, LUASQL_PREFIX); - lua_pushstring(L, errmsg); - lua_concat(L, 2); - sqlite3_close(conn); - return 2; + const char *sourcename; + sqlite3 *conn; + const char *errmsg; + int res; + getenvironment(L); /* validate environment */ + sourcename = luaL_checkstring(L, 2); + res = sqlite3_open(sourcename, &conn); + if (res != SQLITE_OK) + { + errmsg = sqlite3_errmsg(conn); + lua_pushnil(L); + lua_pushliteral(L, LUASQL_PREFIX); + lua_pushstring(L, errmsg); + lua_concat(L, 2); + sqlite3_close(conn); + return 2; } - return create_connection(L, 1, conn); + return create_connection(L, 1, conn); } @@ -512,16 +539,16 @@ static int env_connect(lua_State *L) */ static int env_close (lua_State *L) { - env_data *env = (env_data *)luaL_checkudata(L, 1, LUASQL_ENVIRONMENT_SQLITE); - luaL_argcheck(L, env != NULL, 1, LUASQL_PREFIX"environment expected"); - if (env->closed) { - lua_pushboolean(L, 0); - return 1; - } - - env->closed = 1; - lua_pushboolean(L, 1); - return 1; + env_data *env = (env_data *)luaL_checkudata(L, 1, LUASQL_ENVIRONMENT_SQLITE); + luaL_argcheck(L, env != NULL, 1, LUASQL_PREFIX"environment expected"); + if (env->closed) { + lua_pushboolean(L, 0); + return 1; + } + + env->closed = 1; + lua_pushboolean(L, 1); + return 1; } @@ -531,32 +558,32 @@ static int env_close (lua_State *L) */ static void create_metatables (lua_State *L) { - struct luaL_reg environment_methods[] = { - {"close", env_close}, - {"connect", env_connect}, - {NULL, NULL}, - }; - struct luaL_reg connection_methods[] = { - {"close", conn_close}, - {"escape", conn_escape}, - {"execute", conn_execute}, - {"commit", conn_commit}, - {"rollback", conn_rollback}, - {"setautocommit", conn_setautocommit}, - {"getlastautoid", conn_getlastautoid}, - {NULL, NULL}, - }; - struct luaL_reg cursor_methods[] = { - {"close", cur_close}, - {"getcolnames", cur_getcolnames}, - {"getcoltypes", cur_getcoltypes}, - {"fetch", cur_fetch}, - {NULL, NULL}, - }; - luasql_createmeta(L, LUASQL_ENVIRONMENT_SQLITE, environment_methods); - luasql_createmeta(L, LUASQL_CONNECTION_SQLITE, connection_methods); - luasql_createmeta(L, LUASQL_CURSOR_SQLITE, cursor_methods); - lua_pop (L, 3); + struct luaL_reg environment_methods[] = { + {"close", env_close}, + {"connect", env_connect}, + {NULL, NULL}, + }; + struct luaL_reg connection_methods[] = { + {"close", conn_close}, + {"escape", conn_escape}, + {"execute", conn_execute}, + {"commit", conn_commit}, + {"rollback", conn_rollback}, + {"setautocommit", conn_setautocommit}, + {"getlastautoid", conn_getlastautoid}, + {NULL, NULL}, + }; + struct luaL_reg cursor_methods[] = { + {"close", cur_close}, + {"getcolnames", cur_getcolnames}, + {"getcoltypes", cur_getcoltypes}, + {"fetch", cur_fetch}, + {NULL, NULL}, + }; + luasql_createmeta(L, LUASQL_ENVIRONMENT_SQLITE, environment_methods); + luasql_createmeta(L, LUASQL_CONNECTION_SQLITE, connection_methods); + luasql_createmeta(L, LUASQL_CURSOR_SQLITE, cursor_methods); + lua_pop (L, 3); } /* @@ -564,12 +591,12 @@ static void create_metatables (lua_State */ static int create_environment (lua_State *L) { - env_data *env = (env_data *)lua_newuserdata(L, sizeof(env_data)); - luasql_setmeta(L, LUASQL_ENVIRONMENT_SQLITE); + env_data *env = (env_data *)lua_newuserdata(L, sizeof(env_data)); + luasql_setmeta(L, LUASQL_ENVIRONMENT_SQLITE); - /* fill in structure */ - env->closed = 0; - return 1; + /* fill in structure */ + env->closed = 0; + return 1; } @@ -579,12 +606,12 @@ static int create_environment (lua_State */ LUASQL_API int luaopen_luasql_sqlite3(lua_State *L) { - struct luaL_reg driver[] = { - {"sqlite3", create_environment}, - {NULL, NULL}, - }; - create_metatables (L); - luaL_openlib (L, LUASQL_TABLENAME, driver, 0); - luasql_set_info (L); - return 1; + struct luaL_reg driver[] = { + {"sqlite3", create_environment}, + {NULL, NULL}, + }; + create_metatables (L); + luaL_openlib (L, LUASQL_TABLENAME, driver, 0); + luasql_set_info (L); + return 1; }