summaryrefslogtreecommitdiff
path: root/modules/extra
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-03-04 02:41:29 -0500
committerAdam <Adam@anope.org>2011-03-04 02:41:29 -0500
commita9fb6bab15f57cfdf8349a1c3d5035fc87781470 (patch)
treee40692090dbbaff30ac976192a57061e205df6cf /modules/extra
parentdd968c07be608d391bc02faa1266d25240e82e58 (diff)
Just use blocking sql queries if m_asynch_commands isn't loaded - it's not that bad.
Diffstat (limited to 'modules/extra')
-rw-r--r--modules/extra/db_mysql_live.cpp301
1 files changed, 133 insertions, 168 deletions
diff --git a/modules/extra/db_mysql_live.cpp b/modules/extra/db_mysql_live.cpp
index 30e5a93c7..16467936d 100644
--- a/modules/extra/db_mysql_live.cpp
+++ b/modules/extra/db_mysql_live.cpp
@@ -33,181 +33,146 @@ class SQLCache : public Timer
}
};
-class ChanInfoUpdater : public SQLInterface, public SQLCache
+static void ChanInfoUpdate(const SQLResult &res)
{
- public:
- ChanInfoUpdater(Module *m) : SQLInterface(m) { }
-
- void OnResult(const SQLResult &r)
+ try
{
- ChanInfoUpdater::Process(r);
- }
-
- static void Process(const SQLResult &res)
- {
- try
- {
- ChannelInfo *ci = cs_findchan(res.Get(0, "name"));
- if (!ci)
- ci = new ChannelInfo(res.Get(0, "name"));
- ci->founder = findcore(res.Get(0, "founder"));
- ci->successor = findcore(res.Get(0, "successor"));
- ci->desc = res.Get(0, "descr");
- ci->time_registered = convertTo<time_t>(res.Get(0, "time_registered"));
- ci->ClearFlags();
- ci->FromString(BuildStringVector(res.Get(0, "flags")));
- ci->forbidby = res.Get(0, "forbidby");
- ci->forbidreason = res.Get(0, "forbidreason");
- ci->bantype = convertTo<int>(res.Get(0, "bantype"));
- ci->memos.memomax = convertTo<unsigned>(res.Get(0, "memomax"));
-
- Anope::string mlock_on = res.Get(0, "mlock_on"),
- mlock_off = res.Get(0, "mlock_off"),
- mlock_params = res.Get(0, "mlock_params"),
- mlock_params_off = res.Get(0, "mlock_params_off");
-
- Anope::string mode;
- std::vector<Anope::string> modes;
-
- spacesepstream sep(mlock_on);
- while (sep.GetToken(mode))
- modes.push_back(mode);
- ci->Extend("db_mlock_modes_on", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
-
- modes.clear();
- sep = mlock_off;
- while (sep.GetToken(mode))
- modes.push_back(mode);
- ci->Extend("db_mlock_modes_off", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
-
- modes.clear();
- sep = mlock_params;
- while (sep.GetToken(mode))
- modes.push_back(mode);
- ci->Extend("mlock_params", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
-
- modes.clear();
- sep = mlock_params_off;
- while (sep.GetToken(mode))
- modes.push_back(mode);
- ci->Extend("mlock_params_off", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
-
- ci->LoadMLock();
-
- if (res.Get(0, "botnick").equals_cs(ci->bi ? ci->bi->nick : "") == false)
- {
- if (ci->bi)
- ci->bi->UnAssign(NULL, ci);
- BotInfo *bi = findbot(res.Get(0, "botnick"));
- if (bi)
- bi->Assign(NULL, ci);
- }
-
- ci->capsmin = convertTo<int16>(res.Get(0, "capsmin"));
- ci->capspercent = convertTo<int16>(res.Get(0, "capspercent"));
- ci->floodlines = convertTo<int16>(res.Get(0, "floodlines"));
- ci->floodsecs = convertTo<int16>(res.Get(0, "floodsecs"));
- ci->repeattimes = convertTo<int16>(res.Get(0, "repeattimes"));
-
- if (ci->c)
- check_modes(ci->c);
- }
- catch (const SQLException &ex)
+ ChannelInfo *ci = cs_findchan(res.Get(0, "name"));
+ if (!ci)
+ ci = new ChannelInfo(res.Get(0, "name"));
+ ci->founder = findcore(res.Get(0, "founder"));
+ ci->successor = findcore(res.Get(0, "successor"));
+ ci->desc = res.Get(0, "descr");
+ ci->time_registered = convertTo<time_t>(res.Get(0, "time_registered"));
+ ci->ClearFlags();
+ ci->FromString(BuildStringVector(res.Get(0, "flags")));
+ ci->forbidby = res.Get(0, "forbidby");
+ ci->forbidreason = res.Get(0, "forbidreason");
+ ci->bantype = convertTo<int>(res.Get(0, "bantype"));
+ ci->memos.memomax = convertTo<unsigned>(res.Get(0, "memomax"));
+
+ Anope::string mlock_on = res.Get(0, "mlock_on"),
+ mlock_off = res.Get(0, "mlock_off"),
+ mlock_params = res.Get(0, "mlock_params"),
+ mlock_params_off = res.Get(0, "mlock_params_off");
+
+ Anope::string mode;
+ std::vector<Anope::string> modes;
+
+ spacesepstream sep(mlock_on);
+ while (sep.GetToken(mode))
+ modes.push_back(mode);
+ ci->Extend("db_mlock_modes_on", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
+
+ modes.clear();
+ sep = mlock_off;
+ while (sep.GetToken(mode))
+ modes.push_back(mode);
+ ci->Extend("db_mlock_modes_off", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
+
+ modes.clear();
+ sep = mlock_params;
+ while (sep.GetToken(mode))
+ modes.push_back(mode);
+ ci->Extend("mlock_params", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
+
+ modes.clear();
+ sep = mlock_params_off;
+ while (sep.GetToken(mode))
+ modes.push_back(mode);
+ ci->Extend("mlock_params_off", new ExtensibleItemRegular<std::vector<Anope::string> >(modes));
+
+ ci->LoadMLock();
+
+ if (res.Get(0, "botnick").equals_cs(ci->bi ? ci->bi->nick : "") == false)
{
- Log(LOG_DEBUG) << ex.GetReason();
+ if (ci->bi)
+ ci->bi->UnAssign(NULL, ci);
+ BotInfo *bi = findbot(res.Get(0, "botnick"));
+ if (bi)
+ bi->Assign(NULL, ci);
}
- catch (const ConvertException &) { }
- }
-};
-class NickInfoUpdater : public SQLInterface, public SQLCache
-{
- public:
- NickInfoUpdater(Module *m) : SQLInterface(m) { }
+ ci->capsmin = convertTo<int16>(res.Get(0, "capsmin"));
+ ci->capspercent = convertTo<int16>(res.Get(0, "capspercent"));
+ ci->floodlines = convertTo<int16>(res.Get(0, "floodlines"));
+ ci->floodsecs = convertTo<int16>(res.Get(0, "floodsecs"));
+ ci->repeattimes = convertTo<int16>(res.Get(0, "repeattimes"));
- void OnResult(const SQLResult &r)
+ if (ci->c)
+ check_modes(ci->c);
+ }
+ catch (const SQLException &ex)
{
- NickInfoUpdater::Process(r);
+ Log(LOG_DEBUG) << ex.GetReason();
}
+ catch (const ConvertException &) { }
+}
- static void Process(const SQLResult &res)
+static void NickInfoUpdate(const SQLResult &res)
+{
+ try
{
- try
+ NickCore *nc = findcore(res.Get(0, "display"));
+ if (!nc)
+ return;
+ NickAlias *na = findnick(res.Get(0, "nick"));
+ if (!na)
+ na = new NickAlias(res.Get(0, "nick"), nc);
+
+ na->last_quit = res.Get(0, "last_quit");
+ na->last_realname = res.Get(0, "last_realname");
+ na->last_usermask = res.Get(0, "last_usermask");
+ na->time_registered = convertTo<time_t>(res.Get(0, "time_registered"));
+ na->last_seen = convertTo<time_t>(res.Get(0, "last_seen"));
+ na->ClearFlags();
+ na->FromString(BuildStringVector(res.Get(0, "flags")));
+
+ if (na->nc != nc)
{
- NickCore *nc = findcore(res.Get(0, "display"));
- if (!nc)
- return;
- NickAlias *na = findnick(res.Get(0, "nick"));
- if (!na)
- na = new NickAlias(res.Get(0, "nick"), nc);
-
- na->last_quit = res.Get(0, "last_quit");
- na->last_realname = res.Get(0, "last_realname");
- na->last_usermask = res.Get(0, "last_usermask");
- na->time_registered = convertTo<time_t>(res.Get(0, "time_registered"));
- na->last_seen = convertTo<time_t>(res.Get(0, "last_seen"));
- na->ClearFlags();
- na->FromString(BuildStringVector(res.Get(0, "flags")));
-
- if (na->nc != nc)
- {
- std::list<NickAlias *>::iterator it = std::find(na->nc->aliases.begin(), na->nc->aliases.end(), na);
- if (it != na->nc->aliases.end())
- na->nc->aliases.erase(it);
+ std::list<NickAlias *>::iterator it = std::find(na->nc->aliases.begin(), na->nc->aliases.end(), na);
+ if (it != na->nc->aliases.end())
+ na->nc->aliases.erase(it);
- na->nc = nc;
- na->nc->aliases.push_back(na);
- }
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << ex.GetReason();
+ na->nc = nc;
+ na->nc->aliases.push_back(na);
}
- catch (const ConvertException &) { }
}
-};
+ catch (const SQLException &ex)
+ {
+ Log(LOG_DEBUG) << ex.GetReason();
+ }
+ catch (const ConvertException &) { }
+}
-class NickCoreUpdater : public SQLInterface, public SQLCache
+static void NickCoreUpdate(const SQLResult &res)
{
- public:
- NickCoreUpdater(Module *m) : SQLInterface(m) { }
-
- void OnResult(const SQLResult &r)
+ try
{
- NickCoreUpdater::Process(r);
+ NickCore *nc = findcore(res.Get(0, "display"));
+ if (!nc)
+ nc = new NickCore(res.Get(0, "display"));
+
+ nc->pass = res.Get(0, "pass");
+ nc->email = res.Get(0, "email");
+ nc->greet = res.Get(0, "greet");
+ nc->ClearFlags();
+ nc->FromString(BuildStringVector(res.Get(0, "flags")));
+ nc->language = res.Get(0, "language");
}
-
- static void Process(const SQLResult &res)
+ catch (const SQLException &ex)
{
- try
- {
- NickCore *nc = findcore(res.Get(0, "display"));
- if (!nc)
- nc = new NickCore(res.Get(0, "display"));
-
- nc->pass = res.Get(0, "pass");
- nc->email = res.Get(0, "email");
- nc->greet = res.Get(0, "greet");
- nc->ClearFlags();
- nc->FromString(BuildStringVector(res.Get(0, "flags")));
- nc->language = res.Get(0, "language");
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << ex.GetReason();
- }
- catch (const ConvertException &) { }
+ Log(LOG_DEBUG) << ex.GetReason();
}
-};
+ catch (const ConvertException &) { }
+}
class MySQLLiveModule : public Module
{
service_reference<SQLProvider> SQL;
service_reference<AsynchCommandsService> ACS;
- ChanInfoUpdater chaninfoupdater;
- NickInfoUpdater nickinfoupdater;
- NickCoreUpdater nickcoreupdater;
+ SQLCache chan_cache, nick_cache, core_cache;
SQLResult RunQuery(const Anope::string &query)
{
@@ -220,14 +185,6 @@ class MySQLLiveModule : public Module
return res;
}
- void RunQuery(SQLInterface *i, const Anope::string &query)
- {
- if (!this->SQL)
- throw SQLException("Unable to locate SQL reference, is m_mysql loaded and configured correctly?");
-
- return SQL->Run(i, query);
- }
-
const Anope::string Escape(const Anope::string &query)
{
return SQL ? SQL->Escape(query) : query;
@@ -242,8 +199,7 @@ class MySQLLiveModule : public Module
public:
MySQLLiveModule(const Anope::string &modname, const Anope::string &creator) :
- Module(modname, creator), SQL("mysql/main"), ACS("asynch_commands"),
- chaninfoupdater(this), nickinfoupdater(this), nickcoreupdater(this)
+ Module(modname, creator), SQL("mysql/main"), ACS("asynch_commands")
{
Implementation i[] = { I_OnFindChan, I_OnFindNick, I_OnFindCore, I_OnPreShutdown };
ModuleManager::Attach(i, this, 4);
@@ -258,7 +214,7 @@ class MySQLLiveModule : public Module
void OnFindChan(const Anope::string &chname)
{
- if (chaninfoupdater.Check(chname))
+ if (chan_cache.Check(chname))
return;
try
@@ -272,7 +228,7 @@ class MySQLLiveModule : public Module
{
SQLResult res = this->RunQuery(query);
current_command->Lock();
- ChanInfoUpdater::Process(res);
+ ChanInfoUpdate(res);
}
catch (const SQLException &)
{
@@ -281,7 +237,10 @@ class MySQLLiveModule : public Module
}
}
else
- this->RunQuery(&chaninfoupdater, query);
+ {
+ SQLResult res = this->RunQuery(query);
+ ChanInfoUpdate(res);
+ }
}
catch (const SQLException &ex)
{
@@ -291,7 +250,7 @@ class MySQLLiveModule : public Module
void OnFindNick(const Anope::string &nick)
{
- if (nickinfoupdater.Check(nick))
+ if (nick_cache.Check(nick))
return;
try
@@ -305,7 +264,7 @@ class MySQLLiveModule : public Module
{
SQLResult res = this->RunQuery(query);
current_command->Lock();
- NickInfoUpdater::Process(res);
+ NickInfoUpdate(res);
}
catch (const SQLException &)
{
@@ -314,7 +273,10 @@ class MySQLLiveModule : public Module
}
}
else
- this->RunQuery(&nickinfoupdater, query);
+ {
+ SQLResult res = this->RunQuery(query);
+ NickInfoUpdate(res);
+ }
}
catch (const SQLException &ex)
{
@@ -324,7 +286,7 @@ class MySQLLiveModule : public Module
void OnFindCore(const Anope::string &nick)
{
- if (nickcoreupdater.Check(nick))
+ if (core_cache.Check(nick))
return;
try
@@ -338,7 +300,7 @@ class MySQLLiveModule : public Module
{
SQLResult res = this->RunQuery(query);
current_command->Lock();
- NickCoreUpdater::Process(res);
+ NickCoreUpdate(res);
}
catch (const SQLException &)
{
@@ -347,7 +309,10 @@ class MySQLLiveModule : public Module
}
}
else
- this->RunQuery(&nickcoreupdater, query);
+ {
+ SQLResult res = this->RunQuery(query);
+ NickCoreUpdate(res);
+ }
}
catch (const SQLException &ex)
{