#include "stdafx.h" #include "ManageClientManager.h" #include #include #include 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(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(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(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(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(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; }