aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Tools/CharacterDatabaseCleaner.cpp
diff options
context:
space:
mode:
authorBrian <runningnak3d@gmail.com>2010-07-22 13:41:19 -0600
committerBrian <runningnak3d@gmail.com>2010-07-22 13:41:19 -0600
commitc8662c888b7b809189c3aedd2f4a7c0403f6456e (patch)
tree25488e75eafdc96921682f9351d90f730f4e8a20 /src/server/game/Tools/CharacterDatabaseCleaner.cpp
parent903a3cbe76e570cabbc592db83bbbead97905631 (diff)
* Implemented DB cleaning on startup
* Must be enabled in conf AND set in worldstates for what you want to clean * CLEANING_FLAG_ACHIEVEMENT_PROGRESS = 0x1, * CLEANING_FLAG_SKILLS = 0x2, * CLEANING_FLAG_SPELLS = 0x4, * CLEANING_FLAG_TALENTS = 0x8 * Set to 0xF to clean all 4 * Patch by hunuza --HG-- branch : trunk
Diffstat (limited to 'src/server/game/Tools/CharacterDatabaseCleaner.cpp')
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
new file mode 100644
index 00000000000..faa0584f4f0
--- /dev/null
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA
+ */
+
+#include "Common.h"
+#include "CharacterDatabaseCleaner.h"
+#include "World.h"
+#include "Database/DatabaseEnv.h"
+#include "DBCStores.h"
+#include "ProgressBar.h"
+
+void CharacterDatabaseCleaner::CleanDatabase()
+{
+ // config to disable
+ if(!sWorld.getConfig(CONFIG_CLEAN_CHARACTER_DB))
+ return;
+
+ sLog.outString("Cleaning character database...");
+
+ // check flags which clean ups are necessary
+ QueryResult_AutoPtr result = CharacterDatabase.Query("SELECT value FROM worldstates WHERE entry=20004");
+ if(!result)
+ return;
+ uint32 flags = (*result)[0].GetUInt32();
+
+ // clean up
+ if(flags & CLEANING_FLAG_ACHIEVEMENT_PROGRESS)
+ CleanCharacterAchievementProgress();
+ if(flags & CLEANING_FLAG_SKILLS)
+ CleanCharacterSkills();
+ if(flags & CLEANING_FLAG_SPELLS)
+ CleanCharacterSpell();
+ if(flags & CLEANING_FLAG_TALENTS)
+ CleanCharacterTalent();
+ CharacterDatabase.Query("UPDATE worldstates SET value = 0 WHERE entry=20004");
+}
+
+void CharacterDatabaseCleaner::CheckUnique(const char* column, const
+char* table, bool (*check)(uint32))
+{
+ QueryResult_AutoPtr result = CharacterDatabase.PQuery("SELECT DISTINCT %s FROM %s", column, table);
+ if(!result)
+ {
+ sLog.outString( "Table %s is empty.", table );
+ return;
+ }
+
+ bool found = false;
+ std::ostringstream ss;
+ barGoLink bar( (int)result->GetRowCount() );
+ do
+ {
+ bar.step();
+
+ Field *fields = result->Fetch();
+
+ uint32 id = fields[0].GetUInt32();
+
+ if(!check(id))
+ {
+ if(!found)
+ {
+ ss << "DELETE FROM " << table << " WHERE " << column <<
+" IN (";
+ found = true;
+ }
+ else
+ ss << ",";
+ ss << id;
+ }
+ }
+ while( result->NextRow() );
+
+ if (found)
+ {
+ ss << ")";
+ CharacterDatabase.Execute( ss.str().c_str() );
+ }
+}
+
+bool CharacterDatabaseCleaner::AchievementProgressCheck(uint32 criteria)
+{
+ return sAchievementCriteriaStore.LookupEntry(criteria);
+}
+
+void CharacterDatabaseCleaner::CleanCharacterAchievementProgress()
+{
+ CheckUnique("criteria", "character_achievement_progress",
+&AchievementProgressCheck);
+}
+
+bool CharacterDatabaseCleaner::SkillCheck(uint32 skill)
+{
+ return sSkillLineStore.LookupEntry(skill);
+}
+
+void CharacterDatabaseCleaner::CleanCharacterSkills()
+{
+ CheckUnique("skill", "character_skills", &SkillCheck);
+}
+
+bool CharacterDatabaseCleaner::SpellCheck(uint32 spell_id)
+{
+ return sSpellStore.LookupEntry(spell_id) &&
+!GetTalentSpellPos(spell_id);
+}
+
+void CharacterDatabaseCleaner::CleanCharacterSpell()
+{
+ CheckUnique("spell", "character_spell", &SpellCheck);
+}
+
+bool CharacterDatabaseCleaner::TalentCheck(uint32 talent_id)
+{
+ TalentEntry const *talentInfo = sTalentStore.LookupEntry( talent_id
+);
+ if(!talentInfo)
+ return false;
+
+ return sTalentTabStore.LookupEntry( talentInfo->TalentTab );
+}
+
+void CharacterDatabaseCleaner::CleanCharacterTalent()
+{
+ CharacterDatabase.DirectPExecute("DELETE FROM character_talent WHERE spec > %u OR current_rank > %u", MAX_TALENT_SPECS,
+MAX_TALENT_RANK);
+
+ CheckUnique("talent_id", "character_talent", &TalentCheck);
+}
+