[7802] Use more appropriate field types in character_achievement* tables. Better check data at loading.

This commit is contained in:
VladimirMangos 2009-05-08 19:15:46 +04:00
parent f53d06ad70
commit fffaec6d71
6 changed files with 54 additions and 12 deletions

View file

@ -21,7 +21,7 @@
DROP TABLE IF EXISTS `character_db_version`;
CREATE TABLE `character_db_version` (
`required_7644_01_characters_character_pet` bit(1) default NULL
`required_7802_02_characters_character_achievement_progress` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
--
@ -253,9 +253,9 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `character_achievement`;
CREATE TABLE `character_achievement` (
`guid` int(11) NOT NULL,
`achievement` int(11) NOT NULL,
`date` int(11) NOT NULL,
`guid` int(11) unsigned NOT NULL,
`achievement` int(11) unsigned NOT NULL,
`date` bigint(11) unsigned NOT NULL default '0',
PRIMARY KEY (`guid`,`achievement`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@ -274,10 +274,10 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `character_achievement_progress`;
CREATE TABLE `character_achievement_progress` (
`guid` int(11) NOT NULL,
`criteria` int(11) NOT NULL,
`counter` int(11) NOT NULL,
`date` int(11) NOT NULL,
`guid` int(11) unsigned NOT NULL,
`criteria` int(11) unsigned NOT NULL,
`counter` int(11) unsigned NOT NULL,
`date` bigint(11) unsigned NOT NULL default '0',
PRIMARY KEY (`guid`,`criteria`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

View file

@ -0,0 +1,6 @@
ALTER TABLE character_db_version CHANGE COLUMN required_7644_01_characters_character_pet required_7802_01_characters_character_achievement bit;
ALTER TABLE character_achievement
CHANGE COLUMN guid guid int(11) unsigned NOT NULL,
CHANGE COLUMN achievement achievement int(11) unsigned NOT NULL,
CHANGE COLUMN date date bigint(11) unsigned NOT NULL default '0';

View file

@ -0,0 +1,7 @@
ALTER TABLE character_db_version CHANGE COLUMN required_7802_01_characters_character_achievement required_7802_02_characters_character_achievement_progress bit;
ALTER TABLE character_achievement_progress
CHANGE COLUMN guid guid int(11) unsigned NOT NULL,
CHANGE COLUMN criteria criteria int(11) unsigned NOT NULL,
CHANGE COLUMN counter counter int(11) unsigned NOT NULL,
CHANGE COLUMN date date bigint(11) unsigned NOT NULL default '0';

View file

@ -182,6 +182,8 @@ pkgdata_DATA = \
7782_01_mangos_spell_proc_event.sql \
7796_01_mangos_command.sql \
7796_02_mangos_mangos_string.sql \
7802_01_characters_character_achievement.sql \
7802_02_characters_character_achievement_progress.sql \
README
## Additional files to include when running 'make dist'
@ -344,4 +346,6 @@ EXTRA_DIST = \
7782_01_mangos_spell_proc_event.sql \
7796_01_mangos_command.sql \
7796_02_mangos_mangos_string.sql \
7802_01_characters_character_achievement.sql \
7802_02_characters_character_achievement_progress.sql \
README

View file

@ -407,7 +407,14 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri
do
{
Field *fields = achievementResult->Fetch();
CompletedAchievementData& ca = m_completedAchievements[fields[0].GetUInt32()];
uint32 achievement_id = fields[0].GetUInt32();
// don't must happen: cleanup at server startup in achievementmgr.LoadCompletedAchievements()
if(!sAchievementStore.LookupEntry(achievement_id))
continue;
CompletedAchievementData& ca = m_completedAchievements[achievement_id];
ca.date = time_t(fields[1].GetUInt64());
ca.changed = false;
} while(achievementResult->NextRow());
@ -425,7 +432,15 @@ void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *cri
time_t date = time_t(fields[2].GetUInt64());
AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id);
if (!criteria || (criteria->timeLimit && time_t(date + criteria->timeLimit) < time(NULL)))
if (!criteria)
{
// we will remove not existed criteria for all characters
sLog.outError("Not existed achievement creataria %u data removed from table `character_achievement_progress`.",id);
CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE criteria = %u",id);
continue;
}
if (criteria->timeLimit && time_t(date + criteria->timeLimit) < time(NULL))
continue;
CriteriaProgress& progress = m_criteriaProgress[id];
@ -1763,7 +1778,17 @@ void AchievementGlobalMgr::LoadCompletedAchievements()
{
bar.step();
Field *fields = result->Fetch();
m_allCompletedAchievements.insert(fields[0].GetUInt32());
uint32 achievement_id = fields[0].GetUInt32();
if(!sAchievementStore.LookupEntry(achievement_id))
{
// we will remove not existed achievement for all characters
sLog.outError("Not existed achievement %u data removed from table `character_achievement`.",achievement_id);
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE achievement = %u",achievement_id);
continue;
}
m_allCompletedAchievements.insert(achievement_id);
} while(result->NextRow());
delete result;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "7801"
#define REVISION_NR "7802"
#endif // __REVISION_NR_H__