asgard/
asgard/.settings/
asgard/area/
asgard/data/clans/
asgard/data/clans/history/
asgard/data/rosters/
asgard/src/notice/
/*
 *    The headers need to be added here
 */

#include "include.h"
#include <mysql.h>

/*
 *  Here, there need to be externs to a NEW variable set in merc.h, to check and see if the
 *  mySQL server is open for connections. And a way to check to see if the mysql server is
 *  up and running at any one time.
 *  The variable would be named like: bool sql_on, if it's true, then it works, if it's 
 *  false, then it's not working
 *  Also, there needs to be a variable in the directories include to tell which code we're
 *  running.
 *  Now, here's the functions and how to use them
 *  sql_connect: this is the raw entrance, don't worry too much about it
 *  sql_disconnect: closes connection
 *  boot_database, void function to start the mysql thread
 *  connect_ping: not sure, it was from jason's code, seems useful
 *  sql_parse: parses a value to allow for special characters.
 *  sql_status: returns sql status as a string
 *  
 *  This is the update of an integer field
 *  void sql_update_int(table name,field name,table key name,integer value,row id)
 *
 *  This is the update of a character field
 *  void sql_update_char(table name,field name,table key name,character string,row id)
 *  
 *  This inserts a new row into a table:
 *  void sql_insert_row(table name,table key field,row)
 *
 *  This removes a row from a table:
 *  void sql_delete_row(table name,table key field,row id)
 *
 *  This is the counting routine for locating how many rows are in a table
 *  int sql_count_table(table name,table key)
 * 
 *  This counts the number of returned matches for a search
 *  int sql_count_search_field(table name,field to search,the match string)
 *
 *  This returns the value of an integer
 *  char sql_search_int_field(table name,field name,search number,table key,the match number to return)
 *
 *  This requires an example: 
 *  sql_search_int_field(players,age,17,p_id,2) 
 *  would return the second match (it starts at 1 and goes to the number of return searches)
 *
 *  Same as above, cept returns char value
 *  char sql_search_char_field(table,field,search string,key,match number)
 *
 *  This replaces the char value of a field, with the new string
 *  void sql_update_char_field(table,field,new string,table key,row id)
 *
 *  This replaces the int value of a field, with the new int
 *  void sql_update_int_field(table,field,new integer,table key,row id)
 *
 *  This is the retrieve command for integers
 *  int sql_get_int_field(table,field,table key,row id)
 *
 *  This is the retrieve command for strings
 *  char sql_get_int_field(table,field,table key,row id)
 */

MYSQL * sql_connect(void)
{
	MYSQL * conn; /* pointer to connection handler */
	char stderr[MSL];
	char buf[MSL];

	conn = mysql_init(NULL); /* allocate, initialize connection handler */

	if (conn == NULL)
	{
		sprintf(stderr, "mysql_init() failed (probably out of memory)\r\n");
		log_string(stderr);
		return (NULL);
	}

	if (mysql_real_connect(conn, db_host, db_user, db_pass, db_name, 0, NULL, 0)
			== NULL)
	{
		sprintf(stderr, "mysql_real_connect() failed:\r\nError %u (%s)\r\n",
				mysql_errno(conn), mysql_error(conn));
		log_string(stderr);
		return (NULL);
	}

	sprintf(buf, "MySQL: Connected to the sql server [Thread: %ld]",
			mysql_thread_id(conn));
	log_string(buf);

	return (conn);
}

void sql_disconnect(MYSQL *conn)
{
	mysql_close(conn);

	log_string("Disconnected from the sql server.");
}

MYSQL *conn;
MYSQL_RES *res_set;

bool sql_ping(void)
{
	if (conn == NULL)
	{
		log_string("MySQL: Ping.");
		mysql_ping(conn);
		return TRUE;
	}

	return FALSE;
}

char *sql_parse(char *name)
{
	char *buf;

	buf = NULL;
	(void) mysql_escape_string(buf, name, strlen(name));
	return buf;
}

void sql_update_char(char *table, char *field, char *key, char *value, long id)
{
	char buf[MSL];

	sprintf(buf, "UPDATE %s SET %s='%s' WHERE %s=%ld", table, field, sql_parse(
			value), key, id);
	mysql_query(conn, buf);
	return;

}

void sql_update_int(char *table, char *field, char *key, int value, long id)
{
	char buf[MSL];
	sprintf(buf, "UPDATE %s SET %s=%d WHERE %s=%ld", table, field, value, key,
			id);
	mysql_query(conn, buf);
	return;
}

void sql_insert_row(char *table, char *key, long id)
{
	char buf[MSL];
	sprintf(buf, "INSERT INTO %s (%s) VALUES(%ld)", table, key, id);
	mysql_query(conn, buf);
}

