| 5359 | } |
| 5360 | |
| 5361 | int cdb2_bind_index(cdb2_hndl_tp *hndl, int index, int type, |
| 5362 | const void *varaddr, int length) |
| 5363 | { |
| 5364 | if (log_calls) |
| 5365 | fprintf(stderr, "%p> cdb2_bind_index(%p, %d, %s, %p, %d)\n", |
| 5366 | (void *)pthread_self(), hndl, index, cdb2_type_str(type), |
| 5367 | varaddr, length); |
| 5368 | |
| 5369 | if (index <= 0) { |
| 5370 | sprintf(hndl->errstr, "%s: bind index starts at value 1", __func__); |
| 5371 | return -1; |
| 5372 | } |
| 5373 | hndl->n_bindvars++; |
| 5374 | hndl->bindvars = realloc(hndl->bindvars, sizeof(CDB2SQLQUERY__Bindvalue *) * |
| 5375 | hndl->n_bindvars); |
| 5376 | CDB2SQLQUERY__Bindvalue *bindval = malloc(sizeof(CDB2SQLQUERY__Bindvalue)); |
| 5377 | cdb2__sqlquery__bindvalue__init(bindval); |
| 5378 | bindval->type = type; |
| 5379 | bindval->varname = NULL; |
| 5380 | bindval->value.data = (void *)varaddr; |
| 5381 | bindval->value.len = length; |
| 5382 | bindval->has_index = 1; |
| 5383 | bindval->index = index; |
| 5384 | if (length == 0) { |
| 5385 | /* See comments in cdb2_bind_param(). */ |
| 5386 | bindval->has_isnull = 1; |
| 5387 | bindval->isnull = (varaddr == NULL); |
| 5388 | if (type == CDB2_CSTRING && !bindval->isnull) { |
| 5389 | bindval->value.data = (unsigned char *)""; |
| 5390 | bindval->value.len = 1; |
| 5391 | } |
| 5392 | } |
| 5393 | hndl->bindvars[hndl->n_bindvars - 1] = bindval; |
| 5394 | |
| 5395 | return 0; |
| 5396 | } |
| 5397 | |
| 5398 | |
| 5399 | /* cdb2_bind_array -- bind c array to a parameter name |