static int gt_rdb_stmt_mysql_bind_string(GtRDBStmt *st, GtUword param_no, const char *val, GT_UNUSED GtError *err) { GtRDBStmtMySQL *stm; int had_err = 0; char *str; GtUword *length; gt_assert(st); gt_error_check(err); stm = gt_rdb_stmt_mysql_cast(st); gt_assert(param_no < stm->num_params); /* allocate buffer for string until execution */ str = gt_calloc(strlen(val)+1, sizeof (char)); strncpy(str, val, strlen(val)); gt_hashtable_add(stm->buffers, &str); /* allocate space for length */ length = gt_malloc(sizeof (GtUword)); *length = strlen(str); gt_hashtable_add(stm->buffers, &length); /* fill param structure */ stm->params[param_no].buffer_type = MYSQL_TYPE_STRING; stm->params[param_no].buffer = str; stm->params[param_no].is_null = 0; stm->params[param_no].buffer_length = strlen(str); stm->params[param_no].length = length; return had_err; }
void gt_hashmap_add(GtHashmap *hm, void *key, void *value) { struct map_entry keyvalpair = { key, value }; if (!gt_hashtable_add((GtHashtable*) hm, &keyvalpair)) { ((struct map_entry *)gt_hashtable_get((GtHashtable*) hm, &keyvalpair)) ->value = value; } }
static int gt_rdb_stmt_mysql_bind_int(GtRDBStmt *st, GtUword param_no, int val, GT_UNUSED GtError *err) { GtRDBStmtMySQL *stm; int *lval, had_err = 0; gt_assert(st); gt_error_check(err); stm = gt_rdb_stmt_mysql_cast(st); gt_assert(param_no < stm->num_params); lval = gt_malloc(sizeof (int)); *lval = val; gt_hashtable_add(stm->buffers, &lval); stm->params[param_no].buffer_type = MYSQL_TYPE_LONG; stm->params[param_no].buffer = (char*) lval; stm->params[param_no].is_null = 0; stm->params[param_no].length = 0; return had_err; }
static int gt_rdb_stmt_mysql_bind_double(GtRDBStmt *st, GtUword param_no, double val, GT_UNUSED GtError *err) { GtRDBStmtMySQL *stm; int had_err = 0; double *lval; gt_assert(st); gt_error_check(err); stm = gt_rdb_stmt_mysql_cast(st); gt_assert(param_no < stm->num_params); lval = gt_malloc(sizeof (double)); *lval = val; gt_hashtable_add(stm->buffers, &lval); stm->params[param_no].buffer_type = MYSQL_TYPE_DOUBLE; stm->params[param_no].is_unsigned = false; stm->params[param_no].buffer = (char*) lval; stm->params[param_no].is_null = 0; stm->params[param_no].length = 0; return had_err; }
static int gt_rdb_stmt_mysql_bind_ulong(GtRDBStmt *st, unsigned long param_no, unsigned long val, GT_UNUSED GtError *err) { GtRDBStmtMySQL *stm; unsigned long *lval; int had_err = 0; gt_assert(st); gt_error_check(err); stm = gt_rdb_stmt_mysql_cast(st); gt_assert(param_no < stm->num_params); lval = gt_malloc(sizeof (unsigned long)); *lval = val; gt_hashtable_add(stm->buffers, &lval); stm->params[param_no].buffer_type = MYSQL_TYPE_LONG; stm->params[param_no].is_unsigned = true; stm->params[param_no].buffer = (char*) lval; stm->params[param_no].is_null = 0; stm->params[param_no].length = 0; return had_err; }
static int gt_rdb_stmt_mysql_exec(GtRDBStmt *st, GtError *err) { GtRDBStmtMySQL *stm; int rval, had_err = 0, num_fields; MYSQL_RES *meta_res = NULL; gt_assert(st); gt_error_check(err); stm = gt_rdb_stmt_mysql_cast(st); if (!stm->executed) { if (stm->num_params > 0) { gt_assert(stm->stmt && stm->params); if ((rval = mysql_stmt_bind_param(stm->stmt, stm->params))) { gt_error_set(err, GT_MYSQL_ERRMSG, rval, mysql_stmt_error(stm->stmt)); had_err = -1; } } if (!had_err && (rval = mysql_stmt_execute(stm->stmt))) { gt_error_set(err, GT_MYSQL_ERRMSG, rval, mysql_stmt_error(stm->stmt)); had_err = -1; } if (!had_err) { stm->executed = true; if (mysql_stmt_store_result(stm->stmt)) { gt_error_set(err, GT_MYSQL_ERRMSG, had_err, mysql_stmt_error(stm->stmt)); had_err = -1; } meta_res = mysql_stmt_result_metadata(stm->stmt); if (!had_err && meta_res) { int i = 0; /* statement returned a result */ num_fields = mysql_num_fields(meta_res); stm->results = gt_calloc(num_fields, sizeof (MYSQL_BIND)); /* prepare result buffers for each field */ for (i=0;i<num_fields;i++) { MYSQL_FIELD *field; field = mysql_fetch_field(meta_res); stm->results[i].buffer_type = field->type; switch (field->type) { case MYSQL_TYPE_DOUBLE: {double *dbl = gt_calloc(1, sizeof (double)); gt_hashtable_add(stm->buffers, &dbl); stm->results[i].buffer_length = sizeof (double); stm->results[i].buffer = dbl;} break; case MYSQL_TYPE_LONG: case MYSQL_TYPE_INT24: {int *l = gt_calloc(1, sizeof (int)); gt_hashtable_add(stm->buffers, &l); stm->results[i].is_unsigned = false; stm->results[i].buffer_length = sizeof (int); stm->results[i].buffer = l;} case MYSQL_TYPE_SHORT: {short int *l = gt_calloc(1, sizeof (short int)); gt_hashtable_add(stm->buffers, &l); stm->results[i].is_unsigned = false; stm->results[i].buffer_length = sizeof (short int); stm->results[i].buffer = l;} case MYSQL_TYPE_TINY: {signed char *l = gt_calloc(1, sizeof (signed char)); gt_hashtable_add(stm->buffers, &l); stm->results[i].is_unsigned = false; stm->results[i].buffer_length = sizeof (signed char); stm->results[i].buffer = l;} break; case MYSQL_TYPE_STRING: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_BLOB: case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BIT: {char *str = gt_calloc(field->max_length+1, sizeof (char)); gt_hashtable_add(stm->buffers, &str); GtUword *length = gt_calloc(1, sizeof (GtUword)); gt_hashtable_add(stm->buffers, &length); stm->results[i].buffer = str; stm->results[i].buffer_length = field->max_length; stm->results[i].length = length;} break; default: /* unsupported data type */ break; } } if (!had_err) mysql_stmt_bind_result(stm->stmt, stm->results); mysql_free_result(meta_res); } else { return 1; } } } if (!had_err) { switch ((rval = mysql_stmt_fetch(stm->stmt))) { case 0: default: break; case MYSQL_NO_DATA: had_err = 1; /* last row read */ break; case 1: gt_error_set(err, GT_MYSQL_ERRMSG, mysql_stmt_errno(stm->stmt), mysql_stmt_error(stm->stmt)); had_err = -1; break; } } return had_err; }