GtHashmap* gt_hashmap_new(GtHashType keyhashtype, GtFree keyfree, GtFree valuefree) { struct hm_freefuncs *ff = gt_malloc(sizeof (*ff)); ff->keyfree = keyfree; ff->valuefree = valuefree; switch (keyhashtype) { case GT_HASH_DIRECT: { HashElemInfo hm_directkey_eleminfo = { gt_ht_ptr_elem_hash, { .free_elem_with_data = hm_elem_free }, sizeof (struct map_entry), gt_ht_ptr_elem_cmp, ff, gt_free_func }; return (GtHashmap*) gt_hashtable_new(hm_directkey_eleminfo); } case GT_HASH_STRING: { HashElemInfo hm_strkey_eleminfo = { gt_ht_cstr_elem_hash, { .free_elem_with_data = hm_elem_free }, sizeof (struct map_entry), gt_ht_cstr_elem_cmp, ff, gt_free_func }; return (GtHashmap*) gt_hashtable_new(hm_strkey_eleminfo); } default: gt_assert(0); } return NULL; /* for stupid compilers nagging too much */ }
static GtRDBStmt* gt_rdb_mysql_prepare(GtRDB *rdb, const char *query, GtUword num_params, GtError *err) { GtRDBStmt *st = NULL; GtRDBStmtMySQL *stm = NULL; GtRDBMySQL *rdbm; int had_err = 0, retval = 0; /* we need these to keep track of result/parameter and string buffers */ HashElemInfo str_buffer_hash = { gt_ht_ptr_elem_hash, { free_str }, sizeof (GtStr*), gt_ht_ptr_elem_cmp, NULL, NULL }, buffer_hash = { gt_ht_ptr_elem_hash, { free_buf }, sizeof (void*), gt_ht_ptr_elem_cmp, NULL, NULL }; MYSQL_STMT *tmp = NULL; gt_assert(rdb && query); gt_error_check(err); rdbm = gt_rdb_mysql_cast(rdb); tmp = mysql_stmt_init(&rdbm->conn); if ((retval = mysql_stmt_prepare(tmp, query, strlen(query)))) { gt_error_set(err, GT_MYSQL_ERRMSG, retval, mysql_stmt_error(tmp)); had_err = -1; } if (!had_err) { int param_count; param_count = mysql_stmt_param_count(tmp); if (param_count != num_params) { gt_error_set(err, "invalid parameter count: "GT_WU" expected, %d given", num_params, param_count); mysql_stmt_close(tmp); had_err = -1; } } if (!had_err) { st = gt_rdb_stmt_create(gt_rdb_stmt_mysql_class()); stm = gt_rdb_stmt_mysql_cast(st); stm->num_params = num_params; stm->query = gt_str_new_cstr(query); stm->buffers = gt_hashtable_new(buffer_hash); stm->returned_strings = gt_hashtable_new(str_buffer_hash); stm->stmt = tmp; stm->update_maxlengths = true; stm->params = gt_calloc(num_params, sizeof (MYSQL_BIND)); mysql_stmt_attr_set(tmp, STMT_ATTR_UPDATE_MAX_LENGTH, &stm->update_maxlengths); memset(stm->params, 0, num_params*sizeof (MYSQL_BIND)); stm->conn = &rdbm->conn; } return st; }