コード例 #1
0
unsigned int GetMultiStatements(MADB_Stmt *Stmt, BOOL ExecDirect)
{
  int          i= 0;
  unsigned int MaxParams= 0;
  char        *p= Stmt->Query.RefinedText;

  Stmt->MultiStmtNr= 0;
  Stmt->MultiStmts= (MYSQL_STMT **)MADB_CALLOC(sizeof(MYSQL_STMT) * STMT_COUNT(Stmt->Query));

  while (p < Stmt->Query.RefinedText + Stmt->Query.RefinedLength)
  {
    Stmt->MultiStmts[i]= i == 0 ? Stmt->stmt : MADB_NewStmtHandle(Stmt);
    MDBUG_C_PRINT(Stmt->Connection, "-->inited&preparing %0x(%d,%s)", Stmt->MultiStmts[i], i, p);

    if (mysql_stmt_prepare(Stmt->MultiStmts[i], p, (unsigned long)strlen(p)))
    {
      MADB_SetNativeError(&Stmt->Error, SQL_HANDLE_STMT, Stmt->MultiStmts[i]);
      CloseMultiStatements(Stmt);

      /* Last paranoid attempt make sure that we did not have a parsing error.
         More to preserve "backward-compatimility" - we did this before, but before trying to
         prepare "multi-statement". */
      if (i == 0 && Stmt->Error.NativeError !=1295 /*ER_UNSUPPORTED_PS*/)
      {
        Stmt->stmt= MADB_NewStmtHandle(Stmt);
        if (mysql_stmt_prepare(Stmt->stmt, STMT_STRING(Stmt), (unsigned long)strlen(STMT_STRING(Stmt))))
        {
          mysql_stmt_close(Stmt->stmt);
          Stmt->stmt= NULL;
        }
        else
        {
          MADB_DeleteSubqueries(&Stmt->Query);
          return 0;
        }
      }
      return 1;
    }
    if (mysql_stmt_param_count(Stmt->MultiStmts[i]) > MaxParams)
    {
      MaxParams= mysql_stmt_param_count(Stmt->MultiStmts[i]);
    }
    p+= strlen(p) + 1;
    ++i;
  }

  if (MaxParams)
  {
    Stmt->params= (MYSQL_BIND *)MADB_CALLOC(sizeof(MYSQL_BIND) * MaxParams);
  }

  return 0;
}
コード例 #2
0
ファイル: myconn.cpp プロジェクト: Belxjander/Asuna
int MYSQLC::PrepareSQL(PGLOBAL g, const char *stmt)
  {
  if (!m_DB) {
    strcpy(g->Message, "MySQL not connected");
    return -4;
  } else if (m_Stmt)
    return -1;              // should not append

#if defined(ALPHA)
  if (!(m_Stmt = mysql_prepare(m_DB, stmt, strlen(stmt)))) {

    sprintf(g->Message, "mysql_prepare failed: %s [%s]",
                         mysql_error(m_DB), stmt);
    return -1;
    } // endif m_Stmt

  // Return the parameter count from the statement
  return mysql_param_count(m_Stmt);
#else   // !ALPHA
  if (!(m_Stmt = mysql_stmt_init(m_DB))) {
    strcpy(g->Message, "mysql_stmt_init(), out of memory");
    return -2;
    } // endif m_Stmt

  if (mysql_stmt_prepare(m_Stmt, stmt, strlen(stmt))) {
    sprintf(g->Message, "mysql_stmt_prepare() failed: (%d) %s",
            mysql_stmt_errno(m_Stmt), mysql_stmt_error(m_Stmt));
    return -3;
    } // endif prepare

  // Return the parameter count from the statement
  return mysql_stmt_param_count(m_Stmt);
#endif   // !ALPHA
  } // end of PrepareSQL
