Example #1
0
static bool database_free_result(database_handler_t* handler)
{
	if (mysql_stmt_free_result(handler->stmt))
	{
		if (mysql_stmt_errno(handler->stmt) == CR_SERVER_GONE_ERROR)
		{
			debug_log("try to reopen mysql\n");
			if (!database_handler_reopen(handler))
			{
				error_log("reopen failure:%d,%s\n", mysql_stmt_errno(handler->stmt), mysql_stmt_error(handler->stmt));
				return false;
			}
			debug_log("reopen success\n");
			if (mysql_stmt_free_result(handler->stmt))
			{
				error_log("mysql_stmt_free_result error:%d,%s\n", mysql_stmt_errno(handler->stmt), mysql_stmt_error(handler->stmt));
				return false;
			}
			return true;
		}
		error_log("mysql_stmt_free_result error:%d,%s\n", mysql_stmt_errno(handler->stmt), mysql_stmt_error(handler->stmt));
		return false;
	}
	return true;
}
Example #2
0
static int
table_mysql_check(int service, const char *key)
{
	MYSQL_STMT	*stmt;
	int		 r, s;

	stmt = table_mysql_query(key, service);
	if (stmt == NULL)
		return (-1);

	r = -1;
	s = mysql_stmt_fetch(stmt);

	if (s == 0)
		r = 1;
	else if (s == MYSQL_NO_DATA)
		r = 0;
	else
		log_warnx("warn: table-mysql: mysql_stmt_fetch: %s",
		    mysql_stmt_error(stmt));

	if (mysql_stmt_free_result(stmt))
		log_warnx("warn: table-mysql: mysql_stmt_free_result: %s",
		    mysql_stmt_error(stmt));

	return (r);
}
Example #3
0
static void
on_cursor_close (GSQLCursor *cursor, gpointer user_data)
{
	GSQL_TRACE_FUNC;
	GSQLEMySQLCursor  *e_cursor;
	GSQLEMySQLVariable *var;
	gint i;
	
	g_return_if_fail (GSQL_IS_CURSOR(cursor));
	
	if (cursor->spec != NULL)
	{
		e_cursor = (GSQLEMySQLCursor *)cursor->spec;
		
		if (e_cursor->statement)
		{
			mysql_stmt_free_result(e_cursor->statement);
			mysql_stmt_close(e_cursor->statement);
		}
		
		g_free (e_cursor->binds);
		g_free (e_cursor);
	}
	
}
Example #4
0
bool database::get_oauth_user(char *access_token, int *OAuthUserID, int *UserID,
                              int *expires_at) {
  MYSQL_STMT *stmt;
  MYSQL_BIND pbind[1];
  memset(pbind, 0, sizeof(pbind));

  bool result = false;

  pbind[0].buffer_type = MYSQL_TYPE_STRING;
  pbind[0].buffer = (char *)access_token;
  pbind[0].buffer_length = strnlen(access_token, 512);

  const char sql[] =
      "SELECT  t.user_id, c.parent_id, t.expires_at FROM "
      "`supla_oauth_access_tokens` AS t, `supla_oauth_clients` AS c WHERE c.id "
      "= t.client_id AND c.parent_id != 0 AND t.expires_at > "
      "UNIX_TIMESTAMP(NOW()) AND t.scope = 'restapi' AND token = ? LIMIT 1";

  if (stmt_execute((void **)&stmt, sql, pbind, 1, true)) {
    mysql_stmt_store_result(stmt);

    if (mysql_stmt_num_rows(stmt) > 0) {
      MYSQL_BIND rbind[3];
      memset(rbind, 0, sizeof(rbind));

      int _OAuthUserID, _UserID, _expires_at;

      rbind[0].buffer_type = MYSQL_TYPE_LONG;
      rbind[0].buffer = (char *)&_OAuthUserID;

      rbind[1].buffer_type = MYSQL_TYPE_LONG;
      rbind[1].buffer = (char *)&_UserID;

      rbind[2].buffer_type = MYSQL_TYPE_LONG;
      rbind[2].buffer = (char *)&_expires_at;

      if (mysql_stmt_bind_result(stmt, rbind)) {
        supla_log(LOG_ERR, "MySQL - stmt bind error - %s",
                  mysql_stmt_error(stmt));

      } else if (mysql_stmt_fetch(stmt) == 0) {
        if (OAuthUserID != NULL) *OAuthUserID = _OAuthUserID;

        if (UserID != NULL) *UserID = _UserID;

        if (expires_at != NULL) {
          *expires_at = _expires_at;
        }

        result = true;
      }
    }

    mysql_stmt_free_result(stmt);
    mysql_stmt_close(stmt);
  }

  return result;
}
Example #5
0
Statement::~Statement() {
	if (_resultWasStored) { 
		mysql_stmt_free_result(_stmt);
	}
	mysql_stmt_close(_stmt);
	ClearParameters();
	ClearResults();
}
Example #6
0
axStatus	axDBConn_MySQL::beginTran			() { 
	if( lastExecStmt_ ) {
		mysql_stmt_free_result( lastExecStmt_ );
	}
	lastExecStmt_ = NULL;

	return _directExec( "START TRANSACTION;");
}
Example #7
0
void PreparedResultSet::CleanUp() {
	/// More of the in our code allocated sources are deallocated by the poorly documented mysql c api
	if (m_res)
		mysql_free_result(m_res);

	FreeBindBuffer();
	mysql_stmt_free_result(m_stmt);

	delete[] m_rBind;
}
Example #8
0
void Statement::ResetParameters() { 
	while (! _params.empty()) {
		ParamBuffer *buf = _params.back();
		_params.pop_back();
		delete buf;
	}	

	mysql_stmt_reset(_stmt);
	mysql_stmt_free_result(_stmt);
	_eof = true;
}
Example #9
0
void PreparedResultSet::cleanUp()
{
    /// More of the in our code allocated sources are deallocated by the poorly documented mysql c api
    if (m_res)
        mysql_free_result(m_res);

    freeBindBuffer();
    mysql_stmt_free_result(m_stmt);

    MM_CHECKOUT(m_rBind);
}
Example #10
0
void mysql_statement::clear()
{
  for (int i = 0; i < host_size; ++i) {
    if (host_array[i].buffer) {
      delete [] static_cast<char*>(host_array[i].buffer);
    }
  }
  result_size = 0;
  host_size = 0;
  mysql_stmt_free_result(stmt);
  delete [] host_array;
}
Example #11
0
std::vector<int> DBManager::check_jobs() {
	std::vector<int> job_ids;

	char *stmt_str = "SELECT id FROM wkdd_ldp_jobs WHERE status = 'pending' ORDER BY start_time ASC";
	MYSQL_BIND result[1];
	int my_job_id;

	if (mysql_stmt_prepare(m_stmt, stmt_str, strlen(stmt_str)) != 0) {
		print_stmt_error("could not prepare select statement");
		return job_ids;
	}
	
	if (mysql_stmt_field_count(m_stmt) != 1) {
		print_stmt_error("unexpected column count from select");
		return job_ids;
	}
	
	// initialize result column structures
	memset((void *)result, 0, sizeof(result)); // zero the structures
	
	// set up my_id parameter
	result[0].buffer_type = MYSQL_TYPE_LONG;
	result[0].buffer = (void *) &my_job_id;
	result[0].is_unsigned = 0;
	result[0].is_null = 0;
	
	if (mysql_stmt_bind_result(m_stmt, result) != 0) {
		print_stmt_error("could not bind parameters for select");
		return job_ids;
	}
	
	if (mysql_stmt_execute(m_stmt) != 0) {
		print_stmt_error("could not execute select");
		return job_ids;
	}
	
	// fetch result set into client memory; this is optional, but it allows mysql_stmt_num_rows() to be called to determine the number of rows in the result set
	if (mysql_stmt_store_result(m_stmt) != 0) {
		print_stmt_error("could not buffer result set");
		return job_ids;
	}
	
	while (mysql_stmt_fetch(m_stmt) == 0) {  // fetch each row
		// store into vector
		job_ids.push_back(my_job_id);
	}
	
	// deallocate result set
	mysql_stmt_free_result(m_stmt);
	
	return job_ids;
}
Example #12
0
void MysqlResultSet_free(T *R) {
	assert(R && *R);
        for (int i = 0; i < (*R)->columnCount; i++)
                FREE((*R)->columns[i].buffer);
        mysql_stmt_free_result((*R)->stmt);
        if ((*R)->keep == false)
                mysql_stmt_close((*R)->stmt);
        if ((*R)->meta)
                mysql_free_result((*R)->meta);
        FREE((*R)->columns);
        FREE((*R)->bind);
	FREE(*R);
}
Example #13
0
void MysqlPreparedStatement_free(T *P) {
	assert(P && *P);
        FREE((*P)->bind);
        mysql_stmt_free_result((*P)->stmt);
#if MYSQL_VERSION_ID >= 50503
        /* In case the statement returns multiple result sets or in a stored procedure case,
         think it does, we need to run them down. mysql_stmt_reset does not seem to work here. */
        while (mysql_stmt_next_result((*P)->stmt) == 0);
#endif
        mysql_stmt_close((*P)->stmt);
        FREE((*P)->params);
	FREE(*P);
}
int sqlite3_finalize(mysqlite3_stmt* pStmt)
{
    if (pStmt)
    {
        if (pStmt->sql)
        {
            free(pStmt->sql);
        }
        
        if (pStmt->mystmt)
        {
            mysql_stmt_free_result(pStmt->mystmt);
            mysql_stmt_close(pStmt->mystmt);

        }
        
        int i;
        for (i=0; i < pStmt->nparams; i++)
        {
            // Need to clean up buffers
            if (pStmt->myparams[i].buffer)
            {
                free(pStmt->myparams[i].buffer);
            }
            
            if (pStmt->results && pStmt->results[i].buffer)
            {
                free(pStmt->results[i].buffer);
            }
        }
        
        if (pStmt->lengths) {
            free(pStmt->lengths);
        }
        
        if (pStmt->results) {
            free(pStmt->results);
        }
        
        if (pStmt->myparams)
        {
            free(pStmt->myparams);
        }
        
        mysql_free_result(pStmt->myres);
        
        free(pStmt);
    }
    return 0;
};
Example #15
0
void my_res_free(db_res_t* res, struct my_res* payload)
{
	struct my_cmd* mcmd;

	mcmd = DB_GET_PAYLOAD(res->cmd);

	if (mcmd->st && mysql_stmt_free_result(mcmd->st)) {
		ERR("mysql: Error while freeing MySQL result: %d, %s\n",
			mysql_stmt_errno(mcmd->st), mysql_stmt_error(mcmd->st));
	}

	db_drv_free(&payload->gen);
	pkg_free(payload);
}
Example #16
0
int my_cmd_next(db_res_t* res)
{
	int ret;
	struct my_cmd* mcmd;

	mcmd = DB_GET_PAYLOAD(res->cmd);
	if (mcmd->next_flag == 2 || mcmd->next_flag == -2) return 1;

	if (mcmd->st == NULL) {
		ERR("mysql: Prepared statement not found\n");
		return -1;
	}

	ret = mysql_stmt_fetch(mcmd->st);
	
	if (ret == MYSQL_NO_DATA) {
		mcmd->next_flag =  mcmd->next_flag<0?-2:2;
		return 1;
	}
	/* MYSQL_DATA_TRUNCATED is only defined in mysql >= 5.0 */
#if defined MYSQL_DATA_TRUNCATED
	if (ret == MYSQL_DATA_TRUNCATED) {
		int i;
		ERR("mysql: mysql_stmt_fetch, data truncated, fields: %d\n", res->cmd->result_count);
		for (i = 0; i < res->cmd->result_count; i++) {
			if (mcmd->st->bind[i].error /*&& mcmd->st->bind[i].buffer_length*/) {
				ERR("mysql: truncation, bind %d, length: %lu, buffer_length: %lu\n", 
					i, *(mcmd->st->bind[i].length), mcmd->st->bind[i].buffer_length);
			}
		}
		ret = 0;
	}
#endif
	if (mcmd->next_flag <= 0) {
		mcmd->next_flag++;
	}
	if (ret != 0) {
		ERR("mysql: Error in mysql_stmt_fetch (ret=%d): %s\n", ret, mysql_stmt_error(mcmd->st));
		return -1;
	}

	if (update_result(res->cmd->result, mcmd->st) < 0) {
		mysql_stmt_free_result(mcmd->st);
		return -1;
	}

	res->cur_rec->fld = res->cmd->result;
	return 0;
}
Example #17
0
static void gt_rdb_stmt_mysql_delete(GtRDBStmt *st)
{
  GtRDBStmtMySQL *stm;
  if (!st) return;
  stm = gt_rdb_stmt_mysql_cast(st);
  if (stm->stmt) {
    mysql_stmt_free_result(stm->stmt);
    mysql_stmt_close(stm->stmt);
  }
  gt_free(stm->params);
  gt_free(stm->results);
  gt_hashtable_delete(stm->buffers);
  gt_hashtable_delete(stm->returned_strings);
  gt_str_delete(stm->query);
}
Example #18
0
SqlPreparedStatement::~SqlPreparedStatement()
{
	if (mResultMetadata != nullptr)
	{
		mysql_free_result(mResultMetadata);
		mResultMetadata = nullptr;
	}
	mResultFields.Clear();

	if (mSTMT != nullptr)
	{
		mysql_stmt_free_result(mSTMT);
		mysql_stmt_close(mSTMT);
		mSTMT = nullptr;
	}

}
json::Node PreparedQueryBase::_fetchResults( void ){
    // If we don't have any result binders, just return null.
    if( m_resultsSize == 0 ){
        return json::Node( JSON_NULL );
    }

    // We have results to fetch, so lets fetch them!
    json::Node results( JSON_ARRAY );
    int res = 0;
    while( (res = mysql_stmt_fetch( m_statement )), !res || res == MYSQL_DATA_TRUNCATED ){
        results.push_back( _resultRowToJSONArray() );
    }

    // Free up the results in the MySQL library now.
    mysql_stmt_free_result( m_statement );

    return results;
}
void freeResultset(struct driverMySQL_preparedresultset* rs)
{

  if (rs == NULL)
    return;

  freeMetaInfo(rs->metaInfo,rs->returnFields);
  freeBind(rs->bindResult,rs->returnFields);

  if ( rs->statement != NULL )
    {
      mysql_stmt_free_result(rs->statement); 
      mysql_stmt_close(rs->statement);
    }

  free(rs);
  rs = NULL;
  return;
}
Example #21
0
/* this may be called manually or during GC */
static void rb_mysql_result_free_result(mysql2_result_wrapper * wrapper) {
  if (!wrapper) return;

  if (wrapper->resultFreed != 1) {
    if (wrapper->stmt_wrapper) {
      if (!wrapper->stmt_wrapper->closed) {
        mysql_stmt_free_result(wrapper->stmt_wrapper->stmt);

        /* MySQL BUG? If the statement handle was previously used, and so
         * mysql_stmt_bind_result was called, and if that result set and bind buffers were freed,
         * MySQL still thinks the result set buffer is available and will prefetch the
         * first result in mysql_stmt_execute. This will corrupt or crash the program.
         * By setting bind_result_done back to 0, we make MySQL think that a result set
         * has never been bound to this statement handle before to prevent the prefetch.
         */
        wrapper->stmt_wrapper->stmt->bind_result_done = 0;
      }

      if (wrapper->statement != Qnil) {
        decr_mysql2_stmt(wrapper->stmt_wrapper);
      }

      if (wrapper->result_buffers) {
        unsigned int i;
        for (i = 0; i < wrapper->numberOfFields; i++) {
          if (wrapper->result_buffers[i].buffer) {
            xfree(wrapper->result_buffers[i].buffer);
          }
        }
        xfree(wrapper->result_buffers);
        xfree(wrapper->is_null);
        xfree(wrapper->error);
        xfree(wrapper->length);
      }
      /* Clue that the next statement execute will need to allocate a new result buffer. */
      wrapper->result_buffers = NULL;
    }
    /* FIXME: this may call flush_use_result, which can hit the socket */
    /* For prepared statements, wrapper->result is the result metadata */
    mysql_free_result(wrapper->result);
    wrapper->resultFreed = 1;
  }
}
Example #22
0
int mysql_drv_free_results(db_result_set_t *rs)
{
#ifdef HAVE_PS
  /* Is this a result set of a prepared statement */
  if (rs->statement != NULL && rs->statement->emulated == 0)
  {
    DEBUG("mysql_stmt_free_result(%p)", rs->statement->ptr);
    return mysql_stmt_free_result(rs->statement->ptr);
  }
#endif

  if (rs->ptr != NULL)
  {
    DEBUG("mysql_free_result(%p)", rs->ptr);
    mysql_free_result((MYSQL_RES *)rs->ptr);
    return 0;
  }

  return 1;
}
Example #23
0
static int gt_rdb_stmt_mysql_reset(GtRDBStmt *st, GtError *err)
{
  GtRDBStmtMySQL *stm;
  int rval, had_err = 0;
  gt_assert(st);
  gt_error_check(err);
  stm = gt_rdb_stmt_mysql_cast(st);
  gt_hashtable_reset(stm->buffers);
  gt_hashtable_reset(stm->returned_strings);
  mysql_stmt_free_result(stm->stmt);
  if ((rval = mysql_stmt_reset(stm->stmt))) {
    gt_error_set(err, GT_MYSQL_ERRMSG, rval, mysql_stmt_error(stm->stmt));
    had_err = -1;
  }
  memset(stm->params, 0, stm->num_params*sizeof (MYSQL_BIND));
  gt_free(stm->results);
  stm->results = NULL;
  if (!had_err)
    stm->executed = false;
  return had_err;
}
Example #24
0
/*
 * Selects inode from database with given inode and gen number.
 *
 * Return: 0 on success, -1 on error
 * Return: inode information copied into result
 */
