/*
* 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;
*/