コード例 #3
0
ファイル: sql.c プロジェクト: icxbb-xx/Hercules-1
/// Returns the number of parameters in the prepared statement.
size_t SqlStmt_NumParams(SqlStmt* self)
{
	if( self )
		return (size_t)mysql_stmt_param_count(self->stmt);
	else
		return 0;
}
コード例 #4
0
ファイル: ob_ps_test.cpp プロジェクト: cuiwm/oceanbase
void ObPSTest::delete_test()
{
    MYSQL_STMT *stmt = mysql_stmt_init(&my_);
    ASSERT_TRUE(stmt);
    const char* QUERY = "delete from ob_ps_test where c1 = ?";
    // 1. prepare
    int ret = mysql_stmt_prepare(stmt, QUERY, strlen(QUERY));
    ASSERT_QUERY_RET(ret);
    int param_count = (int)mysql_stmt_param_count(stmt);
    ASSERT_EQ(1, param_count);
    // 2. bind params
    MYSQL_BIND bind[1];
    memset(bind, 0, sizeof(bind));
    int int_data = 0;
    bind[0].buffer_type= MYSQL_TYPE_LONG;
    bind[0].buffer= (char *)&int_data;
    bind[0].is_null= 0;
    bind[0].length= 0;
    ret = mysql_stmt_bind_param(stmt, bind);
    ASSERT_QUERY_RET(ret);
    // 3. execute
    int_data = 3;
    ret = mysql_stmt_execute(stmt);
    ASSERT_QUERY_RET(ret);
    // 4. results
    my_ulonglong affected_rows = mysql_stmt_affected_rows(stmt);
    ASSERT_EQ(1U, affected_rows);

    // 5. clean up
    ret = mysql_stmt_close(stmt);
    ASSERT_QUERY_RET(ret);
}
コード例 #5
0
ファイル: mysqlpp_statement.cpp プロジェクト: mnpk/waspp
	statement::statement(st_mysql* mysql, const std::string& query)
	{
		stmt = mysql_stmt_init(mysql);

		try
		{
			if (!stmt)
			{
				throw exception(__FILE__, __LINE__, "stmt_init failed");
			}

			if (mysql_stmt_prepare(stmt, query.c_str(), query.size()) != 0)
			{
				throw exception(__FILE__, __LINE__, mysql_stmt_error(stmt));
			}

			param_count = mysql_stmt_param_count(stmt);

			binds.resize(0);
			binds.resize(param_count, st_mysql_bind());

			lengths.resize(0);
			lengths.resize(param_count, 0);

			bind_index = 0;
		}
		catch (...)
		{
			mysql_stmt_close(stmt);
			throw;
		}
	}
