From 592060ac756dd7ac5983aac987264ff5eaecd265 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 4 Oct 2010 18:57:54 -0400 Subject: Attempt to write back the old mlock to the databases if we try and fail to connect to the uplink. Because we may not know modes until after we are synced we could accidentally nuke all of the mlocks --- modules/core/db_plain.cpp | 54 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 13 deletions(-) (limited to 'modules/core') diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp index 432313bc2..af342786f 100644 --- a/modules/core/db_plain.cpp +++ b/modules/core/db_plain.cpp @@ -976,11 +976,20 @@ class DBPlain : public Module if (ci->GetMLockCount(true)) { db << "MD MLOCK_ON"; - for (std::map::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) + + Anope::string oldmodes; + if ((!Me || !Me->IsSynced()) && ci->GetExtRegular("db_mlock_modes_on", oldmodes)) { - ChannelMode *cm = it->second; - if (ci->HasMLock(cm->Name, true)) - db << " " << cm->NameAsString; + db << " " << oldmodes; + } + else + { + for (std::map::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) + { + ChannelMode *cm = it->second; + if (ci->HasMLock(cm->Name, true)) + db << " " << cm->NameAsString; + } } db << endl; } @@ -988,21 +997,40 @@ class DBPlain : public Module { db << "MD MLOCK_OFF"; - for (std::map::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) + Anope::string oldmodes; + if ((!Me || !Me->IsSynced()) && ci->GetExtRegular("db_mlock_modes_off", oldmodes)) { - ChannelMode *cm = it->second; - if (ci->HasMLock(cm->Name, false)) - db << " " << cm->NameAsString; + db << " " << oldmodes; + } + else + { + for (std::map::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) + { + ChannelMode *cm = it->second; + if (ci->HasMLock(cm->Name, false)) + db << " " << cm->NameAsString; + } } db << endl; } - for (std::map::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) + std::vector > oldparams;; + if ((!Me || !Me->IsSynced()) && ci->GetExtRegular("db_mlp", oldparams)) + { + for (std::vector >::iterator it = oldparams.begin(), it_end = oldparams.end(); it != it_end; ++it) + { + db << "MD MLP " << it->first << " " << it->second << endl; + } + } + else { - ChannelMode *cm = it->second; - Anope::string Param; + for (std::map::iterator it = ModeManager::ChannelModesByChar.begin(), it_end = ModeManager::ChannelModesByChar.end(); it != it_end; ++it) + { + ChannelMode *cm = it->second; + Anope::string Param; - if (ci->GetParam(cm->Name, Param)) - db << "MD MLP " << cm->NameAsString << " " << Param << endl; + if (ci->GetParam(cm->Name, Param)) + db << "MD MLP " << cm->NameAsString << " " << Param << endl; + } } if (!ci->memos.memos.empty()) { -- cgit