]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/extra/m_mysql.cpp
Attach to events and register services in init()
[user/henk/code/inspircd.git] / src / modules / extra / m_mysql.cpp
index b4d7cd7c6c670d37f2f00e0ec35e1edf00961ac2..08ec93cf2b324313f7fc2b13ee44bef8cb7770fe 100644 (file)
@@ -1,16 +1,25 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2006-2007, 2009 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2006-2009 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
  *
- * This program is free but copyrighted software; see
- *         the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd 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, version 2.
  *
- * ---------------------------------------------------
+ * 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/>.
  */
 
+
 /* Stop mysql wanting to use long long */
 #define NO_CLIENT_LONG_LONG
 
 #include <mysql.h>
 #include "sql.h"
 
-#ifdef WINDOWS
-#pragma comment(lib, "mysqlclient.lib")
+#ifdef _WIN32
+# pragma comment(lib, "mysqlclient.lib")
+# pragma comment(lib, "advapi32.lib")
+# pragma comment(linker, "/NODEFAULTLIB:LIBCMT")
 #endif
 
 /* VERSION 3 API: With nonblocking (threaded) requests */
@@ -27,7 +38,6 @@
 /* $ModDesc: SQL Service Provider module for all other m_sql* modules */
 /* $CompileFlags: exec("mysql_config --include") */
 /* $LinkerFlags: exec("mysql_config --libs_r") rpath("mysql_config --libs_r") */
-/* $ModDep: m_sqlv2.h */
 
 /* THE NONBLOCKING MYSQL API!
  *
@@ -229,7 +239,7 @@ class SQLConnection : public SQLProvider
 
        // This constructor creates an SQLConnection object with the given credentials, but does not connect yet.
        SQLConnection(Module* p, ConfigTag* tag) : SQLProvider(p, "SQL/" + tag->getString("id")),
-               config(tag)
+               config(tag), connection(NULL)
        {
        }
 
@@ -281,18 +291,16 @@ class SQLConnection : public SQLProvider
                {
                        /* XXX: See /usr/include/mysql/mysqld_error.h for a list of
                         * possible error numbers and error messages */
-                       SQLerror e(SQL_QREPLY_FAIL, ConvToStr(mysql_errno(connection)) + std::string(": ") + mysql_error(connection));
+                       SQLerror e(SQL_QREPLY_FAIL, ConvToStr(mysql_errno(connection)) + ": " + mysql_error(connection));
                        return new MySQLresult(e);
                }
        }
 
        bool CheckConnection()
        {
-               if (mysql_ping(connection) != 0)
-               {
+               if (!connection || mysql_ping(connection) != 0)
                        return Connect();
-               }
-               else return true;
+               return true;
        }
 
        std::string GetError()
@@ -346,7 +354,7 @@ class SQLConnection : public SQLProvider
                        {
                                std::string field;
                                i++;
-                               while (i < q.length() && isalpha(q[i]))
+                               while (i < q.length() && isalnum(q[i]))
                                        field.push_back(q[i++]);
                                i--;
 
@@ -447,8 +455,10 @@ void ModuleSQL::OnUnloadModule(Module* mod)
 {
        SQLerror err(SQL_BAD_DBID);
        Dispatcher->LockQueue();
-       for(unsigned int i = qq.size() - 1; i >= 0; i--)
+       unsigned int i = qq.size();
+       while (i > 0)
        {
+               i--;
                if (qq[i].q->creator == mod)
                {
                        if (i == 0)
@@ -493,7 +503,7 @@ void DispatcherThread::Run()
                         */
 
                        this->LockQueue();
-                       if (Parent->qq.front().q == i.q)
+                       if (!Parent->qq.empty() && Parent->qq.front().q == i.q)
                        {
                                Parent->qq.pop_front();
                                Parent->rq.push_back(RQueueItem(i.q, res));