コード例 #6
0
ファイル: lmtmysql.c プロジェクト: LaHaine/lmt
int
lmt_db_insert_router_data (lmt_db_t db, char *rtrname, uint64_t bytes,
                           float pct_cpu)
{
    MYSQL_BIND param[4];
    uint64_t router_id;
    int retval = -1;

    assert (db->magic == LMT_DBHANDLE_MAGIC);
    if (!db->ins_router_data) {
        if (lmt_conf_get_db_debug ())
            msg ("no permission to insert into %s ROUTER_DATA",
                 lmt_db_fsname (db));
        goto done;
    }
    if (_lookup_idhash (db, "router", rtrname, &router_id) < 0) {
        if (lmt_conf_get_db_autoconf ()) {
            if (lmt_conf_get_db_debug ())
                msg ("adding %s to %s ROUTER_INFO", rtrname,lmt_db_fsname (db));
            if (_insert_router_info (db, rtrname, &router_id) < 0)
                goto done;
        } else {
            if (lmt_conf_get_db_debug ())
                msg ("%s: no entry in %s ROUTER_INFO and db_autoconf disabled",
                     rtrname, lmt_db_fsname (db));
            retval = 0; /* avoid a reconnect */
            goto done;
        }
    }
    if (_update_timestamp (db) < 0)
        goto done;

    memset (param, 0, sizeof (param));
    assert (mysql_stmt_param_count (db->ins_router_data) == 4);
    _param_init_int (&param[0], MYSQL_TYPE_LONG, &router_id);
    _param_init_int (&param[1], MYSQL_TYPE_LONG, &db->timestamp_id);
    _param_init_int (&param[2], MYSQL_TYPE_LONGLONG, &bytes);
    _param_init_int (&param[3], MYSQL_TYPE_FLOAT, &pct_cpu);
   
    if (mysql_stmt_bind_param (db->ins_router_data, param)) {
        if (lmt_conf_get_db_debug ())
            msg ("error binding parameters for insert into %s ROUTER_DATA: %s",
                lmt_db_fsname (db), mysql_error (db->conn));
        goto done;
    }
    if (mysql_stmt_execute (db->ins_router_data)) {
        if (mysql_errno (db->conn) == ER_DUP_ENTRY) {
            retval = 0; /* expected failure if previous insert was delayed */
            goto done;
        }
        if (lmt_conf_get_db_debug ())
            msg ("error executing insert into %s ROUTER_DATA: %s",
                 lmt_db_fsname (db), mysql_error (db->conn));
        goto done;
    }
    retval = 0;
done:
    return retval;
}
コード例 #7
0
ファイル: mysql_client_fw.c プロジェクト: lanqiyi/CacheDB
static void verify_param_count(MYSQL_STMT *stmt, long exp_count)
{
 long param_count= mysql_stmt_param_count(stmt);
 if (!opt_silent)
 fprintf(stdout, "\n total parameters in stmt: `%ld` (expected: `%ld`)",
 param_count, exp_count);
 DIE_UNLESS(param_count == exp_count);
}
コード例 #8
0
ファイル: DatabaseMysql.cpp プロジェクト: gc/mangos
bool MySqlPreparedStatement::prepare()
{
    if(isPrepared())
        return true;

    //remove old binds
    RemoveBinds();

    //create statement object
    m_stmt = mysql_stmt_init(m_pMySQLConn);
    if (!m_stmt)
    {
        sLog.outError("SQL: mysql_stmt_init()() failed ");
        return false;
    }

    //prepare statement
    if (mysql_stmt_prepare(m_stmt, m_szFmt.c_str(), m_szFmt.length()))
    {
        sLog.outError("SQL: mysql_stmt_prepare() failed for '%s'", m_szFmt.c_str());
        sLog.outError("SQL ERROR: %s", mysql_stmt_error(m_stmt));
        return false;
    }

    /* Get the parameter count from the statement */
    m_nParams = mysql_stmt_param_count(m_stmt);

    /* Fetch result set meta information */
    m_pResultMetadata = mysql_stmt_result_metadata(m_stmt);
    //if we do not have result metadata
    if (!m_pResultMetadata && strnicmp(m_szFmt.c_str(), "select", 6) == 0)
    {
        sLog.outError("SQL: no meta information for '%s'", m_szFmt.c_str());
        sLog.outError("SQL ERROR: %s", mysql_stmt_error(m_stmt));
        return false;
    }

    //bind input buffers
    if(m_nParams)
    {
        m_pInputArgs = new MYSQL_BIND[m_nParams];
        memset(m_pInputArgs, 0, sizeof(MYSQL_BIND) * m_nParams);
    }

    //check if we have a statement which returns result sets
    if(m_pResultMetadata)
    {
        //our statement is query
        m_bIsQuery = true;
        /* Get total columns in the query */
        m_nColumns = mysql_num_fields(m_pResultMetadata);

        //bind output buffers
    }

    m_bPrepared = true;
    return true;
}
コード例 #9
0
ファイル: mysqldataprovider.cpp プロジェクト: BornHunter/CGSF
void MySqlDataProvider::bindValue(int place, MYSQL_BIND* bind)
{
    if (!mBind)
        LOG_ERROR("MySqlDataProvider::bindValue: "
                  "Attempted to use an unprepared bind!");
    else if (place > 0 && place <= (int)mysql_stmt_param_count(mStmt))
        mBind[place - 1] = *bind;
    else
        LOG_ERROR("MySqlDataProvider::bindValue: "
                  "Attempted bind index out of range");
}
コード例 #10
0
ファイル: SqlCommand.cpp プロジェクト: Metazion/MetaDb
bool SqlCommand::Bind(SqlFieldParam* fieldParams, int number) {
    int paramCount = mysql_stmt_param_count(m_stmt);
    if (paramCount != number) {
        m_sqlConnection.SetLastError("SqlCommand Bind Error << param number should be[%d]"
            ", but in[%d]", paramCount, number);
        return false;
    }

    m_fieldParams = fieldParams;
    m_fieldNumber = number;
    return BindParams();
}
コード例 #11
0
ファイル: PreparedStatement.cpp プロジェクト: BoThay/ArkCORE
MySQLPreparedStatement::MySQLPreparedStatement(MYSQL_STMT* stmt) :
        m_Mstmt(stmt), m_bind(NULL) {
    /// Initialize variable parameters
    m_paramCount = mysql_stmt_param_count(stmt);
    m_paramsSet.assign(m_paramCount, false);
    m_bind = new MYSQL_BIND[m_paramCount];
    memset(m_bind, 0, sizeof(MYSQL_BIND) * m_paramCount);

    /// "If set to 1, causes mysql_stmt_store_result() to update the metadata MYSQL_FIELD->max_length value."
    my_bool bool_tmp = 1;
    mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &bool_tmp);
}
コード例 #12
0
ファイル: MySQLService.cpp プロジェクト: Johance2/ShareModule
int MySQLService::ExcuteBinary(const char *cmd, SQLParam *param)
{
    MYSQL_BIND *bind = 0;
    int err = 0;
    MYSQL_STMT *stmt;

    do
    {
        stmt = mysql_stmt_init(_connection);
        if(!stmt)
            break;
        if(mysql_stmt_prepare(stmt, cmd, strlen(cmd)))
        {
            err = mysql_errno(_connection);
            break;
        }

        uint32 count = mysql_stmt_param_count(stmt);

        bind = new MYSQL_BIND[count];
        memset(bind, 0, sizeof(bind) * count);

        for(uint32 i = 0; i < count; i++)
        {
            bind[i].buffer = param[i].data; 
            bind[i].buffer_type = MYSQL_TYPE_BLOB;
            bind[i].length= 0;
            bind[i].buffer_length = param[i].length;
            bind[i].is_null= 0;
            if (mysql_stmt_bind_param(stmt, bind))
            {
                err = mysql_errno(_connection);
                break;
            }
        }

        if(!err)
        {
            if(mysql_stmt_execute(stmt))
            {
                err = mysql_errno(_connection);
            }
        }

    }while(0);
    
    if(stmt)
        mysql_stmt_close(stmt);

    delete [] bind;

    return err;
}
コード例 #13
0
ファイル: ps_new.c プロジェクト: Torndeco/mariadb-connector-c
int test_sp_reset(MYSQL *mysql)
{
 int i, rc;
  MYSQL_STMT *stmt;
  int a[] = {10,20,30};
  MYSQL_BIND bind[3];
  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), IN p_in INT, INOUT p_inout INT)" 
                         "BEGIN "
                          "  SET p_in = 300, p_out := 'This is OUT param', p_inout = 200; "
                          "  SELECT p_inout, p_in, substring(p_out, 9);"
                         "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);

  FAIL_IF(mysql_stmt_param_count(stmt) != 3, "expected param_count=3");

  memset(bind, 0, sizeof(MYSQL_BIND) * 3);
  for (i=0; i < 3; i++)
  {
    bind[i].buffer= &a[i];
    bind[i].buffer_type= MYSQL_TYPE_LONG;
  }
  bind[0].buffer_type= MYSQL_TYPE_NULL;
  rc= mysql_stmt_bind_param(stmt, bind);
  check_stmt_rc(rc, stmt);

  rc= mysql_stmt_execute(stmt);
  check_stmt_rc(rc, stmt);

  rc= mysql_stmt_fetch(stmt);
  check_stmt_rc(rc, stmt);

  rc= mysql_stmt_reset(stmt);
  check_stmt_rc(rc, stmt);

  /*connection shouldn't be blocked now */

  rc= mysql_query(mysql, "DROP PROCEDURE p1");
  check_mysql_rc(rc, mysql);

  rc= mysql_stmt_close(stmt);
  return OK;
}
コード例 #14
0
ファイル: basil_mysql_routines.c プロジェクト: BYUHPC/slurm
/**
 * prepare_stmt - Initialize and prepare a query statement.
 * @handle:	connected handle
 * @query:	query statement string to execute
 * @bind_parm:  values for unbound variables (parameters) in @query
 * @nparams:	length of @bind_parms
 * @bind_col:	typed array to contain the column results
 *		==> non-NULL 'is_null'/'error' fields are taken to mean
 *		    that NULL values/errors are not acceptable
 * @ncols:	number of expected columns (length of @bind_col)
 * Return prepared statement handle on success, NULL on error.
 */
