*** VERSION 5.2.0 ***
[NeonServV5.git] / src / mysqlConn.c
index 66494e7f5055cf333db9d500c9bde2a605c7f2cd..27f01a1c6f7ff7f37248d10ccc08076fb9e8ddfc 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>. 
+ */
 
 #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() {