X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FmysqlConn.c;h=45ab1931dee8766b7e13c9a4a15da6cfa41fd3fc;hp=a651b1682bb9fcdefbbf5f6b2c73f72d645e4a44;hb=f6bdc9d0fc8db22c265918f3325e11177fd001b9;hpb=48a8b8db9062c0544574f9373fd0e37fda0832ba diff --git a/src/mysqlConn.c b/src/mysqlConn.c index a651b16..45ab193 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -1,4 +1,4 @@ -/* mysqlConn.c - NeonServ v5.3 +/* mysqlConn.c - NeonServ v5.6 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -16,7 +16,20 @@ */ #include "mysqlConn.h" -#define DATABASE_VERSION "13" +#include "ConfigParser.h" +#include "tools.h" +#include "log.h" +#define DATABASE_VERSION "20" + +static void show_mysql_error(); + +struct mysql_conn_struct { + unsigned int 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 +41,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; -void check_mysql() { +#ifdef HAVE_THREADS +static pthread_mutex_t synchronized; +#endif + +static 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 +67,74 @@ 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) { - 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(); - } +int reload_mysql() { + char *new_mysql_host = get_string_field("MySQL.host"); + char *new_mysql_user = get_string_field("MySQL.user"); + char *new_mysql_pass = get_string_field("MySQL.pass"); + char *new_mysql_base = get_string_field("MySQL.base"); + if(!(new_mysql_host && new_mysql_user && new_mysql_pass && new_mysql_base)) + return 0; + + //replace login data + if(mysql_host) + free(mysql_host); + mysql_host = strdup(new_mysql_host); + + if(mysql_user) + free(mysql_user); + mysql_user = strdup(new_mysql_user); + + if(mysql_pass) + free(mysql_pass); + mysql_pass = strdup(new_mysql_pass); + + if(mysql_base) + free(mysql_base); + mysql_base = strdup(new_mysql_base); + + mysql_serverport = get_int_field("MySQL.port"); + if(!mysql_serverport) + mysql_serverport = 3306; + return 1; +} + +void init_mysql() { + THREAD_MUTEX_INIT(synchronized); + + MYSQL *mysql_conn = get_mysql_conn(); + //check database version... int version = 0; if(!mysql_query(mysql_conn, "SELECT `database_version` FROM `version`")) { @@ -98,7 +144,6 @@ void init_mysql(char *host, int port, char *user, char *pass, char *base) { version = atoi(row[0]); } } - printf("%d \n", version); if(!version) { //CREATE DATABASE FILE *f = fopen("database.sql", "r"); @@ -116,7 +161,8 @@ void init_mysql(char *host, int port, char *user, char *pass, char *base) { } } fclose(f); - } + } else + printf_log("main", LOG_ERROR | LOG_MYSQL, "File not found: database.sql"); f = fopen("database.defaults.sql", "r"); if (f) { char line[4096]; @@ -131,7 +177,8 @@ void init_mysql(char *host, int port, char *user, char *pass, char *base) { } } fclose(f); - } + } else + printf_log("main", LOG_ERROR | LOG_MYSQL, "File not found: database.defaults.sql"); do { MYSQL_RES *res = mysql_store_result(mysql_conn); mysql_free_result(res); @@ -165,7 +212,7 @@ void init_mysql(char *host, int port, char *user, char *pass, char *base) { } fclose(f); } else - perror("database.sql missing!"); + printf_log("main", LOG_ERROR | LOG_MYSQL, "File not found: database.upgrade.sql"); do { MYSQL_RES *res = mysql_store_result(mysql_conn); mysql_free_result(res); @@ -176,15 +223,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() { +static void show_mysql_error() { + MYSQL *mysql_conn = get_mysql_conn(); //show mysql_error() - printf("MySQL Error: %s\n", mysql_error(mysql_conn)); + printf_log("main", LOG_ERROR | LOG_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; @@ -194,7 +249,7 @@ void printf_mysql_query(const char *text, ...) { va_end(arg_list); if (pos < 0 || pos > (MYSQLMAXLEN - 2)) pos = MYSQLMAXLEN - 2; queryBuf[pos] = '\0'; - printf("MySQL: %s\n", queryBuf); + printf_log("main", LOG_MYSQL, "%s\n", queryBuf); if(mysql_query(mysql_conn, queryBuf)) { check_mysql(); if(mysql_query(mysql_conn, queryBuf)) { @@ -204,6 +259,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; @@ -213,7 +269,7 @@ void printf_long_mysql_query(int len, const char *text, ...) { va_end(arg_list); if (pos < 0 || pos > (len - 2)) pos = len - 2; queryBuf[pos] = '\0'; - printf("MySQL: %s\n", queryBuf); + printf_log("main", LOG_MYSQL, "%s\n", queryBuf); if(mysql_query(mysql_conn, queryBuf)) { check_mysql(); if(mysql_query(mysql_conn, queryBuf)) { @@ -223,14 +279,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 int tid; + #ifdef HAVE_THREADS + tid = (unsigned int) pthread_self_tid(); + #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; +}