#include "db_mysql.h" void close_db(MYSQL *mysql) { if(mysql) { mysql_close(mysql); mysql = NULL; } } MYSQL *connect_db(void) { extern char dbhost[]; extern char dbuser[]; extern char dbpass[]; extern char dbname[]; extern char dbport[]; static MYSQL *mysql = NULL; if(!mysql) { if(!(mysql = mysql_init(mysql))) { fprintf(stderr, "Init MySQL error\n"); return NULL; } if(!mysql_real_connect(mysql, dbhost, dbuser, dbpass, dbname, (unsigned)atoi(dbport), NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(mysql)); close_db(mysql); return NULL; } mysql_query(mysql, "SET NAMES utf8"); } return mysql; } unsigned long query(MYSQL *mysql, const char *sql, ResultSet *rs) { MYSQL_RES *res = NULL; MYSQL_ROW row = NULL; MYSQL_FIELD *fields = NULL; unsigned i; unsigned long j; if(mysql_query(mysql, sql)) { fprintf(stderr, "%s\n", mysql_error(mysql)); //close_db(mysql); return 0; } res = mysql_store_result(mysql); if(res) { rs->num_fields = mysql_num_fields(res); rs->num_rows = mysql_num_rows(res); rs->fields_name = (char (*)[16])calloc(rs->num_fields, sizeof(char *)); rs->row_set = (char ***)malloc(rs->num_rows * sizeof(char **)); fields = mysql_fetch_fields(res); for(i=0; inum_fields; ++i) strcpy(*(rs->fields_name+i), fields[i].name); j = 0; while(row = mysql_fetch_row(res)) { *(rs->row_set+j) = (char **)malloc(rs->num_fields * sizeof(char *)); for(i=0; inum_fields; ++i) { *(*(rs->row_set+j)+i) = (char *)calloc(strlen(*(row+i))+1, 1); strcpy(*(*(rs->row_set+j)+i), *(row+i)); printf("Row %lu, col %u: %s\n", j, i, *(*(rs->row_set+j)+i)); } ++j; } mysql_free_result(res); } else { if(mysql_field_count(mysql)) { fprintf(stderr, "%s\n", mysql_error(mysql)); //close_db(mysql); return 0; } else return 1; // } return rs->num_rows; } void free_rs(ResultSet *rs) { if(rs->row_set) { unsigned long i; unsigned j; for(i=0; inum_rows; ++i) if(*(rs->row_set+i)) { for(j=0; jnum_fields; ++j) if(*(*(rs->row_set+i)+j)) { free(*(*(rs->row_set+i)+j)); *(*(rs->row_set+i)+j) = NULL; } free(*(rs->row_set+i)); *(rs->row_set+i) = NULL; } free(rs->row_set); rs->row_set = NULL; } if(rs->fields_name) { free(rs->fields_name); rs->fields_name = NULL; } }