diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-03-13 01:41:35 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-03-13 01:41:35 +0000 |
commit | 1efedf9743fefe8269c2bcd292306de06a1b615e (patch) | |
tree | 15921f924d73a867d88fc2870d67e471875e4bd8 /src | |
parent | 11e45f2cb78c0667e2c7c7e2370944bf64b140b8 (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.cpp | 42 |
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() |