mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[9756] Avoid database query on tutorial save by caching tutorial state.
Signed-off-by: hunuza <hunuza@gmail.com>
This commit is contained in:
parent
ae9985e778
commit
a502d1eb78
3 changed files with 38 additions and 37 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<WorldPacket*, ACE_Thread_Mutex> _recvQueue;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "9755"
|
||||
#define REVISION_NR "9756"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue