[9756] Avoid database query on tutorial save by caching tutorial state.

Signed-off-by: hunuza <hunuza@gmail.com>
This commit is contained in:
hunuza 2010-04-17 16:34:32 +02:00
parent ae9985e778
commit a502d1eb78
3 changed files with 38 additions and 37 deletions

View file

@ -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), _player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion),
m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(sObjectMgr.GetIndexForLocale(locale)), 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), _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) if (sock)
{ {
@ -674,8 +674,12 @@ void WorldSession::LoadTutorialsData()
QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId()); QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId());
if(result) if(!result)
{ {
m_tutorialState = TUTORIALDATA_NEW;
return;
}
do do
{ {
Field *fields = result->Fetch(); Field *fields = result->Fetch();
@ -686,9 +690,8 @@ void WorldSession::LoadTutorialsData()
while( result->NextRow() ); while( result->NextRow() );
delete result; delete result;
}
m_TutorialsChanged = false; m_tutorialState = TUTORIALDATA_UNCHANGED;
} }
void WorldSession::SendTutorialsData() void WorldSession::SendTutorialsData()
@ -701,29 +704,19 @@ void WorldSession::SendTutorialsData()
void WorldSession::SaveTutorialsData() void WorldSession::SaveTutorialsData()
{ {
if(!m_TutorialsChanged) switch(m_tutorialState)
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)
{
Rows = result->Fetch()[0].GetUInt32();
delete result;
}
if (Rows)
{ {
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'", 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()); 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;
else 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')",
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]); 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;
} }
m_TutorialsChanged = false; m_tutorialState = TUTORIALDATA_UNCHANGED;
} }
void WorldSession::ReadAddonsInfo(WorldPacket &data) void WorldSession::ReadAddonsInfo(WorldPacket &data)

View file

@ -131,6 +131,13 @@ enum ChatRestrictionType
ERR_YELL_RESTRICTED = 3 ERR_YELL_RESTRICTED = 3
}; };
enum TutorialDataState
{
TUTORIALDATA_UNCHANGED = 0,
TUTORIALDATA_CHANGED = 1,
TUTORIALDATA_NEW = 2
};
/// Player session in the World /// Player session in the World
class MANGOS_DLL_SPEC WorldSession class MANGOS_DLL_SPEC WorldSession
{ {
@ -244,7 +251,8 @@ class MANGOS_DLL_SPEC WorldSession
if(m_Tutorials[intId] != value) if(m_Tutorials[intId] != value)
{ {
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 //used with item_page table
@ -789,7 +797,7 @@ class MANGOS_DLL_SPEC WorldSession
uint32 m_latency; uint32 m_latency;
AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES]; AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
uint32 m_Tutorials[8]; uint32 m_Tutorials[8];
bool m_TutorialsChanged; TutorialDataState m_tutorialState;
AddonsList m_addonsList; AddonsList m_addonsList;
ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue; ACE_Based::LockedQueue<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
}; };

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "9755" #define REVISION_NR "9756"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__