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 = ¶ms->list[param]; |
55 struct evsql_item *p = ¶ms->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 = ¶ms->list[param]; |
64 struct evsql_item *p = ¶ms->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 = ¶ms->list[param]; |
75 struct evsql_item *p = ¶ms->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 = ¶ms->list[param]; |
86 struct evsql_item *p = ¶ms->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 = ¶ms->list[param]; |
98 struct evsql_item *p = ¶ms->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(¶m->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; |