src/evsql/util.c
branchnew-evsql
changeset 45 424ce5ab82fd
parent 44 9e76ee9729b6
child 48 8b019d191353
equal deleted inserted replaced
44:9e76ee9729b6 45:424ce5ab82fd
     3 
     3 
     4 #include "evsql.h"
     4 #include "evsql.h"
     5 #include "../lib/log.h"
     5 #include "../lib/log.h"
     6 #include "../lib/misc.h"
     6 #include "../lib/misc.h"
     7 
     7 
     8 #define _PARAM_TYPE_CASE(typenam) case EVSQL_PARAM_ ## typenam: return #typenam
     8 #define _PARAM_TYPE_CASE(typenam) case EVSQL_TYPE_ ## typenam: return #typenam
     9 
     9 
    10 #define _PARAM_VAL_BUF_MAX 120
    10 #define _PARAM_VAL_BUF_MAX 120
    11 #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
    11 #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
    12 
    12 
    13 const char *evsql_param_type (const struct evsql_query_param *param) {
    13 const char *evsql_item_type (const struct evsql_item_info *item_info) {
    14     switch (param->type) {
    14     switch (item_info->type) {
    15         _PARAM_TYPE_CASE (INVALID   );
    15         _PARAM_TYPE_CASE (INVALID   );
    16         _PARAM_TYPE_CASE (NULL_     );
    16         _PARAM_TYPE_CASE (NULL_     );
    17         _PARAM_TYPE_CASE (BINARY    );
    17         _PARAM_TYPE_CASE (BINARY    );
    18         _PARAM_TYPE_CASE (STRING    );
    18         _PARAM_TYPE_CASE (STRING    );
    19         _PARAM_TYPE_CASE (UINT16    );
    19         _PARAM_TYPE_CASE (UINT16    );
    22         default: return "???";
    22         default: return "???";
    23     }
    23     }
    24 }
    24 }
    25 
    25 
    26 
    26 
    27 static const char *evsql_param_val (const struct evsql_query_param *param) {
    27 static const char *evsql_item_val (const struct evsql_item *item) {
    28     static char buf[_PARAM_VAL_BUF_MAX];
    28     static char buf[_PARAM_VAL_BUF_MAX];
    29     int ret;
    29     int ret;
    30 
    30 
    31     switch (param->type) {
    31     switch (item->info.type) {
    32         _PARAM_VAL_CASE (INVALID,   "???"                               );
    32         _PARAM_VAL_CASE (INVALID,   "???"                               );
    33         _PARAM_VAL_CASE (NULL_,     "(null)"                            );
    33         _PARAM_VAL_CASE (NULL_,     "(null)"                            );
    34         _PARAM_VAL_CASE (BINARY,    "%zu:%s",   param->length, "..."    );
    34         _PARAM_VAL_CASE (BINARY,    "%zu:%s",   item->length, "... "    );
    35         _PARAM_VAL_CASE (STRING,    "%s",       param->data_raw         );
    35         _PARAM_VAL_CASE (STRING,    "%s",       item->bytes             );
    36         _PARAM_VAL_CASE (UINT16,    "%hu",      (unsigned short int)     ntohs(param->data.uint16)  );
    36         _PARAM_VAL_CASE (UINT16,    "%hu",      (unsigned short int)     ntohs(item->value.uint16)  );
    37         _PARAM_VAL_CASE (UINT32,    "%lu",      (unsigned long int)      ntohl(param->data.uint32)  );
    37         _PARAM_VAL_CASE (UINT32,    "%lu",      (unsigned long int)      ntohl(item->value.uint32)  );
    38         _PARAM_VAL_CASE (UINT64,    "%llu",     (unsigned long long int) ntohq(param->data.uint64)  );
    38         _PARAM_VAL_CASE (UINT64,    "%llu",     (unsigned long long int) ntohq(item->value.uint64)  );
    39         default: return "???";
    39         default: return "???";
    40     }
    40     }
    41 
    41 
    42     return buf;
    42     return buf;
    43 }
    43 }
    44 
    44 
    45 int evsql_params_clear (struct evsql_query_params *params) {
    45 int evsql_params_clear (struct evsql_query_params *params) {
    46     struct evsql_query_param *param;
    46     struct evsql_item *param;
    47 
    47 
    48     for (param = params->list; param->type; param++) 
    48     for (param = params->list; param->info.type; param++) 
    49         param->data_raw = NULL;
    49         param->bytes = NULL;
    50 
    50 
    51     return 0;
    51     return 0;
    52 }
    52 }
    53 
    53 
    54 int evsql_param_null   (struct evsql_query_params *params, size_t param) {
    54 int evsql_param_null (struct evsql_query_params *params, size_t param) {
    55     struct evsql_query_param *p = &params->list[param];
    55     struct evsql_item *p = &params->list[param];
    56 
    56 
    57     p->data_raw = NULL;
    57     p->bytes = NULL;
       
    58     p->flags.has_value = 0;
    58 
    59 
    59     return 0;
    60     return 0;
    60 }
    61 }
    61 
    62 
    62 int evsql_param_binary (struct evsql_query_params *params, size_t param, const char *ptr, size_t len) {
    63 int evsql_param_binary (struct evsql_query_params *params, size_t param, const char *ptr, size_t len) {
    63     struct evsql_query_param *p = &params->list[param];
    64     struct evsql_item *p = &params->list[param];
    64     
    65     
    65     assert(p->type == EVSQL_PARAM_BINARY);
    66     assert(p->info.type == EVSQL_TYPE_BINARY);
    66 
    67 
    67     p->data_raw = ptr;
    68     p->bytes = ptr;
    68     p->length = len;
    69     p->length = len;
    69 
    70 
    70     return 0;
    71     return 0;
    71 }
    72 }
    72 
    73 
    73 int evsql_param_string (struct evsql_query_params *params, size_t param, const char *ptr) {
    74 int evsql_param_string (struct evsql_query_params *params, size_t param, const char *ptr) {
    74     struct evsql_query_param *p = &params->list[param];
    75     struct evsql_item *p = &params->list[param];
    75     
    76     
    76     assert(p->type == EVSQL_PARAM_STRING);
    77     assert(p->info.type == EVSQL_TYPE_STRING);
    77 
    78 
    78     p->data_raw = ptr;
    79     p->bytes = ptr;
    79     p->length = 0;
    80     p->length = 0;
    80 
    81 
    81     return 0;
    82     return 0;
    82 }
    83 }
    83 
    84 
    84 int evsql_param_uint16 (struct evsql_query_params *params, size_t param, uint16_t uval) {
    85 int evsql_param_uint16 (struct evsql_query_params *params, size_t param, uint16_t uval) {
    85     struct evsql_query_param *p = &params->list[param];
    86     struct evsql_item *p = &params->list[param];
    86     
    87     
    87     assert(p->type == EVSQL_PARAM_UINT16);
    88     assert(p->info.type == EVSQL_TYPE_UINT16);
    88 
    89 
    89     p->data.uint16 = htons(uval);
    90     p->value.uint16 = htons(uval);
    90     p->data_raw = (const char *) &p->data.uint16;
       
    91     p->length = sizeof(uval);
    91     p->length = sizeof(uval);
       
    92     p->flags.has_value = 1;
    92 
    93 
    93     return 0;
    94     return 0;
    94 }
    95 }
    95 
    96 
    96 int evsql_param_uint32 (struct evsql_query_params *params, size_t param, uint32_t uval) {
    97 int evsql_param_uint32 (struct evsql_query_params *params, size_t param, uint32_t uval) {
    97     struct evsql_query_param *p = &params->list[param];
    98     struct evsql_item *p = &params->list[param];
    98     
    99     
    99     assert(p->type == EVSQL_PARAM_UINT32);
   100     assert(p->info.type == EVSQL_TYPE_UINT32);
   100 
   101 
   101     p->data.uint32 = htonl(uval);
   102     p->value.uint32 = htonl(uval);
   102     p->data_raw = (const char *) &p->data.uint32;
       
   103     p->length = sizeof(uval);
   103     p->length = sizeof(uval);
       
   104     p->flags.has_value = 1;
   104 
   105 
   105     return 0;
   106     return 0;
   106 }
   107 }
   107 
   108 
   108 void evsql_query_debug (const char *sql, const struct evsql_query_params *params) {
   109 void evsql_query_debug (const char *sql, const struct evsql_query_params *params) {
   109     const struct evsql_query_param *param;
   110     const struct evsql_item *param;
   110     size_t param_count = 0, idx = 0;
   111     size_t param_count = 0, idx = 0;
   111 
   112 
   112     // count the params
   113     // count the params
   113     for (param = params->list; param->type; param++) 
   114     for (param = params->list; param->info.type; param++) 
   114         param_count++;
   115         param_count++;
   115     
   116     
   116     DEBUG("sql:     %s", sql);
   117     DEBUG("sql:     %s", sql);
   117     DEBUG("params:  %zu", param_count);
   118     DEBUG("params:  %zu", param_count);
   118 
   119 
   119     for (param = params->list; param->type; param++) {
   120     for (param = params->list; param->info.type; param++) {
   120         DEBUG("\t%2zu : %8s = %s", ++idx, evsql_param_type(param), evsql_param_val(param));
   121         DEBUG("\t%2zu : %8s = %s", ++idx, evsql_item_type(&param->info), evsql_item_val(param));
   121     }
   122     }
   122 }
   123 }
   123 
   124 
   124 int evsql_result_binary (const struct evsql_result *res, size_t row, size_t col, const char **ptr, size_t *size, int nullok) {
   125 int evsql_result_binary (const struct evsql_result *res, size_t row, size_t col, const char **ptr, size_t *size, int nullok) {
   125     *ptr = NULL;
   126     *ptr = NULL;