gameserverinfomanager.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 320 行
CPP
320 行
//////////////////////////////////////////////////////////////////////////////// Filename : GameServerInfoManager.cpp// Written By : Reiot// Description ://////////////////////////////////////////////////////////////////////////////#include "GameServerInfoManager.h"#include "database/DB.h"//////////////////////////////////////////////////////////////////////////////// class GameServerInfoManager member methods//////////////////////////////////////////////////////////////////////////////GameServerInfoManager::GameServerInfoManager () throw (){}GameServerInfoManager::~GameServerInfoManager () throw (){ clear();}void GameServerInfoManager::clear() throw (Error){ // hashmap 救狼 阿 pair 狼 second, 溜 GameServerInfo 按眉父阑 昏力窍绊 // pair 磊眉绰 弊措肺 敌促. (GameServerInfo啊 赛俊 积己登绢 乐促绰 巴俊 // 蜡狼窍扼. 溜 鞘混昏力甫 秦具 茄促. 窍变, GSIM捞 destruct 等促绰 巴篮 // 肺弊牢 辑滚啊 妓促款等促绰 巴阑 狼固窍聪瘪.. - -;) for( int j = 1; j < m_MaxWorldID; j++ ) { for (int i=0; i < m_MaxServerGroupID; i++) { HashMapGameServerInfo::iterator itr = m_pGameServerInfos[j][i].begin(); for (; itr != m_pGameServerInfos[j][i].end(); itr++) { SAFE_DELETE(itr->second); } // 捞力 秦浆甘救俊 乐绰 葛电 pair 甸阑 昏力茄促. m_pGameServerInfos[j][i].clear(); } } if (m_pGameServerInfos != NULL) { for (int i=1 ; i < m_MaxWorldID; i++) SAFE_DELETE_ARRAY(m_pGameServerInfos[i]); SAFE_DELETE_ARRAY(m_pGameServerInfos); } }void GameServerInfoManager::init () throw (Error){ __BEGIN_TRY // just load data from GameServerInfo table load(); // just print to cout cout << toString() << endl; __END_CATCH}void GameServerInfoManager::load () throw (Error){ __BEGIN_TRY // clear GameServerInfos clear(); Statement* pStmt = NULL; // 刚历 MAX SERVER GROUP ID甫 佬绢甸咯具 茄促. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery( "SELECT MAX(GroupID) FROM GameServerInfo" ); if (pResult->getRowCount() == 0) { cerr << "GameServerInfo TABLE does not exist!" << endl; throw Error("GameServerInfo TABLE does not exist!"); } pResult->next(); m_MaxServerGroupID = pResult->getInt(1) + 1; SAFE_DELETE(pStmt); } END_DB(pStmt) BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery( "SELECT MAX(WorldID) FROM GameServerInfo" ); if (pResult->getRowCount() == 0) { cerr << "GameServerInfo TABLE does not exist!" << endl; throw Error("GameServerInfo TABLE does not exist!"); } pResult->next(); m_MaxWorldID = pResult->getInt(1) + 2; SAFE_DELETE(pStmt); } END_DB(pStmt) /* m_pTiles = new Tile* [ m_Width ]; for (uint i = 0 ; i < m_Width ; i++) m_pTiles[i] = new Tile [m_Height]; */ m_pGameServerInfos = new HashMapGameServerInfo* [m_MaxWorldID]; for( int i = 1; i < m_MaxWorldID; i++ ) m_pGameServerInfos[i] = new HashMapGameServerInfo[m_MaxServerGroupID]; cout << "MAX SERVER GROUP = " << m_MaxServerGroupID << endl; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery( "SELECT ServerID, Nickname , IP , TCPPort , UDPPort, WorldID, GroupID, Stat FROM GameServerInfo" ); while (pResult->next()) { GameServerInfo* pGameServerInfo = new GameServerInfo(); pGameServerInfo->setServerID(pResult->getInt(1)); pGameServerInfo->setNickname(pResult->getString(2)); pGameServerInfo->setIP(pResult->getString(3)); pGameServerInfo->setTCPPort(pResult->getInt(4)); pGameServerInfo->setUDPPort(pResult->getInt(5)); WorldID_t WorldID = pResult->getInt(6); pGameServerInfo->setWorldID(WorldID); ServerGroupID_t ServerGroupID = pResult->getInt(7); pGameServerInfo->setGroupID(ServerGroupID); pGameServerInfo->setServerStat((ServerStatus)pResult->getInt(8)); addGameServerInfo(pGameServerInfo, ServerGroupID, WorldID); } SAFE_DELETE(pStmt); } END_DB(pStmt) __END_CATCH}void GameServerInfoManager::addGameServerInfo(GameServerInfo * pGameServerInfo, const ServerGroupID_t ServerGroupID, WorldID_t WorldID ) throw (DuplicatedException){ __BEGIN_TRY if (ServerGroupID >= m_MaxServerGroupID) { throw DuplicatedException("ServerGroupID over Bounce"); } if (WorldID >= m_MaxWorldID ) { throw DuplicatedException("WorldID over Bounce"); } HashMapGameServerInfo::iterator itr = m_pGameServerInfos[WorldID][ServerGroupID].find(pGameServerInfo->getServerID()); if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { throw DuplicatedException("duplicated game-server ServerID"); } m_pGameServerInfos[WorldID][ServerGroupID][ pGameServerInfo->getServerID() ] = pGameServerInfo; __END_CATCH} void GameServerInfoManager::deleteGameServerInfo (const ServerID_t ServerID, const ServerGroupID_t ServerGroupID, WorldID_t WorldID ) throw (NoSuchElementException){ __BEGIN_TRY if (ServerGroupID >= m_MaxServerGroupID) { throw DuplicatedException("ServerGroupID over Bounce"); } if (WorldID >= m_MaxWorldID) { throw DuplicatedException("WorldID over Bounce"); } HashMapGameServerInfo::iterator itr = m_pGameServerInfos[WorldID][ServerGroupID].find(ServerID); if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { // GameServerInfo 甫 昏力茄促. delete itr->second; // pair甫 昏力茄促. m_pGameServerInfos[WorldID][ServerGroupID].erase(itr); } else { // 弊繁 霸烙辑滚牢器 按眉甫 茫阑 荐 绝阑 锭 throw NoSuchElementException(); } __END_CATCH} /*//----------------------------------------------------------------------// get info//----------------------------------------------------------------------GameServerInfo * GameServerInfoManager::getGameServerInfo (const string & nickname) const throw (NoSuchElementException){ __BEGIN_TRY GameServerInfo * pGameServerInfo = NULL; HashMapGameServerInfo::const_iterator itr = m_pGameServerInfos.find(nickname); if (itr != m_pGameServerInfos.end()) { pGameServerInfo = itr->second; } else { // 弊繁 霸烙辑滚牢器 按眉甫 茫阑 荐 绝菌阑 锭 throw NoSuchElementException(nickname); } return pGameServerInfo; __END_CATCH}*/GameServerInfo * GameServerInfoManager::getGameServerInfo (const ServerID_t ServerID, const ServerGroupID_t ServerGroupID, WorldID_t WorldID ) const throw (NoSuchElementException){ __BEGIN_TRY GameServerInfo * pGameServerInfo = NULL; if( WorldID >= m_MaxWorldID || ServerGroupID >= m_MaxServerGroupID ) { // 弊繁 霸烙辑滚牢器 按眉甫 茫阑 荐 绝菌阑 锭 throw NoSuchElementException(); } HashMapGameServerInfo::const_iterator itr = m_pGameServerInfos[WorldID][ServerGroupID].find(ServerID); if (itr != m_pGameServerInfos[WorldID][ServerGroupID].end()) { pGameServerInfo = itr->second; } else { // 弊繁 霸烙辑滚牢器 按眉甫 茫阑 荐 绝菌阑 锭 throw NoSuchElementException(); } return pGameServerInfo; __END_CATCH}string GameServerInfoManager::toString () const throw (){ __BEGIN_TRY StringStream msg; msg << "GameServerInfoManager(\n"; for( int j = 1; j < m_MaxWorldID; j++ ) { for (int i = 0; i < m_MaxServerGroupID; i++) { if (m_pGameServerInfos[j][i].empty()) { msg << "EMPTY"; } else { HashMapGameServerInfo::const_iterator itr = m_pGameServerInfos[j][i].begin(); for (; itr != m_pGameServerInfos[j][i].end(); itr++) { msg << itr->second->toString() << '\n'; } } msg << ")"; } } return msg.toString(); __END_CATCH}// global variable definitionGameServerInfoManager * g_pGameServerInfoManager = NULL;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?