# HG changeset patch # User nrich@ii.net # Date 1228100200 0 # Node ID 06eb2850703f7762f3739aacf3dc51916030e7da # Parent 0b805fda1c9123bfdd02fe8db180c411b8435278 Bugfix: fix connection in DBD.SQLite3.New Improve handling for booleans accross DB types diff -r 0b805fda1c91 -r 06eb2850703f dbd/mysql/statement.c --- a/dbd/mysql/statement.c Sat Nov 29 06:38:16 2008 +0000 +++ b/dbd/mysql/statement.c Mon Dec 01 02:56:40 2008 +0000 @@ -90,6 +90,7 @@ const char *str = NULL; size_t *str_len = NULL; double *num = NULL; + int *boolean = NULL; switch(type) { case LUA_TNIL: @@ -97,13 +98,22 @@ bind[i].is_null = (my_bool*)1; break; + case LUA_TBOOLEAN: + boolean = (int *)malloc(sizeof(int)); + *boolean = lua_toboolean(L, p); + bind[i].buffer_type = MYSQL_TYPE_LONG; + bind[i].is_null = (my_bool*)0; + bind[i].buffer = (char *)boolean; + bind[i].length = 0; + break; + case LUA_TNUMBER: /* * num needs to be it's own * memory here */ num = (double *)malloc(sizeof(double)); - *num = luaL_checknumber(L, p); + *num = lua_tonumber(L, p); bind[i].buffer_type = MYSQL_TYPE_DOUBLE; bind[i].is_null = (my_bool*)0; @@ -113,7 +123,7 @@ case LUA_TSTRING: str_len = malloc(sizeof(size_t)); - str = luaL_checklstring(L, p, str_len); + str = lua_tolstring(L, p, str_len); bind[i].buffer_type = MYSQL_TYPE_STRING; bind[i].is_null = (my_bool*)0; @@ -151,7 +161,7 @@ * extended with other types they * will need to be added here */ - if (bind[i].buffer_type == MYSQL_TYPE_DOUBLE) { + if (bind[i].buffer_type == MYSQL_TYPE_DOUBLE || bind[i].buffer_type == MYSQL_TYPE_LONG) { if (bind[i].buffer) free(bind[i].buffer); } else if (bind[i].buffer_type == MYSQL_TYPE_STRING) { diff -r 0b805fda1c91 -r 06eb2850703f dbd/postgresql/statement.c --- a/dbd/postgresql/statement.c Sat Nov 29 06:38:16 2008 +0000 +++ b/dbd/postgresql/statement.c Mon Dec 01 02:56:40 2008 +0000 @@ -132,7 +132,7 @@ ExecStatusType status; int p; - char **params; + const char **params; PGresult *result = NULL; statement->tuple = 0; @@ -148,14 +148,17 @@ if (lua_isnil(L, p)) { params[i] = NULL; } else { - const char *param = lua_tostring(L, p); - size_t len = strlen(param) + 1; - - params[i] = malloc(len * sizeof(char)); - memset(params[i], 0, len); - - strncpy(params[i], param, len); - params[i][len] = '\0'; + if (lua_isboolean(L, p)) + /* + * boolean values in postgresql can either be + * t/f or 1/0. Pass integer values rather than + * strings to maintain semantic compatibility + * with other DBD drivers that pass booleans + * as integers. + */ + params[i] = lua_toboolean(L, p) ? "1" : "0"; + else + params[i] = lua_tostring(L, p); } } @@ -169,14 +172,6 @@ 0 ); - /* - * free string array - */ - for (p = 0; p < num_bind_params; p++) { - if (params[p]) { - free(params[p]); - } - } free(params); if (!result) { @@ -240,6 +235,7 @@ /* * data is returned as strings from PSQL + * convert them here into Lua types */ if (lua_push == LUA_PUSH_NIL) { diff -r 0b805fda1c91 -r 06eb2850703f dbd/sqlite3/connection.c --- a/dbd/sqlite3/connection.c Sat Nov 29 06:38:16 2008 +0000 +++ b/dbd/sqlite3/connection.c Mon Dec 01 02:56:40 2008 +0000 @@ -12,8 +12,8 @@ connection_t *conn = NULL; /* db */ - switch (n) { - case 1: + switch(n) { + default: if (lua_isnil(L, 1) == 0) db = luaL_checkstring(L, 1); } diff -r 0b805fda1c91 -r 06eb2850703f dbd/sqlite3/statement.c --- a/dbd/sqlite3/statement.c Sat Nov 29 06:38:16 2008 +0000 +++ b/dbd/sqlite3/statement.c Mon Dec 01 02:56:40 2008 +0000 @@ -92,20 +92,29 @@ for (p = 2; p <= n; p++) { int i = p - 1; - if (lua_isnil(L, p)) { - if (sqlite3_bind_null(statement->stmt, i) != SQLITE_OK) { - err = 1; - } - } else if (lua_isnumber(L, p)) { - if (sqlite3_bind_double(statement->stmt, i, luaL_checknumber(L, p)) != SQLITE_OK) { - err = 1; - } - } else if (lua_isstring(L, p)) { - if (sqlite3_bind_text(statement->stmt, i, luaL_checkstring(L, p), -1, SQLITE_STATIC) != SQLITE_OK) { - err = 1; - } + int type = lua_type(L, p); + + switch(type) { + case LUA_TNIL: + err = sqlite3_bind_null(statement->stmt, i) != SQLITE_OK; + break; + case LUA_TNUMBER: + err = sqlite3_bind_double(statement->stmt, i, lua_tonumber(L, p)) != SQLITE_OK; + break; + case LUA_TSTRING: + err = sqlite3_bind_text(statement->stmt, i, lua_tostring(L, p), -1, SQLITE_STATIC) != SQLITE_OK; + break; + case LUA_TBOOLEAN: + err = sqlite3_bind_int(statement->stmt, i, lua_toboolean(L, p)) != SQLITE_OK; + break; + default: + /* + * Unknown/unsupported value type + */ + err = 1; } + if (err) break; }