MYSQL_STMT *prepare_stmt(MYSQL *handle, const char *query,
			 MYSQL_BIND bind_parm[], unsigned long nparams,
			 MYSQL_BIND bind_col[], unsigned long ncols)
{
	MYSQL_STMT	*stmt;
	unsigned long	param_count;

	if (query == NULL || *query == '\0')
		return NULL;

	/* Initialize statement (fails only if out of memory). */
	stmt = mysql_stmt_init(handle);
	if (stmt == NULL) {
		error("can not allocate handle for \"%s\"", query);
		return NULL;
	}

	if (mysql_stmt_prepare(stmt, query, strlen(query))) {
		error("can not prepare statement \"%s\": %s",
		      query, mysql_stmt_error(stmt));
		goto prepare_failed;
	}

	/* Verify the parameter count */
	param_count = mysql_stmt_param_count(stmt);
	if (nparams != nparams) {
		error("expected %lu parameters for \"%s\" but got %lu",
		      nparams, query, param_count);
		goto prepare_failed;
	}

	if (!validate_stmt_column_count(stmt, query, ncols))
		goto prepare_failed;

	if (nparams && mysql_stmt_bind_param(stmt, bind_parm)) {
		error("can not bind parameter buffers for \"%s\": %s",
		      query, mysql_stmt_error(stmt));
		goto prepare_failed;
	}

	if (mysql_stmt_bind_result(stmt, bind_col)) {
		error("can not bind output buffers for \"%s\": %s",
		      query, mysql_stmt_error(stmt));
		goto prepare_failed;
	}

	return stmt;

prepare_failed:
	(void)mysql_stmt_close(stmt);
	return NULL;
}
コード例 #15
0
MySQLPreparedStatement::MySQLPreparedStatement(MySQLConnection* conn, MYSQL_STMT* stmt) :
        mysqlConn(conn),
        closed(false),
        stmt(stmt),
        bind(NULL)
{
    paramCount = mysql_stmt_param_count(stmt);
    paramsSet.assign(paramCount, false);
    bind = new MYSQL_BIND[paramCount];
    ACE_OS::memset(bind, 0, sizeof(MYSQL_BIND) * paramCount);
    my_bool    bool_tmp=1;
    mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &bool_tmp);
}
コード例 #16
0
ファイル: StatementExecutor.cpp プロジェクト: 1514louluo/poco
void StatementExecutor::bindParams(MYSQL_BIND* params, std::size_t count)
{
	if (_state < STMT_COMPILED)
		throw StatementException("Statement is not compiled yet");

	if (count != mysql_stmt_param_count(_pHandle))
		throw StatementException("wrong bind parameters count", 0, _query);

	if (count == 0) return;

	if (mysql_stmt_bind_param(_pHandle, params) != 0)
		throw StatementException("mysql_stmt_bind_param() error ", _pHandle, _query);
}
コード例 #17
0
void MySqlPreparedStatement::prepare()
{
	if(isPrepared())
		return;

	//remove old binds
	unprepare();

	//create statement object
	_myStmt = _mySqlConn._MySQLStmtInit();
	poco_assert(_myStmt != nullptr);

	//prepare statement
	_mySqlConn._MySQLStmtPrepare(*this, _myStmt, _stmtSql, _stmtLen);

	//Get the parameter count from the statement
	_numParams = mysql_stmt_param_count(_myStmt);

	//Fetch result set meta information
	_myResMeta = mysql_stmt_result_metadata(_myStmt);
	//if we do not have result metadata
	if (!_myResMeta && (!strnicmp("select",_stmtSql,6)))
		poco_bugcheck_msg(Poco::format("SQL: no meta information for '%s', ERROR %s",this->getSqlString(),this->lastErrorDescr()).c_str());

	//set up bind input buffers
	_myArgs.resize(_numParams);
	for (size_t i=0;i<_myArgs.size();i++)
		memset(&_myArgs[i], 0, sizeof(MYSQL_BIND));

	//check if we have a statement which returns result sets
	if(_myResMeta)
	{
		//our statement is a query
		_isQuery = true;
		//get number of columns of the query
		_numColumns = mysql_num_fields(_myResMeta);

		//set up bind output buffers
		_myRes.resize(_numColumns);
		for (size_t i=0;i<_myRes.size();i++)
		{
			MYSQL_BIND& curr = _myRes[i];
			memset(&curr,0,sizeof(MYSQL_BIND));
			//TODO: implement fetching results from statements
		}
	}

	_prepared = true;
}
コード例 #18
0
ファイル: wxMySQL.cpp プロジェクト: dinguluer/vscp_software
void wxMySQLRecordset::SetHandle(MYSQL_STMT * stmt)
{
	m_Stmt = stmt;
	m_HasResult = false;	
	if(m_Stmt)
	{	
		printf("MYSQL_STMT_RESULT_METADATA\r\n");
		MYSQL_RES * metadata_result = mysql_stmt_result_metadata(m_Stmt);
		if(metadata_result)
		{				
			m_HasResult = true;
			SetFieldCount(mysql_num_fields(metadata_result));
			mysql_free_result(metadata_result);
		} else SetFieldCount(mysql_stmt_param_count(m_Stmt));
	}
}
コード例 #19
0
ファイル: wb_dbms.cpp プロジェクト: jordibrus/proview
int wb_dbms_query::prepare(const char *query, int nResult, int nParam)
{
    int rc = 0;
    static const char *method = "prepare";

    if (!m_prepared) {

        m_query = query;

        m_stmt = mysql_stmt_init(m_db->con());
        if (m_stmt == 0) error(method, "mysql_stmt_init");

        rc = mysql_stmt_prepare(m_stmt, query, strlen(query));
        if (rc) error(rc, method, "mysql_stmt_prepare");

        m_nParam  = mysql_stmt_param_count(m_stmt);
        m_nResult = mysql_stmt_field_count(m_stmt);

        assert((m_nParam == nParam) && (m_nResult == nResult));

        if (m_nParam > 0) {
            m_param.bind    = (MYSQL_BIND *)calloc(m_nParam,  sizeof(MYSQL_BIND));
            m_param.length  = (size_t *)calloc(m_nParam,  sizeof(size_t));
            m_param.is_null = (my_bool *)calloc(m_nParam,  sizeof(my_bool));

            for (int i = m_nParam - 1; i >= 0; i--) {
                m_param.bind[i].is_null = &m_param.is_null[i];
                m_param.bind[i].length  = (long unsigned int *)&m_param.length[i];
            }
        }

        if (m_nResult > 0) {
            m_result.bind    = (MYSQL_BIND *)calloc(m_nResult, sizeof(MYSQL_BIND));
            m_result.length  = (size_t *)calloc(m_nParam,  sizeof(size_t));
            m_result.is_null = (my_bool *)calloc(m_nResult, sizeof(my_bool));

            for (int i = m_nResult - 1; i >= 0; i--) {
                m_result.bind[i].is_null = &m_result.is_null[i];
                m_result.bind[i].length  = (long unsigned int *)&m_result.length[i];
            }
        }

        m_prepared = true;
    }

    return rc;
}
コード例 #20
0
ファイル: lmtmysql.c プロジェクト: LaHaine/lmt
static int
_update_timestamp (lmt_db_t db)
{
    MYSQL_BIND param[1];
    uint64_t timestamp;
    struct timeval tv;
    int retval = -1;

    assert (db->magic == LMT_DBHANDLE_MAGIC);
    if (!db->ins_timestamp_info) {
        errno = EPERM;
        goto done;
    }
    /* N.B. Round timestamp down to nearest multiple of LMT_UPDATE_INTERVAL,
     * seconds and don't insert a new entry if <= the last timestamp inserted.
     * This keeps the number of rows in TIMESTAMP_INFO in check.
     */
    if (gettimeofday (&tv, NULL) < 0)
        goto done;
    timestamp = tv.tv_sec;
    timestamp -= (timestamp % LMT_UPDATE_INTERVAL);
    if (timestamp <= db->timestamp) {
        retval = 0;
        goto done;
    }
    memset (param, 0, sizeof (param));
    assert (mysql_stmt_param_count (db->ins_timestamp_info) == 1);
    _param_init_int (&param[0], MYSQL_TYPE_LONGLONG, &timestamp);

    if (mysql_stmt_bind_param (db->ins_timestamp_info, param)) {
        if (lmt_conf_get_db_debug ())
            msg ("error binding params for insert into %s TIMESTAMP_INFO: %s",
                lmt_db_fsname (db), mysql_error (db->conn));
        goto done;
    }
    if (mysql_stmt_execute (db->ins_timestamp_info)) {
        if (lmt_conf_get_db_debug ())
            msg ("error executing insert into %s TIMESTAMP_INFO: %s",
                 lmt_db_fsname (db), mysql_error (db->conn));
        goto done;
    }
    db->timestamp = timestamp;
    db->timestamp_id = (uint64_t)mysql_insert_id (db->conn);
    retval = 0;
done:
    return retval;
}
コード例 #21
0
ファイル: mysqldataprovider.cpp プロジェクト: BornHunter/CGSF
bool MySqlDataProvider::prepareSql(const std::string &sql)
{
    if (!mIsConnected)
        return false;

    LOG_DEBUG("MySqlDataProvider::prepareSql Preparing SQL statement: " << sql);

    cleanBinds();

    if (mysql_stmt_prepare(mStmt, sql.c_str(), sql.size()) != 0)
        return false;

    // Allocate bind memory now that the prepared state is done.
    mBind = new MYSQL_BIND[(int)mysql_stmt_param_count(mStmt)];

    return true;
}
コード例 #22
0
ファイル: statement.cpp プロジェクト: iexception007/mysqlppc
	Statement::Statement(MYSQL* conn, const string& sql)
	{
		m_conn = conn;
		m_stmt = mysql_stmt_init(m_conn);
		if(!m_stmt)
			throw(MysqlException(ERRORS,"mysql_stmt_init error"));
		m_state = STMT_INITED;
		m_binder = NULL;

		STMT_Throw(m_stmt,
				mysql_stmt_prepare(m_stmt, sql.data(), sql.size())
			);
		int pc = mysql_stmt_param_count(m_stmt);
		if (pc > 0)
			m_binder = new Binder(pc);
		m_state = STMT_COMPILED;
	}
