Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
CharacterDatabaseCleaner.cpp
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#include "
AchievementMgr.h
"
7
#include "
CharacterDatabaseCleaner.h
"
8
#include "
Common.h
"
9
#include "
Database/DatabaseEnv.h
"
10
#include "
DBCStores.h
"
11
#include "
SpellMgr.h
"
12
#include "
World.h
"
13
14
void
CharacterDatabaseCleaner::CleanDatabase
()
15
{
16
// config to disable
17
if
(!
sWorld
->GetBoolConfig(
WorldBoolConfigs::CONFIG_CLEAN_CHARACTER_DB
))
18
return
;
19
20
SF_LOG_INFO
(
"misc"
,
"Cleaning character database..."
);
21
22
uint32
oldMSTime =
getMSTime
();
23
24
// check flags which clean ups are necessary
25
QueryResult
result =
CharacterDatabase
.PQuery(
"SELECT value FROM worldstates WHERE entry = %d"
,
WS_CLEANING_FLAGS
);
26
if
(!result)
27
return
;
28
29
uint32
flags = (*result)[0].GetUInt32();
30
31
// clean up
32
if
(flags &
CLEANING_FLAG_ACHIEVEMENT_PROGRESS
)
33
CleanCharacterAchievementProgress
();
34
35
if
(flags &
CLEANING_FLAG_SKILLS
)
36
CleanCharacterSkills
();
37
38
if
(flags &
CLEANING_FLAG_SPELLS
)
39
CleanCharacterSpell
();
40
41
if
(flags &
CLEANING_FLAG_TALENTS
)
42
CleanCharacterTalent
();
43
44
if
(flags &
CLEANING_FLAG_QUESTSTATUS
)
45
CleanCharacterQuestStatus
();
46
47
// NOTE: In order to have persistentFlags be set in worldstates for the next cleanup,
48
// you need to define them at least once in worldstates.
49
flags &=
sWorld
->getIntConfig(
WorldIntConfigs::CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS
);
50
CharacterDatabase
.DirectPExecute(
"UPDATE worldstates SET value = %u WHERE entry = %d"
, flags,
WS_CLEANING_FLAGS
);
51
52
sWorld
->SetCleaningFlags(flags);
53
54
SF_LOG_INFO
(
"server.loading"
,
">> Cleaned character database in %u ms"
,
GetMSTimeDiffToNow
(oldMSTime));
55
}
56
57
void
CharacterDatabaseCleaner::CheckUnique
(
const
char
* column,
const
char
*
table
,
bool
(*check)(
uint32
))
58
{
59
QueryResult
result =
CharacterDatabase
.PQuery(
"SELECT DISTINCT %s FROM %s"
, column,
table
);
60
if
(!result)
61
{
62
SF_LOG_INFO
(
"misc"
,
"Table %s is empty."
,
table
);
63
return
;
64
}
65
66
bool
found =
false
;
67
std::ostringstream ss;
68
do
69
{
70
Field
* fields = result->Fetch();
71
72
uint32
id
= fields[0].
GetUInt32
();
73
74
if
(!check(
id
))
75
{
76
if
(!found)
77
{
78
ss <<
"DELETE FROM "
<<
table
<<
" WHERE "
<< column <<
" IN ("
;
79
found =
true
;
80
}
81
else
82
ss <<
','
;
83
84
ss << id;
85
}
86
}
while
(result->NextRow());
87
88
if
(found)
89
{
90
ss <<
')'
;
91
CharacterDatabase
.Execute(ss.str().c_str());
92
}
93
}
94
95
bool
CharacterDatabaseCleaner::AchievementProgressCheck
(
uint32
criteria)
96
{
97
return
sAchievementMgr
->GetAchievementCriteria(criteria);
98
}
99
100
void
CharacterDatabaseCleaner::CleanCharacterAchievementProgress
()
101
{
102
CheckUnique
(
"criteria"
,
"character_achievement_progress"
, &
AchievementProgressCheck
);
103
}
104
105
bool
CharacterDatabaseCleaner::SkillCheck
(
uint32
skill)
106
{
107
return
sSkillLineStore
.LookupEntry(skill);
108
}
109
110
void
CharacterDatabaseCleaner::CleanCharacterSkills
()
111
{
112
CheckUnique
(
"skill"
,
"character_skills"
, &
SkillCheck
);
113
}
114
115
bool
CharacterDatabaseCleaner::SpellCheck
(
uint32
spell_id)
116
{
117
return
sSpellMgr
->GetSpellInfo(spell_id) && !
GetTalentSpellPos
(spell_id);
118
}
119
120
void
CharacterDatabaseCleaner::CleanCharacterSpell
()
121
{
122
CheckUnique
(
"spell"
,
"character_spell"
, &
SpellCheck
);
123
}
124
125
bool
CharacterDatabaseCleaner::TalentCheck
(
uint32
talent_id)
126
{
127
TalentEntry
const
* talentInfo =
sTalentStore
.LookupEntry(talent_id);
128
if
(!talentInfo)
129
return
false
;
130
131
return
true
;
132
}
133
134
void
CharacterDatabaseCleaner::CleanCharacterTalent
()
135
{
136
CharacterDatabase
.DirectPExecute(
"DELETE FROM character_talent WHERE spec > %u"
,
MAX_TALENT_SPECS
);
137
CheckUnique
(
"spell"
,
"character_talent"
, &
TalentCheck
);
138
}
139
140
void
CharacterDatabaseCleaner::CleanCharacterQuestStatus
()
141
{
142
CharacterDatabase
.DirectExecute(
"DELETE FROM character_queststatus WHERE status = 0"
);
143
}
AchievementMgr.h
sAchievementMgr
#define sAchievementMgr
Definition
AchievementMgr.h:413
table
const AuthHandler table[]
Definition
AuthSocket.cpp:119
CharacterDatabaseCleaner.h
Common.h
GetTalentSpellPos
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition
DBCStores.cpp:959
sSkillLineStore
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
sTalentStore
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
DBCStores.h
DatabaseEnv.h
uint32
std::uint32_t uint32
Definition
Define.h:77
SF_LOG_INFO
#define SF_LOG_INFO(filterType__,...)
Definition
Log.h:137
QueryResult
Skyfire::AutoPtr< ResultSet, Skyfire::Mutex > QueryResult
Definition
QueryResult.h:48
MAX_TALENT_SPECS
#define MAX_TALENT_SPECS
Definition
SharedDefines.h:777
SpellMgr.h
sSpellMgr
#define sSpellMgr
Definition
SpellMgr.h:744
GetMSTimeDiffToNow
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition
Timer.h:22
getMSTime
uint32 getMSTime()
Definition
Timer.h:12
World.h
Field
Definition
Field.h:16
Field::GetUInt32
uint32 GetUInt32() const
Definition
Field.h:105
CharacterDatabase
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
Definition
Main.cpp:41
sWorld
#define sWorld
Definition
World.h:910
WS_CLEANING_FLAGS
@ WS_CLEANING_FLAGS
Definition
World.h:515
WorldIntConfigs::CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS
@ CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS
Definition
World.h:330
WorldBoolConfigs::CONFIG_CLEAN_CHARACTER_DB
@ CONFIG_CLEAN_CHARACTER_DB
Definition
World.h:93
CharacterDatabaseCleaner::SpellCheck
bool SpellCheck(uint32 spell_id)
Definition
CharacterDatabaseCleaner.cpp:115
CharacterDatabaseCleaner::SkillCheck
bool SkillCheck(uint32 skill)
Definition
CharacterDatabaseCleaner.cpp:105
CharacterDatabaseCleaner::CleanCharacterTalent
void CleanCharacterTalent()
Definition
CharacterDatabaseCleaner.cpp:134
CharacterDatabaseCleaner::CleanDatabase
void CleanDatabase()
Definition
CharacterDatabaseCleaner.cpp:14
CharacterDatabaseCleaner::CleanCharacterQuestStatus
void CleanCharacterQuestStatus()
Definition
CharacterDatabaseCleaner.cpp:140
CharacterDatabaseCleaner::TalentCheck
bool TalentCheck(uint32 talent_id)
Definition
CharacterDatabaseCleaner.cpp:125
CharacterDatabaseCleaner::CheckUnique
void CheckUnique(const char *column, const char *table, bool(*check)(uint32))
Definition
CharacterDatabaseCleaner.cpp:57
CharacterDatabaseCleaner::CleanCharacterSpell
void CleanCharacterSpell()
Definition
CharacterDatabaseCleaner.cpp:120
CharacterDatabaseCleaner::CLEANING_FLAG_TALENTS
@ CLEANING_FLAG_TALENTS
Definition
CharacterDatabaseCleaner.h:16
CharacterDatabaseCleaner::CLEANING_FLAG_SPELLS
@ CLEANING_FLAG_SPELLS
Definition
CharacterDatabaseCleaner.h:15
CharacterDatabaseCleaner::CLEANING_FLAG_SKILLS
@ CLEANING_FLAG_SKILLS
Definition
CharacterDatabaseCleaner.h:14
CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS
@ CLEANING_FLAG_QUESTSTATUS
Definition
CharacterDatabaseCleaner.h:17
CharacterDatabaseCleaner::CLEANING_FLAG_ACHIEVEMENT_PROGRESS
@ CLEANING_FLAG_ACHIEVEMENT_PROGRESS
Definition
CharacterDatabaseCleaner.h:13
CharacterDatabaseCleaner::CleanCharacterAchievementProgress
void CleanCharacterAchievementProgress()
Definition
CharacterDatabaseCleaner.cpp:100
CharacterDatabaseCleaner::CleanCharacterSkills
void CleanCharacterSkills()
Definition
CharacterDatabaseCleaner.cpp:110
CharacterDatabaseCleaner::AchievementProgressCheck
bool AchievementProgressCheck(uint32 criteria)
Definition
CharacterDatabaseCleaner.cpp:95
TalentEntry
Definition
DBCStructure.h:2721
src
server
game
Tools
CharacterDatabaseCleaner.cpp
Generated on
for Project SkyFire Core by
1.17.0