--- a/src/util.c Sun Mar 08 01:16:54 2009 +0200
+++ b/src/util.c Sun Mar 08 01:33:45 2009 +0200
@@ -5,13 +5,13 @@
#include "lib/log.h"
#include "lib/misc.h"
-#define _PARAM_TYPE_CASE(typenam) case EVSQL_PARAM_ ## typenam: return #typenam
+#define _PARAM_TYPE_CASE(typenam) case EVSQL_TYPE_ ## typenam: return #typenam
#define _PARAM_VAL_BUF_MAX 120
-#define _PARAM_VAL_CASE(typenam, ...) case EVSQL_PARAM_ ## typenam: if (param->data_raw) ret = snprintf(buf, _PARAM_VAL_BUF_MAX, __VA_ARGS__); else return "(null)"; break
+#define _PARAM_VAL_CASE(typenam, ...) case EVSQL_TYPE_ ## typenam: if (item->bytes) ret = snprintf(buf, _PARAM_VAL_BUF_MAX, __VA_ARGS__); else return "(null)"; break
-const char *evsql_param_type (const struct evsql_query_param *param) {
- switch (param->type) {
+const char *evsql_item_type (const struct evsql_item_info *item_info) {
+ switch (item_info->type) {
_PARAM_TYPE_CASE (INVALID );
_PARAM_TYPE_CASE (NULL_ );
_PARAM_TYPE_CASE (BINARY );
@@ -24,18 +24,18 @@
}
-static const char *evsql_param_val (const struct evsql_query_param *param) {
+static const char *evsql_item_val (const struct evsql_item *item) {
static char buf[_PARAM_VAL_BUF_MAX];
int ret;
- switch (param->type) {
+ switch (item->info.type) {
_PARAM_VAL_CASE (INVALID, "???" );
_PARAM_VAL_CASE (NULL_, "(null)" );
- _PARAM_VAL_CASE (BINARY, "%zu:%s", param->length, "..." );
- _PARAM_VAL_CASE (STRING, "%s", param->data_raw );
- _PARAM_VAL_CASE (UINT16, "%hu", (unsigned short int) ntohs(param->data.uint16) );
- _PARAM_VAL_CASE (UINT32, "%lu", (unsigned long int) ntohl(param->data.uint32) );
- _PARAM_VAL_CASE (UINT64, "%llu", (unsigned long long int) ntohq(param->data.uint64) );
+ _PARAM_VAL_CASE (BINARY, "%zu:%s", item->length, "... " );
+ _PARAM_VAL_CASE (STRING, "%s", item->bytes );
+ _PARAM_VAL_CASE (UINT16, "%hu", (unsigned short int) ntohs(item->value.uint16) );
+ _PARAM_VAL_CASE (UINT32, "%lu", (unsigned long int) ntohl(item->value.uint32) );
+ _PARAM_VAL_CASE (UINT64, "%llu", (unsigned long long int) ntohq(item->value.uint64) );
default: return "???";
}
@@ -43,132 +43,91 @@
}
int evsql_params_clear (struct evsql_query_params *params) {
- struct evsql_query_param *param;
+ struct evsql_item *param;
- for (param = params->list; param->type; param++)
- param->data_raw = NULL;
+ for (param = params->list; param->info.type; param++) {
+ param->bytes = NULL;
+ param->flags.has_value = 0;
+ }
return 0;
}
-int evsql_param_null (struct evsql_query_params *params, size_t param) {
- struct evsql_query_param *p = ¶ms->list[param];
+int evsql_param_null (struct evsql_query_params *params, size_t param) {
+ struct evsql_item *p = ¶ms->list[param];
- p->data_raw = NULL;
+ p->bytes = NULL;
+ p->flags.has_value = 0;
return 0;
}
int evsql_param_binary (struct evsql_query_params *params, size_t param, const char *ptr, size_t len) {
- struct evsql_query_param *p = ¶ms->list[param];
+ struct evsql_item *p = ¶ms->list[param];
- assert(p->type == EVSQL_PARAM_BINARY);
+ assert(p->info.type == EVSQL_TYPE_BINARY);
- p->data_raw = ptr;
+ p->bytes = ptr;
p->length = len;
return 0;
}
int evsql_param_string (struct evsql_query_params *params, size_t param, const char *ptr) {
- struct evsql_query_param *p = ¶ms->list[param];
+ struct evsql_item *p = ¶ms->list[param];
- assert(p->type == EVSQL_PARAM_STRING);
+ assert(p->info.type == EVSQL_TYPE_STRING);
+
+ // XXX: hmm...
+ p->info.format = EVSQL_FMT_TEXT;
- p->data_raw = ptr;
+ p->bytes = ptr;
p->length = 0;
return 0;
}
int evsql_param_uint16 (struct evsql_query_params *params, size_t param, uint16_t uval) {
- struct evsql_query_param *p = ¶ms->list[param];
+ struct evsql_item *p = ¶ms->list[param];
- assert(p->type == EVSQL_PARAM_UINT16);
+ assert(p->info.type == EVSQL_TYPE_UINT16);
- p->data.uint16 = htons(uval);
- p->data_raw = (const char *) &p->data.uint16;
+ p->value.uint16 = htons(uval);
p->length = sizeof(uval);
+ p->flags.has_value = 1;
return 0;
}
int evsql_param_uint32 (struct evsql_query_params *params, size_t param, uint32_t uval) {
- struct evsql_query_param *p = ¶ms->list[param];
+ struct evsql_item *p = ¶ms->list[param];
- assert(p->type == EVSQL_PARAM_UINT32);
+ assert(p->info.type == EVSQL_TYPE_UINT32);
- p->data.uint32 = htonl(uval);
- p->data_raw = (const char *) &p->data.uint32;
+ p->value.uint32 = htonl(uval);
p->length = sizeof(uval);
+ p->flags.has_value = 1;
return 0;
}
void evsql_query_debug (const char *sql, const struct evsql_query_params *params) {
- const struct evsql_query_param *param;
+ const struct evsql_item *param;
size_t param_count = 0, idx = 0;
// count the params
- for (param = params->list; param->type; param++)
+ for (param = params->list; param->info.type; param++)
param_count++;
DEBUG("sql: %s", sql);
DEBUG("params: %zu", param_count);
- for (param = params->list; param->type; param++) {
- DEBUG("\t%2zu : %8s = %s", ++idx, evsql_param_type(param), evsql_param_val(param));
+ for (param = params->list; param->info.type; param++) {
+ DEBUG("\t%2zu : %8s = %s", ++idx, evsql_item_type(¶m->info), evsql_item_val(param));
}
}
-const char *evsql_result_error (const struct evsql_result_info *res) {
- if (!res->error)
- return "No error";
-
- switch (res->evsql->type) {
- case EVSQL_EVPQ:
- if (!res->result.pq)
- return "unknown error (no result)";
-
- return PQresultErrorMessage(res->result.pq);
-
- default:
- FATAL("res->evsql->type");
- }
-
-}
-
-size_t evsql_result_rows (const struct evsql_result_info *res) {
- switch (res->evsql->type) {
- case EVSQL_EVPQ:
- return PQntuples(res->result.pq);
-
- default:
- FATAL("res->evsql->type");
- }
-}
-
-size_t evsql_result_cols (const struct evsql_result_info *res) {
- switch (res->evsql->type) {
- case EVSQL_EVPQ:
- return PQnfields(res->result.pq);
-
- default:
- FATAL("res->evsql->type");
- }
-}
-
-size_t evsql_result_affected (const struct evsql_result_info *res) {
- switch (res->evsql->type) {
- case EVSQL_EVPQ:
- return strtol(PQcmdTuples(res->result.pq), NULL, 10);
-
- default:
- FATAL("res->evsql->type");
- }
-}
-
-int evsql_result_binary (const struct evsql_result_info *res, size_t row, size_t col, const char **ptr, size_t *size, int nullok) {
+int evsql_result_binary (const struct evsql_result *res, size_t row, size_t col, const char **ptr, size_t *size, bool nullok) {
*ptr = NULL;
switch (res->evsql->type) {
@@ -196,7 +155,7 @@
return -1;
}
-int evsql_result_binlen (const struct evsql_result_info *res, size_t row, size_t col, const char **ptr, size_t size, int nullok) {
+int evsql_result_binlen (const struct evsql_result *res, size_t row, size_t col, const char **ptr, size_t size, int nullok) {
size_t real_size = 0;
if (evsql_result_binary(res, row, col, ptr, &real_size, nullok))
@@ -216,7 +175,7 @@
return -1;
}
-int evsql_result_string (const struct evsql_result_info *res, size_t row, size_t col, const char **ptr, int nullok) {
+int evsql_result_string (const struct evsql_result *res, size_t row, size_t col, const char **ptr, int nullok) {
size_t real_size;
if (evsql_result_binary(res, row, col, ptr, &real_size, nullok))
@@ -230,7 +189,7 @@
return -1;
}
-int evsql_result_uint16 (const struct evsql_result_info *res, size_t row, size_t col, uint16_t *uval, int nullok) {
+int evsql_result_uint16 (const struct evsql_result *res, size_t row, size_t col, uint16_t *uval, int nullok) {
const char *data;
int16_t sval;
@@ -253,7 +212,7 @@
return nullok ? 0 : -1;
}
-int evsql_result_uint32 (const struct evsql_result_info *res, size_t row, size_t col, uint32_t *uval, int nullok) {
+int evsql_result_uint32 (const struct evsql_result *res, size_t row, size_t col, uint32_t *uval, int nullok) {
const char *data;
int32_t sval;
@@ -276,7 +235,7 @@
return nullok ? 0 : -1;
}
-int evsql_result_uint64 (const struct evsql_result_info *res, size_t row, size_t col, uint64_t *uval, int nullok) {
+int evsql_result_uint64 (const struct evsql_result *res, size_t row, size_t col, uint64_t *uval, int nullok) {
const char *data;
int64_t sval;
@@ -299,16 +258,6 @@
return nullok ? 0 : -1;
}
-void evsql_result_free (const struct evsql_result_info *res) {
- switch (res->evsql->type) {
- case EVSQL_EVPQ:
- return PQclear(res->result.pq);
-
- default:
- FATAL("res->evsql->type");
- }
-}
-
const char *evsql_conn_error (struct evsql_conn *conn) {
switch (conn->evsql->type) {
case EVSQL_EVPQ: