# 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
*/
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"));
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 */
}
};
+class DummyQuery : public SQLQuery
+{
+ public:
+ DummyQuery(Module* me) : SQLQuery(me, "") {}
+ void OnResult(SQLResult& result) {}
+};
+
class ModulePgSQL : public Module
{
public:
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()