Added a new type to allow NULL values to be part of queries

This commit is contained in:
Pierre Pronchery 2012-11-30 01:23:53 +01:00
parent 95c60145ef
commit 9f5531ac71
4 changed files with 27 additions and 5 deletions

View File

@ -27,7 +27,8 @@
/* types */ /* types */
typedef enum _DatabaseType typedef enum _DatabaseType
{ {
DT_INTEGER = 0, DT_NULL = 0,
DT_INTEGER,
DT_TIMESTAMP, DT_TIMESTAMP,
DT_VARCHAR DT_VARCHAR
} DatabaseType; } DatabaseType;

View File

@ -25,6 +25,7 @@
#include "database.h" #include "database.h"
#include "../../config.h" #include "../../config.h"
/* constants */
#ifndef PREFIX #ifndef PREFIX
# define PREFIX "/usr/local" # define PREFIX "/usr/local"
#endif #endif

View File

@ -257,6 +257,11 @@ static int _pgsql_prepare_query(PgSQL * pgsql, PgSQLStatement * statement,
v[cnt] = NULL; v[cnt] = NULL;
switch(type) 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: case DT_INTEGER:
l = va_arg(args, int); l = va_arg(args, int);
snprintf(buf, sizeof(buf), "%d", l); snprintf(buf, sizeof(buf), "%d", l);
@ -277,13 +282,16 @@ static int _pgsql_prepare_query(PgSQL * pgsql, PgSQLStatement * statement,
break; break;
case DT_VARCHAR: case DT_VARCHAR:
s = va_arg(args, char const *); 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", ret = -error_set_code(1, "%s",
strerror(errno)); strerror(errno));
break; break;
default: default:
ret = -error_set_code(1, "%s", ret = -error_set_code(1, "%s (%d)",
strerror(ENOSYS)); "Unsupported type", type);
break; break;
} }
#ifdef DEBUG #ifdef DEBUG

View File

@ -190,6 +190,13 @@ static int _sqlite3_prepare_query(SQLite3 * sqlite3,
} }
switch(type) 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: case DT_INTEGER:
l = va_arg(args, int); l = va_arg(args, int);
#ifdef DEBUG #ifdef DEBUG
@ -221,7 +228,12 @@ static int _sqlite3_prepare_query(SQLite3 * sqlite3,
sqlite3->handle)); sqlite3->handle));
break; break;
case DT_VARCHAR: 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 #ifdef DEBUG
fprintf(stderr, "DEBUG: %s() %s=\"%s\" (%d)\n", fprintf(stderr, "DEBUG: %s() %s=\"%s\" (%d)\n",
__func__, name, s, i); __func__, name, s, i);