From a502d1eb788d990bb0eba2d1c72b3d3c9d58979c Mon Sep 17 00:00:00 2001 From: hunuza Date: Sat, 17 Apr 2010 16:34:32 +0200 Subject: [PATCH] [9756] Avoid database query on tutorial save by caching tutorial state. Signed-off-by: hunuza --- src/game/WorldSession.cpp | 61 +++++++++++++++++---------------------- src/game/WorldSession.h | 12 ++++++-- src/shared/revision_nr.h | 2 +- 3 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 8d59fc836..efc3d1249 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -45,7 +45,7 @@ LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mu _player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion), m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(sObjectMgr.GetIndexForLocale(locale)), _logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_playerSave(false), -m_latency(0), m_TutorialsChanged(false) +m_latency(0), m_tutorialState(TUTORIALDATA_UNCHANGED) { if (sock) { @@ -674,21 +674,24 @@ void WorldSession::LoadTutorialsData() QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId()); - if(result) - { - do - { - Field *fields = result->Fetch(); - - for (int iI = 0; iI < 8; ++iI) - m_Tutorials[iI] = fields[iI].GetUInt32(); - } - while( result->NextRow() ); - - delete result; + if(!result) + { + m_tutorialState = TUTORIALDATA_NEW; + return; } - m_TutorialsChanged = false; + do + { + Field *fields = result->Fetch(); + + for (int iI = 0; iI < 8; ++iI) + m_Tutorials[iI] = fields[iI].GetUInt32(); + } + while( result->NextRow() ); + + delete result; + + m_tutorialState = TUTORIALDATA_UNCHANGED; } void WorldSession::SendTutorialsData() @@ -701,29 +704,19 @@ void WorldSession::SendTutorialsData() void WorldSession::SaveTutorialsData() { - if(!m_TutorialsChanged) - return; - - uint32 Rows=0; - // it's better than rebuilding indexes multiple times - QueryResult *result = CharacterDatabase.PQuery("SELECT count(*) AS r FROM character_tutorial WHERE account = '%u'", GetAccountId()); - if(result) + switch(m_tutorialState) { - Rows = result->Fetch()[0].GetUInt32(); - delete result; + case TUTORIALDATA_CHANGED: + CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u'", + m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetAccountId()); + break; + case TUTORIALDATA_NEW: + CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", + GetAccountId(), m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]); + break; } - if (Rows) - { - CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u'", - m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetAccountId()); - } - else - { - CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", GetAccountId(), m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]); - } - - m_TutorialsChanged = false; + m_tutorialState = TUTORIALDATA_UNCHANGED; } void WorldSession::ReadAddonsInfo(WorldPacket &data) diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index e15b35f7c..e01b80674 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -131,6 +131,13 @@ enum ChatRestrictionType ERR_YELL_RESTRICTED = 3 }; +enum TutorialDataState +{ + TUTORIALDATA_UNCHANGED = 0, + TUTORIALDATA_CHANGED = 1, + TUTORIALDATA_NEW = 2 +}; + /// Player session in the World class MANGOS_DLL_SPEC WorldSession { @@ -244,7 +251,8 @@ class MANGOS_DLL_SPEC WorldSession if(m_Tutorials[intId] != value) { m_Tutorials[intId] = value; - m_TutorialsChanged = true; + if(m_tutorialState == TUTORIALDATA_UNCHANGED) + m_tutorialState = TUTORIALDATA_CHANGED; } } //used with item_page table @@ -789,7 +797,7 @@ class MANGOS_DLL_SPEC WorldSession uint32 m_latency; AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES]; uint32 m_Tutorials[8]; - bool m_TutorialsChanged; + TutorialDataState m_tutorialState; AddonsList m_addonsList; ACE_Based::LockedQueue _recvQueue; }; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3801407aa..e4f31285b 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9755" + #define REVISION_NR "9756" #endif // __REVISION_NR_H__