mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +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),
|
_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,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());
|
QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId());
|
||||||
|
|
||||||
if(result)
|
if(!result)
|
||||||
{
|
{
|
||||||
do
|
m_tutorialState = TUTORIALDATA_NEW;
|
||||||
{
|
return;
|
||||||
Field *fields = result->Fetch();
|
|
||||||
|
|
||||||
for (int iI = 0; iI < 8; ++iI)
|
|
||||||
m_Tutorials[iI] = fields[iI].GetUInt32();
|
|
||||||
}
|
|
||||||
while( result->NextRow() );
|
|
||||||
|
|
||||||
delete result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
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();
|
case TUTORIALDATA_CHANGED:
|
||||||
delete result;
|
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)
|
m_tutorialState = TUTORIALDATA_UNCHANGED;
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::ReadAddonsInfo(WorldPacket &data)
|
void WorldSession::ReadAddonsInfo(WorldPacket &data)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue