1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
void MySQLStatement::execute(ArchiveCollector & collector)
{
MYSQL_FIELD *field_mysql;
debug_log(debug_database, "execute %lx", (size_t)this);
_ResultArchive result_archive(*this);
int nbcolonnes = 0;
bool is_a_select = static_cast < MySQLDatabase * > (database().get())->current_query_is_a_select();
bool first_occur = true;// search column only once
if (!_stmt)
{
fprintf(stderr, " mysql_stmt_init(), out of memory\n");
exit(0);
}
if(mysql_stmt_execute(_stmt) != 0)
{
//error
fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(_stmt),"\n");
exit(0);
}
if (is_a_select == true)
{
int count = 0;
int nb_column = 0;
unsigned long length;
my_bool is_null;
my_bool error;
MYSQL_RES *res_set = mysql_stmt_result_metadata(_stmt);
while(field_mysql = mysql_fetch_field(res_set)) // how many column
{
nb_column++;
}
_results_vectorbind.resize(nb_column);
_lenght_selected_value.resize(nb_column);
_error_selectedvalue.resize(nb_column);
_is_null_selected_value.resize(nb_column);
for (count = 0; count < nb_column ; count++)
{
_results_vectorbind[count].buffer_type= MYSQL_TYPE_STRING;
_results_vectorbind[count].buffer_length= 0;
_results_vectorbind[count].buffer= NULL;
_results_vectorbind[count].is_null= &_is_null_selected_value[count];
_results_vectorbind[count].length= &_lenght_selected_value[count];
_results_vectorbind[count].error= &_error_selectedvalue[count];
}
mysql_stmt_bind_result(_stmt, &_results_vectorbind[0]);// vector will have selected values
if (mysql_stmt_store_result(_stmt))
{
fprintf(stderr, " mysql_stmt_store_result() failed\n");
fprintf(stderr, " %s\n", mysql_stmt_error(_stmt));
exit(0);
}
/* Fetch all rows */
int res_sql_fetch;
res_sql_fetch = mysql_stmt_fetch(_stmt);
while ( res_sql_fetch == 0 || res_sql_fetch == 101 ) //0 : succesfull - 101 if data is truncated (normal)
{
if (first_occur == true)
{
while(field_mysql = mysql_fetch_field(res_set)) // Nom de colonnes
{
boost::optional < Field > field_name;
field_name = field_for_name(field_mysql->name);
if (field_name != NULL)
{
// initialised
_tab_asso_nomcolonnes[*field_name] = nbcolonnes; // *field_name is no longer a boost::optionnal <Field> but a Field
nbcolonnes++;
}
}
first_occur = false;
}
collector.collect(result_archive);
res_sql_fetch = mysql_stmt_fetch(_stmt);// fetch stmt again
}
}
_reset();
} |
Partager