diff options
author | Brian <runningnak3d@gmail.com> | 2010-07-22 13:41:19 -0600 |
---|---|---|
committer | Brian <runningnak3d@gmail.com> | 2010-07-22 13:41:19 -0600 |
commit | c8662c888b7b809189c3aedd2f4a7c0403f6456e (patch) | |
tree | 25488e75eafdc96921682f9351d90f730f4e8a20 /src | |
parent | 903a3cbe76e570cabbc592db83bbbead97905631 (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.txt | 1 | ||||
-rw-r--r-- | src/server/game/Tools/CharacterDatabaseCleaner.cpp | 147 | ||||
-rw-r--r-- | src/server/game/Tools/CharacterDatabaseCleaner.h | 53 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 4 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 6 |
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 |