X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FmysqlConn.c;h=12ab76d6ff709ab7bf986e08384a62beaaef80bd;hb=c32e8254ec4ed0d77757e32f8aa5aabcdb494057;hp=d2430f0889d0ec772dd1d15f236a655e0b266e22;hpb=989cb8324ec8fe9caba511d89051552638dbc776;p=NeonServV5.git diff --git a/src/mysqlConn.c b/src/mysqlConn.c index d2430f0..12ab76d 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -16,7 +16,15 @@ */ #include "mysqlConn.h" -#define DATABASE_VERSION "10" +#define DATABASE_VERSION "15" + +struct mysql_conn_struct { + unsigned long tid; + MYSQL *mysql_conn; + struct used_result *used_results; + struct escaped_string *escaped_strings; + struct mysql_conn_struct *next; +}; struct used_result { MYSQL_RES *result; @@ -28,13 +36,18 @@ struct escaped_string { struct escaped_string *next; }; -MYSQL *mysql_conn = NULL; -static struct used_result *used_results; -static struct escaped_string *escaped_strings; +struct mysql_conn_struct *get_mysql_conn_struct(); + +struct mysql_conn_struct *mysql_conns = NULL; static int mysql_serverport; static char *mysql_host, *mysql_user, *mysql_pass, *mysql_base; +#ifdef HAVE_THREADS +static pthread_mutex_t synchronized; +#endif + void check_mysql() { + MYSQL *mysql_conn = get_mysql_conn(); int errid; if((errid = mysql_ping(mysql_conn))) { if(mysql_errno(mysql_conn) == CR_SERVER_GONE_ERROR) { @@ -49,46 +62,49 @@ void check_mysql() { } MYSQL_RES *mysql_use() { - MYSQL_RES *res = mysql_store_result(mysql_conn); + struct mysql_conn_struct *mysql_conn = get_mysql_conn_struct(); + MYSQL_RES *res = mysql_store_result(mysql_conn->mysql_conn); struct used_result *result = malloc(sizeof(*result)); if (!result) { mysql_free_result(res); return NULL; } result->result = res; - result->next = used_results; - used_results = result; + result->next = mysql_conn->used_results; + mysql_conn->used_results = result; return res; } void mysql_free() { + struct mysql_conn_struct *mysql_conn = get_mysql_conn_struct(); + if(!mysql_conn) return; struct used_result *result, *next_result; - for(result = used_results; result; result = next_result) { + for(result = mysql_conn->used_results; result; result = next_result) { next_result = result->next; mysql_free_result(result->result); free(result); } - used_results = NULL; + mysql_conn->used_results = NULL; struct escaped_string *escaped, *next_escaped; - for(escaped = escaped_strings; escaped; escaped = next_escaped) { + for(escaped = mysql_conn->escaped_strings; escaped; escaped = next_escaped) { next_escaped = escaped->next; free(escaped->string); free(escaped); } - escaped_strings = NULL; + mysql_conn->escaped_strings = NULL; } void init_mysql(char *host, int port, char *user, char *pass, char *base) { + THREAD_MUTEX_INIT(synchronized); mysql_host = strdup(host); mysql_serverport = port; mysql_user = strdup(user); mysql_pass = strdup(pass); mysql_base = strdup(base); - mysql_conn = mysql_init(NULL); - if (!mysql_real_connect(mysql_conn, mysql_host, mysql_user, mysql_pass, mysql_base, mysql_serverport, NULL, 0)) { - //error - show_mysql_error(); - } + + + MYSQL *mysql_conn = get_mysql_conn(); + //check database version... int version = 0; if(!mysql_query(mysql_conn, "SELECT `database_version` FROM `version`")) { @@ -176,15 +192,23 @@ void init_mysql(char *host, int port, char *user, char *pass, char *base) { } void free_mysql() { - mysql_close(mysql_conn); + struct mysql_conn_struct *mysql_conn, *next; + for(mysql_conn = mysql_conns; mysql_conn; mysql_conn = next) { + next = mysql_conn->next; + mysql_close(mysql_conn->mysql_conn); + free(mysql_conn); + } + mysql_conns = NULL; } void show_mysql_error() { + MYSQL *mysql_conn = get_mysql_conn(); //show mysql_error() printf("MySQL Error: %s\n", mysql_error(mysql_conn)); } void printf_mysql_query(const char *text, ...) { + MYSQL *mysql_conn = get_mysql_conn(); va_list arg_list; char queryBuf[MYSQLMAXLEN]; int pos; @@ -204,6 +228,7 @@ void printf_mysql_query(const char *text, ...) { } void printf_long_mysql_query(int len, const char *text, ...) { + MYSQL *mysql_conn = get_mysql_conn(); va_list arg_list; char queryBuf[len]; int pos; @@ -223,14 +248,50 @@ void printf_long_mysql_query(int len, const char *text, ...) { } char* escape_string(const char *str) { + struct mysql_conn_struct *mysql_conn = get_mysql_conn_struct(); struct escaped_string *escapedstr = malloc(sizeof(*escapedstr)); if (!escapedstr) { return NULL; } char escaped[strlen(str)*2+1]; - mysql_real_escape_string(mysql_conn, escaped, str, strlen(str)); + mysql_real_escape_string(mysql_conn->mysql_conn, escaped, str, strlen(str)); escapedstr->string = strdup(escaped); - escapedstr->next = escaped_strings; - escaped_strings = escapedstr; + escapedstr->next = mysql_conn->escaped_strings; + mysql_conn->escaped_strings = escapedstr; return escapedstr->string; } + +struct mysql_conn_struct *get_mysql_conn_struct() { + SYNCHRONIZE(synchronized); + struct mysql_conn_struct *mysql_conn; + unsigned long tid; + #ifdef HAVE_THREADS + tid = syscall(SYS_gettid); + #else + tid = 1; + #endif + for(mysql_conn = mysql_conns; mysql_conn; mysql_conn = mysql_conn->next) { + if(mysql_conn->tid == tid) { + DESYNCHRONIZE(synchronized); + return mysql_conn; + } + } + mysql_conn = malloc(sizeof(*mysql_conn)); + mysql_conn->mysql_conn = mysql_init(NULL); + mysql_conn->tid = tid; + mysql_conn->used_results = NULL; + mysql_conn->escaped_strings = NULL; + mysql_conn->next = mysql_conns; + mysql_conns = mysql_conn; + if (!mysql_real_connect(mysql_conn->mysql_conn, mysql_host, mysql_user, mysql_pass, mysql_base, mysql_serverport, NULL, 0)) { + //error + show_mysql_error(); + } + DESYNCHRONIZE(synchronized); + return mysql_conn; +} + +MYSQL *get_mysql_conn() { + struct mysql_conn_struct *mysql_conn = get_mysql_conn_struct(); + return mysql_conn->mysql_conn; +}