#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "mud.h"
#include "mysql.h"
int sql_working;
/*
* load_mysql()
*
* Opens the database, provides errors, etc
*/
void load_mysql(void)
{
if (!open_db() )
{
log_string("*** MySQL ************: Could not open Database.\n");
log_string("*** MySQL ************: Reason:\n%s\n", mysql_error(&mysqlconn));
exit (1);
return;
}
log_string("*** MySQL ************: Connection open and working.");
return;
}
/*
* MySQLQuery()
*
* Inserts a raw query to the SQL server
* returns true if it works, false if it fails
*
* Modified to use Safe Query
*/
int MySQLQuery(char * query)
{
mysql_safe_query(query);
return 1;
}
/*
* open_db()
*
* Opens a connection to the SQL database
*/
int open_db(void)
{
if (!mysql_init(&mysqlconn))
{
log_string("*** MySQL ************: Unable to open database!\n");
return FALSE;
}
if ((mysql_real_connect(&mysqlconn, MY_SERVER, MY_USER, MY_PWD, MY_DB, MY_PORT, MY_SOCK, MY_FLAG)) == NULL)
{
log_string("*** MySQL ************: open_db() failed during opening!\n");
mysql_close(&mysqlconn);
return FALSE;
}
return TRUE;
}
/*
* close_db()
*
* Closes connection to the SQL server
*/
void close_db(void)
{
log_string("*** MySQL ************: close_db(): closed\n");
mysql_close(&mysqlconn);
return;
}
/*
* mysql_safe_query()
*
* Sanitizes Sql Querys
*/
int mysql_safe_query (char *fmt, ...)
{
va_list argp;
int i = 0;
double j = 0;
char *s = 0, *out = 0, *p = 0;
char safe [MAX_BUFFER];
char query [MAX_BUFFER];
*query = '\0';
*safe = '\0';
va_start (argp, fmt);
for ( p = fmt, out = query; *p != '\0'; p++ ) {
if ( *p != '%' ) {
*out++ = *p;
continue;
}
switch ( *++p ) {
case 'c':
i = va_arg (argp, int);
out += sprintf (out, "%c", i);
break;
case 's':
s = va_arg (argp, char *);
if ( !s ) {
out += sprintf (out, " ");
break;
}
mysql_real_escape_string (&mysqlconn, safe, s, strlen(s));
out += sprintf (out, "%s", safe);
*safe = '\0';
break;
case 'd':
i = va_arg (argp, int);
out += sprintf (out, "%d", i);
break;
case 'f':
j = va_arg (argp, double);
out += sprintf (out, "%f", j);
break;
case '%':
out += sprintf (out, "%%");
break;
}
}
*out = '\0';
va_end (argp);
if (mysql_real_query(&mysqlconn, query, strlen(query)))
{
log_string("*** MySQL ************: Error:\n%s\n", mysql_error(&mysqlconn));
return FALSE;
}
mysql_free_result(result);
return 1;
}
/*
* MySQL_optimize()
*
* Optimizes all used tables.
* TODO: How the hell can i run all of these without causing:
* Commands out of sync; you can't run this command now
*/
void MySQL_optimize(void)
{
char query[4096];
snprintf(query, sizeof(query) + 1, "OPTIMIZE TABLE `vand_players`");
MySQLQuery(query);
/*
snprintf(query, sizeof(query) + 1, "OPTIMIZE TABLE `vand_logins`");
MySQLQuery(query);
snprintf(query, sizeof(query) + 1, "OPTIMIZE TABLE `vand_help_add`");
MySQLQuery(query);
snprintf(query, sizeof(query) + 1, "OPTIMIZE TABLE `vand_help`");
MySQLQuery(query);
snprintf(query, sizeof(query) + 1, "OPTIMIZE TABLE `vand_chatlog`");
MySQLQuery(query);
*/
return;
}