// These are my C MySQL wrappers... can you find anything wrong here? memory leaks? int db_connect(MYSQL** mysql) { *mysql = NULL; if( (*mysql = mysql_init(*mysql)) == NULL ) { qplerror("Insufficient memory to initialize MYSQL object"); return 0; } else if( !mysql_real_connect(*mysql, dbhost, dbuser, dbpass, dbname, 0, NULL, 0) ) { qplerror("Failed to connect to MySQL database %s (user %s)", dbhost, dbuser); return 0; } return 1; } void db_close(MYSQL* mysql) { mysql_close(mysql); } MYSQL_RES* db_query(MYSQL* mysql, const char* query, ...) { MYSQL_RES* result; char query_fmt[BUFSIZ]; va_list args; va_start(args, query); vsnprintf(query_fmt, sizeof(query_fmt), query, args); va_end(args); if( mysql_query(mysql, query_fmt) != 0 ) { qplerror("Failed to query MySQL database %s (%s)\r\nQuery: %s\r\nError: %s\r\n", dbname, dbhost, query_fmt, mysql_error(mysql)); return NULL; } if( (result = mysql_store_result(mysql)) != NULL ) { if( mysql_num_rows(result) > 0 ) { return result; } free(result); } return NULL; } // get null-terminated string from mysql result set at specified index char* db_gets(MYSQL_RES* result, MYSQL_ROW row, int index) { unsigned long* lengths = mysql_fetch_lengths(result); char p[lengths[index]+1]; // +1 for '\0' int i; LogLine("webtunnel.log", "db_gets A"); LogLine("webtunnel.log", "db_gets A: index: %d", index); for(i = 0;i < lengths[index];i++) { p[i] = row[index][i]; } LogLine("webtunnel.log", "db_gets B"); p[lengths[index]] = '\0'; LogLine("webtunnel.log", "db_gets C"); return strdup(p); } void db_gets_all(MYSQL_RES* result, MYSQL_ROW row, char*** result_arr, size_t nrows) { int i; char** arr_local; if( (arr_local = calloc(nrows, sizeof *arr_local)) != NULL ) { for(i = 0;i < nrows;i++) { arr_local[i] = db_gets(result, row, i); } } *result_arr = arr_local; } void db_gets_all_free(char*** result_arr, size_t nrows) { int i; for(i = 0;i < nrows;i++) free_tmp((*result_arr)[i], "db_gets_all_free"); free_tmp(*result_arr, "db_gets_all_free"); } // mysql_real_escape_string() a mysql field char* mres(MYSQL* mysql, char* field, size_t maxlen) { int len = strlen(field); if( maxlen < len+1+2*len+1 ) { *field = '\0'; return ""; } mysql_real_escape_string(mysql, field+len+1, field, len); return field+len+1; }