/* #@ _PROCESS_CALL_RESULT_ */ static void process_call_result (MYSQL *conn, MYSQL_STMT *stmt) { int status; int num_cols; /* * For each result, check number of columns. If none, the result is * the final status packet and there is nothing to do. Otherwise, * fetch the result set. */ do { if ((num_cols = mysql_stmt_field_count (stmt)) > 0) { /* announce whether result set contains parameters or data set */ if (conn->server_status & SERVER_PS_OUT_PARAMS) printf ("OUT/INOUT parameter values:\n"); else printf ("Statement result set values:\n"); if (process_result_set (stmt, num_cols)) break; /* some error occurred */ } /* status is -1 = done, 0 = more results, >0 = error */ status = mysql_stmt_next_result (stmt); if (status > 0) print_stmt_error (stmt, "Error checking for next result"); } while (status == 0); }
int CMySQLDynamicRecordSet::NextResults() { if(m_pDBConnection==NULL||m_hStmt==NULL) return DBERR_INVALID_PARAM; int RetCode; RetCode=mysql_stmt_next_result(m_hStmt); if(RetCode>0) return DBERR_FETCH_RESULT_FAIL; if(mysql_stmt_bind_result(m_hStmt,&(m_FetchBuffer[0]))) { m_pDBConnection->ProcessErrorMsg(m_hStmt,"绑定结果集失败"); return DBERR_BINDCOLFAIL; } if(m_CacheAllData) { if(mysql_stmt_store_result(m_hStmt)) { m_pDBConnection->ProcessErrorMsg(m_hStmt,"缓存结果集失败"); return DBERR_BUFFER_OVERFLOW; } } int Ret=FetchRow(); return Ret; }
int test_sp_reset1(MYSQL *mysql) { int rc; 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 'foo' FROM DUAL;" " SELECT 'bar' 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); 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); rc= mysql_stmt_store_result(stmt); check_stmt_rc(rc, stmt); rc= mysql_stmt_next_result(stmt); check_stmt_rc(rc, stmt); rc= mysql_stmt_fetch(stmt); check_stmt_rc(rc, stmt); /* mysql_stmt_reset should set statement in prepared state. * this means: all subsequent result sets should be flushed. * Let's try! */ rc= mysql_stmt_reset(stmt); check_stmt_rc(rc, stmt); rc= mysql_query(mysql, "DROP PROCEDURE p1"); check_mysql_rc(rc, mysql); mysql_stmt_close(stmt); return OK; }
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); }
MError MMysqlCommand::DoGotoNextResult() { int ret = mysql_stmt_next_result(p_stmt_); if (ret == 0) { return BindResult(); } else if (ret < 0) { MLOG(MGetLibLogger(), MWARN, "next result ret is ", ret); return MError::Unknown; } else { MLOG(MGetLibLogger(), MWARN, "next result errno:", mysql_stmt_errno(p_stmt_), " error:", mysql_stmt_error(p_stmt_)); return MError::Unknown; } }
long MyRecordset::LoadStmt(MYSQL_STMT* stmt, long indcol) { MYSQL_FIELD *fields; MYSQL_BIND* binds = NULL; /* for output buffers */ MYSQL_RES *result = NULL; result = mysql_stmt_result_metadata(stmt); test_stmt_error(stmt, result == NULL); char* buffer = NULL; nbcol = mysql_stmt_field_count(stmt); fields = mysql_fetch_fields(result); binds = new MYSQL_BIND[nbcol*sizeof(MYSQL_BIND)]; memset(binds, 0, sizeof (MYSQL_BIND) * nbcol); int size=0; for(int i = 0; i < nbcol; i++) size+=fields[i].length; buffer = new char[size*8]; memset(buffer, 0, sizeof (char) * size*8); int pos = 0; for(int i = 0; i < nbcol; i++) { colname.push_back(fields[i].name); coltype.push_back(fields[i].type); binds[i].buffer_type = fields[i].type; binds[i].is_null = 0; binds[i].buffer = &buffer[pos]; binds[i].buffer_length = fields[i].length; pos+=fields[i].length; } int status = mysql_stmt_bind_result(stmt, binds); test_stmt_error(stmt, status); int linenum = 0; char tmp[8000]; while(true) { status = mysql_stmt_fetch(stmt); if (status == 1 || status == MYSQL_NO_DATA) break; data.push_back(vector<string>()); MYSQL_TIME ts; string stmp; for(int i = 0; i < nbcol; i++) { switch (binds[i].buffer_type) { case MYSQL_TYPE_TINY: snprintf(tmp, 8000, "%d", *((signed char*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_SHORT: snprintf(tmp, 8000, "%d", *((short int*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_LONG: snprintf(tmp, 8000, "%d", *((int*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_LONGLONG: snprintf(tmp, 8000, "%lld", *((long long int*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_DECIMAL: snprintf(tmp, 8000, "%s", ((char*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_NEWDECIMAL: snprintf(tmp, 8000, "%s", (char*)(binds[i].buffer)); stmp = string(tmp); data.back().push_back(stmp); break; case MYSQL_TYPE_FLOAT: snprintf(tmp, 8000, "%f", *((float*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_DOUBLE: snprintf(tmp, 8000, "%f", *((double*)(binds[i].buffer))); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_TIME: ts = *((MYSQL_TIME*)(binds[i].buffer)); snprintf(tmp, 8000, "%04d-%02d-%02d %02d:%02d:%02d", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_DATE: ts = *((MYSQL_TIME*)(binds[i].buffer)); snprintf(tmp, 8000, "%04d-%02d-%02d %02d:%02d:%02d", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_DATETIME: ts = *((MYSQL_TIME*)(binds[i].buffer)); snprintf(tmp, 8000, "%04d-%02d-%02d %02d:%02d:%02d", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_TIMESTAMP: ts = *((MYSQL_TIME*)(binds[i].buffer)); snprintf(tmp, 8000, "%04d-%02d-%02d %02d:%02d:%02d", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_STRING: snprintf(tmp, 8000, "%s", (char*)binds[i].buffer); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_VAR_STRING: snprintf(tmp, 8000, "%s", (char*)binds[i].buffer); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_BLOB: snprintf(tmp, 8000, "%s", (char*)binds[i].buffer); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_BIT: snprintf(tmp, 8000, "%s", (char*)binds[i].buffer); data.back().push_back(string(tmp)); break; case MYSQL_TYPE_NULL: data.back().push_back(""); break; default: printf("UNKNOWN TYPE %s %d\n", fields[i].name, binds[i].buffer_type); exit(1); break; } if(indcol != -1 && i == indcol) { int cval = *((int*)(binds[i].buffer)); index[cval] = linenum; } } linenum++; } nbrow = linenum; while(mysql_stmt_next_result(stmt) == 0) { linenum+=0; } mysql_free_result(result); delete[] binds; delete[] buffer; return 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; }
int test_sp_reset2(MYSQL *mysql) { int rc, i; MYSQL_STMT *stmt; MYSQL_BIND bind[4]; long l[4]; char *stmtstr= "CALL P1()"; memset(l, 0, sizeof(l)); rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); check_mysql_rc(rc, mysql); rc= mysql_query(mysql, "CREATE TABLE t1 (a int)"); check_mysql_rc(rc, mysql); rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1"); check_mysql_rc(rc, mysql); rc= mysql_query(mysql, "CREATE PROCEDURE p1()" "BEGIN " " SET @a:=1;" " INSERT INTO t1 VALUES(1);" " SELECT 1 FROM DUAL;" " SELECT 2,3 FROM DUAL;" " INSERT INTO t1 VALUES(2);" " SELECT 3,4,5 FROM DUAL;" " SELECT 4,5,6,7 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); rc= mysql_stmt_execute(stmt); check_stmt_rc(rc, stmt); memset(bind, 0, sizeof(MYSQL_BIND) * 4); for (i=0; i < 4; i++) { bind[i].buffer_type= MYSQL_TYPE_LONG; bind[i].buffer= &l[i]; } rc= mysql_stmt_bind_result(stmt, bind); check_stmt_rc(rc, stmt); while (rc != MYSQL_NO_DATA) { rc= mysql_stmt_fetch(stmt); diag("l=%ld", l[0]); } rc= mysql_stmt_next_result(stmt); check_stmt_rc(rc, stmt); /* now rebind since we expect 2 columns */ rc= mysql_stmt_bind_result(stmt, bind); check_stmt_rc(rc, stmt); while (rc != MYSQL_NO_DATA) { rc= mysql_stmt_fetch(stmt); diag("l=%ld l=%ld", l[0], l[1]); } rc= mysql_stmt_next_result(stmt); check_stmt_rc(rc, stmt); /* now rebind since we expect 2 columns */ rc= mysql_stmt_bind_result(stmt, bind); check_stmt_rc(rc, stmt); while (rc != MYSQL_NO_DATA) { rc= mysql_stmt_fetch(stmt); diag("l=%ld l=%ld l=%ld", l[0], l[1], l[2]); } rc= mysql_stmt_close(stmt); rc= mysql_query(mysql, "DROP PROCEDURE p1"); check_mysql_rc(rc, mysql); return OK; }
static int test_multi_result(MYSQL *mysql) { MYSQL_STMT *stmt; MYSQL_BIND ps_params[3]; /* input parameter buffers */ MYSQL_BIND rs_bind[3]; int int_data[3]; /* input/output values */ my_bool is_null[3]; /* output value nullability */ int rc, i; /* set up stored procedure */ rc = mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1"); check_mysql_rc(rc, mysql); rc = mysql_query(mysql, "CREATE PROCEDURE p1(" " IN p_in INT, " " OUT p_out INT, " " INOUT p_inout INT) " "BEGIN " " SELECT p_in, p_out, p_inout; " " SET p_in = 100, p_out = 200, p_inout = 300; " " SELECT p_in, p_out, p_inout; " "END"); check_mysql_rc(rc, mysql); /* initialize and prepare CALL statement with parameter placeholders */ stmt = mysql_stmt_init(mysql); if (!stmt) { diag("Could not initialize statement"); exit(1); } rc = mysql_stmt_prepare(stmt, "CALL p1(?, ?, ?)", 16); check_stmt_rc(rc, stmt); /* initialize parameters: p_in, p_out, p_inout (all INT) */ memset(ps_params, 0, sizeof (ps_params)); ps_params[0].buffer_type = MYSQL_TYPE_LONG; ps_params[0].buffer = (char *) &int_data[0]; ps_params[0].length = 0; ps_params[0].is_null = 0; ps_params[1].buffer_type = MYSQL_TYPE_LONG; ps_params[1].buffer = (char *) &int_data[1]; ps_params[1].length = 0; ps_params[1].is_null = 0; ps_params[2].buffer_type = MYSQL_TYPE_LONG; ps_params[2].buffer = (char *) &int_data[2]; ps_params[2].length = 0; ps_params[2].is_null = 0; /* bind parameters */ rc = mysql_stmt_bind_param(stmt, ps_params); check_stmt_rc(rc, stmt); /* assign values to parameters and execute statement */ int_data[0]= 10; /* p_in */ int_data[1]= 20; /* p_out */ int_data[2]= 30; /* p_inout */ rc = mysql_stmt_execute(stmt); check_stmt_rc(rc, stmt); FAIL_IF(mysql_stmt_field_count(stmt) != 3, "expected 3 fields"); memset(rs_bind, 0, sizeof (MYSQL_BIND) * 3); for (i=0; i < 3; i++) { rs_bind[i].buffer = (char *) &(int_data[i]); rs_bind[i].buffer_length = sizeof (int_data); rs_bind[i].buffer_type = MYSQL_TYPE_LONG; rs_bind[i].is_null = &is_null[i]; } rc= mysql_stmt_bind_result(stmt, rs_bind); check_stmt_rc(rc, stmt); rc= mysql_stmt_fetch(stmt); check_stmt_rc(rc, stmt); FAIL_IF(int_data[0] != 10 || int_data[1] != 20 || int_data[2] != 30, "expected 10 20 30"); rc= mysql_stmt_next_result(stmt); check_stmt_rc(rc, stmt); rc= mysql_stmt_bind_result(stmt, rs_bind); rc= mysql_stmt_fetch(stmt); FAIL_IF(mysql_stmt_field_count(stmt) != 3, "expected 3 fields"); FAIL_IF(int_data[0] != 100 || int_data[1] != 200 || int_data[2] != 300, "expected 100 200 300"); FAIL_IF(mysql_stmt_next_result(stmt) != 0, "expected more results"); rc= mysql_stmt_bind_result(stmt, rs_bind); rc= mysql_stmt_fetch(stmt); FAIL_IF(mysql_stmt_field_count(stmt) != 2, "expected 2 fields"); FAIL_IF(int_data[0] != 200 || int_data[1] != 300, "expected 100 200 300"); FAIL_IF(mysql_stmt_next_result(stmt) != 0, "expected more results"); FAIL_IF(mysql_stmt_field_count(stmt) != 0, "expected 0 fields"); rc= mysql_stmt_close(stmt); return OK; }
int test_sp_params(MYSQL *mysql) { int i, rc; MYSQL_STMT *stmt; int a[] = {10,20,30}; MYSQL_BIND bind[3]; char *stmtstr= "CALL P1(?,?,?)"; char res[3][20]; 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); memset(res, 0, 60); memset(bind, 0, sizeof(MYSQL_BIND) * 3); for (i=0; i < 3; i++) { bind[i].buffer_type= MYSQL_TYPE_STRING; bind[i].buffer_length= 20; bind[i].buffer= res[i]; } do { if (mysql->server_status & SERVER_PS_OUT_PARAMS) { diag("out param result set"); FAIL_IF(mysql_stmt_field_count(stmt) != 2, "expected 2 columns"); FAIL_IF(strcmp(stmt->fields[0].org_name, "p_out") != 0, "wrong field name"); FAIL_IF(strcmp(stmt->fields[1].org_name, "p_inout") != 0, "wrong field name"); rc= mysql_stmt_bind_result(stmt, bind); check_stmt_rc(rc, stmt); rc= mysql_stmt_fetch(stmt); check_stmt_rc(rc, stmt); FAIL_IF(strcmp(res[0],"This is OUT param") != 0, "comparison failed"); FAIL_IF(strcmp(res[1],"200") != 0, "comparison failed"); } else if (mysql_stmt_field_count(stmt)) { diag("sp result set"); FAIL_IF(mysql_stmt_field_count(stmt) != 3, "expected 3 columns"); rc= mysql_stmt_bind_result(stmt, bind); check_stmt_rc(rc, stmt); rc= mysql_stmt_fetch(stmt); check_stmt_rc(rc, stmt); FAIL_IF(strcmp(res[0],"200") != 0, "comparison failed"); FAIL_IF(strcmp(res[1],"300") != 0, "comparison failed"); FAIL_IF(strcmp(res[2],"OUT param") != 0, "comparison failed"); } } while (mysql_stmt_next_result(stmt) == 0); rc= mysql_stmt_close(stmt); return OK; }