X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FmysqlConn.c;h=27f01a1c6f7ff7f37248d10ccc08076fb9e8ddfc;hp=66494e7f5055cf333db9d500c9bde2a605c7f2cd;hb=c575e458c6257e75b97884847143b20965a5dfda;hpb=0f1dc61921eef1db8e404a5a82372e2d1cd55daa diff --git a/src/mysqlConn.c b/src/mysqlConn.c index 66494e7..27f01a1 100644 --- a/src/mysqlConn.c +++ b/src/mysqlConn.c @@ -1,5 +1,22 @@ +/* mysqlConn.c - NeonServ v5.2 + * Copyright (C) 2011 Philipp Kreil (pk910) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "mysqlConn.h" +#define DATABASE_VERSION "5" struct used_result { MYSQL_RES *result; @@ -14,12 +31,14 @@ struct escaped_string { MYSQL *mysql_conn = NULL; static struct used_result *used_results; static struct escaped_string *escaped_strings; +static int mysql_serverport; +static char *mysql_host, *mysql_user, *mysql_pass, *mysql_base; void check_mysql() { int errid; if((errid = mysql_ping(mysql_conn))) { if(mysql_errno(mysql_conn) == CR_SERVER_GONE_ERROR) { - if(!mysql_real_connect(mysql_conn, MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_BASE, MYSQL_PORT, NULL, 0)) { + if(!mysql_real_connect(mysql_conn, mysql_host, mysql_user, mysql_pass, mysql_base, mysql_serverport, NULL, 0)) { show_mysql_error(); } } else { @@ -59,12 +78,93 @@ void mysql_free() { escaped_strings = NULL; } -void init_mysql() { +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_PORT, NULL, 0)) { + if (!mysql_real_connect(mysql_conn, mysql_host, mysql_user, mysql_pass, mysql_base, mysql_serverport, NULL, 0)) { //error show_mysql_error(); } + //check database version... + int version = 0; + if(!mysql_query(mysql_conn, "SELECT `database_version` FROM `version`")) { + MYSQL_RES *res = mysql_use(); + MYSQL_ROW row; + if((row = mysql_fetch_row(res))) { + version = atoi(row[0]); + } + } + printf("%d \n", version); + if(!version) { + //CREATE DATABASE + FILE *f = fopen("database.sql", "r"); + mysql_set_server_option(mysql_conn, MYSQL_OPTION_MULTI_STATEMENTS_ON); + if (f) { + char line[512]; + char query_buffer[8192]; + int query_buffer_pos = 0; + while (fgets(line, sizeof(line), f)) { + query_buffer_pos += sprintf(query_buffer + query_buffer_pos, " %s", line); + if(line[(strlen(line) - 2)] == ';') { + if(mysql_query(mysql_conn, query_buffer)) + show_mysql_error(); + query_buffer_pos = 0; + } + } + fclose(f); + } + f = fopen("database.defaults.sql", "r"); + if (f) { + char line[4096]; + char query_buffer[131072]; + int query_buffer_pos = 0; + while (fgets(line, sizeof(line), f)) { + query_buffer_pos += sprintf(query_buffer + query_buffer_pos, " %s", line); + if(line[(strlen(line) - 2)] == ';') { + if(mysql_query(mysql_conn, query_buffer)) + show_mysql_error(); + query_buffer_pos = 0; + } + } + fclose(f); + } + mysql_set_server_option(mysql_conn, MYSQL_OPTION_MULTI_STATEMENTS_OFF); + mysql_query(mysql_conn, "INSERT INTO `version` (`database_version`) VALUES ('" DATABASE_VERSION "')"); + } + else if(version < atoi(DATABASE_VERSION)) { + //UPDATE DATABASE + FILE *f = fopen("database.upgrade.sql", "r"); + mysql_set_server_option(mysql_conn, MYSQL_OPTION_MULTI_STATEMENTS_ON); + if (f) { + char line[512]; + char query_buffer[8192]; + int query_buffer_pos = 0, use_querys = 0; + sprintf(query_buffer, "-- version: %d", version); + while (fgets(line, sizeof(line), f)) { + if(use_querys) { + query_buffer_pos += sprintf(query_buffer + query_buffer_pos, " %s", line); + if(line[strlen(line) - 1] == ';') { + mysql_query(mysql_conn, query_buffer); + query_buffer_pos = 0; + } + } else if(!stricmp(query_buffer, line)) { + use_querys = 1; + } + } + if(query_buffer_pos) { + if(mysql_query(mysql_conn, query_buffer)) + show_mysql_error(); + } + fclose(f); + } else + perror("database.sql missing!"); + mysql_set_server_option(mysql_conn, MYSQL_OPTION_MULTI_STATEMENTS_OFF); + mysql_query(mysql_conn, "UPDATE `version` SET `database_version` = '" DATABASE_VERSION "'"); + } } void free_mysql() {