aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/server/game/CMakeLists.txt1
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp147
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.h53
-rw-r--r--src/server/game/World/World.cpp4
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/worldserver/worldserver.conf.dist6
6 files changed, 212 insertions, 0 deletions
diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt
index b500b686fb9..40fc77ff464 100644
--- a/src/server/game/CMakeLists.txt
+++ b/src/server/game/CMakeLists.txt
@@ -172,6 +172,7 @@ set(game_STAT_SRCS
Spells/SpellEffects.cpp
Spells/Spell.cpp
Spells/SpellMgr.cpp
+ Tools/CharacterDatabaseCleaner.cpp
Tools/PlayerDump.cpp
Tools/Tools.cpp
Weather/Weather.cpp
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);
+}
+
diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.h b/src/server/game/Tools/CharacterDatabaseCleaner.h
new file mode 100644
index 00000000000..d26990e7bf7
--- /dev/null
+++ b/src/server/game/Tools/CharacterDatabaseCleaner.h
@@ -0,0 +1,53 @@
+/*
+* 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
+*/
+
+#ifndef CHARACTERDATABASECLEANER_H
+#define CHARACTERDATABASECLEANER_H
+
+namespace CharacterDatabaseCleaner
+{
+ enum CleaningFlags
+ {
+ CLEANING_FLAG_ACHIEVEMENT_PROGRESS = 0x1,
+ CLEANING_FLAG_SKILLS = 0x2,
+ CLEANING_FLAG_SPELLS = 0x4,
+ CLEANING_FLAG_TALENTS = 0x8
+ };
+
+
+ void CleanDatabase();
+
+ void CheckUnique(const char* column, const char* table, bool
+(*check)(uint32));
+
+ bool AchievementProgressCheck(uint32 criteria);
+ bool SkillCheck(uint32 skill);
+ bool SpellCheck(uint32 spell_id);
+ bool TalentCheck(uint32 talent_id);
+
+ void CleanCharacterAchievementProgress();
+ void CleanCharacterSkills();
+ void CleanCharacterSpell();
+ void CleanCharacterTalent();
+}
+
+#endif
+
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 0c5505fa16a..915cfbb08b5 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -71,6 +71,7 @@
#include "LFGMgr.h"
#include "ConditionMgr.h"
#include "DisableMgr.h"
+#include "CharacterDatabaseCleaner.h"
volatile bool World::m_stopEvent = false;
uint8 World::m_ExitCode = SHUTDOWN_EXIT_CODE;
@@ -606,6 +607,7 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_COMPRESSION] = 1;
}
m_configs[CONFIG_ADDON_CHANNEL] = sConfig.GetBoolDefault("AddonChannel", true);
+ m_configs[CONFIG_CLEAN_CHARACTER_DB] = sConfig.GetBoolDefault("CleanCharacterDB", false);
m_configs[CONFIG_CHAT_CHANNEL_LEVEL_REQ] = sConfig.GetIntDefault("ChatLevelReq.Channel", 1);
m_configs[CONFIG_CHAT_WHISPER_LEVEL_REQ] = sConfig.GetIntDefault("ChatLevelReq.Whisper", 1);
m_configs[CONFIG_CHAT_SAY_LEVEL_REQ] = sConfig.GetIntDefault("ChatLevelReq.Say", 1);
@@ -1485,6 +1487,8 @@ void World::SetInitialWorldSettings()
sLog.outString("Loading Pet Name Parts...");
objmgr.LoadPetNames();
+ CharacterDatabaseCleaner::CleanDatabase();
+
sLog.outString("Loading the max pet number...");
objmgr.LoadPetNumber();
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 88c845213a2..f3f06f6c821 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -285,6 +285,7 @@ enum WorldConfigs
CONFIG_CHARDELETE_KEEP_DAYS,
CONFIG_CHARDELETE_METHOD,
CONFIG_CHARDELETE_MIN_LEVEL,
+ CONFIG_CLEAN_CHARACTER_DB,
CONFIG_VALUE_COUNT
};
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 2751212fae4..ac6dd718230 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -225,6 +225,11 @@ EAIErrorLevel = 2
# Number of threads to update maps.
# Default: 1
#
+# CleanCharacterDB
+# Perform character db clean ups on start up
+# Default: 0 (Disabled)
+# 1 (Enable)
+#
###############################################################################
UseProcessors = 0
@@ -257,6 +262,7 @@ LogDB.Opt.ClearTime = 1209600
MaxCoreStuckTime = 0
AddonChannel = 1
MapUpdate.Threads = 1
+CleanCharacterDB = 0
###############################################################################
# SERVER LOGGING