/*========================================== * Allow user to execute SQL queries [Zarin] *------------------------------------------ */ int buildin_query_sql(struct script_state *st) { char *name = NULL; char *query; int num, i = 0,j, nb_rows; struct { char * dst_var_name; char type; } row[32]; TBL_PC *sd = (st->rid)? script_rid2sd(st) : NULL; query = conv_str(st,& (st->stack->stack_data[st->start+2])); strcpy(tmp_sql, query); // ---------- // Connect //DB connection initialized mysql_init(&mysql_handle); printf("Connect MySQL server"); printf("...\n"); if(!mysql_real_connect(&mysql_handle, '127.0.0.1', 'aurora', 'aurora', 'aurora' ,3306, (char *)NULL, 0) ) { printf("%s\n",mysql_error(&mysql_handle)); exit(1); } else { printf ("Connect Success! (MySQL Server)\n"); } // ---------- if(mysql_query(&mysql_handle,tmp_sql)){ // Close connection mysql_close(&mysql_handle); //mysql_handle = NULL; //ShowSQL("DB error - %s\n",mysql_error(&mmysql_handle)); //ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql); push_val(st->stack,C_INT,0); return 1; } // If some data was returned if((sql_res = mysql_store_result(&mysql_handle))){ // Count the number of rows to store nb_rows = mysql_num_fields(sql_res); // Can't store more row than variable if (nb_rows > st->end - (st->start+3)) nb_rows = st->end - (st->start+3); if (!nb_rows) { // Close connection mysql_close(&mysql_handle); //mysql_handle = NULL; push_val(st->stack,C_INT,0); return 0; // Nothing to store } if (nb_rows > 32) { // Close connection mysql_close(&mysql_handle); //mysql_handle = NULL; //ShowWarning("buildin_query_sql: too many rows!\n"); push_val(st->stack,C_INT,0); return 1; } memset(row, 0, sizeof(row)); // Verify argument types for(j=0; j < nb_rows; j++) { //if(!data_isreference(conv_str(st,& (st->stack->stack_data[st->start+3+j])))){ // //ShowWarning("buildin_query_sql: Parameter %d is not a variable!\n", j); // push_val(st->stack,C_INT,0); // return 0; //} else { // Store type of variable (string = 0/int = 1) num=st->stack->stack_data[st->start+3+j].u.num; name=(char *)(str_buf+str_data[num&0x00ffffff].str); if(name[strlen(name)-1] != '$') { row[j].type = 1; } row[j].dst_var_name = name; //} } // Store data while(i<128 && (sql_row = mysql_fetch_row(sql_res))){ for(j=0; j < nb_rows; j++) { if (row[j].type == 1) push_val(st->stack,C_INT,(void *)atoi(sql_row[j])); //setd_sub(st,sd, row[j].dst_var_name, i, (void *)atoi(sql_row[j]),script_getref(st,3+j)); else push_val(st->stack,C_CONSTSTR,(void *)sql_row[j]); //setd_sub(st,sd, row[j].dst_var_name, i, (void *)sql_row[j],script_getref(st,3+j)); } i++; } // Free data mysql_free_result(sql_res); } push_val(st->stack,C_INT,i); // Close connection mysql_close(&mysql_handle); //mysql_handle = NULL; return 0; }