Files
2022-10-26 12:25:11 +08:00

254 lines
9.7 KiB
C++

#pragma once
#ifndef DBPROXY_SERVER_EX_H
#define DBPROXY_SERVER_EX_H
//==================================================================================================
/// GameServerEx class
/**
@author Kim Min Wook < taiyo@webzen.com >
@since 2006. 10. 23
@remark
- 프레임워크를 상속받아 구현하는 것으로 코드 변경
@note
-
@history
-
*/
//==================================================================================================
#include <ServerFrame.h>
#include "TempServerSession.h" // ServerCommon
#include "Sessions/GameServerSession.h"
#include "Sessions/MasterServerSession.h"
#include "Sessions/AgentServerSession.h"
#include "Sessions/WorldServerSession.h"
#include "Sessions/GuildServerSession.h"
#include "Sessions/PortalServerSession.h"
#include "Sessions/SolarAuthServerSession.h"
class DBUser;
class ScriptParserManager;
//==================================================================================================
class DBProxyServerEx : public ServerFrame
{
public:
// db result handler index containing in DBProxyServerEx
enum QUERY_INDEX
{
QUERY_SELECTDBSERIAL = 0,
//QUERY_UPDATECHARACTER,
//QUERY_UPDATEWAREHOUSE,
QUERY_MATCHCHAR_UPDATE,
QUERY_MATCHCHAR_DELETE,
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
QUERY_MATCHFATIGUE_UPDATE,
QUERY_MATCHFATIGUE_SELECT,
#endif
QUERY_TEST_INSERT,
QUERY_FATE_ITEM_IDENTIFY_DBR,
};
//----------------------------------------------------------------------------------------------
// Network Session Alloc/DeAlloc Handlers
static NetworkObject* DoAllocServerSession();
static void DoFreeServerSession(NetworkObject* network_object);
static void DoFreeConnectSession(NetworkObject* network_object) { __UNUSED(network_object); }
static NetworkObject* DoAllocClient_NotUsed() { return NULL; }
static void DoFreeClient_NotUsed(NetworkObject* network_object) { __UNUSED(network_object); }
static void DoFreeConnect_NotUsed(NetworkObject* network_object) { __UNUSED(network_object); }
//----------------------------------------------------------------------------------------------
DBProxyServerEx();
virtual ~DBProxyServerEx();
// ServerFrame interface
#if (DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_ACCOUNT)
virtual eSERVER_TYPE GetServerType() { return ACCOUNT_DBPROXY; }
#else
virtual eSERVER_TYPE GetServerType() { return GAME_DBPROXY; }
#endif
//virtual void SendServerType(ServerSession* session);
//----------------------------------------------------------------------------------------------
static void StartServer();
ePHASE_SHIFT GetPhaseStatus() const;
void SetPhaseStatus(ePHASE_SHIFT phase);
// requested shutdown from master server
void RequestShutdown();
#if DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_UNIT
SolarDatabaseInDBP* Get1stDatabase(); // { SUNOnline, }
SolarDatabaseInDBP* Get2ndDatabase(); // { MatchingDB, }
SolarDatabaseInDBP* Get3rdDatabase(); // { (spared for batch units...) }
#endif
bool SendMaster(MSG_BASE* msg, uint16_t msg_size);
bool IsMasterConnected() const;
// NOTE: f110522.3L
bool SendToWorldServer(MSG_BASE* msg, uint16_t msg_size);
bool IsWorldConnected() const;
#ifdef _NA002635_GZ_DZ_PROTOCOL_UINIFICATION
void SendToDBPServer(MSG_BASE* pMsg, WORD wSize);
void SendToGuildServer(MSG_BASE* pMsg, WORD wSize);
#endif //_NA002635_GZ_DZ_PROTOCOL_UINIFICATION
bool ConnectTo(eSERVER_TYPE server_type);
#if SUN_CODE_BACKUP
ServerSession* GetSession(eSERVER_TYPE server_type);
#endif
//----------------------------------------------------------------------------------------------
// DB 관련
void DBResult(DWORD dwIndex, Query* pData); // <- CHECK110519
BYTE GetItemWorldID() const;
//----------------------------------------------------------------------------------------------
// DB Connections
bool IsDBDisconnected() const;
bool IsMatchDBDisconnected() const;
DWORD& DBLastedConnectedTick() { return latest_main_db_connected_ticks_; } // <- CHECK110519
DWORD& MatchDBLastedConnectedTick() { return latest_match_db_connected_ticks_; } // <- CHECK110519
bool SetDBDisconnected(bool disconnected, DWORD query_start_tick = 0);
bool SetMatchDBDisconnected(bool disconnected, DWORD query_start_tick = 0);
#ifdef __CN_OO0510__FATIGUE_MATCHING_UPDATE
// 매칭 DB관련 쿼리 함수
void ExecuteQuery_MatchChar_Update(USERGUID user_guid, const TCHAR* char_name,
LEVELTYPE Level, BYTE class_type);
void ExecuteQuery_MatchChar_Delete(USERGUID user_guid, const TCHAR* char_name);
//피로도 관련 쿼리 함수
void ExecuteQuery_MatchFatigue_Update(USERGUID user_guid, DWORD user_key, int play_time);
void ExecuteQuery_MatchFatigue_Select(USERGUID user_guid, DWORD user_key);
#endif //__CN_OO0510__FATIGUE_MATCHING_UPDATE
// TODO: f110519.7L, need changes
sPASSWORD_BLOCK_IN_DBPROXY* AllocTempPasswordBlock() { return (sPASSWORD_BLOCK_IN_DBPROXY*)password_pool_.Alloc(); }
BOOL FreeTempPasswordBlock(sPASSWORD_BLOCK_IN_DBPROXY* pTempPwdBlock) { return password_pool_.Free(pTempPwdBlock); }
protected:
//----------------------------------------------------------------------------------------------
// ServerFrame interfaces
virtual BOOL Init();
virtual BOOL Update(DWORD delta_tick);
virtual void Release();
virtual ServerSession* AllocServerSession(eSERVER_TYPE);
virtual void FreeServerSession(ServerSession*);
virtual BOOL KeyEvent(char inputed_char);
//----------------------------------------------------------------------------------------------
private:
enum eSHUTDOWNSTATE { RUNNING, READYTOSHUTDOWN, };
//
void SetShutdownState(eSHUTDOWNSTATE state);
//
bool InitializeScriptData(BOOL read_from_file);
bool InitializeLogger(const char* server_name);
bool CreateSunLog(BYTE sun_log_option, BYTE sun_log_level,
const TCHAR* log_path, const TCHAR* file_name);
bool InitializeSessionPool();
bool InitializeDatabase();
//
bool UpdateDB();
//
void ReloadAttributes();
void DisplayServerInfo();
//----------------------------------------------------------------------------------------------
// data fields...
ePHASE_SHIFT phase_shift_;
MasterServerSession* master_server_session_;
WorldServerSession* world_server_session_; // NOTE: f110522.3L
BYTE item_world_id_;
struct {
long disconnected_main_db_; // mutual exclusion
long disconnected_match_db_; // mutual exclusion
DWORD latest_main_db_connected_ticks_; // 가장 최신 연결 완료 시점.
DWORD latest_match_db_connected_ticks_; // 가장 최신 연결 완료 시점.
};
//----------------------------------------------------------------------------------------------
SolarDatabaseInDBP main_database_;
#if (DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_UNIT) || \
defined(__CN_OO0510__FATIGUE_MATCHING_UPDATE)
SolarDatabaseInDBP match_database_;
#endif
#if DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_UNIT
SolarDatabaseInDBP extra_database_;
#endif
//----------------------------------------------------------------------------------------------
struct {
bool shutdown_requested_; // 마스터 서버로부터 종료 요청 받은 경우 true
eSHUTDOWNSTATE shutdown_state_;
};
ScriptParserManager* script_parser_manager_;
TEMP_PWD_POOL password_pool_; // TODO: waverix, need renewal
//----------------------------------------------------------------------------------------------
util::CMemoryPoolFactory<AgentServerSession> m_AgentServerSessionPool;
util::CMemoryPoolFactory<GameServerSession> m_GameServerSessionPool;
#if !defined(_NA002635_GZ_DZ_PROTOCOL_UINIFICATION)
util::CMemoryPoolFactory<GuildServerSession> m_GuildServerSessionPool;
#endif
util::CMemoryPoolFactory<TempServerSession> m_TempServerSessionPool;
util::CMemoryPoolFactory<MasterServerSession> m_MasterServerSessionPool;
#if !defined(_NA002635_GP_DP_PROTOCOL_UINIFICATION)
util::CMemoryPoolFactory<PortalServerSession> m_PortalServerSessionPool;
#endif
util::CMemoryPoolFactory<WorldServerSession> m_WorldServerSessionPool;
util::CMemoryPoolFactory<SolarAuthServerSession> m_SolarAuthServerSessionPool;
//----------------------------------------------------------------------------------------------
};
//==================================================================================================
extern DBProxyServerEx g_DBProxyServer;
//==================================================================================================
inline ePHASE_SHIFT DBProxyServerEx::GetPhaseStatus() const {
return phase_shift_;
}
inline void DBProxyServerEx::SetPhaseStatus(ePHASE_SHIFT phase) {
phase_shift_ = phase;
}
inline BYTE DBProxyServerEx::GetItemWorldID() const {
return item_world_id_;
}
inline bool DBProxyServerEx::IsDBDisconnected() const {
return disconnected_main_db_ != 0;
}
inline bool DBProxyServerEx::IsMatchDBDisconnected() const {
return disconnected_match_db_ != 0;
}
// requested shutdown from master server
inline void DBProxyServerEx::RequestShutdown()
{
SetShutdownState(READYTOSHUTDOWN);
#if DBPROXY_TYPE_SELECTOR != DBPROXY_TYPE_UNIT
shutdown_requested_ = true;
#endif
}
#if DBPROXY_TYPE_SELECTOR == DBPROXY_TYPE_UNIT
inline SolarDatabaseInDBP*
DBProxyServerEx::Get1stDatabase() {
return &main_database_;
}
inline SolarDatabaseInDBP*
DBProxyServerEx::Get2ndDatabase() {
return &match_database_;
};
inline SolarDatabaseInDBP*
DBProxyServerEx::Get3rdDatabase() {
return &extra_database_;
};
#endif
inline void DBProxyServerEx::SetShutdownState(eSHUTDOWNSTATE state) {
shutdown_state_ = state;
}
#endif //DBPROXY_SERVER_EX_H