コード例 #1
0
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;
}
コード例 #2
0
ファイル: hashmap.c プロジェクト: 9beckert/TIR
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;
  }
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
0
ファイル: rdb_mysql.c プロジェクト: oeigenbrod/genometools
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;
}
コード例 #6
0
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;
}