summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-03-13 01:41:35 +0000
committerdanieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7>2010-03-13 01:41:35 +0000
commit1efedf9743fefe8269c2bcd292306de06a1b615e (patch)
tree15921f924d73a867d88fc2870d67e471875e4bd8 /src
parent11e45f2cb78c0667e2c7c7e2370944bf64b140b8 (diff)
Implement OnUnloadModule for postgres
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12627 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/modules/extra/m_pgsql.cpp42
1 files changed, 32 insertions, 10 deletions
diff --git a/src/modules/extra/m_pgsql.cpp b/src/modules/extra/m_pgsql.cpp
index 85d092241..735ca2f5a 100644
--- a/src/modules/extra/m_pgsql.cpp
+++ b/src/modules/extra/m_pgsql.cpp
@@ -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()