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>
This commit is contained in:
337
Server/DBProcess/ConvertLogToRow/ConvertLogToRow.cpp
Normal file
337
Server/DBProcess/ConvertLogToRow/ConvertLogToRow.cpp
Normal file
@@ -0,0 +1,337 @@
|
||||
// ConvertLogToRow.cpp : <20>ܼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α<CEB1><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include <atldbcli.h>
|
||||
#include <sqloledb.h>
|
||||
#include <Log/ServerLog.h>
|
||||
#include <Log/ParseLog.h>
|
||||
#include <Log/LogCommands.h>
|
||||
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <ctime>
|
||||
|
||||
#define LOG_CONVERT0(str) { ERRLOG0(g_Log, (str)); printf(str "\n"); }
|
||||
#define LOG_CONVERT1(str, arg1) { ERRLOG1(g_Log, (str), (arg1)); printf(str "\n", (arg1)); }
|
||||
#define LOG_CONVERT2(str, arg1, arg2) { ERRLOG2(g_Log, (str), (arg1), (arg2)); printf(str "\n", (arg1), (arg2)); }
|
||||
|
||||
|
||||
class CProcessLogToRow
|
||||
{
|
||||
public:
|
||||
|
||||
typedef ATL::CCommand<ATL::CDynamicParameterAccessor> LogCommand;
|
||||
|
||||
CProcessLogToRow(ATL::CSession& session) : m_Session(session) { }
|
||||
~CProcessLogToRow() { }
|
||||
|
||||
HRESULT Initialize();
|
||||
HRESULT Process(const TCHAR* szLogFileName);
|
||||
|
||||
private:
|
||||
|
||||
HRESULT LogMonsterDead(__int64 nLogKey, const GAMELOG::sMonsterDeadLog* lpLog);
|
||||
|
||||
ATL::CSession& m_Session;
|
||||
|
||||
LogCommand m_MonsterDeadCmd;
|
||||
LogCommand m_MonsterDropCmd;
|
||||
};
|
||||
|
||||
|
||||
int _tmain(int argc, _TCHAR* argv[])
|
||||
{
|
||||
// DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
// <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
// <20>α<CEB1> <20>м<EFBFBD><D0BC>ؼ<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> Row<6F><77> <20>ִ´<D6B4>.
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Log<6F><67> <20>м<EFBFBD><D0BC>ؼ<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>. <20><><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
||||
|
||||
if (6 != argc)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CoInitialize(0);
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
ATL::CDataSource ds;
|
||||
ATL::CSession session;
|
||||
ATL::CDBPropSet dsPropSet;
|
||||
|
||||
dsPropSet.SetGUID(DBPROPSET_DBINIT);
|
||||
dsPropSet.AddProperty(DBPROP_INIT_DATASOURCE, argv[1]);
|
||||
dsPropSet.AddProperty(DBPROP_INIT_CATALOG, argv[2]);
|
||||
dsPropSet.AddProperty(DBPROP_AUTH_USERID, argv[3]);
|
||||
dsPropSet.AddProperty(DBPROP_AUTH_PASSWORD, argv[4]);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ͺ<EFBFBD><CDBA>̽<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (FAILED(hr = ds.Open(CLSID_SQLOLEDB, &dsPropSet, 1)))
|
||||
{
|
||||
LOG_CONVERT1("DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0%08x", hr);
|
||||
}
|
||||
else if (FAILED(hr = session.Open(ds)))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else
|
||||
{
|
||||
CProcessLogToRow logToLow(session);
|
||||
|
||||
if (FAILED(hr = logToLow.Initialize()))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD>α<EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else if (FAILED(hr = logToLow.Process(argv[5])))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD>α<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
}
|
||||
|
||||
session.Close();
|
||||
ds.Close();
|
||||
|
||||
CoUninitialize();
|
||||
return 0;
|
||||
}
|
||||
|
||||
HRESULT CreateCommand(ATL::CSession& Session, CProcessLogToRow::LogCommand& Cmd,
|
||||
LPCTSTR szQuery, LPCTSTR szCommandName)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
void* pDummy = 0;
|
||||
|
||||
if (FAILED(hr = Cmd.Create(Session, szQuery)))
|
||||
{
|
||||
LOG_CONVERT2("%s Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", szCommandName, hr);
|
||||
}
|
||||
else if (FAILED(hr = Cmd.Prepare()))
|
||||
{
|
||||
LOG_CONVERT2("%s Ŀ<>ǵ<EFBFBD> <20>غ<EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", szCommandName, hr);
|
||||
}
|
||||
else if (FAILED(hr = Cmd.BindParameters(
|
||||
&(Cmd.m_hParameterAccessor), Cmd.m_spCommand, &pDummy, true, true )))
|
||||
{
|
||||
LOG_CONVERT2("%s Ŀ<>ǵ<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", szCommandName, hr);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT CProcessLogToRow::Initialize()
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
ATL::CCommand<> tableCommand;
|
||||
|
||||
tableCommand.Open(m_Session, "DROP TABLE RYLMonsterDropLog");
|
||||
tableCommand.Open(m_Session, "DROP TABLE RYLMonsterDeadLog");
|
||||
tableCommand.Open(m_Session, "DROP TABLE RYLLog");
|
||||
tableCommand.Open(m_Session, "DROP PROC InsertRYLLog");
|
||||
|
||||
if (FAILED(hr = tableCommand.Open(m_Session,
|
||||
"CREATE TABLE RYLLog ("
|
||||
"LogID bigint PRIMARY KEY IDENTITY(1000000, 1), "
|
||||
"UID int, "
|
||||
"CID int, "
|
||||
"PosX smallint, "
|
||||
"PosZ smallint, "
|
||||
"Time smalldatetime, "
|
||||
"Cmd tinyint, "
|
||||
"Err tinyint) ")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD>α<EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else if (FAILED(hr = tableCommand.Open(m_Session,
|
||||
"CREATE PROC InsertRYLLog @UID int, @CID int, @PosX smallint, "
|
||||
"@PosZ smallint, @Time smalldatetime, @Cmd tinyint, @Err tinyint, @LogUID bigint output \n"
|
||||
"AS \n"
|
||||
" INSERT INTO RYLLog (UID, CID, PosX, PosZ, Time, Cmd, Err) "
|
||||
" values (@UID, @CID, @PosX, @PosZ, @Time, @Cmd, @Err) \n"
|
||||
" SET @LogUID = SCOPE_IDENTITY() \n")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD>α<EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else if (FAILED(hr = tableCommand.Open(m_Session,
|
||||
"CREATE TABLE RYLMonsterDropLog ("
|
||||
"LogID bigint, "
|
||||
"PrototypeID int, "
|
||||
"FOREIGN KEY (LogID) REFERENCES RYLLog(LogID))")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else if (FAILED(hr = tableCommand.Open(m_Session,
|
||||
"CREATE TABLE RYLMonsterDeadLog ("
|
||||
"LogID bigint, "
|
||||
"MonsterCID int, "
|
||||
"MonsterLevel tinyint, "
|
||||
"FOREIGN KEY (LogID) REFERENCES RYLLog(LogID))")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
// Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
else if (FAILED(hr = CreateCommand(m_Session, m_MonsterDeadCmd,
|
||||
"INSERT INTO RYLMonsterDeadLog (LogID, MonsterCID, MonsterLevel) values (?, ?, ?)",
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else if (FAILED(hr = CreateCommand(m_Session, m_MonsterDropCmd,
|
||||
"INSERT INTO RYLMonsterDropLog (LogID, PrototypeID) values (?, ?)",
|
||||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT CProcessLogToRow::Process(const TCHAR* szLogFileName)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
typedef std::set<std::string> LogFileSet;
|
||||
LogFileSet logFileSet;
|
||||
|
||||
WIN32_FIND_DATA findData;
|
||||
memset(&findData, 0, sizeof(WIN32_FIND_DATA));
|
||||
|
||||
HANDLE hFileFind = FindFirstFile(szLogFileName, &findData);
|
||||
|
||||
if (INVALID_HANDLE_VALUE != hFileFind)
|
||||
{
|
||||
do
|
||||
{
|
||||
logFileSet.insert(findData.cFileName);
|
||||
}
|
||||
while (FindNextFile(hFileFind, &findData));
|
||||
|
||||
FindClose(hFileFind);
|
||||
}
|
||||
|
||||
LogFileSet::iterator pos = logFileSet.begin();
|
||||
LogFileSet::iterator end = logFileSet.end();
|
||||
|
||||
CParseLog parseLog;
|
||||
CProcessLogToRow::LogCommand dynamicCommand;
|
||||
|
||||
if (FAILED(hr = CreateCommand(m_Session, dynamicCommand,
|
||||
"exec InsertRYLLog ?, ?, ?, ?, ?, ?, ?, ? output",
|
||||
"<EFBFBD>α<EFBFBD> <20><><EFBFBD><EFBFBD>")))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD>α<EFBFBD> <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>: hr:0x%08x", hr);
|
||||
}
|
||||
else
|
||||
{
|
||||
int nFileCount = 0;
|
||||
|
||||
for (; pos != end; ++pos, ++nFileCount)
|
||||
{
|
||||
if (!parseLog.LoadFile(pos->c_str()))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD>α<EFBFBD> <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD>ϸ<EFBFBD>:%s", pos->c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
const CParseLog::LogPtrArray& logPtrArray = parseLog.GetLogPtrArray();
|
||||
|
||||
CParseLog::LogPtrArray::const_iterator ptr_pos = logPtrArray.begin();
|
||||
CParseLog::LogPtrArray::const_iterator ptr_end = logPtrArray.end();
|
||||
|
||||
int nCount = 0;
|
||||
for (; ptr_pos != ptr_end; ++ptr_pos, ++nCount)
|
||||
{
|
||||
const GAMELOG::sLogBase* lpLog = *ptr_pos;
|
||||
|
||||
// <20><EFBFBD><D7B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> SCOPED_IDENTITY<54><59> key<65><79><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
// <20>α<EFBFBD> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
|
||||
|
||||
DBTIMESTAMP timeStamp;
|
||||
tm* lpTime = localtime(&lpLog->m_time);
|
||||
|
||||
if (0 != lpTime && GAMELOG::CMD::MONSTER_DEAD == lpLog->m_cCmd)
|
||||
{
|
||||
timeStamp.year = lpTime->tm_year + 1900;
|
||||
timeStamp.month = lpTime->tm_mon + 1;
|
||||
timeStamp.day = lpTime->tm_mday;
|
||||
timeStamp.hour = lpTime->tm_hour;
|
||||
timeStamp.minute = lpTime->tm_min;
|
||||
timeStamp.second = lpTime->tm_sec;
|
||||
timeStamp.fraction = 0;
|
||||
|
||||
__int64 logKey = 0LL;
|
||||
|
||||
dynamicCommand.SetParam(1, &lpLog->m_dwUID);
|
||||
dynamicCommand.SetParam(2, &lpLog->m_dwCID);
|
||||
dynamicCommand.SetParam(3, &lpLog->m_usXPos);
|
||||
dynamicCommand.SetParam(4, &lpLog->m_usZPos);
|
||||
dynamicCommand.SetParam(5, &timeStamp);
|
||||
dynamicCommand.SetParam(6, &lpLog->m_cCmd);
|
||||
dynamicCommand.SetParam(7, &lpLog->m_cErr);
|
||||
dynamicCommand.SetParam(8, &logKey);
|
||||
|
||||
if (FAILED(hr = dynamicCommand.Open()))
|
||||
{
|
||||
LOG_CONVERT1("DB<EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else if (dynamicCommand.GetParam(8, &logKey))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
switch (lpLog->m_cCmd)
|
||||
{
|
||||
case GAMELOG::CMD::MONSTER_DEAD:
|
||||
LogMonsterDead(logKey, static_cast<const GAMELOG::sMonsterDeadLog*>(lpLog));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
if (0 == (nCount % 1000))
|
||||
{
|
||||
printf("(%d/%d)%s (%d/%d)\n",
|
||||
nFileCount, logFileSet.size(),
|
||||
pos->c_str(), nCount, logPtrArray.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("(%d/%d)%s (%d/%d)\n",
|
||||
nFileCount, logFileSet.size(),
|
||||
pos->c_str(), nCount, logPtrArray.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT CProcessLogToRow::LogMonsterDead(__int64 nLogKey, const GAMELOG::sMonsterDeadLog* lpLog)
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
m_MonsterDeadCmd.SetParam(1, &nLogKey);
|
||||
m_MonsterDeadCmd.SetParam(2, &lpLog->m_dwMonsterCID);
|
||||
m_MonsterDeadCmd.SetParam(3, &lpLog->m_cMonsterLevel);
|
||||
|
||||
if (FAILED(hr = m_MonsterDeadCmd.Open()))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int nCount = 0; nCount < lpLog->m_cDropItemNum; ++nCount)
|
||||
{
|
||||
m_MonsterDropCmd.SetParam(1, &nLogKey);
|
||||
m_MonsterDropCmd.SetParam(2, reinterpret_cast<const int*>(lpLog+1) + nCount);
|
||||
|
||||
if (FAILED(hr = m_MonsterDropCmd.Open()))
|
||||
{
|
||||
LOG_CONVERT1("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : hr:0x%08x", hr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
Reference in New Issue
Block a user