void sql_delete_row(char *table, char *key, long id)
{
	char buf[MSL];
	sprintf(buf, "DELETE FROM %s WHERE %s=%ld", table, key, id);
	mysql_query(conn, buf);
}

int sql_count_table(char *table, char *key)
{
	char buf[MSL];

	int count;
	sprintf(buf, "SELECT COUNT(%s) FROM %s", key, table);
	mysql_query(conn, buf);
	res_set = mysql_store_result(conn);
	count = mysql_num_rows(res_set);
	mysql_free_result(res_set);
	return count;

}
int sql_count_search_field(char *table, char *field, char *search, char *key)
{
	char buf[MSL];

	int count;
	sprintf(buf, "SELECT COUNT(%s) FROM %s WHERE %s='%s'", key, table, field,
			sql_parse(search));
	mysql_query(conn, buf);
	res_set = mysql_store_result(conn);
	count = mysql_num_rows(res_set);
	mysql_free_result(res_set);
	return count;

}

int sql_search_int_field(char *table, char *field, char *value, char *key,
		int place)
{
	MYSQL_ROW row;
	char buf[MSL];

	int result;
	int total = 0;
	int i;
	if (place > total)
		place = total;
	if (place < 1)
		place = 1;
	place--;
	sprintf(buf, "SELECT %s FROM %s WHERE %s='%s' ORDER BY %s", field, table,
			field, sql_parse(value), key);
	mysql_query(conn, buf);
	res_set = mysql_store_result(conn);
	total = mysql_num_rows(res_set);
	for (i = 0; i < total; i++)
	{
		row = mysql_fetch_row(res_set);
		if (i == place)
			sprintf(buf, "%s", row[0]);
	}
	mysql_free_result(res_set);
	if (!buf)
		sprintf(buf, "0");
	result = atoi(buf);
	return result;
}

char *sql_search_char_field(char *table, char *field, char *value, char *key,
		int place)
{
	MYSQL_ROW row;
	char buf[MSL];
	char *result = '\0';
	int total = 0;
	int i;

	if (place > total)
		place = total;
	if (place < 1)
		place = 1;
	place--;
	sprintf(buf, "SELECT %s FROM %s WHERE %s='%s' ORDER BY %s", field, table,
			field, key, sql_parse(value));
	mysql_query(conn, buf);
	res_set = mysql_store_result(conn);
	total = mysql_num_rows(res_set);
	for (i = 0; i < total; i++)
	{
		row = mysql_fetch_row(res_set);
		if (i == place)
			sprintf(result, "%s", row[0]);
	}
	mysql_free_result(res_set);
	return result;
}

void sql_update_char_field(char *table, char *field, char *value, char *key,
		long id)
{
	char buf[MSL];

	sprintf(buf, "UPDATE %s SET %s='%s' WHERE %s='%ld'", table, field,
			sql_parse(value), key, id);
	mysql_query(conn, buf);
	return;
}
void sql_update_int_field(char *table, char *field, int value, char *key,
		long id)
{
	char buf[MSL];

	sprintf(buf, "UPDATE %s SET %s='%d' WHERE %s='%ld'", table, field, value,
			key, id);
	mysql_query(conn, buf);
	return;
}

int sql_get_int_field(char *table, char *field, char *key, long id)
{
	MYSQL_ROW row;
	char buf[MSL];

	int ret;

	sprintf(buf, "SELECT %s FROM %s WHERE %s=%ld", table, field, key, id);
	mysql_query(conn, buf);
	res_set = mysql_store_result(conn);
	row = mysql_fetch_row(res_set);
	ret = atoi(row[0]);
	mysql_free_result(res_set);
	return (ret);

}

char *sql_get_char_field(char *table, char *field, char *key, long id)
{
	char buf[MSL];
	MYSQL_ROW row;

	char *ret;

	sprintf(buf, "SELECT %s FROM %s WHERE %s=%ld", table, field, key, id);
	mysql_query(conn, buf);
	res_set = mysql_store_result(conn);
	row = mysql_fetch_row(res_set);
	if (row[0] != NULL)
	{
		ret = str_dup(row[0]);
	}
	else
	{
		ret = "NULL";
	}

	mysql_free_result(res_set);

	return ret;
}

char *sql_status(void)
{
	if (conn == NULL)
		return "No Connection";

	return mysql_stat(conn);
}

/* In progress
 bool sql_player_full( CHAR_DATA *ch )
 {
 if ( !sql_player_save(ch) )
 return;

 if ( !sql_clan_update(ch) )
 return;




 bool sql_player_save( CHAR_DATA *ch )
 {
 if (conn == NULL)
 return FALSE;


 */