#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; }