int
sam_db_inode_select(
	sam_db_context_t *con,
	sam_id_t id,
	sam_db_inode_t *result)
{
	int err;
	MYSQL_STMT *stmt;
	MYSQL_BIND bind[2];
	MYSQL_BIND bind_result[10];

	memset(bind, 0, sizeof (bind));
	memset(bind_result, 0, sizeof (bind_result));

	SAMDB_BIND(bind[0], id.ino, MYSQL_TYPE_LONG, TRUE);
	SAMDB_BIND(bind[1], id.gen, MYSQL_TYPE_LONG, TRUE);
	bind_inode(bind_result, result, TRUE);

	if ((stmt = sam_db_execute_sql(con, bind,
	    bind_result, INO_SELECT)) == NULL) {
		Trace(TR_ERR, "Error selecting inode %d.%d", id.ino, id.gen);
		return (-1);
	}

	if ((err = mysql_stmt_fetch(stmt)) != 0) {
		if (err == MYSQL_NO_DATA) {
			return (MYSQL_NO_DATA);
		}
		Trace(TR_ERR, "Error fetching inode %d.%d: %s", id.ino, id.gen,
		    mysql_error(con->mysql));
		return (-1);
	}

	if (mysql_stmt_free_result(stmt) != 0) {
		Trace(TR_ERR, "Error freeing result: %s",
		    mysql_error(con->mysql));
	}

	return (0);
}
Example #25
0
bool SqlPreparedStatement::Prepare()
{
	auto sql = Sql();
	mSTMT = mysql_stmt_init(Sql());
	if (mSTMT == nullptr)
	{
		throw SqlException(sql, "Error in SqlPreparedStatement::mysql_stmt_init");
	}

	if (mysql_stmt_prepare(mSTMT, mStatement.c_str(), (ulong)mStatement.Length()) != 0)
	{
		SqlException e(mSTMT, "Error in SqlPreparedStatement::mysql_stmt_prepare");
		mysql_stmt_free_result(mSTMT);
		mysql_stmt_close(mSTMT);
		throw e;
	}

	mParamterCount = mysql_stmt_param_count(mSTMT);
	mResultCount = mysql_stmt_field_count(mSTMT);
	if (mResultCount!=0)
	{
		if ((mResultMetadata = mysql_stmt_result_metadata(mSTMT)) == NULL)
		{
			throw SqlException(mSTMT, "Error in SqlPreparedStatement::mysql_stmt_result_metadata");
		}

		MYSQL_FIELD* field = nullptr;
		while ((field = mysql_fetch_field(mResultMetadata)) != nullptr)
		{
			mResultFields.Add(field);
		}
	}

	
	
	return true;
}
Example #26
0
DBJob DBManager::get_job(const int& id) {
	DBJob data;

	char *stmt_str = "SELECT term, type FROM wkdd_ldp_jobs WHERE id = ?";
	MYSQL_BIND param[1];
	MYSQL_BIND result[2];
	int my_job_id;
	int my_type;
	char my_term[2000];
	unsigned long my_term_length;

	if (mysql_stmt_prepare(m_stmt, stmt_str, strlen(stmt_str)) != 0) {
		print_stmt_error("could not prepare select statement");
		return data;
	}
	
	if (mysql_stmt_field_count(m_stmt) != 2) {
		print_stmt_error("unexpected column count from select");
		return data;
	}
	
	// initialize result column structures
	memset((void *)param, 0, sizeof(param));
	memset((void *)result, 0, sizeof(result)); // zero the structures
	
	// set up my_id parameter
	param[0].buffer_type = MYSQL_TYPE_LONG;
	param[0].buffer = (void *) &my_job_id;
	param[0].is_unsigned = 0;
	param[0].is_null = 0;
	
	// set up my_term parameter
	result[0].buffer_type = MYSQL_TYPE_STRING;
	result[0].buffer = (void *) &my_term;
	result[0].buffer_length = sizeof(my_term);
	result[0].length = &my_term_length;
	result[0].is_null = 0;
	
	// set up my_type parameter
	result[1].buffer_type = MYSQL_TYPE_LONG;
	result[1].buffer = (void *) &my_type;
	result[1].is_unsigned = 0;
	result[1].is_null = 0;
	
	if (mysql_stmt_bind_param(m_stmt, param) != 0) {
		print_stmt_error("could not bind parameters for select");
		return data;
	}
	
	if (mysql_stmt_bind_result(m_stmt, result) != 0) {
		print_stmt_error("could not bind parameters for select");
		return data;
	}
	
	// set variable
	my_job_id = id;
	
	if (mysql_stmt_execute(m_stmt) != 0) {
		print_stmt_error("could not execute select");
		return data;
	}
	
	// fetch result set into client memory; this is optional, but it allows mysql_stmt_num_rows() to be called to determine the number of rows in the result set
	if (mysql_stmt_store_result(m_stmt) != 0) {
		print_stmt_error("could not buffer result set");
		return data;
	}
	
	mysql_stmt_fetch(m_stmt);  // fetch the single result
	data = DBJob(my_term, my_type);
	
	// deallocate result set
	mysql_stmt_free_result(m_stmt);
	
	return data;
}
Example #27
0
/*
 * the new order transaction
 */
