X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fextra%2Fm_sql.cpp;h=654d841918284aebb3f70b6ba8c8496d6df2bb1f;hb=2c6c072c1f5f19d1471feb43fa94bba0030e5fb6;hp=8b9f212a0991c0afd5a68bd11a5a89dafe9a0c21;hpb=d651aeb61a34e047586806a3db434ac6390aad73;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/extra/m_sql.cpp b/src/modules/extra/m_sql.cpp index 8b9f212a0..654d84191 100644 --- a/src/modules/extra/m_sql.cpp +++ b/src/modules/extra/m_sql.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * Inspire is copyright (C) 2002-2004 ChatSpike-Dev. + * InspIRCd is copyright (C) 2002-2004 ChatSpike-Dev. * E-mail: * * @@ -26,8 +26,8 @@ using namespace std; #include "m_sql.h" /* $ModDesc: SQL Service Provider module for all other m_sql* modules */ -/* $CompileFlags: -I/usr/local/include/mysql -I/usr/include/mysql -I/usr/local/include -I/usr/include */ -/* $LinkerFlags: -L/usr/local/lib/mysql -Wl,--rpath -Wl,/usr/local/lib/mysql -L/usr/lib/mysql -Wl,--rpath -Wl,/usr/lib/mysql -lmysqlclient */ +/* $CompileFlags: `mysql_config --include` */ +/* $LinkerFlags: `mysql_config --libs` `perl ../mysql_rpath.pl` */ /** SQLConnection represents one mysql session. * Each session has its own persistent connection to the database. @@ -37,7 +37,7 @@ using namespace std; #define mysql_field_count mysql_num_fields #endif -class SQLConnection +class SQLConnection : public classbase { protected: @@ -64,15 +64,15 @@ class SQLConnection this->pass = thispass; this->db = thisdb; this->id = myid; - unsigned int timeout = 1; - mysql_init(&connection); - mysql_options(&connection,MYSQL_OPT_CONNECT_TIMEOUT,(char*)&timeout); } // This method connects to the database using the credentials supplied to the constructor, and returns // true upon success. bool Connect() { + unsigned int timeout = 1; + mysql_init(&connection); + mysql_options(&connection,MYSQL_OPT_CONNECT_TIMEOUT,(char*)&timeout); return mysql_real_connect(&connection, host.c_str(), user.c_str(), pass.c_str(), db.c_str(), 0, NULL, 0); } @@ -80,6 +80,8 @@ class SQLConnection // multiple rows. bool QueryResult(std::string query) { + if (!CheckConnection()) return false; + int r = mysql_query(&connection, query.c_str()); if (!r) { @@ -90,17 +92,20 @@ class SQLConnection // This method issues a query that just expects a number of 'effected' rows (e.g. UPDATE or DELETE FROM). // the number of effected rows is returned in the return value. - unsigned long QueryCount(std::string query) + long QueryCount(std::string query) { - int r = mysql_query(&connection, query.c_str()); - if (!r) - { - res = mysql_store_result(&connection); - unsigned long rows = mysql_affected_rows(&connection); - mysql_free_result(res); - return rows; - } - return 0; + /* If the connection is down, we return a negative value - New to 1.1 */ + if (!CheckConnection()) return -1; + + int r = mysql_query(&connection, query.c_str()); + if (!r) + { + res = mysql_store_result(&connection); + unsigned long rows = mysql_affected_rows(&connection); + mysql_free_result(res); + return rows; + } + return 0; } // This method fetches a row, if available from the database. You must issue a query @@ -115,15 +120,20 @@ class SQLConnection if (row) { unsigned int field_count = 0; + MYSQL_FIELD *fields = mysql_fetch_fields(res); if(mysql_field_count(&connection) == 0) return thisrow; - MYSQL_FIELD *fields = mysql_fetch_fields(res); - while (field_count < mysql_field_count(&connection)) + if (fields && mysql_field_count(&connection)) { - thisrow[std::string(fields[field_count].name)] = std::string(row[field_count]); - field_count++; + while (field_count < mysql_field_count(&connection)) + { + std::string a = (fields[field_count].name ? fields[field_count].name : ""); + std::string b = (row[field_count] ? row[field_count] : ""); + thisrow[a] = b; + field_count++; + } + return thisrow; } - return thisrow; } } return thisrow; @@ -134,11 +144,28 @@ class SQLConnection if (res) { mysql_free_result(res); + res = NULL; return true; } else return false; } + bool ConnectionLost() + { + if (&connection) { + return (mysql_ping(&connection) != 0); + } + else return false; + } + + bool CheckConnection() + { + if (ConnectionLost()) { + return Connect(); + } + else return true; + } + std::string GetError() { return mysql_error(&connection); @@ -286,6 +313,11 @@ class ModuleSQL : public Module } } + void Implements(char* List) + { + List[I_OnRehash] = List[I_OnRequest] = 1; + } + char* OnRequest(Request* request) { if (request) @@ -323,12 +355,12 @@ class ModuleSQL : public Module virtual ~ModuleSQL() { Connections.clear(); - delete Conf; + DELETE(Conf); } - virtual void OnRehash(std::string parameter) + virtual void OnRehash(const std::string ¶meter) { - delete Conf; + DELETE(Conf); Conf = new ConfigReader(); LoadDatabases(Conf); }