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 + -
显示快捷键?