Public feed
#890258
// 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;
}