]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Implement OnUnloadModule for postgres
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 13 Mar 2010 01:41:35 +0000 (01:41 +0000)
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>
Sat, 13 Mar 2010 01:41:35 +0000 (01:41 +0000)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12627 e03df62e-2008-0410-955e-edbf42e46eb7

docs/modules.conf.example
src/modules/extra/m_pgsql.cpp

index 3e405dcd3c1e2b77b64afa69c6ec1d4a97073c1b..1bd91c29317a9b8fa44f6bcf32b40b45c9b42734 100644 (file)
 # m_mssql.so is more complex than described here, see wiki for more   #
 # info http://wiki.inspircd.org/Modules/mssql                         #
 #
-#<database name="db" username="user" password="pass" hostname="localhost" id="db1">
+#<database module="mssql" name="db" username="user" password="pass" hostname="localhost" id="db1">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # MySQL module: Allows other SQL modules to access MySQL databases
 # m_mysql.so is more complex than described here, see the wiki for    #
 # more: http://wiki.inspircd.org/Modules/mysql                        #
 #
-#<database name="mydb" username="myuser" password="mypass" hostname="localhost" id="my_database2">
+#<database module="mysql" name="mydb" username="myuser" password="mypass" hostname="localhost" id="my_database2">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Named Modes module: This module allows for the display and set/unset
 # m_pgsql.so is more complex than described here, see the wiki for    #
 # more: http://wiki.inspircd.org/Modules/pgsql                        #
 #
-#<database name="mydb" username="myuser" password="mypass" hostname="localhost" id="my_database" ssl="no">
+#<database module="pgsql" name="mydb" username="myuser" password="mypass" hostname="localhost" id="my_database" ssl="no">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # Muteban: Implements extended ban m:, which stops anyone matching
 # m_sqlite.so is more complex than described here, see the wiki for   #
 # more: http://wiki.inspircd.org/Modules/sqlite3                      #
 #
-#<database hostname="/full/path/to/database.db" id="anytext">
+#<database module="sqlite" hostname="/full/path/to/database.db" id="anytext">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
 # SQLutils module: Provides some utilities to SQL client modules, such
index 85d092241d2074627e42d00f0ae9beb60684724b..735ca2f5aedced6f1d0b5d5535f2964c4381504a 100644 (file)
@@ -124,19 +124,16 @@ class PgSQLresult : public SQLResult
  */
 class SQLConn : public SQLProvider, public EventHandler
 {
- private:
+ public:
        reference<ConfigTag> conf;      /* The <database> entry */
        std::deque<SQLQuery*> queue;
        PGconn*                 sql;            /* PgSQL database connection handle */
        SQLstatus               status;         /* PgSQL database connection status */
        SQLQuery*               qinprog;        /* If there is currently a query in progress */
-       time_t                  idle;           /* Time we last heard from the database */
 
- public:
        SQLConn(Module* Creator, ConfigTag* tag)
        : SQLProvider(Creator, "SQL/" + tag->getString("id")), conf(tag), sql(NULL), status(CWRITE), qinprog(NULL)
        {
-               idle = ServerInstance->Time();
                if (!DoConnect())
                {
                        ServerInstance->Logs->Log("m_pgsql",DEFAULT, "WARNING: Could not connect to database " + tag->getString("id")); 
@@ -274,11 +271,6 @@ restart:
 
                if (PQconsumeInput(sql))
                {
-                       /* We just read stuff from the server, that counts as it being alive
-                        * so update the idle-since time :p
-                        */
-                       idle = ServerInstance->Time();
-
                        if (PQisBusy(sql))
                        {
                                /* Nothing happens here */
@@ -487,6 +479,13 @@ restart:
        }
 };
 
+class DummyQuery : public SQLQuery
+{
+ public:
+       DummyQuery(Module* me) : SQLQuery(me, "") {}
+       void OnResult(SQLResult& result) {}
+};
+
 class ModulePgSQL : public Module
 {
  public:
@@ -555,7 +554,30 @@ class ModulePgSQL : public Module
 
        void OnUnloadModule(Module* mod)
        {
-               // TODO cancel queries that will have a bad vtable
+               SQLerror err(SQL_BAD_DBID);
+               for(ConnMap::iterator i = connections.begin(); i != connections.end(); i++)
+               {
+                       SQLConn* conn = i->second;
+                       if (conn->qinprog && conn->qinprog->creator == mod)
+                       {
+                               conn->qinprog->OnError(err);
+                               delete conn->qinprog;
+                               conn->qinprog = new DummyQuery(this);
+                       }
+                       std::deque<SQLQuery*>::iterator j = conn->queue.begin();
+                       while (j != conn->queue.end())
+                       {
+                               SQLQuery* q = *j;
+                               if (q->creator == mod)
+                               {
+                                       q->OnError(err);
+                                       delete q;
+                                       j = conn->queue.erase(j);
+                               }
+                               else
+                                       j++;
+                       }
+               }
        }
 
        Version GetVersion()