Public feed #890258

Miscellany

public text v1 · immutable
Raw Edit
·published 2008-02-03 16:21 UTC
rendered paste body
// 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;
}