Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
#include "stdafx.h"
|
||||
#include "AdminDataMgr.h"
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
#include <DB/DBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
|
||||
CAdminDataMgr& CAdminDataMgr::GetInstance()
|
||||
{
|
||||
static CAdminDataMgr adminDataMgr;
|
||||
return adminDataMgr;
|
||||
}
|
||||
|
||||
bool CAdminDataMgr::LoadAdminList(CDBComponent& DBComponent)
|
||||
{
|
||||
const int MAX_LIST = 100;
|
||||
|
||||
ADMIN AdminList[MAX_LIST];
|
||||
int AdminNum = 0;
|
||||
|
||||
memset(&AdminList, 0, sizeof(ADMIN) * MAX_LIST);
|
||||
|
||||
if(!DBComponent.ExecuteQuery("SELECT * FROM AdminList"))
|
||||
{
|
||||
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. : %s",
|
||||
DBComponent.GetErrorString());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
m_AdminMap.clear();
|
||||
|
||||
while(DBComponent.GetData((void **)AdminList, sizeof(ADMIN), MAX_LIST, &AdminNum))
|
||||
{
|
||||
if(0 == AdminNum)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
ADMIN* lpAdminPos = AdminList;
|
||||
ADMIN* lpAdminEnd = AdminList + AdminNum;
|
||||
|
||||
for(;lpAdminPos != lpAdminEnd; ++lpAdminPos)
|
||||
{
|
||||
AdminData adminData;
|
||||
adminData.m_dwUID = lpAdminPos->UID;
|
||||
adminData.m_cLevel = static_cast<unsigned char>(lpAdminPos->Level);
|
||||
|
||||
adminData.m_startIP.S_un.S_addr = inet_addr(lpAdminPos->IP_S);
|
||||
adminData.m_endIP.S_un.S_addr = inet_addr(lpAdminPos->IP_E);
|
||||
|
||||
m_AdminMap.insert(AdminMap::value_type(adminData.m_dwUID, adminData));
|
||||
}
|
||||
|
||||
memset(&AdminList, 0, sizeof(ADMIN) * MAX_LIST);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned char CAdminDataMgr::GetAdminLevel(unsigned long dwUID, IN_ADDR address)
|
||||
{
|
||||
AdminMap::iterator pos = m_AdminMap.find(dwUID);
|
||||
if(pos != m_AdminMap.end())
|
||||
{
|
||||
AdminData& admin = pos->second;
|
||||
|
||||
if(admin.m_dwUID == dwUID)
|
||||
{
|
||||
if(CServerSetup::GetInstance().GetAdminIPCheck())
|
||||
{
|
||||
if(admin.m_startIP.S_un.S_un_b.s_b1 == address.S_un.S_un_b.s_b1 &&
|
||||
admin.m_startIP.S_un.S_un_b.s_b2 == address.S_un.S_un_b.s_b2 &&
|
||||
admin.m_startIP.S_un.S_un_b.s_b3 == address.S_un.S_un_b.s_b3 &&
|
||||
admin.m_startIP.S_un.S_un_b.s_b4 <= address.S_un.S_un_b.s_b4 &&
|
||||
address.S_un.S_un_b.s_b4 <= admin.m_endIP.S_un.S_un_b.s_b4)
|
||||
{
|
||||
return admin.m_cLevel;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return admin.m_cLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef _RYL_DBAGENT_DB_ADMIN_DATA_H_
|
||||
#define _RYL_DBAGENT_DB_ADMIN_DATA_H_
|
||||
|
||||
#include <winsock2.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
struct AdminData
|
||||
{
|
||||
unsigned long m_dwUID;
|
||||
unsigned char m_cLevel;
|
||||
|
||||
IN_ADDR m_startIP;
|
||||
IN_ADDR m_endIP;
|
||||
};
|
||||
|
||||
class CAdminDataMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CAdminDataMgr& GetInstance();
|
||||
|
||||
bool LoadAdminList(CDBComponent& DBComponent);
|
||||
unsigned char GetAdminLevel(unsigned long dwUID, IN_ADDR address);
|
||||
|
||||
private:
|
||||
|
||||
typedef std::map<unsigned long, AdminData, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, AdminData> > > AdminMap;
|
||||
|
||||
AdminMap m_AdminMap;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
185
Server/RylServerProject/RylDBAgentServer/DataStorage/Billing.cpp
Normal file
185
Server/RylServerProject/RylDBAgentServer/DataStorage/Billing.cpp
Normal file
@@ -0,0 +1,185 @@
|
||||
#include "stdafx.h"
|
||||
#include "Billing.h"
|
||||
#include "SessionData.h"
|
||||
|
||||
#include <Network/Stream/SendStream.h>
|
||||
#include <Network/SendPacket/SendServerInfo.h>
|
||||
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
|
||||
enum BillingConst
|
||||
{
|
||||
SENDED_BILLING_TIMEOUT_NOTIFY = (1 << 0)
|
||||
};
|
||||
|
||||
|
||||
CBilling::CBilling()
|
||||
: m_nLoginTime(0),
|
||||
m_nPlayTime(0),
|
||||
m_dwCRMIndex1(0),
|
||||
m_cBillingType(0),
|
||||
m_cFlags(0),
|
||||
m_eWarnMsgType(WARN_BEFORE_1SEC)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CBilling::~CBilling()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CBilling::StartBilling(int nPlayTime, unsigned long dwCRMIndex1, unsigned char cBillingType)
|
||||
{
|
||||
m_nLoginTime = time(0);
|
||||
m_nPlayTime = nPlayTime;
|
||||
m_dwCRMIndex1 = dwCRMIndex1;
|
||||
m_cBillingType = cBillingType;
|
||||
m_cFlags = 0;
|
||||
}
|
||||
|
||||
void CBilling::ClearBilling()
|
||||
{
|
||||
m_nLoginTime = 0;
|
||||
m_nPlayTime = 0;
|
||||
m_dwCRMIndex1 = 0;
|
||||
m_cBillingType = 0;
|
||||
m_cFlags = 0;
|
||||
}
|
||||
|
||||
void CBilling::AddYouxiLandPoint(int nAdditionalPoint, unsigned char cBillingType)
|
||||
{
|
||||
m_nPlayTime += nAdditionalPoint;
|
||||
m_cBillingType = cBillingType;
|
||||
|
||||
m_cFlags &= ~SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
}
|
||||
|
||||
bool CBilling::CheckBilling(const CSessionData& SessionData, time_t nCurrentTime)
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õǾ<C3B5><C7BE><EFBFBD>, PC<50><43><EFBFBD><EFBFBD> <20>ƴϰ<C6B4>,
|
||||
// <20><><EFBFBD><EFBFBD> CHAR_ENABLED<45><44><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>,
|
||||
// <20>Ѱ<EFBFBD><D1B0><EFBFBD> <20><><EFBFBD>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD> üũ.
|
||||
if (0 != m_nLoginTime && 0 == m_dwCRMIndex1 &&
|
||||
CSessionData::SE_CHAR_ENABLED == SessionData.GetSessionState() &&
|
||||
CServerSetup::GamaUnitedBilling != CServerSetup::GetInstance().GetBillingType())
|
||||
{
|
||||
switch(m_cBillingType)
|
||||
{
|
||||
case 'T':
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. m_nPlayTime<6D><65> <20>д<EFBFBD><D0B4><EFBFBD>
|
||||
{
|
||||
// <20>߰<EFBFBD><DFB0>ð<EFBFBD> 20<32><30> <20><> <20><>.
|
||||
int nRemainSecond = int(m_nPlayTime * 60 + m_nLoginTime - nCurrentTime) + 20;
|
||||
|
||||
// 5<><35> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if (0 < nRemainSecond && nRemainSecond <= 300 && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY))
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ι<EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>..
|
||||
m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
SendPacket::BillingNotify(SessionData,
|
||||
static_cast<unsigned char>((nRemainSecond + 30)/60), m_cBillingType);
|
||||
}
|
||||
else if (nRemainSecond <= 0)
|
||||
{
|
||||
DETLOG2(g_Log, "UID:%10u/CID:%10u/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
SessionData.GetUID(), SessionData.GetCID());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. m_nPlayTime<6D><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>
|
||||
{
|
||||
const struct tm CurrentTime = *localtime(&nCurrentTime);
|
||||
const struct tm LoginTime = *localtime(&m_nLoginTime);
|
||||
|
||||
// <20>Ϸ<EFBFBD> <20><><EFBFBD>Ұ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 5<><35> <20><><EFBFBD≯<EFBFBD>, <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(LoginTime.tm_yday + m_nPlayTime - 1 == CurrentTime.tm_yday &&
|
||||
23 == CurrentTime.tm_hour && 55 <= CurrentTime.tm_min &&
|
||||
!(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY))
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ι<EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>..
|
||||
m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
SendPacket::BillingNotify(SessionData,
|
||||
static_cast<unsigned char>(60 - CurrentTime.tm_min), m_cBillingType);
|
||||
}
|
||||
else if(LoginTime.tm_yday + static_cast<long>(m_nPlayTime) <= CurrentTime.tm_yday)
|
||||
{
|
||||
DETLOG2(g_Log, "UID:%10u/CID:%10u/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD>",
|
||||
SessionData.GetUID(), SessionData.GetCID());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'Y':
|
||||
|
||||
// <20>븸 <20><><EFBFBD><EFBFBD>Ʈ. m_nPlayTime<6D><65> <20>д<EFBFBD><D0B4><EFBFBD>
|
||||
{
|
||||
// <20>߰<EFBFBD><DFB0>ð<EFBFBD> 1<><31> <20><> <20><>.
|
||||
int nRemainSecond = int(m_nPlayTime * 60 + m_nLoginTime - nCurrentTime) + 60;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üŷ
|
||||
if (0 < nRemainSecond && nRemainSecond <= 60 && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY))
|
||||
{
|
||||
// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ι<EFBFBD> <20><> <20><>ƾ<EFBFBD><C6BE><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>..
|
||||
m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY;
|
||||
|
||||
// Ű<>ۿ<EFBFBD> <20>ٽ<EFBFBD> <20>˾ƺ<CBBE><C6BA><EFBFBD>
|
||||
DETLOG5(g_Log, "UID:%10u/CID:%10u/<2F>븸 <20><><EFBFBD><EFBFBD>Ʈ üũ<C3BC>մϴ<D5B4>. <20><><EFBFBD><EFBFBD> <20><>:%d, <20>α<EFBFBD><CEB1><EFBFBD>:%d <20><><EFBFBD><EFBFBD>:%d",
|
||||
SessionData.GetUID(), SessionData.GetCID(), nRemainSecond, m_nLoginTime, nCurrentTime); // <20>ӽ<EFBFBD>
|
||||
|
||||
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>и<EFBFBD><D0B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
unsigned char cRemainMinute = static_cast<unsigned char>((nRemainSecond + 30) / 60);
|
||||
|
||||
if(WARN_BEFORE_1SEC == m_eWarnMsgType)
|
||||
{
|
||||
// <20>߱<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
SendPacket::BillingCheckNotify(
|
||||
SessionData, cRemainMinute, m_cBillingType);
|
||||
}
|
||||
|
||||
// UID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Ȯ<><C8AE> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SendPacket::UpdateUIDTable(PktUUT::UpdateUIDTableBillingCheck,
|
||||
SessionData.GetAccountName(), NULL, SessionData.GetUID(), SessionData.GetCID(),
|
||||
SessionData.GetSessionID(), SessionData.GetServerID(), SessionData.GetRemoteAddress());
|
||||
}
|
||||
else if (nRemainSecond <= 0)
|
||||
{
|
||||
DETLOG6(g_Log, "UID:%10u/CID:%10u/<2F>븸 <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>:%d Ÿ<><C5B8>:%d, <20>α<EFBFBD><CEB1><EFBFBD>:%d <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>:%d",
|
||||
SessionData.GetUID(), SessionData.GetCID(), nRemainSecond, m_nPlayTime, m_nLoginTime, nCurrentTime);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
#ifndef _RYL_DBAGENT_BILLING_DATA_H_
|
||||
#define _RYL_DBAGENT_BILLING_DATA_H_
|
||||
|
||||
#include <ctime>
|
||||
|
||||
// forward decl;
|
||||
class CSendStream;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl;
|
||||
class CSessionData;
|
||||
|
||||
class CBilling
|
||||
{
|
||||
public:
|
||||
|
||||
CBilling();
|
||||
~CBilling();
|
||||
|
||||
enum WarningType
|
||||
{
|
||||
WARN_BEFORE_1SEC = 0,
|
||||
NO_WARNING = 1,
|
||||
WARN_EVERY_MINUTE = 2
|
||||
};
|
||||
|
||||
|
||||
time_t GetLoginTime() const { return m_nLoginTime; }
|
||||
int GetPlayTime() const { return m_nPlayTime; }
|
||||
unsigned long GetCRMData() const { return m_dwCRMIndex1; }
|
||||
WarningType GetWarnMsgType() const { return m_eWarnMsgType; }
|
||||
char GetBillingType() const { return m_cBillingType; }
|
||||
|
||||
void SetWarnMsgType(WarningType eWarnMsgType) { m_eWarnMsgType = eWarnMsgType; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void StartBilling(int nPlayTime,
|
||||
unsigned long dwCRMIndex1, unsigned char cBillingType);
|
||||
|
||||
void ClearBilling();
|
||||
|
||||
//! <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>
|
||||
void AddYouxiLandPoint(int nAdditionalPoint, unsigned char cBillingType);
|
||||
|
||||
//! true : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> / false : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
|
||||
bool CheckBilling(const CSessionData& SessionData, time_t nCurrentTime);
|
||||
|
||||
private:
|
||||
|
||||
time_t m_nLoginTime; // <20>α<EFBFBD><CEB1><EFBFBD> <20>ð<EFBFBD>(midnight, January 1, 1970 <20><><EFBFBD><EFBFBD> <20>帥 <20>ð<EFBFBD>(sec))
|
||||
|
||||
int m_nPlayTime; // <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (<28><>¥ Ȥ<><C8A4> <20>ð<EFBFBD>)
|
||||
unsigned long m_dwCRMIndex1; // PC<50><43> ID (0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
WarningType m_eWarnMsgType; // <20>ؿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEBD><EFBFBD> Ÿ<><C5B8> ( 0 : 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20>븸 <20><>, 1 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, 2 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> )
|
||||
|
||||
char m_cBillingType; // <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> (D : <20><><EFBFBD><EFBFBD> <20><>¥, T : <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD>)
|
||||
char m_cFlags; // <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>.
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,236 @@
|
||||
#ifndef _RYL_DBAGENT_CHARACTER_DATA_H_
|
||||
#define _RYL_DBAGENT_CHARACTER_DATA_H_
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
#include <Community/FriendList.h>
|
||||
#include <Community/BanList.h>
|
||||
#include <Skill/Spell/Affected.h>
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CSessionData;
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
class CDBDataMgr;
|
||||
|
||||
class CCharacterData
|
||||
{
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_EQUIP_VIEW = 15
|
||||
};
|
||||
|
||||
enum CHANGED_CHAR_DATA
|
||||
{
|
||||
CHANGED_CHAR_INFOST = (1 << 0),
|
||||
CHANGED_CHAR_POS = (1 << 1),
|
||||
CHANGED_SKILL = (1 << 2),
|
||||
CHANGED_QUICK = (1 << 3),
|
||||
CHANGED_EQUIP = (1 << 4),
|
||||
CHANGED_INVEN = (1 << 5),
|
||||
CHANGED_EXTRA = (1 << 6),
|
||||
CHANGED_EXCHANGE = (1 << 7),
|
||||
CHANGED_TEMPINVEN = (1 << 8),
|
||||
CHANGED_CHAR_INFOEX = (1 << 9),
|
||||
CHANGED_QUEST = (1 << 10),
|
||||
CHANGED_HISTORY = (1 << 11),
|
||||
CHANGED_CONFIG = (1 << 12),
|
||||
CHANGED_FRIENDLIST = (1 << 13),
|
||||
CHANGED_BANLIST = (1 << 14),
|
||||
CHANGED_SPELL = (1 << 15),
|
||||
CHANGED_ENCHANT = (1 << 16)
|
||||
};
|
||||
|
||||
|
||||
CCharacterData();
|
||||
~CCharacterData();
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
|
||||
//! Ű <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>. <20><><EFBFBD>⼭<EFBFBD><E2BCAD> CID<49>̴<EFBFBD>.
|
||||
unsigned long GetKey() const { return GetCID(); }
|
||||
|
||||
unsigned long GetCID() const { return m_CharInfo.CID; }
|
||||
unsigned long GetPID() const { return m_CharInfo.PID; }
|
||||
unsigned long GetGID() const { return m_CharInfo.GID; }
|
||||
unsigned long GetServerID() const { return m_CharInfoEx.ServerID; }
|
||||
unsigned char GetAdminFlag() const { return m_CharInfoEx.cAdminFlag; }
|
||||
|
||||
const char* GetName() const { return m_CharInfo.Name; }
|
||||
char GetRace() const { return m_CharInfo.Race; }
|
||||
|
||||
unsigned short GetClass() { return m_CharInfo.Class; }
|
||||
char GetLevel() const { return m_CharInfo.Level; }
|
||||
|
||||
const CHAR_INFOST& GetInfo() const { return m_CharInfo; }
|
||||
const CHAR_POS& GetPos() const { return m_CharPos; }
|
||||
const SKILL& GetSkill() const { return m_Skill; }
|
||||
const QUICK& GetQuick() const { return m_Quick; }
|
||||
const SPELL& GetSpell() const { return m_Spell; }
|
||||
|
||||
const EQUIP& GetEquip() const { return m_Equip; }
|
||||
const INVEN& GetInven() const { return m_Inven; }
|
||||
const EXTRA& GetExtra() const { return m_Extra; }
|
||||
const EXCHANGE& GetExchange() const { return m_Exchange; }
|
||||
const TEMPINVEN& GetTempInven() const { return m_TempInven; }
|
||||
|
||||
const CHAR_INFOEX& GetInfoEx() const { return m_CharInfoEx; }
|
||||
const QUEST& GetQuest() const { return m_Quest; }
|
||||
const HISTORY& GetHistory() const { return m_History; }
|
||||
const CONFIG& GetConfig() const { return m_Config; }
|
||||
|
||||
const CFriendList& GetFriendList() const { return m_FriendList; }
|
||||
const CBanList& GetBanList() const { return m_BanList; }
|
||||
|
||||
TIME* GetLogoutTime() { return &m_CharInfoEx.LoggoutTime; }
|
||||
TIME* GetLoginTime() { return &m_LogginTime; }
|
||||
|
||||
|
||||
|
||||
|
||||
// ģ<><C4A3>/<2F>ź<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD>.
|
||||
bool AddFriend(unsigned long dwFriendCID, const char* szCharacterName, unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID);
|
||||
bool RemoveFriend(unsigned long dwFriendCID);
|
||||
|
||||
bool AddBan(unsigned long dwBanCID, const char* szBanName, unsigned long dwGID, unsigned short wClass, char cLevel, unsigned long dwServerID);
|
||||
bool RemoveBan(unsigned long dwBanCID);
|
||||
|
||||
bool SetFriendGroup(unsigned long dwCID, unsigned long dwGroup);
|
||||
|
||||
bool FriendSerializeIn(const char* lpData, unsigned long dwDataLen);
|
||||
bool BanSerializeIn(const char* lpData, unsigned long dwDataLen);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
void SetUID(unsigned long dwUID);
|
||||
void SetPID(unsigned long dwPID);
|
||||
void SetGID(unsigned long dwGID);
|
||||
void SetServerID(unsigned long dwServerID);
|
||||
|
||||
// <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ʴ´<CAB4>!
|
||||
bool SetInfo(const CHAR_INFOST& charInfoST, bool bChangeName = false);
|
||||
void SetPos(const CHAR_POS& charPos);
|
||||
void SetSkill(const SKILL& skill);
|
||||
void SetQuick(const QUICK& quick);
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
void SetSpell(const SPELL& spell);
|
||||
|
||||
void SetInfoEx(const CHAR_INFOEX& charInfoEx);
|
||||
void SetQuest(const QUEST& quest);
|
||||
void SetHistory(const HISTORY& history);
|
||||
void SetConfig(const CONFIG& config);
|
||||
|
||||
bool SetEquip(const char* szData, unsigned long dwDataLen);
|
||||
bool SetInven(const char* szData, unsigned long dwDataLen);
|
||||
bool SetExtra(const char* szData, unsigned long dwDataLen);
|
||||
bool SetExchange(const char* szData, unsigned long dwDataLen);
|
||||
bool SetTempInven(const char* szData, unsigned long dwDataLen);
|
||||
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
bool IsDataChanged() const { return 0 != m_dwUpdateData; }
|
||||
bool IsValidData() const { return !(0 == GetCID() || 0 == GetInfo().Level); }
|
||||
|
||||
void ClearData(); //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void ReloadEquipView(); //! <20><><EFBFBD><EFBFBD> <20>並 <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool SerializeOut(char* lpBuffer_Out, unsigned short* lpSizeArray_Out,
|
||||
unsigned long &dwBufferSize_InOut, unsigned long dwSizeArrayNum);
|
||||
|
||||
//! <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD>۵Ǿ<DBB5> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool SerializeIn(const char* lpBuffer_In, const unsigned short* lpSizeArray_In,
|
||||
unsigned long dwBufferSize, unsigned long dwSizeArrayNum);
|
||||
|
||||
//! DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UpdateDBData(CDBComponent& DBComponent);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool ForceUpdateDBAllData(CDBComponent& DBComponent)
|
||||
{
|
||||
m_dwUpdateData = 0xFFFFFFFF;
|
||||
return UpdateDBData(DBComponent);
|
||||
}
|
||||
|
||||
void SetFriendUpdateData(void) { m_dwUpdateData |= CCharacterData::CHANGED_FRIENDLIST; }
|
||||
void SetBadUpdateData(void) { m_dwUpdateData |= CCharacterData::CHANGED_BANLIST; }
|
||||
|
||||
void SetAdminFlag(unsigned char cAdminFlag) { m_CharInfoEx.cAdminFlag = cAdminFlag; }
|
||||
|
||||
unsigned char GetRealmCheckPoint(void) const { return m_CharInfoEx.RealmCheckPoint; }
|
||||
void SetRealmCheckPoint(unsigned char cRealmCheckPoint) { m_CharInfoEx.RealmCheckPoint = cRealmCheckPoint; }
|
||||
|
||||
unsigned char GetRealmMinute(void) const { return m_CharInfoEx.RealmMinute; }
|
||||
void SetRealmMinute(unsigned char cRealmMinute) { m_CharInfoEx.RealmMinute = cRealmMinute; }
|
||||
|
||||
unsigned char GetGuildWarFlag(void) const { return m_CharInfoEx.GuildWarFlag; }
|
||||
unsigned char GetRealmWarFlag(void) const { return m_CharInfoEx.RealmWarFlag; }
|
||||
bool SetGuildWarFlag(unsigned char cFlag);
|
||||
bool SetRealmWarFlag(unsigned char cFlag);
|
||||
|
||||
unsigned char GetRealmPoint() const { return m_CharInfoEx.RealmPoint; }
|
||||
void SetRealmPoint(unsigned char cRealmPoint) { m_CharInfoEx.RealmPoint = cRealmPoint; }
|
||||
|
||||
unsigned long GetLastDBUpdateTime() const { return m_dwLastDBUpdateTime; }
|
||||
|
||||
//! DB<44>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool GetFromDB(CDBComponent& DBComponent, unsigned long dwKey);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD> <20>´<EFBFBD>.
|
||||
bool WriteDataToDumpFile(const char* szFileName);
|
||||
bool ReadDataFromDumpFile(const char* szFileName);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><DEBC><EFBFBD>
|
||||
bool ConvertToPart2Item(bool bConvertSkillToTicket);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>
|
||||
bool DeductGold(unsigned long dwGold);
|
||||
bool AddGold(unsigned long dwGold);
|
||||
|
||||
private:
|
||||
|
||||
CHAR_INFOST m_CharInfo; // <20>⺻ <20><><EFBFBD><EFBFBD>
|
||||
CHAR_POS m_CharPos; // <20><>ġ <20><><EFBFBD><EFBFBD>
|
||||
SKILL m_Skill; // <20><>ų <20><><EFBFBD><EFBFBD>
|
||||
QUICK m_Quick; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
CHAR_INFOEX m_CharInfoEx; // <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
QUEST m_Quest; // <20><><EFBFBD><EFBFBD>Ʈ
|
||||
HISTORY m_History; // <20><><EFBFBD><EFBFBD><EFBFBD>丮
|
||||
CONFIG m_Config; // <20><><EFBFBD><EFBFBD>
|
||||
|
||||
EQUIP m_Equip; // <20><><EFBFBD><EFBFBD>
|
||||
INVEN m_Inven; // <20>κ<EFBFBD>
|
||||
EXTRA m_Extra; // <20><><EFBFBD><EFBFBD>
|
||||
EXCHANGE m_Exchange; // <20><>ȯ
|
||||
TEMPINVEN m_TempInven; // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>丮
|
||||
SPELL m_Spell; // <20><><EFBFBD><EFBFBD>
|
||||
|
||||
CBanList m_BanList; // <20>ź<EFBFBD>
|
||||
CFriendList m_FriendList; // ģ<><C4A3>
|
||||
|
||||
|
||||
TIME m_LogginTime; // <20><><EFBFBD>缭<EFBFBD><E7BCAD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1>ε<EFBFBD> <20>ð<EFBFBD>.
|
||||
|
||||
unsigned short m_EquipView[MAX_EQUIP_VIEW]; // <20><><EFBFBD><EFBFBD> <20><>
|
||||
unsigned long m_dwUpdateData; // <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8>.
|
||||
unsigned long m_dwLastDBUpdateTime;
|
||||
|
||||
unsigned long m_dwUID;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,99 @@
|
||||
#include "stdafx.h"
|
||||
#include "CharacterDataMgr.h"
|
||||
#include "SessionDataMgr.h"
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
CCharacterDataMgr& CCharacterDataMgr::GetInstance()
|
||||
{
|
||||
static CCharacterDataMgr characterDataMgr;
|
||||
return characterDataMgr;
|
||||
}
|
||||
|
||||
CCharacterDataMgr::CCharacterDataMgr()
|
||||
{
|
||||
SetManagerName("ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
|
||||
CCharacterDataMgr::~CCharacterDataMgr()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DBDataError CCharacterDataMgr::LoadData(CSessionData& SessionData, unsigned long dwKey,
|
||||
CCharacterData*& lpLoadData_Out)
|
||||
{
|
||||
DBDataError eDataError = CCharaterDataMgrBase::LoadData(SessionData, dwKey, lpLoadData_Out);
|
||||
|
||||
if(DATA_SUCCEEDED == eDataError)
|
||||
{
|
||||
CSessionDataMgr::GetInstance().AddCharLoadedSession(dwKey, SessionData);
|
||||
}
|
||||
|
||||
return eDataError;
|
||||
}
|
||||
|
||||
DBDataError CCharacterDataMgr::UnloadData(const CSessionData& SessionData, CCharacterData* lpUnloadData)
|
||||
{
|
||||
DBDataError eDataError = CCharaterDataMgrBase::UnloadData(SessionData, lpUnloadData);
|
||||
|
||||
if(DATA_SUCCEEDED == eDataError)
|
||||
{
|
||||
CSessionDataMgr::GetInstance().RemoveCharLoadedSession(SessionData.GetCID());
|
||||
}
|
||||
|
||||
return eDataError;
|
||||
}
|
||||
|
||||
void CCharacterDataMgr::Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const unsigned long& dwKey, const char* szErrorMsg)
|
||||
{
|
||||
switch(eLogType)
|
||||
{
|
||||
case LOG_NORMAL:
|
||||
case LOG_RULE:
|
||||
case LOG_INFO:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "UID:%10u / CID:%10u / Key:%10u / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(), dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "Key:%10u / %s %s",
|
||||
dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
|
||||
case LOG_DETAIL:
|
||||
case LOG_SYSERR:
|
||||
case LOG_ERROR:
|
||||
case LOG_DEBUG:
|
||||
case LOG_WARN:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine,
|
||||
"UID:%10u / CID:%10u / Key:%10u / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(), dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine, "Key:%10u / %s %s",
|
||||
dwKey, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef _RYL_DBAGENT_CHARACTER_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_CHARACTER_DATA_MGR_H_
|
||||
|
||||
#include "DBDataMgr.h"
|
||||
#include "CharacterData.h"
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
typedef CDBDataMgr<unsigned long, CCharacterData> CCharaterDataMgrBase;
|
||||
|
||||
class CCharacterDataMgr : public CCharaterDataMgrBase
|
||||
{
|
||||
public:
|
||||
|
||||
static CCharacterDataMgr& GetInstance();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>/<2F><><EFBFBD>ε<EFBFBD>
|
||||
virtual DBDataError LoadData(CSessionData& SessionData,
|
||||
unsigned long dwKey, CCharacterData*& lpLoadData_Out);
|
||||
|
||||
virtual DBDataError UnloadData(const CSessionData& SessionData, CCharacterData* lpUnloadData);
|
||||
|
||||
private:
|
||||
|
||||
CCharacterDataMgr();
|
||||
~CCharacterDataMgr();
|
||||
|
||||
virtual void Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const unsigned long& dataKey, const char* szErrorMsg);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
#ifndef _RYL_DBAGENT_DB_DATA_H_
|
||||
#define _RYL_DBAGENT_DB_DATA_H_
|
||||
|
||||
//forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CSessionData;
|
||||
class CDBDataMgr;
|
||||
|
||||
class IDBData
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~IDBData() { }
|
||||
|
||||
virtual unsigned long GetKey() const = 0; //! Key<65><79> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
|
||||
virtual unsigned long GetLastDBUpdateTime() const = 0; //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
|
||||
virtual bool UpdateDBData(CDBComponent& DBComponent) = 0; //! DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
virtual bool IsDataChanged() const = 0; //! <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD> <20>´<EFBFBD>.
|
||||
virtual bool WriteDataToDumpFile(const char* szFileName) = 0;
|
||||
virtual bool ReadDataFromDumpFile(const char* szFileName) = 0;
|
||||
|
||||
protected:
|
||||
|
||||
//! DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7>´<EFBFBD>.
|
||||
virtual bool GetFromDB(CDBComponent& DBComponent, unsigned long dwKey) = 0;
|
||||
|
||||
friend class CDBDataMgr;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
#include "stdafx.h"
|
||||
#include "DBDataMgr.h"
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
const char* g_szDBDataErrorString[MAX_DATA_ERROR] =
|
||||
{
|
||||
"DATA_SUCCEEDED", //! <20><><EFBFBD><EFBFBD>
|
||||
"DATA_SERVER_ERROR", //! <20><EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
"DATA_ALREADY_LOGIN_ERROR", //! <20>̹<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
"DATA_ALREADY_LOGOUT_ERROR" //! <20>̹<EFBFBD> <20>αƿ<D7BE> <20><> <20><><EFBFBD><EFBFBD>
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
522
Server/RylServerProject/RylDBAgentServer/DataStorage/DBDataMgr.h
Normal file
522
Server/RylServerProject/RylDBAgentServer/DataStorage/DBDataMgr.h
Normal file
@@ -0,0 +1,522 @@
|
||||
#ifndef _RYL_DBAGENT_DB_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_DB_DATA_MGR_H_
|
||||
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#include <mmsystem.h>
|
||||
#include <Log/ServerLogDefine.h>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
|
||||
#include "SessionData.h"
|
||||
|
||||
|
||||
//forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// forward decl.
|
||||
class CSessionData;
|
||||
|
||||
enum DBDataError
|
||||
{
|
||||
DATA_SUCCEEDED = 0, //! <20><><EFBFBD><EFBFBD>
|
||||
DATA_SERVER_ERROR = 1, //! <20><EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
|
||||
DATA_ALREADY_LOGIN_ERROR = 2, //! <20>̹<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
DATA_ALREADY_LOGOUT_ERROR = 3, //! <20>̹<EFBFBD> <20>αƿ<D7BE> <20><> <20><><EFBFBD><EFBFBD>
|
||||
MAX_DATA_ERROR = 4
|
||||
};
|
||||
|
||||
extern const char* g_szDBDataErrorString[MAX_DATA_ERROR];
|
||||
|
||||
template<typename Key, typename Data, typename Pred = std::less<Key> >
|
||||
class CDBDataMgr
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename Key KeyType;
|
||||
typedef typename Data DataType;
|
||||
|
||||
enum Const { MAX_MANAGER_NAME = 32 };
|
||||
|
||||
// ù<><C3B9>° <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20>ι<EFBFBD>° <20><><EFBFBD>ڴ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ð<EFBFBD>
|
||||
// <20>αƿ<D7BE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ե<EFBFBD> <20>ð<EFBFBD>
|
||||
typedef std::pair<DataType*, unsigned long> DBDataPair;
|
||||
|
||||
typedef std::map<KeyType, DBDataPair, Pred,
|
||||
boost::fast_pool_allocator< std::pair<KeyType, DBDataPair> > > DataMap;
|
||||
|
||||
//! DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void SetDBComponent(CDBComponent* lpDBComponent) { m_lpDBComponent = lpDBComponent; }
|
||||
CDBComponent* GetDBComponent() { return m_lpDBComponent; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> LoginDB<44><42> <20>ִ<EFBFBD><D6B4><EFBFBD>, LogoutDB<44><42> <20>ִ<EFBFBD><D6B4><EFBFBD> <20>˾<EFBFBD> <20>´<EFBFBD>.
|
||||
bool IsDataLoginDB(const KeyType& dataKey) { return m_LoginMap.end() != m_LoginMap.find(dataKey); }
|
||||
bool IsDataLogoutDB(const KeyType& dataKey) { return m_LogoutMap.end() != m_LogoutMap.find(dataKey); }
|
||||
|
||||
//! <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
const char* GetManagerName() const { return m_szManagerName; }
|
||||
unsigned int GetLoginNum() const { return static_cast<unsigned int>(m_LoginMap.size()); }
|
||||
unsigned int GetLogoutNum() const { return static_cast<unsigned int>(m_LogoutMap.size()); }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
|
||||
virtual DBDataError LoadData(CSessionData& SessionData, KeyType dataKey, DataType*& lpLoadData_Out);
|
||||
virtual DBDataError UnloadData(const CSessionData& SessionData, DataType* lpUnloadData);
|
||||
|
||||
DataType* GetLogoutData(const KeyType& dataKey); //! <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
DBDataError ReloadData(const KeyType& dataKey); //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44>κ<EFBFBD><CEBA><EFBFBD> Reload<61>Ѵ<EFBFBD>.
|
||||
bool RemoveLogoutData(const KeyType& dataKey); //! <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>αƿ<D7BE><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool ManageUnloadedData(unsigned long dwMaxDataNum);
|
||||
|
||||
//! <20>α<EFBFBD><CEB1><EFBFBD> <20><> / <20>αƿ<D7BE> <20>¿<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
//! Arg1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ּҰ<D6BC><D2B0><EFBFBD>,
|
||||
//! Arg2 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20>ִ<EFBFBD> <20>ð<EFBFBD><C3B0>̴<EFBFBD>.
|
||||
void UpdateDBData(unsigned long dwMinUpdateNum, unsigned long dwMaxUseTime);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
void Destroy()
|
||||
{
|
||||
Destroy(m_LoginMap.begin(), m_LoginMap.end());
|
||||
Destroy(m_LogoutMap.begin(), m_LogoutMap.end());
|
||||
|
||||
m_LoginMap.clear();
|
||||
m_LogoutMap.clear();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
CDBDataMgr() : m_lpDBComponent(0) { memset(m_szManagerName, 0, sizeof(char) * MAX_MANAGER_NAME); }
|
||||
~CDBDataMgr() { Destroy(); }
|
||||
|
||||
void SetManagerName(const char* szManagerName)
|
||||
{
|
||||
strncpy(m_szManagerName, szManagerName, MAX_MANAGER_NAME - 1);
|
||||
m_szManagerName[MAX_MANAGER_NAME - 1] = 0;
|
||||
}
|
||||
|
||||
// KeyType<70><65> <20>α<CEB1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӹƼ<DEBE> ó<><C3B3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
virtual void Log(LOG_TYPE eLogType,
|
||||
const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData,
|
||||
const KeyType& dataKey, const char* szErrorMsg) = 0;
|
||||
|
||||
// Data<74><61> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><EFBFBD><DEBC><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
Data* CreateData() { return new Data; }
|
||||
void DeleteData(Data* lpDBData) { delete lpDBData; }
|
||||
|
||||
/*
|
||||
Data* CreateData() { return m_DataPool.construct(); }
|
||||
void DeleteData(Data* lpDBData) { m_DataPool.destruct(lpDBData); }
|
||||
*/
|
||||
|
||||
private:
|
||||
|
||||
void Destroy(typename DataMap::iterator first, typename DataMap::iterator last);
|
||||
|
||||
CDBComponent* m_lpDBComponent; //! DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
DataMap m_LoginMap; //! <20>α<EFBFBD><CEB1><EFBFBD> <20><> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
DataMap m_LogoutMap; //! <20>αƿ<D7BE><C6BF><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
|
||||
|
||||
boost::object_pool<Data> m_DataPool; //! <20><>ü Ǯ
|
||||
|
||||
char m_szManagerName[MAX_MANAGER_NAME]; //! <20><><EFBFBD><EFBFBD> <20>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>.
|
||||
};
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
class CGreaterLogoutTime
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename CDBDataMgr<Key, Data, Pred>::DataMap::value_type DataType;
|
||||
|
||||
CGreaterLogoutTime(unsigned long dwCurrentTime) : m_dwCurrentTime(dwCurrentTime) { }
|
||||
|
||||
bool operator () (const DataType& lhs, const DataType& rhs)
|
||||
{
|
||||
return m_dwCurrentTime - lhs.second.second >
|
||||
m_dwCurrentTime - rhs.second.second;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwCurrentTime;
|
||||
};
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
class CGreaterUpdateTime
|
||||
{
|
||||
public:
|
||||
|
||||
typedef typename CDBDataMgr<Key, Data, Pred>::DataMap::value_type DataType;
|
||||
|
||||
CGreaterUpdateTime(unsigned long dwCurrentTime) : m_dwCurrentTime(dwCurrentTime) { }
|
||||
|
||||
bool operator () (const DataType& lhs, const DataType& rhs)
|
||||
{
|
||||
return m_dwCurrentTime - lhs.second.first->GetLastDBUpdateTime() >
|
||||
m_dwCurrentTime - rhs.second.first->GetLastDBUpdateTime();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwCurrentTime;
|
||||
};
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><> Session<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
DBDataError CDBDataMgr<Key, Data, Pred>::LoadData(CSessionData& SessionData, KeyType dataKey, Data*& lpLoadData_Out)
|
||||
{
|
||||
lpLoadData_Out = 0;
|
||||
Data* lpDBData = 0;
|
||||
|
||||
DataMap::iterator pos;
|
||||
DataMap::iterator end;
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
pos = m_LoginMap.find(dataKey);
|
||||
end = m_LoginMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, (pos->second.first->GetKey() != dataKey)
|
||||
? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : Ű <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>" : "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>");
|
||||
|
||||
return DATA_ALREADY_LOGIN_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>˻<EFBFBD><CBBB>մϴ<D5B4>.
|
||||
pos = m_LogoutMap.find(dataKey);
|
||||
end = m_LogoutMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD>. <20>αƿ<D7BE> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20>غ<EFBFBD><D8BA><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
lpDBData = pos->second.first;
|
||||
m_LogoutMap.erase(pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ε带 <20>Ѵ<EFBFBD>.
|
||||
if(0 != m_lpDBComponent)
|
||||
{
|
||||
lpDBData = CreateData();
|
||||
|
||||
if(0 != lpDBData)
|
||||
{
|
||||
if(!lpDBData->GetFromDB(*m_lpDBComponent, dataKey))
|
||||
{
|
||||
// DB<44><42><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. GetFromDB<44><42><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
DeleteData(lpDBData);
|
||||
lpDBData = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><EFBFBD><DEB8><EFBFBD> <20>Ҵ翡 <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : DB<44><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C>Դϴ<D4B4>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(0 != lpDBData)
|
||||
{
|
||||
DBDataPair dataPair(lpDBData, timeGetTime());
|
||||
|
||||
if(!m_LoginMap.insert(std::make_pair(dataKey, dataPair)).second)
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey,
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : LoginMap<61><70> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)");
|
||||
|
||||
DeleteData(lpDBData);
|
||||
lpDBData = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_INFO, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
|
||||
lpLoadData_Out = lpDBData;
|
||||
return DATA_SUCCEEDED;
|
||||
}
|
||||
}
|
||||
|
||||
return DATA_SERVER_ERROR;
|
||||
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Session<6F><6E><EFBFBD><EFBFBD> <20>и<EFBFBD><D0B8><EFBFBD> <20><> <20><><EFBFBD>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
DBDataError CDBDataMgr<Key, Data, Pred>::UnloadData(const CSessionData& SessionData, Data* lpUnloadData)
|
||||
{
|
||||
if(0 != lpUnloadData)
|
||||
{
|
||||
KeyType dataKey = lpUnloadData->GetKey();
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (0 == m_LoginMap.erase(dataKey))
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>̻<EFBFBD> : <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5>մϴ<D5B4>");
|
||||
}
|
||||
else if(0 == m_lpDBComponent || !lpUnloadData->UpdateDBData(*m_lpDBComponent))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>.
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20>̻<EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>");
|
||||
}
|
||||
else if (m_LogoutMap.insert(
|
||||
std::make_pair(dataKey, std::make_pair(lpUnloadData, timeGetTime()))).second)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
Log(LOG_INFO, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>⼭ Ż<><C5BB>
|
||||
return DATA_SUCCEEDED;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>ȵȴ<C8B5>. <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : Logout<75>ʿ<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>");
|
||||
}
|
||||
|
||||
// <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if(!lpUnloadData->WriteDataToDumpFile(0))
|
||||
{
|
||||
Log(LOG_ERROR, LOG_FFL, &SessionData, dataKey, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
// <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܵ<EFBFBD> <20><>¿ <20><> <20><><EFBFBD><EFBFBD>. <20>߸<EFBFBD> Delete<74>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
|
||||
// DeleteData(lpUnloadData);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG4(g_Log, "UID:%10u / CID:%10u / lpUnloadData:0x%p / %s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ڰ<EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>",
|
||||
SessionData.GetUID(), SessionData.GetCID(), lpUnloadData, m_szManagerName);
|
||||
}
|
||||
|
||||
return DATA_SERVER_ERROR;
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44>κ<EFBFBD><CEBA><EFBFBD> Reload<61>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
DBDataError CDBDataMgr<Key, Data, Pred>::ReloadData(const KeyType& dataKey)
|
||||
{
|
||||
if(0 == m_lpDBComponent)
|
||||
{
|
||||
return DATA_SERVER_ERROR;
|
||||
}
|
||||
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ҷ<EFBFBD><D2B7>ͼ<EFBFBD><CDBC><EFBFBD> <20>ȵȴ<C8B5>.
|
||||
DataMap::iterator pos = m_LoginMap.find(dataKey);
|
||||
DataMap::iterator end = m_LoginMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
return DATA_ALREADY_LOGIN_ERROR;
|
||||
}
|
||||
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, DB<44>κ<EFBFBD><CEBA><EFBFBD> <20>ҷ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
pos == m_LogoutMap.find(dataKey);
|
||||
end == m_LogoutMap.end();
|
||||
|
||||
return (pos != end && !pos->second.first->GetFromDB(*m_lpDBComponent, dataKey))
|
||||
? DATA_SERVER_ERROR : DATA_SUCCEEDED;
|
||||
}
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
bool CDBDataMgr<Key, Data, Pred>::RemoveLogoutData(const KeyType& dataKey)
|
||||
{
|
||||
// <20>αƿ<D7BE> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
DataMap::iterator pos = m_LogoutMap.find(dataKey);
|
||||
DataMap::iterator end = m_LogoutMap.end();
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
DeleteData(pos->second.first);
|
||||
m_LogoutMap.erase(pos);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>αƿ<D7BE><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
bool CDBDataMgr<Key, Data, Pred>::ManageUnloadedData(unsigned long dwMaxDataNum)
|
||||
{
|
||||
size_t nLogoutDataNum = m_LogoutMap.size();
|
||||
|
||||
if(dwMaxDataNum < nLogoutDataNum)
|
||||
{
|
||||
// <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
typedef std::vector<std::pair<KeyType, DBDataPair>,
|
||||
boost::pool_allocator<std::pair<KeyType, DBDataPair> > > RemoveMap;
|
||||
|
||||
RemoveMap removeMap(nLogoutDataNum - dwMaxDataNum);
|
||||
|
||||
std::partial_sort_copy(m_LogoutMap.begin(), m_LogoutMap.end(),
|
||||
removeMap.begin(), removeMap.end(), CGreaterLogoutTime<Key,Data,Pred>(timeGetTime()));
|
||||
|
||||
RemoveMap::iterator pos = removeMap.begin();
|
||||
RemoveMap::iterator end = removeMap.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
m_LogoutMap.erase(pos->first);
|
||||
DeleteData(pos->second.first);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//! <20>α<EFBFBD><CEB1><EFBFBD> <20>¿<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20>ִ<EFBFBD> <20>ð<EFBFBD><C3B0>̴<EFBFBD>.
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
void CDBDataMgr<Key, Data, Pred>::UpdateDBData(unsigned long dwMinUpdateNum, unsigned long dwMaxUseTime)
|
||||
{
|
||||
if(0 != m_lpDBComponent)
|
||||
{
|
||||
typedef std::vector<std::pair<KeyType, DBDataPair>,
|
||||
boost::pool_allocator<std::pair<KeyType, DBDataPair> > > UpdateList;
|
||||
|
||||
UpdateList updateList(m_LoginMap.size());
|
||||
|
||||
unsigned long dwStartTime = timeGetTime();
|
||||
|
||||
std::partial_sort_copy(m_LoginMap.begin(), m_LoginMap.end(),
|
||||
updateList.begin(), updateList.end(), CGreaterUpdateTime<Key,Data,Pred>(dwStartTime));
|
||||
|
||||
UpdateList::iterator loginPos = updateList.begin();
|
||||
UpdateList::iterator loginEnd = updateList.end();
|
||||
|
||||
unsigned long dwCurrentTime = timeGetTime();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ұų<D2B0>, <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>ϰ<EFBFBD>, <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
for(unsigned long dwUpdateCount = 0; loginPos != loginEnd; ++loginPos)
|
||||
{
|
||||
if (dwMinUpdateNum < dwUpdateCount &&
|
||||
dwCurrentTime < dwStartTime + dwMaxUseTime)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Data* lpDBData = loginPos->second.first;
|
||||
|
||||
if(lpDBData->IsDataChanged())
|
||||
{
|
||||
lpDBData->UpdateDBData(*m_lpDBComponent);
|
||||
++dwUpdateCount;
|
||||
|
||||
dwCurrentTime = timeGetTime();
|
||||
}
|
||||
}
|
||||
|
||||
// ij<><C4B3> DB<44><42><EFBFBD><EFBFBD>. <20><><EFBFBD>κ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
// <20>ֱ<EFBFBD> <20>ź<EFBFBD><C5BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
DataMap::iterator logoutPos = m_LogoutMap.begin();
|
||||
DataMap::iterator logoutEnd = m_LogoutMap.end();
|
||||
|
||||
dwCurrentTime = timeGetTime();
|
||||
|
||||
for(unsigned long dwUpdateCount = 0; logoutPos != logoutEnd; ++logoutPos)
|
||||
{
|
||||
if (dwMinUpdateNum < dwUpdateCount &&
|
||||
dwCurrentTime < dwStartTime + dwMaxUseTime)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Data* lpDBData = logoutPos->second.first;
|
||||
|
||||
if(lpDBData->IsDataChanged())
|
||||
{
|
||||
lpDBData->UpdateDBData(*m_lpDBComponent);
|
||||
++dwUpdateCount;
|
||||
|
||||
dwCurrentTime = timeGetTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
void CDBDataMgr<Key, Data, Pred>::Destroy(typename DataMap::iterator first, typename DataMap::iterator last)
|
||||
{
|
||||
for(; first != last; ++first)
|
||||
{
|
||||
Data* lpData = first->second.first;
|
||||
|
||||
if(0 == m_lpDBComponent || !lpData->UpdateDBData(*m_lpDBComponent))
|
||||
{
|
||||
// TODO : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>. ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> file<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
Log(LOG_ERROR, LOG_FFL, 0, lpData->GetKey(), lpData->WriteDataToDumpFile(0)
|
||||
? "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"
|
||||
: "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ, <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>");
|
||||
}
|
||||
|
||||
DeleteData(lpData);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Key, typename Data, typename Pred>
|
||||
Data* CDBDataMgr<Key, Data, Pred>::GetLogoutData(const KeyType& dataKey)
|
||||
{
|
||||
DataMap::iterator logoutPos = m_LogoutMap.find(dataKey);
|
||||
|
||||
Data* lpDBData = 0;
|
||||
|
||||
if(logoutPos == m_LogoutMap.end())
|
||||
{
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
DataMap::iterator loginPos = m_LoginMap.find(dataKey);
|
||||
|
||||
if(loginPos == m_LoginMap.end())
|
||||
{
|
||||
// <20>α<EFBFBD><CEB1><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>츸 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD>
|
||||
lpDBData = CreateData();
|
||||
if(0 != lpDBData)
|
||||
{
|
||||
if (lpDBData->GetFromDB(*m_lpDBComponent, dataKey) &&
|
||||
m_LogoutMap.insert(
|
||||
std::make_pair(dataKey, std::make_pair(lpDBData, timeGetTime()))).second)
|
||||
{
|
||||
Log(LOG_INFO, LOG_FFL, 0, dataKey, "<EFBFBD>αƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
||||
}
|
||||
else
|
||||
{
|
||||
DeleteData(lpDBData);
|
||||
lpDBData = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20>αƿ<D7BE> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
lpDBData = logoutPos->second.first;
|
||||
}
|
||||
|
||||
return lpDBData;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
#include "stdafx.h"
|
||||
#include "DBItemSerialMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
|
||||
CDBAgentItemSerialMgr& CDBAgentItemSerialMgr::GetInstance()
|
||||
{
|
||||
static CDBAgentItemSerialMgr dbAgentItemSerialMgr;
|
||||
return dbAgentItemSerialMgr;
|
||||
}
|
||||
|
||||
|
||||
void CDBAgentItemSerialMgr::SaveChangedSerial(CDBComponent& DBComponent)
|
||||
{
|
||||
if(m_dwLastChangedItemSerial != GetItemSerial())
|
||||
{
|
||||
SaveItemSerial(DBComponent, GetServerID());
|
||||
m_dwLastChangedItemSerial = GetItemSerial();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef _RYL_DBAGENT_DB_ITEM_SERIAL_MGR_H_
|
||||
#define _RYL_DBAGENT_DB_ITEM_SERIAL_MGR_H_
|
||||
|
||||
#include <Item/ItemSerialMgr.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
class CDBAgentItemSerialMgr : public Item::CItemSerialMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CDBAgentItemSerialMgr& GetInstance();
|
||||
|
||||
unsigned long GetServerID() const { return m_dwServerID; }
|
||||
void SetServerID(unsigned long dwServerID) { m_dwServerID = dwServerID; }
|
||||
|
||||
void SaveChangedSerial(CDBComponent& DBComponent);
|
||||
|
||||
private:
|
||||
|
||||
CDBAgentItemSerialMgr() : m_dwLastChangedItemSerial(0) { }
|
||||
~CDBAgentItemSerialMgr() { }
|
||||
|
||||
unsigned __int64 m_dwLastChangedItemSerial;
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
1363
Server/RylServerProject/RylDBAgentServer/DataStorage/SessionData.cpp
Normal file
1363
Server/RylServerProject/RylDBAgentServer/DataStorage/SessionData.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,287 @@
|
||||
#ifndef _RYL_DBAGENT_SESSION_DATA_H_
|
||||
#define _RYL_DBAGENT_SESSION_DATA_H_
|
||||
|
||||
#include <DB/DBDefine.h>
|
||||
#include <Creature/Character/CharacterClass.h>
|
||||
#include <Network/Packet/PacketStruct/UnifiedCharPacket.h>
|
||||
|
||||
#include "Billing.h"
|
||||
|
||||
#include <deque>
|
||||
|
||||
//! forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
//! forward decl.
|
||||
class CCharacterData;
|
||||
class CStoreData;
|
||||
|
||||
struct RequestData
|
||||
{
|
||||
enum
|
||||
{
|
||||
// edith 2008.03.17 ID,PASS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
MaxName = 24,
|
||||
MaxPass = 36,
|
||||
};
|
||||
|
||||
unsigned long m_dwRequestKey;
|
||||
unsigned long m_dwSelectedCID;
|
||||
unsigned long m_dwServerID;
|
||||
unsigned long m_dwSessionID;
|
||||
|
||||
IN_ADDR m_PeerAddress;
|
||||
char m_szAccount[MaxName];
|
||||
|
||||
// edith 2008.01.15 <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>۾<EFBFBD>
|
||||
char m_szPassword[MaxPass];
|
||||
|
||||
RequestData();
|
||||
|
||||
// edith 2008.01.15 <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>۾<EFBFBD>
|
||||
RequestData(unsigned long dwRequestKey, unsigned long dwSelectedCID,
|
||||
unsigned long dwServerID, unsigned long dwSessionID,
|
||||
IN_ADDR peerAddr, const char* szAccountName, const char* szPassword);
|
||||
};
|
||||
|
||||
class CSessionData
|
||||
{
|
||||
public:
|
||||
|
||||
enum SessionState
|
||||
{
|
||||
SE_NONE = 0,
|
||||
SE_USER_ENABLED = 1,
|
||||
SE_USER_DISABLED = 2,
|
||||
SE_MOVE = 3,
|
||||
SE_CHAR_ENABLED = 4,
|
||||
SE_CHAR_DISABLED = 5,
|
||||
SE_MAX_STATE = 6
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_REALM_POINT = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><>,.<2E><> by Minbobo.
|
||||
|
||||
REALM_POINT_TIME = 60, // 60 <20><>
|
||||
|
||||
FAME_PANELTY_VALUE_1ST = 5000,
|
||||
FAME_PANELTY_VALUE_2ND = 10000,
|
||||
};
|
||||
|
||||
struct SaveEnemy
|
||||
{
|
||||
enum
|
||||
{
|
||||
MAX_SAVING_ENEMY = 5, // <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ִ<EFBFBD> <20><>ü <20><>
|
||||
};
|
||||
|
||||
|
||||
unsigned long m_dwCID;
|
||||
unsigned long m_dwTick;
|
||||
};
|
||||
|
||||
typedef std::deque<RequestData> RequestQueue;
|
||||
|
||||
CSessionData();
|
||||
~CSessionData();
|
||||
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20>⺻ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
unsigned long GetUID() const { return m_dwUID; }
|
||||
unsigned long GetCID() const { return m_dwCID; }
|
||||
unsigned long GetSessionID() const { return m_dwSessionID; }
|
||||
unsigned long GetServerID() const { return m_dwServerID; }
|
||||
IN_ADDR GetRemoteAddress() const { return m_RemoteAddress; }
|
||||
const char* GetAccountName() const { return m_szAccount; }
|
||||
unsigned char GetAdminLevel() const { return m_cAdminLevel; }
|
||||
// WORK_LIST 2.1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
|
||||
unsigned char GetAccountNation() const { return m_UserInfo.Nation; }
|
||||
void SetAccountNation(unsigned char cNation) { m_UserInfo.Nation = cNation; }
|
||||
|
||||
const USER_INFO& GetUserInfo() const { return m_UserInfo; }
|
||||
const CHAR_VIEW* GetCharView(unsigned char cIndex) const
|
||||
{ return (cIndex < USER_INFO::MAX_CHAR_NUM) ? m_CharView + cIndex : 0; }
|
||||
|
||||
bool GetCharView(unsigned long dwCID, CHAR_VIEW& charView_Out);
|
||||
|
||||
// WORK_LIST 2.3 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
bool SetCharViewGID(unsigned long dwCID, unsigned long dwGID);
|
||||
bool SetCharViewFame(unsigned long dwCID, unsigned long dwFame);
|
||||
|
||||
CBilling& GetBilling() { return m_Billing; }
|
||||
|
||||
bool HasCharacter(unsigned long dwCID) const;
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ <20>Լ<EFBFBD>
|
||||
SessionState GetSessionState() const { return m_eSessionState; }
|
||||
void SetSessionState(SessionState eSessionState) { m_eSessionState = eSessionState; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD>
|
||||
void SetAuthServerID();
|
||||
void SetAccountName(const char* szAccountName);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> Enable/Disable/Move
|
||||
bool UserEnable(CDBComponent& DBComponent, unsigned long dwUID);
|
||||
bool UserDisable();
|
||||
bool UserMove();
|
||||
|
||||
//! ij<><C4B3><EFBFBD><EFBFBD> Enable/Disable/Move
|
||||
bool LoadData(unsigned long dwCID);
|
||||
void UnloadData();
|
||||
|
||||
bool CharEnable(unsigned long dwCID, unsigned long dwServerID);
|
||||
bool CharDisable(unsigned long dwCID, unsigned long dwServerID);
|
||||
bool CharMove(unsigned long dwCID, unsigned long dwServerID);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (ij<><C4B3><EFBFBD><EFBFBD>)
|
||||
CCharacterData* GetCharacterData() { return m_lpCharacterData; }
|
||||
CStoreData* GetStoreData() { return m_lpStoreData; }
|
||||
|
||||
SaveEnemy* GetSaveEnemy() { return m_SaveEnemy; }
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (â<><C3A2>)
|
||||
void SetCharacterData(CCharacterData* lpCharacterData) { m_lpCharacterData = lpCharacterData; }
|
||||
void SetStoreData(CStoreData* lpStoreData) { m_lpStoreData = lpStoreData; }
|
||||
|
||||
//! <20><> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool SetMoveZone(unsigned char cZone, const POS& Pos);
|
||||
void UpdateMoveZone();
|
||||
bool CheckCharZone(unsigned char cZone);
|
||||
|
||||
unsigned char GetCharStartZone(char cRace);
|
||||
|
||||
bool GetPlayTimeFromDB(CDBComponent& DBComponent);
|
||||
bool GetPremiumServiceFromDB(CDBComponent& DBComponent);
|
||||
|
||||
bool GetUserInfoFromDB(CDBComponent& DBComponent); //! DB<44>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>並 <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
bool GetUnifiedDataFromDB(CDBComponent& DBComponent); //! DB<44>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
void LogUserData(const char* szMessage);
|
||||
void LogCharData(const char* szMessage);
|
||||
void LogUserDataError(const char* szMessage, const char* szRoutine, const char* szFile, int nLine);
|
||||
void LogCharDataError(const char* szMessage, const char* szRoutine, const char* szFile, int nLine);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҵ<DEBC>
|
||||
void SetUID(unsigned long dwUID) { m_dwUID = dwUID; }
|
||||
void SetAddress(IN_ADDR addr) { m_RemoteAddress = addr; }
|
||||
|
||||
//! <20><>û ť <20><><EFBFBD><EFBFBD> (dwRequestKey<65><79> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
void PushRequest(const RequestData& reqData);
|
||||
RequestData PopRequest();
|
||||
|
||||
void SetRequestData(const RequestData& reqData);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
unsigned char GetOldServerGroupID() const { return m_cOldServerGroupID; }
|
||||
void SetOldServerGroupID(unsigned char cOldServerGroupID) { m_cOldServerGroupID = cOldServerGroupID; }
|
||||
|
||||
const UnifiedStoreInfo* GetUnifiedStoreInfo() const { return m_UnifiedStoreInfo; }
|
||||
const UnifiedCharData* GetUnifiedCharData() const { return m_UnifiedCharData; }
|
||||
const UnifiedCharData* GetUnifiedCharData(unsigned long dwCID) const;
|
||||
|
||||
int GetUnifiedStoreInfoNum() const { return m_nUnifiedStoreInfoNum; }
|
||||
int GetUnifiedCharDataNum() const { return m_nUnifiedCharDataNum; }
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD> / ó<><C3B3> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
unsigned char GetFirstLogin() const { return m_UserInfo.FirstLogin; }
|
||||
void SetFirstLogin(unsigned char cFirstLogin) { m_UserInfo.FirstLogin = cFirstLogin; }
|
||||
|
||||
// <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> â<><C3A2><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ɴ<EFBFBD>.
|
||||
bool HasUnifiedStoreInfo(unsigned char cOldServerGroupID);
|
||||
|
||||
// <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20>ٲ۴<D9B2>.
|
||||
bool ChangeUnifiedStoreInfoGroup(CDBComponent& DBComponent,
|
||||
unsigned char cOldServerGroupID, unsigned char cNewServerGroupID);
|
||||
|
||||
// UID/CID<49><44> <20><>ġ<EFBFBD>ϴ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44> <20>ٲ۴<D9B2>.
|
||||
bool ChangeUnifiedCharServerGroupID(CDBComponent& DBComponent,
|
||||
unsigned long dwUID, unsigned long dwCID, unsigned char cOldServerGroupID);
|
||||
|
||||
// <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>(ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
|
||||
bool DelUnifiedCharData(unsigned long dwCID);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UpdateCharacterBinding(CDBComponent& DBComponent,
|
||||
unsigned long dwSelectedCID[USER_INFO::MAX_CHAR_NUM]);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> CID<49><44> <20>ָ<EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
CClass::RaceType CheckUnifiedCharRace(unsigned long dwSelectedCID[USER_INFO::MAX_CHAR_NUM]);
|
||||
|
||||
// Part1 -> Part2 ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
unsigned char GetTransferedCharCount(CDBComponent& DBComponent);
|
||||
bool UpdateTransferedCharCount(CDBComponent& DBComponent);
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD>.
|
||||
bool GetUnifiedInfo(CDBComponent& DBComponent, unsigned long UserID_In);
|
||||
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ üũ.
|
||||
bool GetRealmPointCheck();
|
||||
|
||||
// <20><><EFBFBD>̽<EFBFBD>ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
KeyInfo* GetKeyInfo(void) { return &m_KeyInfo; }
|
||||
|
||||
|
||||
unsigned int GetPlayTime() { return m_dwPlayTime; }
|
||||
long GetPremiumTime() { return m_PremiumService.lPremiumTime; }
|
||||
int GetPremiumType() { return m_PremiumService.iPremiumType; }
|
||||
|
||||
private:
|
||||
|
||||
USER_INFO m_UserInfo; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
CHAR_VIEW m_CharView[USER_INFO::MAX_CHAR_NUM]; //! ij<><C4B3><EFBFBD><EFBFBD> <20><>
|
||||
|
||||
UnifiedStoreInfo m_UnifiedStoreInfo[PktUnifiedCharInfo::MAX_STORE_INFO]; // <20><><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
UnifiedCharData m_UnifiedCharData[PktUnifiedCharInfo::MAX_CHAR_DATA]; // <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
int m_nUnifiedStoreInfoNum;
|
||||
int m_nUnifiedCharDataNum;
|
||||
|
||||
char m_szAccount[CHAR_INFOST::MAX_ACCOUNT_LEN]; //! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
IN_ADDR m_RemoteAddress; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD>
|
||||
|
||||
unsigned long m_dwUID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> UID
|
||||
unsigned long m_dwCID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CID
|
||||
unsigned long m_dwSessionID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> SessionID
|
||||
unsigned long m_dwServerID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ServerID
|
||||
|
||||
SessionState m_eSessionState; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
unsigned long m_dwFlags; //! <20><><EFBFBD><EFBFBD> Flag<61><67>
|
||||
|
||||
CBilling m_Billing; //! <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ó<><C3B3>
|
||||
RequestQueue m_RequestQueue; //! <20><>û ť
|
||||
|
||||
CCharacterData* m_lpCharacterData; //! ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
CStoreData* m_lpStoreData; //! â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
unsigned char m_cAdminLevel; //! <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD>
|
||||
unsigned char m_cOldServerGroupID; //! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID : 1~10 / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CServerSetup::AgentServerType <20><> <20><><EFBFBD><EFBFBD>.
|
||||
unsigned char m_cTransferedCharCount; //! ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȸ<><C8B8>. <20>ʱⰪ<CAB1><E2B0AA> UCHAR_MAX <20>̰<EFBFBD>,
|
||||
//! GetTransferedCharCount<6E><74> ȣ<><C8A3><EFBFBD>ÿ<EFBFBD>, <20>ʱⰪ <20>״<EFBFBD><D7B4><EFBFBD><EFBFBD≯<EFBFBD> DB<44><42><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
|
||||
|
||||
char m_cNewZone; //! <20><> <20>̵<EFBFBD><CCB5><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><> ǥ<><C7A5>
|
||||
POS m_NewPos; //! <20><> <20>̵<EFBFBD><CCB5><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD> <20><>ǥ ǥ<><C7A5>
|
||||
|
||||
SaveEnemy m_SaveEnemy[SaveEnemy::MAX_SAVING_ENEMY];
|
||||
|
||||
KeyInfo m_KeyInfo;
|
||||
|
||||
unsigned int m_dwPlayTime;
|
||||
|
||||
PREMIUMSERVICE m_PremiumService;
|
||||
};
|
||||
|
||||
extern const char* g_szSessionStateString[CSessionData::SE_MAX_STATE];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,424 @@
|
||||
#include "stdafx.h"
|
||||
#include "SessionDataMgr.h"
|
||||
#include "CharacterData.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
|
||||
#include <Community/Party/PartyDBInfo.h>
|
||||
#include <Community/Party/PartyDBMgr.h>
|
||||
|
||||
#include <Community/Guild/GuildDB.h>
|
||||
#include <Community/Guild/GuildDBMgr.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
#ifdef _RYL_GAME_CLIENT_
|
||||
#include "RYLNetworkData.h"
|
||||
#endif
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
#include <Utility/Setup/ServerSetup.h>
|
||||
#endif
|
||||
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
CSessionDataMgr& CSessionDataMgr::GetInstance()
|
||||
{
|
||||
static CSessionDataMgr sessionDataMgr;
|
||||
return sessionDataMgr;
|
||||
}
|
||||
|
||||
CSessionData* CSessionDataMgr::GetOpenSession(unsigned long dwUID)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
return pos != m_uidMap.end() ? pos->second : 0;
|
||||
}
|
||||
|
||||
|
||||
CSessionData* CSessionDataMgr::GetOpenSession(const char* szAccountName,
|
||||
IN_ADDR peerAddress, bool bCheckAddress)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CSessionData* lpResultSessionData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
if((bCheckAddress && lpSessionData->GetRemoteAddress().S_un.S_addr == peerAddress.S_un.S_addr) &&
|
||||
0 == strncmp(szAccountName, lpSessionData->GetAccountName(), CHAR_INFOST::MAX_ACCOUNT_LEN))
|
||||
{
|
||||
lpResultSessionData = lpSessionData;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return lpResultSessionData;
|
||||
}
|
||||
|
||||
CSessionData* CSessionDataMgr::GetCharLoadedSession(unsigned long dwCID)
|
||||
{
|
||||
SessionMap::iterator pos = m_cidMap.find(dwCID);
|
||||
return pos != m_cidMap.end() ? pos->second : 0;
|
||||
}
|
||||
|
||||
bool CSessionDataMgr::IsLoadedChar(const char* szCharName)
|
||||
{
|
||||
if (NULL != szCharName)
|
||||
{
|
||||
SessionMap::iterator pos = m_cidMap.begin();
|
||||
SessionMap::iterator end = m_cidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (NULL != lpCharData->GetName() &&
|
||||
0 == strncmp(lpCharData->GetName(), szCharName, CHAR_INFOST::MAX_NAME_LEN))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
CSessionData* CSessionDataMgr::SessionOpen(unsigned long dwUID)
|
||||
{
|
||||
CSessionData* lpSessionData = 0;
|
||||
|
||||
if(0 == dwUID)
|
||||
{
|
||||
SERLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>.");
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> ã<><C3A3>
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
if(pos != m_uidMap.end())
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if (CSessionData::SE_USER_ENABLED == eSessionState ||
|
||||
CSessionData::SE_CHAR_ENABLED == eSessionState)
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", dwUID);
|
||||
lpSessionData = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
INFLOG1(g_Log, "UID:%10u / <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lpSessionData = new CSessionData;
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
if(m_uidMap.insert(std::make_pair(dwUID, lpSessionData)).second)
|
||||
{
|
||||
lpSessionData->SetUID(dwUID);
|
||||
INFLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UID<49>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", dwUID);
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
delete lpSessionData;
|
||||
lpSessionData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lpSessionData;
|
||||
}
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionClose(unsigned long dwUID, unsigned long dwSessionID)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
if(pos == m_uidMap.end())
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>", dwUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
CSessionData* lpSessionData = pos->second;
|
||||
m_uidMap.erase(pos);
|
||||
|
||||
if(lpSessionData && lpSessionData->GetSessionID() != dwSessionID)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / OldSessionID:%10u / CloseSessionID:%10u / <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>", dwUID, lpSessionData->GetSessionID(), dwSessionID);
|
||||
}
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
delete lpSessionData;
|
||||
lpSessionData = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionCloseWithLogout(unsigned long dwUID, unsigned long dwServerID)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.find(dwUID);
|
||||
if(pos == m_uidMap.end())
|
||||
{
|
||||
ERRLOG1(g_Log, "UID:%10u / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>", dwUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
CSessionData* lpSessionData = pos->second;
|
||||
|
||||
if(lpSessionData->GetServerID() != dwServerID)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / ServerID:0x%08X / CloseServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> <20><><EFBFBD><EFBFBD> : "
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>", dwUID, lpSessionData->GetServerID(), dwServerID);
|
||||
}
|
||||
else
|
||||
{
|
||||
SessionCloseWithLogout(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionCloseWithLogout(SessionMap::iterator logoutPos)
|
||||
{
|
||||
CSessionData* lpSessionData = logoutPos->second;
|
||||
m_uidMap.erase(logoutPos);
|
||||
|
||||
CSessionData::SessionState eSessionState = lpSessionData->GetSessionState();
|
||||
|
||||
if(CSessionData::SE_USER_ENABLED == eSessionState)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> Disable
|
||||
lpSessionData->UserDisable();
|
||||
}
|
||||
else if(CSessionData::SE_CHAR_ENABLED == eSessionState)
|
||||
{
|
||||
CCharacterData* lpCharacterData = lpSessionData->GetCharacterData();
|
||||
if(0 != lpCharacterData)
|
||||
{
|
||||
unsigned long dwCID = lpCharacterData->GetCID();
|
||||
unsigned long dwPID = lpCharacterData->GetInfo().PID;
|
||||
unsigned long dwGID = lpCharacterData->GetInfo().GID;
|
||||
|
||||
// <20><>Ƽ<EFBFBD><C6BC> <20>αƿ<D7BE> <20>ϸ<EFBFBD>
|
||||
CPartyDBInfo* lpParty = CPartyDBMgr::GetInstance().OpenParty(
|
||||
CDBSingleObject::GetInstance(), dwPID);
|
||||
|
||||
if (0 != lpParty)
|
||||
{
|
||||
CPartyDBMgr::GetInstance().LogoutPartyMember(
|
||||
CDBSingleObject::GetInstance(), lpParty, dwCID);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>忡 <20>αƿ<D7BE> <20>˸<EFBFBD>
|
||||
CGuildDB* lpGuild = static_cast<CGuildDB*>(
|
||||
CGuildDBMgr::GetInstance().GetGuild(dwGID));
|
||||
|
||||
if (0 != lpGuild)
|
||||
{
|
||||
lpGuild->SendLoginOutMember(dwCID, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> Disable
|
||||
lpSessionData->CharDisable(
|
||||
lpSessionData->GetCID(), lpSessionData->GetServerID());
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
|
||||
if(lpSessionData)
|
||||
{
|
||||
delete lpSessionData;
|
||||
lpSessionData = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CSessionDataMgr::SessionCloseCurrentServer(unsigned long dwServerID)
|
||||
{
|
||||
INFLOG1(g_Log, "ServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD>", dwServerID);
|
||||
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
unsigned int nLogoutCount = 0;
|
||||
|
||||
for(; pos != end; )
|
||||
{
|
||||
CSessionData* lpSessionData = pos->second;
|
||||
|
||||
if(lpSessionData->GetServerID() == dwServerID)
|
||||
{
|
||||
SessionCloseWithLogout(pos++);
|
||||
++nLogoutCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
|
||||
INFLOG2(g_Log, "ServerID:0x%08X / <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20>ƿ<EFBFBD> ó<><C3B3> <20>Ϸ<EFBFBD> : %u<><75>",
|
||||
dwServerID, nLogoutCount);
|
||||
}
|
||||
|
||||
|
||||
bool CSessionDataMgr::AddCharLoadedSession(unsigned long dwCID, CSessionData& SessionData)
|
||||
{
|
||||
if(m_cidMap.insert(std::make_pair(dwCID, &SessionData)).second)
|
||||
{
|
||||
INFLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> ", dwCID);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> : <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.", dwCID);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CSessionDataMgr::RemoveCharLoadedSession(unsigned long dwCID)
|
||||
{
|
||||
if(0 != m_cidMap.erase(dwCID))
|
||||
{
|
||||
INFLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ", dwCID);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERRLOG1(g_Log, "CID:%10u / Ȱ<><C8B0>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwCID);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Load <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OFF <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
void CSessionDataMgr::ClearGuildWarInstanceFlag()
|
||||
{
|
||||
if (m_cidMap.empty())
|
||||
return;
|
||||
|
||||
SessionMap::iterator pos = m_cidMap.begin();
|
||||
SessionMap::iterator end = m_cidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
#ifdef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CRYLNetworkData::Instance()->m_eInternationalCode)
|
||||
#endif
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CServerSetup::GetInstance().GetNationType())
|
||||
#endif
|
||||
{
|
||||
if(NULL != lpSessionData)
|
||||
{
|
||||
if(NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetGuildWarFlag())
|
||||
{
|
||||
lpCharData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetGuildWarFlag())
|
||||
{
|
||||
lpCharData->SetGuildWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CSessionDataMgr::ClearRealmWarInstanceFlag()
|
||||
{
|
||||
if (m_cidMap.empty())
|
||||
return;
|
||||
|
||||
SessionMap::iterator pos = m_cidMap.begin();
|
||||
SessionMap::iterator end = m_cidMap.end();
|
||||
|
||||
CSessionData* lpSessionData = 0;
|
||||
CCharacterData* lpCharData = 0;
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
lpSessionData = pos->second;
|
||||
|
||||
#ifdef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CRYLNetworkData::Instance()->m_eInternationalCode)
|
||||
#endif
|
||||
|
||||
#ifndef _RYL_GAME_CLIENT_
|
||||
if(GameRYL::GLOBAL == CServerSetup::GetInstance().GetNationType())
|
||||
#endif
|
||||
{
|
||||
if(NULL != lpSessionData)
|
||||
{
|
||||
if(NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetRealmWarFlag())
|
||||
{
|
||||
lpCharData->SetRealmWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(NULL != lpSessionData && NULL != (lpCharData = lpSessionData->GetCharacterData()))
|
||||
{
|
||||
if (Creature::WAR_INSTANCE == lpCharData->GetRealmWarFlag())
|
||||
{
|
||||
lpCharData->SetRealmWarFlag(Creature::WAR_OFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
#ifndef _RYL_DBAGENT_SESSION_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_SESSION_DATA_MGR_H_
|
||||
|
||||
#include "SessionData.h"
|
||||
|
||||
#include <map>
|
||||
#include <boost/pool/object_pool.hpp>
|
||||
#include <boost/pool/pool_alloc.hpp>
|
||||
|
||||
//! forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
class CSessionDataMgr
|
||||
{
|
||||
public:
|
||||
|
||||
static CSessionDataMgr& GetInstance();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
CSessionData* SessionOpen(unsigned long dwUID);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3>
|
||||
CSessionData* GetOpenSession(unsigned long dwUID);
|
||||
CSessionData* GetOpenSession(const char* szAccountName, IN_ADDR peerAddress, bool bCheckAddress);
|
||||
CSessionData* GetCharLoadedSession(unsigned long dwCID);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD>
|
||||
void SessionClose(unsigned long dwUID, unsigned long dwSessionID);
|
||||
void SessionCloseWithLogout(unsigned long dwUID, unsigned long dwServerID);
|
||||
|
||||
void SessionCloseCurrentServer(unsigned long dwServerID);
|
||||
|
||||
// CharEnable / CharDisable<6C>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> CID<49><44> <20><><EFBFBD><EFBFBD>
|
||||
bool AddCharLoadedSession(unsigned long dwCID, CSessionData& SessionData);
|
||||
bool RemoveCharLoadedSession(unsigned long dwCID);
|
||||
|
||||
bool IsLoadedChar(const char* szCharName);
|
||||
|
||||
unsigned int GetSessionNum() { return static_cast<unsigned int>(m_uidMap.size()); }
|
||||
unsigned int GetCharEnabledSessionNum() { return static_cast<unsigned int>(m_cidMap.size()); }
|
||||
|
||||
// Load <20><> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OFF <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
||||
void ClearGuildWarInstanceFlag();
|
||||
void ClearRealmWarInstanceFlag();
|
||||
|
||||
template<typename FnProcess>
|
||||
void Process(FnProcess fnProcess)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(*pos->second);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename FnProcess>
|
||||
void ProcessRealmPoint(FnProcess fnProcess, unsigned char cType)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(pos->second, cType);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename FnProcess>
|
||||
void ProcessRealmTime(FnProcess fnProcess, TIME* pTime)
|
||||
{
|
||||
SessionMap::iterator pos = m_uidMap.begin();
|
||||
SessionMap::iterator end = m_uidMap.end();
|
||||
|
||||
for(;pos != end; ++pos)
|
||||
{
|
||||
fnProcess(pos->second, pTime);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
typedef std::map<CSessionData*, unsigned long> SessionPoolCheck;
|
||||
|
||||
typedef boost::object_pool<CSessionData> SessionPool;
|
||||
|
||||
typedef std::map<unsigned long, CSessionData*, std::less<unsigned long>,
|
||||
boost::fast_pool_allocator<std::pair<unsigned long, CSessionData*> > > SessionMap;
|
||||
|
||||
void SessionCloseWithLogout(SessionMap::iterator logoutPos);
|
||||
|
||||
SessionMap m_uidMap;
|
||||
SessionMap m_cidMap;
|
||||
|
||||
//SessionPool m_SessionPool;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,313 @@
|
||||
#include "stdafx.h"
|
||||
#include "StoreData.h"
|
||||
#include "SessionData.h"
|
||||
#include "DBDataMgr.h"
|
||||
#include "DBItemSerialMgr.h"
|
||||
|
||||
#include <DB/DBComponent.h>
|
||||
#include <DB/GameDBComponent.h>
|
||||
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Utility/Debug/PerformanceCheck.h>
|
||||
|
||||
#include <Item/ItemMgr.h>
|
||||
#include <Item/Container/ContainerConstant.h>
|
||||
#include <Item/RebalanceConvert/OldItemMgr.h>
|
||||
#include <Item/RebalanceConvert/RebalanceItem.h>
|
||||
#include <Item/RebalanceConvert/ContainerChecker.h>
|
||||
|
||||
#include <mmsystem.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
enum CHANGED_STORE_DATA
|
||||
{
|
||||
CHANGED_STORE_INFO = (1 << 0),
|
||||
CHANGED_STORE_1 = (1 << 1),
|
||||
CHANGED_STORE_2 = (1 << 2)
|
||||
};
|
||||
|
||||
|
||||
CStoreData::CStoreData()
|
||||
: m_dwUID(0), m_dwUpdateData(0), m_dwLastDBUpdateTime(0)
|
||||
{
|
||||
ClearData();
|
||||
}
|
||||
|
||||
CStoreData::~CStoreData()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CStoreData::SetStoreInfo(const STORE_INFO& storeInfo)
|
||||
{
|
||||
if(0 != memcmp(&m_StoreInfo, &storeInfo, sizeof(STORE_INFO)))
|
||||
{
|
||||
m_StoreInfo = storeInfo;
|
||||
m_dwUpdateData |= CHANGED_STORE_INFO;
|
||||
}
|
||||
}
|
||||
|
||||
bool CStoreData::SetStore1(const char* lpData, unsigned long dwDataSize)
|
||||
{
|
||||
if(STORE::MAX_STORE_SIZE < dwDataSize)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : Store1 (%u/%u)",
|
||||
GetUID(), STORE::MAX_STORE_SIZE, dwDataSize);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(m_Store1.dwSize != dwDataSize || 0 != memcmp(m_Store1.Data, lpData, dwDataSize))
|
||||
{
|
||||
memcpy(m_Store1.Data, lpData, dwDataSize);
|
||||
m_Store1.dwSize = dwDataSize;
|
||||
|
||||
m_dwUpdateData |= CHANGED_STORE_1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CStoreData::SetStore2(const char* lpData, unsigned long dwDataSize)
|
||||
{
|
||||
if(STORE::MAX_STORE_SIZE < dwDataSize)
|
||||
{
|
||||
SERLOG3(g_Log, "UID:%10u / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : Store2 (%u/%u)",
|
||||
GetUID(), STORE::MAX_STORE_SIZE, dwDataSize);
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(m_Store2.dwSize != dwDataSize || 0 != memcmp(m_Store2.Data, lpData, dwDataSize))
|
||||
{
|
||||
memcpy(m_Store2.Data, lpData, dwDataSize);
|
||||
m_Store2.dwSize = dwDataSize;
|
||||
|
||||
m_dwUpdateData |= CHANGED_STORE_2;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CStoreData::ClearData()
|
||||
{
|
||||
m_dwUID = 0;
|
||||
m_dwUpdateData = 0;
|
||||
m_cOldServerGroupID = 0;
|
||||
|
||||
memset(&m_StoreInfo, 0, sizeof(STORE_INFO));
|
||||
memset(&m_Store1, 0, sizeof(STORE));
|
||||
memset(&m_Store2, 0, sizeof(STORE));
|
||||
}
|
||||
|
||||
|
||||
bool CStoreData::GetFromDB(CDBComponent& DBComponent, UnifiedStoreKey storeKey)
|
||||
{
|
||||
PERFORMANCE_CHECK(FunctionTimingCheck);
|
||||
|
||||
ClearData();
|
||||
|
||||
using namespace DBComponent;
|
||||
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD>
|
||||
if (!GameDB::GetUnifiedItemStoreInfo(DBComponent,
|
||||
storeKey.first, storeKey.second, &m_StoreInfo, true))
|
||||
{
|
||||
if (!GameDB::InsertUser(DBComponent, storeKey.first, storeKey.second, 0))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : InsertUser ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!GameDB::GetUnifiedItemStoreInfo(DBComponent,
|
||||
storeKey.first, storeKey.second, &m_StoreInfo))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : GetUnifiedItemStoreInfo ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// â<><C3A2> 1
|
||||
if (!GameDB::GetUnifiedItemStore1(DBComponent, storeKey.first, storeKey.second, &m_Store1))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : GetItemStore1 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
|
||||
// â<><C3A2> 2
|
||||
if (!GameDB::GetUnifiedItemStore2(DBComponent, storeKey.first, storeKey.second, &m_Store2))
|
||||
{
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : GetItemStore2 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
storeKey.first, storeKey.second);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_dwUID = storeKey.first;
|
||||
m_cOldServerGroupID = storeKey.second;
|
||||
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : CStoreData::GetFromDB", storeKey.first, storeKey.second);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CStoreData::UpdateDBData(CDBComponent& DBComponent)
|
||||
{
|
||||
PERFORMANCE_CHECK(FunctionTimingCheck);
|
||||
|
||||
// <20><><EFBFBD>Ἲ <20>˻<EFBFBD>
|
||||
if (!IsVaildData())
|
||||
{
|
||||
SERLOG1(g_Log, "UID:%10u / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UpdateStoreToDB <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ἲ <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD>", m_dwUID);
|
||||
return false;
|
||||
}
|
||||
else if(IsDataChanged())
|
||||
{
|
||||
using namespace DBComponent;
|
||||
|
||||
if ((m_dwUpdateData & CHANGED_STORE_INFO) &&
|
||||
!GameDB::SetUnifiedItemStoreInfo(DBComponent, m_dwUID, m_cOldServerGroupID, &m_StoreInfo))
|
||||
{
|
||||
// â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : SetUnifiedItemStoreInfo ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
return false;
|
||||
}
|
||||
else if((m_dwUpdateData & CHANGED_STORE_1) &&
|
||||
!GameDB::UpdateUnifiedItemStore1(DBComponent, m_dwUID, m_cOldServerGroupID, &m_Store1))
|
||||
{
|
||||
// â<><C3A2>1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UpdateUnifiedItemStore1 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
return false;
|
||||
}
|
||||
else if((m_dwUpdateData & CHANGED_STORE_2) &&
|
||||
!GameDB::UpdateUnifiedItemStore2(DBComponent, m_dwUID, m_cOldServerGroupID, &m_Store2))
|
||||
{
|
||||
// â<><C3A2>2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
||||
SERLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : UpdateUnifiedItemStore2 ȣ<><C8A3> <20><><EFBFBD><EFBFBD>",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_dwUpdateData = 0;
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : CStoreData::UpdateDBData",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
INFLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.",
|
||||
m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
|
||||
m_dwLastDBUpdateTime = timeGetTime();
|
||||
return true;
|
||||
}
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool CStoreData::ConvertToPart2Item(bool bConvertSkillToTicket)
|
||||
{
|
||||
RebalanceLib::CItemArrayChecker<
|
||||
ContainerConstant::DEPOSIT_WIDTH,
|
||||
ContainerConstant::DEPOSIT_HEIGHT,
|
||||
ContainerConstant::MAX_DEPOSIT_TAB> depositChecker(TakeType::TS_DEPOSIT);
|
||||
|
||||
RebalanceLib::SkillBookInfo skillBookInfo;
|
||||
|
||||
STORE store1;
|
||||
STORE store2;
|
||||
unsigned long dwGold = m_StoreInfo.Gold;
|
||||
|
||||
CDBAgentItemSerialMgr& dbItemSerialMgr =
|
||||
CDBAgentItemSerialMgr::GetInstance();
|
||||
|
||||
unsigned __int64 dwItemSerial = dbItemSerialMgr.GetItemSerial();
|
||||
|
||||
memset(&skillBookInfo, 0, sizeof(RebalanceLib::SkillBookInfo));
|
||||
memset(&store1, 0, sizeof(STORE));
|
||||
memset(&store2, 0, sizeof(STORE));
|
||||
|
||||
store1.dwSize = STORE::MAX_STORE_SIZE;
|
||||
store2.dwSize = STORE::MAX_STORE_SIZE;
|
||||
|
||||
if(!RebalanceLib::ConvertContainer(m_dwUID, 0, &depositChecker,
|
||||
bConvertSkillToTicket ? &skillBookInfo : 0,
|
||||
m_Store1.Data, m_Store1.dwSize, store1.Data, store1.dwSize))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>1 <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else if(!RebalanceLib::ConvertContainer(m_dwUID, 0, &depositChecker,
|
||||
bConvertSkillToTicket ? &skillBookInfo : 0,
|
||||
m_Store2.Data, m_Store2.dwSize, store2.Data, store2.dwSize))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>2 <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int nCount = 0; nCount < CSkillMgr::MAX_SKILL_LOCKCOUNT; ++nCount)
|
||||
{
|
||||
// 3<><33><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
skillBookInfo.m_dwBookNum[nCount] *= 3;
|
||||
}
|
||||
|
||||
if(bConvertSkillToTicket &&
|
||||
!RebalanceLib::AddSkillBook(m_dwUID, 0, "Store1", dbItemSerialMgr, dwGold,
|
||||
store1.Data, store1.dwSize, STORE::MAX_STORE_SIZE, depositChecker, skillBookInfo))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>1 <20><>ų<EFBFBD><C5B3> <20>־<EFBFBD><D6BE>ֱ <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else if(bConvertSkillToTicket && !skillBookInfo.IsEmpty() &&
|
||||
!RebalanceLib::AddSkillBook(m_dwUID, 0, "Store2", dbItemSerialMgr, dwGold,
|
||||
store2.Data, store2.dwSize, STORE::MAX_STORE_SIZE, depositChecker, skillBookInfo))
|
||||
{
|
||||
ERRLOG2(g_Log, "UID:%10u / ServerGroupID:%d / â<><C3A2>2 <20><>ų<EFBFBD><C5B3> <20>־<EFBFBD><D6BE>ֱ <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwUID, m_cOldServerGroupID);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(dwItemSerial < dbItemSerialMgr.GetItemSerial())
|
||||
{
|
||||
dbItemSerialMgr.SaveItemSerial(
|
||||
CDBSingleObject::GetInstance(), dbItemSerialMgr.GetServerID());
|
||||
}
|
||||
|
||||
m_StoreInfo.Gold = dwGold;
|
||||
m_Store1 = store1;
|
||||
m_Store2 = store2;
|
||||
}
|
||||
|
||||
if(!skillBookInfo.IsEmpty())
|
||||
{
|
||||
for(int nCount = 0; nCount < CSkillMgr::MAX_SKILL_LOCKCOUNT; ++nCount)
|
||||
{
|
||||
if(0 != skillBookInfo.m_dwBookNum[nCount])
|
||||
{
|
||||
ERRLOG3(g_Log, "UID:%10u / LockCount:%d / Num:%d / <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
|
||||
m_dwUID, nCount + 1, skillBookInfo.m_dwBookNum[nCount]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CStoreData::WriteDataToDumpFile(const char* szFileName)
|
||||
{
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CStoreData::ReadDataFromDumpFile(const char* szFileName)
|
||||
{
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
#ifndef _RYL_DBAGENT_USER_DATA_H_
|
||||
#define _RYL_DBAGENT_USER_DATA_H_
|
||||
|
||||
#include <DB/DBdefine.h>
|
||||
|
||||
// forward decl.
|
||||
class CDBComponent;
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
typedef std::pair<unsigned long, unsigned char> UnifiedStoreKey;
|
||||
|
||||
class CStoreData
|
||||
{
|
||||
public:
|
||||
|
||||
CStoreData();
|
||||
~CStoreData();
|
||||
|
||||
UnifiedStoreKey GetKey() const { return UnifiedStoreKey(m_dwUID, m_cOldServerGroupID); }
|
||||
unsigned long GetUID() const { return m_dwUID; }
|
||||
|
||||
const STORE_INFO& GetStoreInfo() const { return m_StoreInfo; }
|
||||
const STORE& GetStore1() const { return m_Store1; }
|
||||
const STORE& GetStore2() const { return m_Store2; }
|
||||
|
||||
void SetStoreInfo(const STORE_INFO& storeInfo);
|
||||
bool SetStore1(const char* lpData, unsigned long dwDataSize);
|
||||
bool SetStore2(const char* lpData, unsigned long dwDataSize);
|
||||
|
||||
bool IsVaildData() const
|
||||
{
|
||||
return 0 != m_dwUID &&
|
||||
0 != strncmp("", m_StoreInfo.Password, STORE_INFO::MAX_PASS_LEN);
|
||||
}
|
||||
|
||||
bool IsDataChanged() const { return (0 != m_dwUpdateData); }
|
||||
|
||||
void ClearData();
|
||||
|
||||
//! DB<44><42> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
bool UpdateDBData(CDBComponent& DBComponent);
|
||||
|
||||
//! DB<44><42> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
|
||||
bool ForceUpdateDBAllData(CDBComponent& DBComponent)
|
||||
{
|
||||
m_dwUpdateData = 0xFFFFFFFF;
|
||||
return UpdateDBData(DBComponent);
|
||||
}
|
||||
|
||||
unsigned long GetLastDBUpdateTime() const { return m_dwLastDBUpdateTime; }
|
||||
|
||||
//! DB<44><42><EFBFBD><EFBFBD> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
bool GetFromDB(CDBComponent& DBComponent, UnifiedStoreKey storeKey);
|
||||
|
||||
bool WriteDataToDumpFile(const char* szFileName);
|
||||
bool ReadDataFromDumpFile(const char* szFileName);
|
||||
|
||||
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
bool ConvertToPart2Item(bool bConvertSkillToTicket);
|
||||
|
||||
private:
|
||||
|
||||
unsigned long m_dwUID;
|
||||
unsigned long m_dwUpdateData;
|
||||
unsigned long m_dwLastDBUpdateTime;
|
||||
|
||||
STORE_INFO m_StoreInfo;
|
||||
STORE m_Store1;
|
||||
STORE m_Store2;
|
||||
|
||||
unsigned char m_cOldServerGroupID;
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,75 @@
|
||||
#include "stdafx.h"
|
||||
#include "StoreDataMgr.h"
|
||||
#include <Log/ServerLog.h>
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
|
||||
CStoreDataMgr& CStoreDataMgr::GetInstance()
|
||||
{
|
||||
static CStoreDataMgr storeDataMgr;
|
||||
return storeDataMgr;
|
||||
}
|
||||
|
||||
CStoreDataMgr::CStoreDataMgr()
|
||||
{
|
||||
SetManagerName("â<EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
|
||||
CStoreDataMgr::~CStoreDataMgr()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CStoreDataMgr::Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const UnifiedStoreKey& dataKey, const char* szErrorMsg)
|
||||
{
|
||||
switch(eLogType)
|
||||
{
|
||||
case LOG_NORMAL:
|
||||
case LOG_RULE:
|
||||
case LOG_INFO:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "UID:%10u / CID:%10u / KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(),
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.SimpleLog(eLogType, "KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
|
||||
case LOG_DETAIL:
|
||||
case LOG_SYSERR:
|
||||
case LOG_ERROR:
|
||||
case LOG_DEBUG:
|
||||
case LOG_WARN:
|
||||
|
||||
if(0 != lpSessionData)
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine,
|
||||
"UID:%10u / CID:%10u / KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
lpSessionData->GetUID(), lpSessionData->GetCID(),
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_Log.DetailLog(eLogType, pRtn, pFileName, nLine,
|
||||
"KeyUID:%10u / KeyServerGroupID:%d / %s %s",
|
||||
dataKey.first, dataKey.second, GetManagerName(), szErrorMsg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
#ifndef _RYL_DBAGENT_STORE_DATA_MGR_H_
|
||||
#define _RYL_DBAGENT_STORE_DATA_MGR_H_
|
||||
|
||||
#include "DBDataMgr.h"
|
||||
#include "StoreData.h"
|
||||
|
||||
namespace DBAgent
|
||||
{
|
||||
namespace DataStorage
|
||||
{
|
||||
// ù<><C3B9>° : UID
|
||||
// <20>ι<EFBFBD>° : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ
|
||||
class CStoreDataMgr : public CDBDataMgr<UnifiedStoreKey, CStoreData>
|
||||
{
|
||||
public:
|
||||
|
||||
static CStoreDataMgr& GetInstance();
|
||||
|
||||
private:
|
||||
|
||||
CStoreDataMgr();
|
||||
~CStoreDataMgr();
|
||||
|
||||
virtual void Log(LOG_TYPE eLogType, const char* pRtn, const char* pFileName, int nLine,
|
||||
const CSessionData* lpSessionData, const UnifiedStoreKey& dataKey, const char* szErrorMsg);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user