int neword( int t_num,
	    int w_id_arg,		/* warehouse id */
	    int d_id_arg,		/* district id */
	    int c_id_arg,		/* customer id */
	    int o_ol_cnt_arg,	        /* number of items */
	    int o_all_local_arg,	/* are all order lines local */
	    int itemid[],		/* ids of items to be ordered */
	    int supware[],		/* warehouses supplying items */
	    int qty[]		        /* quantity of each item */
)
{

	int            w_id = w_id_arg;
	int            d_id = d_id_arg;
	int            c_id = c_id_arg;
	int            o_ol_cnt = o_ol_cnt_arg;
	int            o_all_local = o_all_local_arg;
	float           c_discount;
	char            c_last[17];
	char            c_credit[3];
	float           w_tax;
	int            d_next_o_id;
	float           d_tax;
	char            datetime[81];
	int            o_id;
	char            i_name[25];
	float           i_price;
	char            i_data[51];
	int            ol_i_id;
	int            s_quantity;
	char            s_data[51];
	char            s_dist_01[25];
	char            s_dist_02[25];
	char            s_dist_03[25];
	char            s_dist_04[25];
	char            s_dist_05[25];
	char            s_dist_06[25];
	char            s_dist_07[25];
	char            s_dist_08[25];
	char            s_dist_09[25];
	char            s_dist_10[25];
	char            ol_dist_info[25];
	int            ol_supply_w_id;
	float           ol_amount;
	int            ol_number;
	int            ol_quantity;

	char            iname[MAX_NUM_ITEMS][MAX_ITEM_LEN];
	char            bg[MAX_NUM_ITEMS];
	float           amt[MAX_NUM_ITEMS];
	float           price[MAX_NUM_ITEMS];
	int            stock[MAX_NUM_ITEMS];
	float           total = 0.0;

	int            min_num;
	int            i,j,tmp,swp;
	int            ol_num_seq[MAX_NUM_ITEMS];

	int             proceed = 0;

	MYSQL_STMT*   mysql_stmt;
        MYSQL_BIND    param[9];
	MYSQL_BIND    column[12];

	/* EXEC SQL WHENEVER NOT FOUND GOTO sqlerr;*/
	/* EXEC SQL WHENEVER SQLERROR GOTO sqlerr;*/

	/*EXEC SQL CONTEXT USE :ctx[t_num];*/

        gettimestamp(datetime, STRFTIME_FORMAT, TIMESTAMP_LEN);

	proceed = 1;
	/*EXEC_SQL SELECT c_discount, c_last, c_credit, w_tax
		INTO :c_discount, :c_last, :c_credit, :w_tax
	        FROM customer, warehouse
	        WHERE w_id = :w_id 
		AND c_w_id = w_id 
		AND c_d_id = :d_id 
		AND c_id = :c_id;*/
	mysql_stmt = stmt[t_num][0];

	memset(param, 0, sizeof(MYSQL_BIND) * 3); /* initialize */
	param[0].buffer_type = MYSQL_TYPE_LONG;
	param[0].buffer = &w_id;
	param[1].buffer_type = MYSQL_TYPE_LONG;
	param[1].buffer = &d_id;
	param[2].buffer_type = MYSQL_TYPE_LONG;
	param[2].buffer = &c_id;
	if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
	if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;

	if( mysql_stmt_store_result(mysql_stmt) ) goto sqlerr;
	memset(column, 0, sizeof(MYSQL_BIND) * 4); /* initialize */
	column[0].buffer_type = MYSQL_TYPE_FLOAT;
	column[0].buffer = &c_discount;
	column[1].buffer_type = MYSQL_TYPE_STRING;
	column[1].buffer = c_last;
	column[1].buffer_length = sizeof(c_last);
	column[2].buffer_type = MYSQL_TYPE_STRING;
	column[2].buffer = c_credit;
	column[2].buffer_length = sizeof(c_credit);
	column[3].buffer_type = MYSQL_TYPE_FLOAT;
	column[3].buffer = &w_tax;
	if( mysql_stmt_bind_result(mysql_stmt, column) ) goto sqlerr;
	switch( mysql_stmt_fetch(mysql_stmt) ) {
	    case 0: //SUCCESS
	    case MYSQL_DATA_TRUNCATED:
		break;
	    case 1: //ERROR
	    case MYSQL_NO_DATA: //NO MORE DATA
	    default:
		mysql_stmt_free_result(mysql_stmt);
		goto sqlerr;
	}
	mysql_stmt_free_result(mysql_stmt);


#ifdef DEBUG
	printf("n %d\n",proceed);
#endif

	proceed = 2;
	/*EXEC_SQL SELECT d_next_o_id, d_tax INTO :d_next_o_id, :d_tax
	        FROM district
	        WHERE d_id = :d_id
		AND d_w_id = :w_id
		FOR UPDATE;*/
	mysql_stmt = stmt[t_num][1];

	memset(param, 0, sizeof(MYSQL_BIND) * 2); /* initialize */
	param[0].buffer_type = MYSQL_TYPE_LONG;
	param[0].buffer = &d_id;
	param[1].buffer_type = MYSQL_TYPE_LONG;
	param[1].buffer = &w_id;
	if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
	if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;

	if( mysql_stmt_store_result(mysql_stmt) ) goto sqlerr;
	memset(column, 0, sizeof(MYSQL_BIND) * 2); /* initialize */
	column[0].buffer_type = MYSQL_TYPE_LONG;
	column[0].buffer = &d_next_o_id;
	column[1].buffer_type = MYSQL_TYPE_FLOAT;
	column[1].buffer = &d_tax;
	if( mysql_stmt_bind_result(mysql_stmt, column) ) goto sqlerr;
	switch( mysql_stmt_fetch(mysql_stmt) ) {
	    case 0: //SUCCESS
	    case MYSQL_DATA_TRUNCATED:
		break;
	    case 1: //ERROR
	    case MYSQL_NO_DATA: //NO MORE DATA
	    default:
		mysql_stmt_free_result(mysql_stmt);
		goto sqlerr;
	}
	mysql_stmt_free_result(mysql_stmt);


	proceed = 3;
	/*EXEC_SQL UPDATE district SET d_next_o_id = :d_next_o_id + 1
	        WHERE d_id = :d_id 
		AND d_w_id = :w_id;*/
	mysql_stmt = stmt[t_num][2];

	memset(param, 0, sizeof(MYSQL_BIND) * 3); /* initialize */
	param[0].buffer_type = MYSQL_TYPE_LONG;
	param[0].buffer = &d_next_o_id;
	param[1].buffer_type = MYSQL_TYPE_LONG;
	param[1].buffer = &d_id;
	param[2].buffer_type = MYSQL_TYPE_LONG;
	param[2].buffer = &w_id;
	if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
	if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;

	o_id = d_next_o_id;

#ifdef DEBUG
	printf("n %d\n",proceed);
#endif

	proceed = 4;
	/*EXEC_SQL INSERT INTO orders (o_id, o_d_id, o_w_id, o_c_id,
			             o_entry_d, o_ol_cnt, o_all_local)
		VALUES(:o_id, :d_id, :w_id, :c_id, 
		       :datetime,
                       :o_ol_cnt, :o_all_local);*/
	mysql_stmt = stmt[t_num][3];

	memset(param, 0, sizeof(MYSQL_BIND) * 7); /* initialize */
	param[0].buffer_type = MYSQL_TYPE_LONG;
	param[0].buffer = &o_id;
	param[1].buffer_type = MYSQL_TYPE_LONG;
	param[1].buffer = &d_id;
	param[2].buffer_type = MYSQL_TYPE_LONG;
	param[2].buffer = &w_id;
	param[3].buffer_type = MYSQL_TYPE_LONG;
	param[3].buffer = &c_id;
	param[4].buffer_type = MYSQL_TYPE_STRING;
	param[4].buffer = datetime;
	param[4].buffer_length = strlen(datetime);
	param[5].buffer_type = MYSQL_TYPE_LONG;
	param[5].buffer = &o_ol_cnt;
	param[6].buffer_type = MYSQL_TYPE_LONG;
	param[6].buffer = &o_all_local;
	if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
	if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;


#ifdef DEBUG
	printf("n %d\n",proceed);
#endif

	proceed = 5;
	/* EXEC_SQL INSERT INTO new_orders (no_o_id, no_d_id, no_w_id)
	   VALUES (:o_id,:d_id,:w_id); */
	mysql_stmt = stmt[t_num][4];

	memset(param, 0, sizeof(MYSQL_BIND) * 3); /* initialize */
	param[0].buffer_type = MYSQL_TYPE_LONG;
	param[0].buffer = &o_id;
	param[1].buffer_type = MYSQL_TYPE_LONG;
	param[1].buffer = &d_id;
	param[2].buffer_type = MYSQL_TYPE_LONG;
	param[2].buffer = &w_id;
	if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
	if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;

	/* sort orders to avoid DeadLock */
	for (i = 0; i < o_ol_cnt; i++) {
		ol_num_seq[i]=i;
	}
	for (i = 0; i < (o_ol_cnt - 1); i++) {
		tmp = (MAXITEMS + 1) * supware[ol_num_seq[i]] + itemid[ol_num_seq[i]];
		min_num = i;
		for ( j = i+1; j < o_ol_cnt; j++) {
		  if ( (MAXITEMS + 1) * supware[ol_num_seq[j]] + itemid[ol_num_seq[j]] < tmp ){
		    tmp = (MAXITEMS + 1) * supware[ol_num_seq[j]] + itemid[ol_num_seq[j]];
		    min_num = j;
		  }
		}
		if ( min_num != i ){
		  swp = ol_num_seq[min_num];
		  ol_num_seq[min_num] = ol_num_seq[i];
		  ol_num_seq[i] = swp;
		}
	}


	for (ol_number = 1; ol_number <= o_ol_cnt; ol_number++) {
		ol_supply_w_id = supware[ol_num_seq[ol_number - 1]];
		ol_i_id = itemid[ol_num_seq[ol_number - 1]];
		ol_quantity = qty[ol_num_seq[ol_number - 1]];

		/* EXEC SQL WHENEVER NOT FOUND GOTO invaliditem; */
		proceed = 6;
		/*EXEC_SQL SELECT i_price, i_name, i_data
			INTO :i_price, :i_name, :i_data
		        FROM item
		        WHERE i_id = :ol_i_id;*/
		mysql_stmt = stmt[t_num][5];

		memset(param, 0, sizeof(MYSQL_BIND) * 1); /* initialize */
		param[0].buffer_type = MYSQL_TYPE_LONG;
		param[0].buffer = &ol_i_id;
		if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
		if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;

		if( mysql_stmt_store_result(mysql_stmt) ) goto sqlerr;
		memset(column, 0, sizeof(MYSQL_BIND) * 3); /* initialize */
		column[0].buffer_type = MYSQL_TYPE_FLOAT;
		column[0].buffer = &i_price;
		column[1].buffer_type = MYSQL_TYPE_STRING;
		column[1].buffer = i_name;
		column[1].buffer_length = sizeof(i_name);
		column[2].buffer_type = MYSQL_TYPE_STRING;
		column[2].buffer = i_data;
		column[2].buffer_length = sizeof(i_data);
		if( mysql_stmt_bind_result(mysql_stmt, column) ) goto sqlerr;
		switch( mysql_stmt_fetch(mysql_stmt) ) {
		    case 0: //SUCCESS
		    case MYSQL_DATA_TRUNCATED:
			break;

		    case MYSQL_NO_DATA: //NO MORE DATA
			mysql_stmt_free_result(mysql_stmt);
			goto invaliditem;

		    case 1: //ERROR
		    default:
			mysql_stmt_free_result(mysql_stmt);
			goto sqlerr;
		}
		mysql_stmt_free_result(mysql_stmt);


		price[ol_num_seq[ol_number - 1]] = i_price;
		strncpy(iname[ol_num_seq[ol_number - 1]], i_name, 25);

		/* EXEC SQL WHENEVER NOT FOUND GOTO sqlerr; */

#ifdef DEBUG
		printf("n %d\n",proceed);
#endif

		proceed = 7;
		/*EXEC_SQL SELECT s_quantity, s_data, s_dist_01, s_dist_02,
		                s_dist_03, s_dist_04, s_dist_05, s_dist_06,
		                s_dist_07, s_dist_08, s_dist_09, s_dist_10
			INTO :s_quantity, :s_data, :s_dist_01, :s_dist_02,
		             :s_dist_03, :s_dist_04, :s_dist_05, :s_dist_06,
		             :s_dist_07, :s_dist_08, :s_dist_09, :s_dist_10
		        FROM stock
		        WHERE s_i_id = :ol_i_id 
			AND s_w_id = :ol_supply_w_id
			FOR UPDATE;*/
		mysql_stmt = stmt[t_num][6];

		memset(param, 0, sizeof(MYSQL_BIND) * 2); /* initialize */
		param[0].buffer_type = MYSQL_TYPE_LONG;
		param[0].buffer = &ol_i_id;
		param[1].buffer_type = MYSQL_TYPE_LONG;
		param[1].buffer = &ol_supply_w_id;
		if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
		if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;

		if( mysql_stmt_store_result(mysql_stmt) ) goto sqlerr;
		memset(column, 0, sizeof(MYSQL_BIND) * 12); /* initialize */
		column[0].buffer_type = MYSQL_TYPE_LONG;
		column[0].buffer = &s_quantity;
		column[1].buffer_type = MYSQL_TYPE_STRING;
		column[1].buffer = s_data;
		column[1].buffer_length = sizeof(s_data);
		column[2].buffer_type = MYSQL_TYPE_STRING;
		column[2].buffer = s_dist_01;
		column[2].buffer_length = sizeof(s_dist_01);
		column[3].buffer_type = MYSQL_TYPE_STRING;
		column[3].buffer = s_dist_02;
		column[3].buffer_length = sizeof(s_dist_02);
		column[4].buffer_type = MYSQL_TYPE_STRING;
		column[4].buffer = s_dist_03;
		column[4].buffer_length = sizeof(s_dist_03);
		column[5].buffer_type = MYSQL_TYPE_STRING;
		column[5].buffer = s_dist_04;
		column[5].buffer_length = sizeof(s_dist_04);
		column[6].buffer_type = MYSQL_TYPE_STRING;
		column[6].buffer = s_dist_05;
		column[6].buffer_length = sizeof(s_dist_05);
		column[7].buffer_type = MYSQL_TYPE_STRING;
		column[7].buffer = s_dist_06;
		column[7].buffer_length = sizeof(s_dist_06);
		column[8].buffer_type = MYSQL_TYPE_STRING;
		column[8].buffer = s_dist_07;
		column[8].buffer_length = sizeof(s_dist_07);
		column[9].buffer_type = MYSQL_TYPE_STRING;
		column[9].buffer = s_dist_08;
		column[9].buffer_length = sizeof(s_dist_08);
		column[10].buffer_type = MYSQL_TYPE_STRING;
		column[10].buffer = s_dist_09;
		column[10].buffer_length = sizeof(s_dist_09);
		column[11].buffer_type = MYSQL_TYPE_STRING;
		column[11].buffer = s_dist_10;
		column[11].buffer_length = sizeof(s_dist_10);
		if( mysql_stmt_bind_result(mysql_stmt, column) ) goto sqlerr;
		switch( mysql_stmt_fetch(mysql_stmt) ) {
		    case 0: //SUCCESS
			break;
		    case 1: //ERROR
		    case MYSQL_NO_DATA: //NO MORE DATA
		    default:
			mysql_stmt_free_result(mysql_stmt);
			goto sqlerr;
		}
		mysql_stmt_free_result(mysql_stmt);


		pick_dist_info(ol_dist_info, d_id);	/* pick correct
							 * s_dist_xx */

		stock[ol_num_seq[ol_number - 1]] = s_quantity;

		if ((strstr(i_data, "original") != NULL) &&
		    (strstr(s_data, "original") != NULL))
			bg[ol_num_seq[ol_number - 1]] = 'B';
		else
			bg[ol_num_seq[ol_number - 1]] = 'G';

		if (s_quantity > ol_quantity)
			s_quantity = s_quantity - ol_quantity;
		else
			s_quantity = s_quantity - ol_quantity + 91;

#ifdef DEBUG
		printf("n %d\n",proceed);
#endif

		proceed = 8;
		/*EXEC_SQL UPDATE stock SET s_quantity = :s_quantity
		        WHERE s_i_id = :ol_i_id 
			AND s_w_id = :ol_supply_w_id;*/
		mysql_stmt = stmt[t_num][7];

		memset(param, 0, sizeof(MYSQL_BIND) * 3); /* initialize */
		param[0].buffer_type = MYSQL_TYPE_LONG;
		param[0].buffer = &s_quantity;
		param[1].buffer_type = MYSQL_TYPE_LONG;
		param[1].buffer = &ol_i_id;
		param[2].buffer_type = MYSQL_TYPE_LONG;
		param[2].buffer = &ol_supply_w_id;
		if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
		if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;


		ol_amount = ol_quantity * i_price * (1 + w_tax + d_tax) * (1 - c_discount);
		amt[ol_num_seq[ol_number - 1]] = ol_amount;
		total += ol_amount;

#ifdef DEBUG
		printf("n %d\n",proceed);
#endif

		proceed = 9;
		/*EXEC_SQL INSERT INTO order_line (ol_o_id, ol_d_id, ol_w_id, 
						 ol_number, ol_i_id, 
						 ol_supply_w_id, ol_quantity, 
						 ol_amount, ol_dist_info)
			VALUES (:o_id, :d_id, :w_id, :ol_number, :ol_i_id,
				:ol_supply_w_id, :ol_quantity, :ol_amount,
				:ol_dist_info);*/
		mysql_stmt = stmt[t_num][8];

		memset(param, 0, sizeof(MYSQL_BIND) * 9); /* initialize */
		param[0].buffer_type = MYSQL_TYPE_LONG;
		param[0].buffer = &o_id;
		param[1].buffer_type = MYSQL_TYPE_LONG;
		param[1].buffer = &d_id;
		param[2].buffer_type = MYSQL_TYPE_LONG;
		param[2].buffer = &w_id;
		param[3].buffer_type = MYSQL_TYPE_LONG;
		param[3].buffer = &ol_number;
		param[4].buffer_type = MYSQL_TYPE_LONG;
		param[4].buffer = &ol_i_id;
		param[5].buffer_type = MYSQL_TYPE_LONG;
		param[5].buffer = &ol_supply_w_id;
		param[6].buffer_type = MYSQL_TYPE_LONG;
		param[6].buffer = &ol_quantity;
		param[7].buffer_type = MYSQL_TYPE_FLOAT;
		param[7].buffer = &ol_amount;
		param[8].buffer_type = MYSQL_TYPE_STRING;
		param[8].buffer = ol_dist_info;
		param[8].buffer_length = strlen(ol_dist_info);
		if( mysql_stmt_bind_param(mysql_stmt, param) ) goto sqlerr;
		if( mysql_stmt_execute(mysql_stmt) ) goto sqlerr;


	}			/* End Order Lines */

#ifdef DEBUG
	printf("insert 3\n");
	fflush(stdout);
#endif

	/*EXEC_SQL COMMIT WORK;*/
	if( mysql_commit(ctx[t_num]) ) goto sqlerr;

	return (1);

invaliditem:
	/*EXEC_SQL ROLLBACK WORK;*/
	mysql_rollback(ctx[t_num]);

	/* printf("Item number is not valid\n"); */
	return (1); /* OK? */

sqlerr:
	fprintf(stderr,"neword %d:%d\n",t_num,proceed);
      	error(ctx[t_num],mysql_stmt);
	/*EXEC SQL WHENEVER SQLERROR GOTO sqlerrerr;*/
	/*EXEC_SQL ROLLBACK WORK;*/
	mysql_rollback(ctx[t_num]);
sqlerrerr:
	return (0);
}
Example #28
0
static int
table_mysql_fetch(int service, char *dst, size_t sz)
{
	MYSQL_STMT	*stmt;
	const char	*k;
	int		 s;

    retry:

	if (service != K_SOURCE)
		return (-1);

	stmt = config->stmt_fetch_source;

	if (stmt == NULL)
		return (-1);

	if (config->source_ncall < config->source_refresh &&
	    time(NULL) - config->source_update < config->source_expire)
	    goto fetch;

	if (mysql_stmt_execute(stmt)) {
		if (mysql_stmt_errno(stmt) == CR_SERVER_LOST ||
		    mysql_stmt_errno(stmt) == CR_SERVER_GONE_ERROR ||
		    mysql_stmt_errno(stmt) == CR_COMMANDS_OUT_OF_SYNC) {
			log_warnx("warn: table-mysql: trying to reconnect after error: %s",
			    mysql_stmt_error(stmt));
			if (config_connect(config))
				goto retry;
			return (-1);
		}
		log_warnx("warn: table-mysql: mysql_stmt_execute: %s",
		    mysql_stmt_error(stmt));
		return (-1);
	}

	config->source_iter = NULL;
	while(dict_poproot(&config->sources, NULL, NULL))
		;

	while ((s = mysql_stmt_fetch(stmt)) == 0)
		dict_set(&config->sources, results_buffer[0], NULL);

	if (s && s != MYSQL_NO_DATA)
		log_warnx("warn: table-mysql: mysql_stmt_fetch: %s",
		    mysql_stmt_error(stmt));

	if (mysql_stmt_free_result(stmt))
		log_warnx("warn: table-mysql: mysql_stmt_free_result: %s",
		    mysql_stmt_error(stmt));

	config->source_update = time(NULL);
	config->source_ncall = 0;

    fetch:

	config->source_ncall += 1;

	if (! dict_iter(&config->sources, &config->source_iter, &k, (void **)NULL)) {
		config->source_iter = NULL;
		if (! dict_iter(&config->sources, &config->source_iter, &k, (void **)NULL))
			return (0);
	}

	if (strlcpy(dst, k, sz) >= sz)
		return (-1);

	return (1);
}
Example #29
0
static int
table_mysql_lookup(int service, const char *key, char *dst, size_t sz)
{
	MYSQL_STMT	*stmt;
	int		 r, s;

	stmt = table_mysql_query(key, service);
	if (stmt == NULL)
		return (-1);

	s = mysql_stmt_fetch(stmt);
	if (s == MYSQL_NO_DATA) {
		r = 0;
		goto end;
	}
	
	if (s != 0) {
		r = -1;
		log_warnx("warn: table-mysql: mysql_stmt_fetch: %s",
		    mysql_stmt_error(stmt));
		goto end;
	}

	r = 1;

	switch(service) {
	case K_ALIAS:
		do {
			if (dst[0] && strlcat(dst, ", ", sz) >= sz) {
				log_warnx("warn: table-mysql: result too large");
				r = -1;
				break;
			}
			if (strlcat(dst, results_buffer[0], sz) >= sz) {
				log_warnx("warn: table-mysql: result too large");
				r = -1;
				break;
			}
			s = mysql_stmt_fetch(stmt);
		} while (s == 0);

		if (s && s != MYSQL_NO_DATA) {
			log_warnx("warn: table-mysql: mysql_stmt_fetch: %s",
			    mysql_stmt_error(stmt));
			r = -1;
		}
		break;
	case K_CREDENTIALS:
		if (snprintf(dst, sz, "%s:%s",
		    results_buffer[0],
		    results_buffer[1]) > (ssize_t)sz) {
			log_warnx("warn: table-mysql: result too large");
			r = -1;
		}
		break;
	case K_USERINFO:
		if (snprintf(dst, sz, "%s:%s:%s:%s",
		    results_buffer[0],
		    results_buffer[1],
		    results_buffer[2],
		    results_buffer[3]) > (ssize_t)sz) {
			log_warnx("warn: table-mysql: result too large");
			r = -1;
		}
		break;
	case K_DOMAIN:
	case K_NETADDR:
	case K_SOURCE:
	case K_MAILADDR:
	case K_ADDRNAME:
		if (strlcpy(dst, results_buffer[0], sz) >= sz) {
			log_warnx("warn: table-mysql: result too large");
			r = -1;
		}
		break;
	default:
		log_warnx("warn: table-mysql: unknown service %i",
		    service);
		r = -1;
	}

    end:
	if (mysql_stmt_free_result(stmt))
		log_warnx("warn: table-mysql: mysql_stmt_free_result: %s",
		    mysql_stmt_error(stmt));

	return (r);
}
Example #30
0
int test_query(MYSQL *mysql)
{
  int rc;
  int i;
  MYSQL_STMT *stmt;
  MYSQL_BIND bind[1];

  char tmp[20];
  char *stmtstr= "CALL P1(?)";

  rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");
  check_mysql_rc(rc, mysql);
  rc= mysql_query(mysql, "CREATE PROCEDURE p1(OUT p_out VARCHAR(19))" 
                         "BEGIN "
                          "  SET p_out = 'foo';"
                          "  SELECT 1 FROM DUAL;"
                         "END");
  check_mysql_rc(rc, mysql);

  stmt= mysql_stmt_init(mysql);
  check_mysql_rc(rc, mysql);

  rc= mysql_stmt_prepare(stmt, stmtstr, strlen(stmtstr));
  check_stmt_rc(rc, stmt);

  for (i=0; i < 1000; i++)
  {
    int status;
    memset(tmp, 0, sizeof(tmp));
    memset(bind, 0, sizeof(MYSQL_BIND));
    bind[0].buffer= tmp;
    bind[0].buffer_type= MYSQL_TYPE_STRING;
    bind[0].buffer_length= 4;

    mysql_stmt_bind_param(stmt, bind);

    rc= mysql_stmt_execute(stmt);
    check_stmt_rc(rc, stmt);
    do {
      if (stmt->field_count)
      {
        mysql_stmt_bind_result(stmt, bind);
        rc= mysql_stmt_store_result(stmt);
        check_stmt_rc(rc, stmt);
        while(mysql_stmt_fetch(stmt) == 0);

        rc= mysql_stmt_free_result(stmt);
        check_stmt_rc(rc, stmt);
      }
      status= mysql_stmt_next_result(stmt);
      if (status == 1)
        check_stmt_rc(status, stmt);
    } while (status == 0);

    rc= mysql_stmt_reset(stmt);
    if (rc)
      diag("reset failed after %d iterations", i);
    check_stmt_rc(rc, stmt);
  }
  mysql_stmt_close(stmt);

  return OK;
}