From 9f5531ac71c4865f2be0c3c7affc89e3d4d10ce5 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 30 Nov 2012 01:23:53 +0100 Subject: [PATCH] Added a new type to allow NULL values to be part of queries --- include/Database/database.h | 3 ++- src/engines/pdo.c | 1 + src/engines/pgsql.c | 14 +++++++++++--- src/engines/sqlite3.c | 14 +++++++++++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/include/Database/database.h b/include/Database/database.h index 7591103..6745585 100644 --- a/include/Database/database.h +++ b/include/Database/database.h @@ -27,7 +27,8 @@ /* types */ typedef enum _DatabaseType { - DT_INTEGER = 0, + DT_NULL = 0, + DT_INTEGER, DT_TIMESTAMP, DT_VARCHAR } DatabaseType; diff --git a/src/engines/pdo.c b/src/engines/pdo.c index a65e27f..bfae8b2 100644 --- a/src/engines/pdo.c +++ b/src/engines/pdo.c @@ -25,6 +25,7 @@ #include "database.h" #include "../../config.h" +/* constants */ #ifndef PREFIX # define PREFIX "/usr/local" #endif diff --git a/src/engines/pgsql.c b/src/engines/pgsql.c index a5ab83c..1595e0e 100644 --- a/src/engines/pgsql.c +++ b/src/engines/pgsql.c @@ -257,6 +257,11 @@ static int _pgsql_prepare_query(PgSQL * pgsql, PgSQLStatement * statement, v[cnt] = NULL; switch(type) { + case DT_NULL: + if((v[cnt] = va_arg(args, void *)) != NULL) + ret = -error_set_code(1, "%s", + strerror(EINVAL)); + break; case DT_INTEGER: l = va_arg(args, int); snprintf(buf, sizeof(buf), "%d", l); @@ -277,13 +282,16 @@ static int _pgsql_prepare_query(PgSQL * pgsql, PgSQLStatement * statement, break; case DT_VARCHAR: s = va_arg(args, char const *); - if(s != NULL && (v[cnt] = strdup(s)) == NULL) + if(s == NULL) + ret = -error_set_code(1, "%s", + strerror(EINVAL)); + else if((v[cnt] = strdup(s)) == NULL) ret = -error_set_code(1, "%s", strerror(errno)); break; default: - ret = -error_set_code(1, "%s", - strerror(ENOSYS)); + ret = -error_set_code(1, "%s (%d)", + "Unsupported type", type); break; } #ifdef DEBUG diff --git a/src/engines/sqlite3.c b/src/engines/sqlite3.c index f301245..c0ba6f0 100644 --- a/src/engines/sqlite3.c +++ b/src/engines/sqlite3.c @@ -190,6 +190,13 @@ static int _sqlite3_prepare_query(SQLite3 * sqlite3, } switch(type) { + case DT_NULL: + if((s = va_arg(args, void *)) != NULL) + ret = -error_set_code(1, "%s", + strerror(EINVAL)); + else + sqlite3_bind_null(statement->stmt, i); + break; case DT_INTEGER: l = va_arg(args, int); #ifdef DEBUG @@ -221,7 +228,12 @@ static int _sqlite3_prepare_query(SQLite3 * sqlite3, sqlite3->handle)); break; case DT_VARCHAR: - s = va_arg(args, char const *); + if((s = va_arg(args, char const *)) == NULL) + { + ret = -error_set_code(1, "%s", + strerror(EINVAL)); + break; + } #ifdef DEBUG fprintf(stderr, "DEBUG: %s() %s=\"%s\" (%d)\n", __func__, name, s, i);