MySQLMud/data/
MySQLMud/doc/
MySQLMud/log/
MySQLMud/players/
MySQLMud/www/images/
socketmud/data/
socketmud/doc/
socketmud/log/
socketmud/players/
#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;
}