Bugfix: fix connection in DBD.SQLite3.New

Mon, 01 Dec 2008 02:56:40 +0000

author
nrich@ii.net
date
Mon, 01 Dec 2008 02:56:40 +0000
changeset 9
06eb2850703f
parent 8
0b805fda1c91
child 10
3aa8a37a3dd8

Bugfix: fix connection in DBD.SQLite3.New

Improve handling for booleans accross DB types

dbd/mysql/statement.c file | annotate | diff | comparison | revisions
dbd/postgresql/statement.c file | annotate | diff | comparison | revisions
dbd/sqlite3/connection.c file | annotate | diff | comparison | revisions
dbd/sqlite3/statement.c file | annotate | diff | comparison | revisions
--- 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) {
--- 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) {
--- 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);
     }
--- 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;
     }   

mercurial