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:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -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;
}
}
}

View File

@@ -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

View 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;
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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>
};
}
}

View 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

View File

@@ -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();
}
}
}
}

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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><><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

View File

@@ -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);
}
}
}
}
}
}
}

View File

@@ -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

View File

@@ -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;
}
}
}

View File

@@ -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

View File

@@ -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;
}
}
}
}

View File

@@ -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