Files
Client/Server/ManageTool/ManageLibrary/ServerManage/ManageClientManager.cpp
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

538 lines
13 KiB
C++

#include "stdafx.h"
#include "ManageClientManager.h"
#include <DB/SQLite.h>
#include <DB/ManageServerDB.h>
#include <Log/ServerLog.h>
CManageClientManager& CManageClientManager::GetInstance()
{
static CManageClientManager manageClientManager(CManageServerDB::GetInstance());
return manageClientManager;
}
CManageClientManager::CManageClientManager(CManageServerDB& manageServerDB)
: m_ManageServerDB(manageServerDB)
{
ReloadRunInfo();
}
CManageClientManager::~CManageClientManager()
{
}
// ----------------------------------------------------------------------------------------------
// ¼­¹ö Á¤º¸ °ü·Ã
bool CManageClientManager::Add(InfoType eInfoType,
const ServerManage::RunInfo& runInfo,
unsigned long& dwID_Out)
{
const int MAX_QUERY_LEN = 512;
char szQuery[MAX_QUERY_LEN];
int nQueryLen = -1;
switch(eInfoType)
{
case SERVER_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"INSERT INTO TblServerInfo values(%d, '%s')",
runInfo.m_dwServerIP, runInfo.m_szServerName);
break;
case RUN_PATH_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"INSERT INTO TblRunPath values(NULL, '%s')", runInfo.m_szPath);
break;
case OPTION_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"INSERT INTO TblRunOptions values(NULL, '%s')", runInfo.m_szOption);
break;
case RUN_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"INSERT INTO TblRunInfo values(NULL, %d, %d, %d)",
runInfo.m_dwPathID, runInfo.m_dwOptionID, runInfo.m_dwServerIP);
break;
default:
ERRLOG1(g_Log, "Unknown InfoType : %d", eInfoType);
return false;
};
szQuery[MAX_QUERY_LEN - 1] = 0;
if(nQueryLen <= 0)
{
ERRLOG1(g_Log, "Make query failed : %s", szQuery);
return false;
}
CSQLite::Dataset executeQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(!executeQuery.Compile() || !executeQuery.Execute())
{
if(0 != executeQuery.GetLastError())
{
ERRLOG2(g_Log, "Add failed : error : %s(Query:%s)",
executeQuery.GetLastError(), szQuery);
}
return false;
}
dwID_Out = m_ManageServerDB.GetSQLite().GetLastInsertRowID();
return ReloadRunInfo();
}
bool CManageClientManager::Modify(InfoType eInfoType, const ServerManage::RunInfo& runInfo)
{
const int MAX_QUERY_LEN = 512;
char szQuery[MAX_QUERY_LEN];
int nQueryLen = -1;
switch(eInfoType)
{
case SERVER_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"UPDATE TblServerInfo SET ServerName = '%s' WHERE IP = %d",
runInfo.m_szServerName, runInfo.m_dwServerIP);
break;
case RUN_PATH_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"UPDATE TblRunPath SET RunPath = '%s' WHERE PathID = %d",
runInfo.m_szPath, runInfo.m_dwPathID);
break;
case OPTION_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"UPDATE TblRunOptions SET RunOption = '%s' WHERE OptionID = %d",
runInfo.m_szOption, runInfo.m_dwOptionID);
break;
case RUN_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"UPDATE TblRunInfo SET PathID = %d, OptionID = %d, ServerIP = %d WHERE RunID = %d",
runInfo.m_dwPathID, runInfo.m_dwOptionID, runInfo.m_dwServerIP, runInfo.m_dwRunID);
break;
default:
ERRLOG1(g_Log, "Unknown InfoType : %d", eInfoType);
return false;
};
szQuery[MAX_QUERY_LEN - 1] = 0;
if(nQueryLen <= 0)
{
ERRLOG1(g_Log, "Make query failed : %s", szQuery);
return false;
}
CSQLite::Dataset executeQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(!executeQuery.Compile() || !executeQuery.Execute())
{
if(0 != executeQuery.GetLastError())
{
ERRLOG2(g_Log, "Modify failed : error : %s(Query:%s)",
executeQuery.GetLastError(), szQuery);
}
return false;
}
return ReloadRunInfo();
}
bool CManageClientManager::Remove(InfoType eInfoType, unsigned long dwID, bool bDeleteRelated)
{
const int MAX_QUERY_LEN = 512;
char szQuery[MAX_QUERY_LEN];
char szDeleteRelated[MAX_QUERY_LEN];
const char* szRelatedKey = 0;
int nQueryLen = -1;
switch(eInfoType)
{
case SERVER_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"DELETE FROM TblServerInfo WHERE IP = %d", dwID);
szRelatedKey = "ServerIP";
break;
case RUN_PATH_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"DELETE FROM TblRunPath WHERE PathID = %d;", dwID);
szRelatedKey = "PathID";
break;
case OPTION_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"DELETE FROM TblRunOptions WHERE OptionID = %d;", dwID);
szRelatedKey = "OptionID";
break;
case RUN_INFO:
nQueryLen = _snprintf(szQuery, MAX_QUERY_LEN - 1,
"DELETE FROM TblRunInfo WHERE RunID = %d", dwID);
break;
default:
ERRLOG1(g_Log, "Unknown InfoType : %d", eInfoType);
return false;
};
szQuery[MAX_QUERY_LEN - 1] = 0;
if(nQueryLen <= 0)
{
ERRLOG1(g_Log, "Make query failed : %s", szQuery);
return false;
}
else
{
CSQLite::Dataset executeQuery(m_ManageServerDB.GetSQLite(), szQuery);
if(!executeQuery.Compile() || !executeQuery.Execute())
{
if(0 != executeQuery.GetLastError())
{
ERRLOG2(g_Log, "Delete failed : error : %s(Query:%s)",
executeQuery.GetLastError(), szQuery);
}
return false;
}
if(bDeleteRelated && 0 != szRelatedKey)
{
nQueryLen = _snprintf(szDeleteRelated, MAX_QUERY_LEN - 1,
"DELETE FROM TblRunInfo WHERE %s = %d;", szRelatedKey, dwID);
if(nQueryLen <= 0)
{
ERRLOG1(g_Log, "Make query failed : %s", szDeleteRelated);
return false;
}
CSQLite::Dataset deleteRelatedQuery(m_ManageServerDB.GetSQLite(), szDeleteRelated);
if(!deleteRelatedQuery.Compile() || !deleteRelatedQuery.Execute())
{
if(0 != deleteRelatedQuery.GetLastError())
{
ERRLOG2(g_Log, "Delete related failed : error : %s(Query:%s)",
deleteRelatedQuery.GetLastError(), szDeleteRelated);
}
return false;
}
}
}
return ReloadRunInfo();
}
int GetServerInfoCallback(void *callBackArg, int nColumnNum,
char **szColumnValues, char **szColumnNames)
{
if(2 == nColumnNum)
{
CManageClientManager::RunTable& runTable =
*reinterpret_cast<CManageClientManager::RunTable*>(callBackArg);
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwServerIP = atol(szColumnValues[0]);
_snprintf(runInfo.m_szServerName, ServerManage::RunInfo::MAX_SERVER_NAME - 1,
"%s", szColumnValues[1]);
runInfo.m_szServerName[ServerManage::RunInfo::MAX_SERVER_NAME - 1] = 0;
if(!runTable.insert(CManageClientManager::RunTable::value_type(
runInfo.m_dwServerIP, runInfo)).second)
{
ERRLOG1(g_Log, "Insert failed. Key : %d", runInfo.m_dwServerIP);
}
}
return 0;
}
int GetPathInfoCallback(void *callBackArg, int nColumnNum,
char **szColumnValues, char **szColumnNames)
{
if(2 == nColumnNum)
{
CManageClientManager::RunTable& runTable =
*reinterpret_cast<CManageClientManager::RunTable*>(callBackArg);
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwPathID = atol(szColumnValues[0]);
_snprintf(runInfo.m_szPath, ServerManage::RunInfo::MAX_PATH_LEN - 1,
"%s", szColumnValues[1]);
runInfo.m_szPath[ServerManage::RunInfo::MAX_PATH_LEN - 1] = 0;
if(!runTable.insert(CManageClientManager::RunTable::value_type(
runInfo.m_dwPathID, runInfo)).second)
{
ERRLOG1(g_Log, "Insert failed. Key : %d", runInfo.m_dwPathID);
}
}
return 0;
}
int GetOptionInfoCallback(void *callBackArg, int nColumnNum,
char **szColumnValues, char **szColumnNames)
{
if(2 == nColumnNum)
{
CManageClientManager::RunTable& runTable =
*reinterpret_cast<CManageClientManager::RunTable*>(callBackArg);
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwOptionID = atol(szColumnValues[0]);
_snprintf(runInfo.m_szOption, ServerManage::RunInfo::MAX_OPT_LEN - 1,
"%s", szColumnValues[1]);
runInfo.m_szOption[ServerManage::RunInfo::MAX_OPT_LEN - 1] = 0;
if(!runTable.insert(CManageClientManager::RunTable::value_type(
runInfo.m_dwOptionID, runInfo)).second)
{
ERRLOG1(g_Log, "Insert failed. Key : %d", runInfo.m_dwOptionID);
}
}
return 0;
}
int GetRunInfoCallback(void *callBackArg, int nColumnNum,
char **szColumnValues, char **szColumnNames)
{
if(4 == nColumnNum)
{
CManageClientManager::RunTable& runTable =
*reinterpret_cast<CManageClientManager::RunTable*>(callBackArg);
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwRunID = atol(szColumnValues[0]);
runInfo.m_dwPathID = atol(szColumnValues[1]);
runInfo.m_dwOptionID = atol(szColumnValues[2]);
runInfo.m_dwServerIP = atol(szColumnValues[3]);
if(!runTable.insert(CManageClientManager::RunTable::value_type(
runInfo.m_dwRunID, runInfo)).second)
{
ERRLOG1(g_Log, "Insert failed. Key : %d", runInfo.m_dwOptionID);
}
}
return 0;
}
bool CManageClientManager::Get(InfoType eInfoType, RunTable& runTable)
{
runTable.clear();
const char* szQuery = 0;
CSQLite::QueryCallBack lpQueryCallBack = 0;
switch(eInfoType)
{
case SERVER_INFO:
szQuery = "SELECT IP, ServerName FROM TblServerInfo";
lpQueryCallBack = GetServerInfoCallback;
break;
case RUN_PATH_INFO:
szQuery = "SELECT PathID, RunPath FROM TblRunPath";
lpQueryCallBack = GetPathInfoCallback;
break;
case OPTION_INFO:
szQuery = "SELECT OptionID, RunOption FROM TblRunOptions";
lpQueryCallBack = GetOptionInfoCallback;
break;
case RUN_INFO:
szQuery = "SELECT RunID, PathID, OptionID, ServerIP FROM TblRunInfo";
lpQueryCallBack = GetRunInfoCallback;
break;
default:
ERRLOG1(g_Log, "Unknown InfoType : %d", eInfoType);
return false;
};
if(!m_ManageServerDB.GetSQLite().ExecuteQuery(szQuery, lpQueryCallBack, &runTable))
{
const char* szError = m_ManageServerDB.GetSQLite().GetLastError();
if(0 != szError)
{
ERRLOG2(g_Log, "Query failed : refresh runinfo failed : %s(Query:%s)",
szError, szQuery);
}
return false;
}
return true;
}
// ----------------------------------------------------------------------------------------------
// ½ÇÇà Á¤º¸ ¾ò¾î¿À±â
bool CManageClientManager::GetRunInfo(ServerManage::RunInfo* lpRunInfo_Out, size_t* nArrayNum_InOut)
{
size_t nRunTableSize = m_RunTable.size();
if(0 != lpRunInfo_Out && 0 != nArrayNum_InOut && nRunTableSize <= *nArrayNum_InOut)
{
RunTable::iterator pos = m_RunTable.begin();
RunTable::iterator end = m_RunTable.end();
for(; pos != end; ++pos, ++lpRunInfo_Out)
{
*lpRunInfo_Out = pos->second;
}
*nArrayNum_InOut = nRunTableSize;
return true;
}
return false;
}
bool CManageClientManager::GetRunInfo(unsigned long dwRunID, ServerManage::RunInfo& runInfo_Out)
{
RunTable::iterator pos = m_RunTable.find(dwRunID);
if(pos != m_RunTable.end())
{
runInfo_Out = pos->second;
return true;
}
return false;
}
bool CManageClientManager::HasRunInfo(unsigned long dwRunID)
{
return m_RunTable.find(dwRunID) != m_RunTable.end();
}
void CManageClientManager::GetRunInfoFromIP(unsigned long dwServerIP, RunTable& runTable)
{
RunTable::iterator pos = m_RunTable.begin();
RunTable::iterator end = m_RunTable.end();
for(; pos != end; ++pos)
{
RunTable::value_type& data = *pos;
if(data.second.m_dwServerIP == dwServerIP)
{
runTable.insert(data);
}
}
}
int ReloadRunInfoCallback(void *callBackArg, int nColumnNum, char **szColumnValues, char **szColumnNames)
{
CManageClientManager::RunTable& runTable =
*reinterpret_cast<CManageClientManager::RunTable*>(callBackArg);
if(7 == nColumnNum)
{
ServerManage::RunInfo runInfo;
memset(&runInfo, 0, sizeof(ServerManage::RunInfo));
runInfo.m_dwRunID = atol(szColumnValues[0]);
runInfo.m_dwServerIP = atol(szColumnValues[1]);
runInfo.m_dwPathID = atol(szColumnValues[2]);
runInfo.m_dwOptionID = atol(szColumnValues[3]);
_snprintf(runInfo.m_szServerName, ServerManage::RunInfo::MAX_SERVER_NAME - 1,
"%s", szColumnValues[4]);
runInfo.m_szServerName[ServerManage::RunInfo::MAX_SERVER_NAME - 1] = 0;
_snprintf(runInfo.m_szPath, ServerManage::RunInfo::MAX_PATH_LEN - 1,
"%s", szColumnValues[5]);
runInfo.m_szPath[ServerManage::RunInfo::MAX_PATH_LEN - 1] = 0;
_snprintf(runInfo.m_szOption, ServerManage::RunInfo::MAX_OPT_LEN - 1,
"%s", szColumnValues[6]);
runInfo.m_szOption[ServerManage::RunInfo::MAX_OPT_LEN - 1] = 0;
if(!runTable.insert(CManageClientManager::RunTable::value_type(
atol(szColumnValues[0]), runInfo)).second)
{
ERRLOG0(g_Log, "Reload failed");
}
}
return 0;
}
bool CManageClientManager::ReloadRunInfo()
{
m_RunTable.clear();
const char* szQuery = "SELECT TblRunInfo.RunID, TblRunInfo.ServerIP, TblRunInfo.PathID, "
"TblRunInfo.OptionID, TblServerInfo.ServerName, TblRunPath.RunPath, TblRunOptions.RunOption "
"FROM TblRunInfo "
"LEFT OUTER JOIN TblRunPath ON TblRunInfo.PathID = TblRunPath.PathID "
"LEFT OUTER JOIN TblRunOptions ON TblRunInfo.OptionID = TblRunOptions.OptionID "
"LEFT OUTER JOIN TblServerInfo ON TblRunInfo.ServerIP = TblServerInfo.IP ";
if(!m_ManageServerDB.GetSQLite().ExecuteQuery(szQuery, ReloadRunInfoCallback, &m_RunTable))
{
const char* szError = m_ManageServerDB.GetSQLite().GetLastError();
if(0 != szError)
{
ERRLOG2(g_Log, "Query failed : refresh runinfo failed : %s(Query:%s)",
szError, szQuery);
}
return false;
}
return true;
}