コード例 #23
0
ファイル: mysqlembed.cpp プロジェクト: ruidafu/HPCC-Platform
 MySQLPreparedStatement(MySQLConnection *_conn, MySQLStatement *_stmt)
 : conn(_conn), stmt(_stmt)
 {
     // Create bindings for input parameters
     inputBindings.init(mysql_stmt_param_count(*stmt));
     // And for results
     res.setown(new MySQLResult(mysql_stmt_result_metadata(*stmt)));
     if (*res)
     {
         resultBindings.bindResults(*res);
         /* Bind the result buffers */
         if (mysql_stmt_bind_result(*stmt, resultBindings.queryBindings()))
             fail(mysql_stmt_error(*stmt));
     }
     else if (mysql_stmt_errno(*stmt))  // SQL actions don't return results...
         fail(mysql_stmt_error(*stmt));
 }
コード例 #24
0
ファイル: apr_dbd_mysql.c プロジェクト: dago/opencsw
static int dbd_mysql_pvquery(apr_pool_t *pool, apr_dbd_t *sql, int *nrows,
                             apr_dbd_prepared_t *statement, va_list args)
{
    MYSQL_BIND *bind;
    char *arg;
    int ret;
    int nargs = 0;
    int i;
    my_bool is_null = FALSE;

    if (sql->trans && sql->trans->errnum) {
        return sql->trans->errnum;
    }
    nargs = mysql_stmt_param_count(statement->stmt);

    bind = apr_palloc(pool, nargs*sizeof(MYSQL_BIND));
    for (i=0; i < nargs; ++i) {
        arg = va_arg(args, char*);
        bind[i].buffer_type = MYSQL_TYPE_VAR_STRING;
        bind[i].buffer = arg;
        bind[i].buffer_length = strlen(arg);
        bind[i].length = &bind[i].buffer_length;
        bind[i].is_null = &is_null;
        bind[i].is_unsigned = 0;
    }

    ret = mysql_stmt_bind_param(statement->stmt, bind);
    if (ret != 0) {
        *nrows = 0;
        ret = mysql_stmt_errno(statement->stmt);
    }
    else {
        ret = mysql_stmt_execute(statement->stmt);
        if (ret != 0) {
            ret = mysql_stmt_errno(statement->stmt);
        }
        *nrows = mysql_stmt_affected_rows(statement->stmt);
    }
    if (sql->trans) {
        sql->trans->errnum = ret;
    }
    return ret;
}
コード例 #25
0
MyStatement::MyStatement(MyDatabase *db, MYSQL_STMT *stmt)
: m_mysql(db->m_mysql), m_pParent(db), m_stmt(stmt), m_rs(NULL), m_Results(false)
{
	m_Params = (unsigned int)mysql_stmt_param_count(m_stmt);

	if (m_Params)
	{
		m_pushinfo = (ParamBind *)malloc(sizeof(ParamBind) * m_Params);
		memset(m_pushinfo, 0, sizeof(ParamBind) * m_Params);
		m_bind = (MYSQL_BIND *)malloc(sizeof(MYSQL_BIND) * m_Params);
		memset(m_bind, 0, sizeof(MYSQL_BIND) * m_Params);
	} else {
		m_pushinfo = NULL;
		m_bind = NULL;
	}

	m_pRes = mysql_stmt_result_metadata(stmt);
	m_Results = false;
}
コード例 #26
0
ファイル: db.c プロジェクト: ericuni/note
MYSQL_STMT *db_stmt_prepare(MYSQL_STMT *stmt, MYSQL *con, const char *sql, const int para_num){
// 	init the statement
	if((stmt = mysql_stmt_init(con)) == NULL){
		printf("Mysql statement initialization failed.\n");
		exit(0);
	}
// 	combine the statement with the sql
	if(mysql_stmt_prepare(stmt, sql, strlen(sql))){
	  printf("mysql_stmt_prepare(), INSERT failed\n");
	  printf("%s", mysql_stmt_error(stmt));
	  exit(0);
	}

// 	ensure the parameter number is correct
	if(mysql_stmt_param_count(stmt) != para_num){
		printf("invalid parameter count returned by MySQL\n");
		exit(0);
	}
	return stmt;
}
コード例 #27
0
ファイル: m_mysql_command.cpp プロジェクト: mzxdream/bak
std::pair<unsigned, MError> MMysqlCommand::DoExecuteNonQuery()
{
    int param_count = mysql_stmt_param_count(p_stmt_);
    if (static_cast<size_t>(param_count) != in_params_.size())
    {
        MLOG(MGetLibLogger(), MERR, "param count is not match need:", param_count, " actual is:", in_params_.size());
        return std::pair<unsigned, MError>(0, MError::NotMatch);
    }
    if (mysql_stmt_bind_param(p_stmt_, &in_params_[0]) != 0)
    {
        MLOG(MGetLibLogger(), MERR, "bind failed errno:", mysql_stmt_errno(p_stmt_), " error:", mysql_stmt_error(p_stmt_));
        return std::pair<unsigned, MError>(0, MError::Unknown);
    }
    if (mysql_stmt_execute(p_stmt_) != 0)
    {
        MLOG(MGetLibLogger(), MERR, "execute failed errorno:", mysql_stmt_errno(p_stmt_), " error:", mysql_stmt_error(p_stmt_));
        return std::pair<unsigned, MError>(0, MError::Unknown);
    }
    unsigned affect = mysql_stmt_affected_rows(p_stmt_);
    return std::make_pair(affect, MError::No);
}
コード例 #28
0
ファイル: m_mysql_command.cpp プロジェクト: mzxdream/bak
MError MMysqlCommand::DoExecuteReader()
{
    int param_count = mysql_stmt_param_count(p_stmt_);
    if (static_cast<size_t>(param_count) != in_params_.size())
    {
        MLOG(MGetLibLogger(), MERR, "param count is not match need:", param_count, " actual is :", in_params_.size());
        return MError::NotMatch;
    }
    if (mysql_stmt_bind_param(p_stmt_, &in_params_[0]) != 0)
    {
        MLOG(MGetLibLogger(), MERR, "bind failed errno:", mysql_stmt_errno(p_stmt_), " error:", mysql_stmt_error(p_stmt_));
        return MError::Unknown;
    }
    my_bool update_max_length = 1;
    mysql_stmt_attr_set(p_stmt_, STMT_ATTR_UPDATE_MAX_LENGTH, static_cast<void*>(&update_max_length));
    if (mysql_stmt_execute(p_stmt_) != 0)
    {
        MLOG(MGetLibLogger(), MERR, "execute failed errno:", mysql_stmt_errno(p_stmt_), " error:", mysql_stmt_error(p_stmt_));
        return MError::Unknown;
    }
    return BindResult();
}
コード例 #29
0
ファイル: SqlStatement.cpp プロジェクト: saeschdivara/x0
bool SqlStatement::run()
{
	TRACE("run: %s", query_);
	if (bindOffset_ != mysql_stmt_param_count(stmt_)) {
		error_ = "Invalid parameter count";
		fprintf(stderr, "Cannot run argument with invalid parameter count.\n");
		return false;
	}

	if (paramCount_ != 0 && mysql_stmt_bind_param(stmt_, params_) != 0) {
		error_ = mysql_stmt_error(stmt_);
		return false;
	}

	unsigned i = 0;
	for (bool done = false; !done; i = 1 + i % 10) {
		switch (mysql_stmt_execute(stmt_)) {
			case CR_SERVER_GONE_ERROR:
			case CR_SERVER_LOST_EXTENDED:
			case CR_SERVER_LOST:
				if (i)
					sleep(i); 

				break;
			case 0:
				done = true;
				break;
			default:
				error_ = mysql_stmt_error(stmt_);
				fprintf(stderr, "sql: statement execution error: %s\n", error_);
				return false;
		}
	}

	mysql_stmt_store_result(stmt_);
	error_ = nullptr;
	return true;
}
コード例 #30
0
ファイル: table_mysql.c プロジェクト: Drustan/OpenSMTPD
static MYSQL_STMT *
table_mysql_prepare_stmt(MYSQL *_db, const char *query, unsigned long nparams,
    unsigned int nfields)
{
	MYSQL_STMT	*stmt;

	if ((stmt = mysql_stmt_init(_db)) == NULL) {
		log_warnx("warn: table-mysql: mysql_stmt_init: %s",
		    mysql_error(_db));
		goto end;
	}
	if (mysql_stmt_prepare(stmt, query, strlen(query))) {
		log_warnx("warn: table-mysql: mysql_stmt_prepare: %s",
		    mysql_stmt_error(stmt));
		goto end;
	}
	if (mysql_stmt_param_count(stmt) != nparams) {
		log_warnx("warn: table-mysql: wrong number of params for %s", query);
		goto end;
	}
	if (mysql_stmt_field_count(stmt) != nfields) {
		log_warnx("warn: table-mysql: wrong number of columns in resultset");
		goto end;
	}
	if (mysql_stmt_bind_result(stmt, results)) {
		log_warnx("warn: table-mysql: mysql_stmt_bind_results: %s",
		    mysql_stmt_error(stmt));
		goto end;
	}

	return (stmt);

    end:
	if (stmt)
		mysql_stmt_close(stmt);

	return (NULL);
}