82 // initialize params |
82 // initialize params |
83 _evsql_query_params_init_pq(&query->params, count, params->result_format); |
83 _evsql_query_params_init_pq(&query->params, count, params->result_format); |
84 |
84 |
85 // transform |
85 // transform |
86 for (param = params->list, idx = 0; param->info.type; param++, idx++) { |
86 for (param = params->list, idx = 0; param->info.type; param++, idx++) { |
87 // `set for NULLs, otherwise not |
87 // set for NULLs, otherwise not |
88 query->params.types[idx] = param->bytes ? 0 : EVSQL_PQ_ARBITRARY_TYPE_OID; |
88 query->params.types[idx] = (param->bytes || param->flags.has_value) ? 0 : EVSQL_PQ_ARBITRARY_TYPE_OID; |
89 |
89 |
90 // scalar values |
90 // scalar values |
91 query->params.item_vals[idx] = param->value; |
91 query->params.item_vals[idx] = param->value; |
92 |
92 |
93 // values |
93 // values |
94 // point this at the value stored in the item_vals union if flagged as such |
94 // point this at the value stored in the item_vals union if flagged as such |
95 query->params.values[idx] = param->flags.has_value ? (const char *) &query->params.item_vals[idx] : param->bytes; |
95 query->params.values[idx] = param->flags.has_value ? (const char *) &query->params.item_vals[idx] : param->bytes; |
96 |
96 |
97 // lengths |
97 // lengths |
98 query->params.lengths[idx] = param->length; |
98 query->params.lengths[idx] = param->length; |
99 |
99 |
100 // formats, binary if length is nonzero, but text for NULLs |
100 // XXX: this assumes that format is FMT_BINARY... |
101 query->params.formats[idx] = param->length && param->bytes ? 1 : 0; |
101 query->params.formats[idx] = param->info.format; |
102 } |
102 } |
103 |
103 |
104 // execute it |
104 // execute it |
105 if (_evsql_query_enqueue(evsql, trans, query, command)) |
105 if (_evsql_query_enqueue(evsql, trans, query, command)) |
106 goto error; |
106 goto error; |