Files
mir_server/server/LocalLogServer/LocalLogClientSocket.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

514 lines
13 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
using namespace jxSrvDef;
int CLocalLogClientSocket::g_nSpid = 0;
CLocalLogClientSocket::CLocalLogClientSocket(void)
{
m_nextCreateTtableTick = 0;
}
CLocalLogClientSocket::CLocalLogClientSocket(CLocalLogServerSocket* pSrv,SOCKET nSocket, SOCKADDR_IN *pClientAddr)
{
this->pSrv = pSrv;
this->m_pSQLConnection = pSrv->GetSqlConnection();
this->SetClientSocket(nSocket,pClientAddr);
m_nextCreateTtableTick = 0;
}
CLocalLogClientSocket::~CLocalLogClientSocket(void)
{
OutputMsg(rmTip,_T("log client[%s] Destroy"),getClientName());
for(int i = 0; i < m_dataList.count(); i++)
{
CDataPacket* dp = m_dataList[i];
dp->setPosition(0);
flushSendPacket(*dp);
}
m_dataList.clear();
for(int i = 0; i < m_freeDataList.count(); i++)
{
CDataPacket* dp = m_freeDataList[i];
dp->setPosition(0);
flushSendPacket(*dp);
}
m_freeDataList.clear();
}
bool CLocalLogClientSocket::OnValidateRegData(const jxSrvDef::PSERVER_REGDATA pRegData)
{
//游戏服和db能够登陆
if ( pRegData && pRegData->GameType == SERVER_REGDATA::GT_JianXiaoJiangHu &&
( pRegData->ServerType == GameServer || pRegData->ServerType == DBServer
|| pRegData->ServerType == SessionServer) )
{
return true;
}
else
{
return false;
}
}
VOID CLocalLogClientSocket::OnRun()
{
Inherited::OnRun();
//没有连接上就不处理
/*
if(!m_pSQLConnection->Connected())
{
return;
}
*/
char sBuf[1024];
char szSql[2048];
sBuf[0] = 0;
szSql[0] = 0;
int nSpid = 0,nServerIndex = 0;
int nSrvId = 0;
SYSTEMTIME st;
GetLocalTime(&st);
//OutputMsg(rmTip,"SingleRun thread id=%d",(int)GetCurrentThread());
jxSrvDef::INTERSRVCMD nCmd =0;
TICKCOUNT nStartTick = _getTickCount(); //获取当前的时间tick
while(m_dataList.count() >0)
{
CDataPacket* pDataPatck = m_dataList[0];
CDataPacketReader inPacket(pDataPatck->getMemoryPtr(),pDataPatck->getPosition());
inPacket >> nCmd ;
#ifdef WIN32
__try
#endif
{
bool canExec = false;
switch(nCmd)
{
case LOG_CREATETABLE_CMD:
{
CreateCommonTable(inPacket);
break;
}
case LOG_SEND_CURRENCY_CMD: //发送资产日志
{
LOGCURRENCY data;
inPacket >> data;
inPacket >> nSpid;
inPacket >> nServerIndex;
inPacket >> nSrvId;
data.szName[sizeof(data.szName) -1]=0;
data.szAccount[sizeof(data.szAccount) -1]=0;
sprintf(szSql,m_szInsertCurrency,st.wYear,st.wMonth,
(int)data.nLogId,(int)data.nLogType,(int)data.nCurrencyType,data.nAmount,data.nBalance,(int)data.nIsShop,
data.szAccount,data.nActorid,data.szName,nServerIndex,nSrvId);
//OutputMsg(rmTip,"资产日志:%s",szSql);
canExec = true;
break;
}
case LOG_SEND_SHOP_CMD: //发送商城日志
{
LOGSHOP data;
inPacket >> data;
inPacket >> nSpid;
inPacket >> nServerIndex;
inPacket >> nSrvId;
data.szName[sizeof(data.szName) -1]=0;
data.szAccount[sizeof(data.szAccount) -1]=0;
sprintf(szSql,m_szInsertShop,st.wYear,st.wMonth,
(int)data.nShopType,(int)data.nItemId,(int)data.nItemType,(int)data.nItemNum,(int)data.nCurrencyType,data.nConsumeNum,
data.szAccount,data.nActorid,data.szName,nServerIndex,nSrvId);
canExec = true;
break;
}
case LOG_SEND_ITEM_CMD: //发送道具日志
{
LOGITEM data;
inPacket >> data;
inPacket >> nSpid;
inPacket >> nServerIndex;
inPacket >> nSrvId;
data.szName[sizeof(data.szName) -1]=0;
data.szAccount[sizeof(data.szAccount) -1]=0;
data.sReason[sizeof(data.sReason) -1]=0;
sprintf(szSql,m_szInsertItem,st.wYear,st.wMonth,
(int)data.nItemId,(int)data.nItemType,(int)data.nItemNum,(int)data.nOperType,data.sReason,
data.szAccount,data.nActorid,data.szName,nServerIndex,nSrvId);
canExec = true;
break;
}
case LOG_SEND_TASK_CMD: //发送任务日志
{
LOGTASK data;
inPacket >> data;
inPacket >> nSpid;
inPacket >> nServerIndex;
inPacket >> nSrvId;
data.szName[sizeof(data.szName) -1]=0;
data.szAccount[sizeof(data.szAccount) -1]=0;
sprintf(szSql,m_szInsertTask,st.wYear,st.wMonth,
(int)data.nTaskId,(int)data.nTaskType,(int)data.nStatu,
data.szAccount,data.nActorid,data.szName,nServerIndex,nSrvId);
canExec = true;
break;
}
case LOG_SEND_ACTIVITY_CMD: //发送活动日志
{
LOGACTIVITY data;
inPacket >> data;
inPacket >> nSpid;
inPacket >> nServerIndex;
inPacket >> nSrvId;
data.szName[sizeof(data.szName) -1]=0;
data.szAccount[sizeof(data.szAccount) -1]=0;
sprintf(szSql,m_szInsertActivity,st.wYear,st.wMonth,
(int)data.nAtvId,(int)data.nAtvType,(int)data.nStatu,
data.szAccount,data.nActorid,data.szName,nServerIndex,nSrvId);
canExec = true;
break;
}
default:
break;
}
if (canExec)
{
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else m_pSQLConnection->ResetQuery();
}
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
m_pSQLConnection->ResetQuery();
}
#endif
m_freeDataList.add(pDataPatck);
m_dataList.remove(0); // 删除此消息
//如果执行的时间大于200毫秒则退出执行
TICKCOUNT nCurrentTick = _getTickCount() ;
if(nCurrentTick - nStartTick > 200)
{
break;
}
}
}
VOID CLocalLogClientSocket::OnDispatchRecvPacket(const jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader &inPacket)
{
if (!pSrv || nCmd ==0)
{
return;
}
#ifdef WIN32
__try
#endif
{
//如果数据不够每次都申请512个数据包
if(m_freeDataList.count() <=0 )
{
allocSendPacketList(m_freeDataList, 512);
}
CDataPacket* pDataPatck = m_freeDataList.pop();//得到一个空闲的Datapacket
pDataPatck->setPosition(0);
//TRACE("free m_TempData:%d\n",(int)(m_TempData));
//复制到内存块中
(*pDataPatck) << nCmd;
pDataPatck->writeBuf(inPacket.getOffsetPtr(),inPacket.getLength());
m_dataList.add(pDataPatck);
//OutputMsg(rmTip,"OnDispatchRecvPacket thread id=%d,ncmd=%d",(int)GetCurrentThread(),(int)nCmd);
//每次都申请一批数据包
/*
*/
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
}
#endif
}
VOID CLocalLogClientSocket::InsertCommon(CDataPacketReader &inPacket)
{
LOGGERDATACOMMON data;
inPacket >> data;
int nSpid = 0;
inPacket >> nSpid;
if(g_nSpid > 0 && nSpid <= 0)
{
nSpid = g_nSpid;
}
int nServerIndex = 0;
inPacket >> nServerIndex;
data.szShortStr0[sizeof(data.szShortStr0) -1]=0;
data.szShortStr1[sizeof(data.szShortStr1) -1]=0;
data.szMidStr0[sizeof(data.szMidStr0) -1]=0;
data.szMidStr1[sizeof(data.szMidStr1) -1]=0;
data.szMidStr2[sizeof(data.szMidStr2) -1]=0;
data.szLongStr0[sizeof(data.szLongStr0) -1]=0;
data.szLongStr1[sizeof(data.szLongStr1) -1]=0;
data.szLongStr2[sizeof(data.szLongStr2) -1]=0;
data.szName[sizeof(data.szName) -1] =0;
data.szAccount[sizeof(data.szAccount) -1] =0;
data.szSpid[sizeof(data.szSpid)-1] = 0;
SYSTEMTIME st;
GetLocalTime(&st);
char szSql[2048];
sprintf(szSql,m_szCommonLogSql,nSpid,data.nServerIndex,st.wYear,st.wMonth,st.wDay,
data.nLogid,data.nActorid,data.szName,data.szAccount,data.nServerIndex,
data.nPara0,data.nPara1,data.nPara2,
data.szShortStr0,data.szShortStr1,
data.szMidStr0,data.szMidStr1,data.szMidStr2,
data.szLongStr0,data.szLongStr1,data.szLongStr2,data.szSpid);
int nResult = m_pSQLConnection->RealExec(szSql,strlen(szSql));
BOOL bReturn = FALSE;
if (nResult != 0)
{
//执行插入操作出错,要记录文本日志
OutputMsg( rmError, _T("exec sql error!!:%s"),szSql);
}
else
{
//释放结果集
m_pSQLConnection->ResetQuery();
}
}
VOID CLocalLogClientSocket::CreateCommonTable(CDataPacketReader &inPacket)
{
int nSpid = 0;
inPacket >> nSpid;
if(g_nSpid > 0 && nSpid <= 0)
{
nSpid = g_nSpid;
}
int nServerIndex = 0;
inPacket >> nServerIndex;
TICKCOUNT nCurrentTick = _getTickCount();
if(nCurrentTick < m_nextCreateTtableTick)
{
return;
}
int nCount = 0;
const int TOTAL = 3600;
SYSTEMTIME Systime;
GetLocalTime( &Systime );
WORD nDay = Systime.wDay;
WORD nMonth = Systime.wMonth;
WORD nYear = Systime.wYear;
bool isSucceed= true; //是否都执行成功
#ifdef WIN32
__try
#endif
{
//生成未来2个月的表格
for(int i = 0; i < 2; i++)
{
// 创建资产日志表
if (m_pSQLConnection->Exec(m_szCreateCurrency,nYear,nMonth) != 0)
{
//失败
OutputMsg(rmError,_T("建表资产表失败sql:%s"),m_szCreateCurrency);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
// 创建商城日志表
if (m_pSQLConnection->Exec(m_szCreateShop,nYear,nMonth) != 0)
{
//失败
OutputMsg(rmError,_T("建表商城表失败sql:%s"),m_szCreateShop);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
// 创建道具日志表
if (m_pSQLConnection->Exec(m_szCreateItem,nYear,nMonth) != 0)
{
//失败
OutputMsg(rmError,_T("建表道具表失败sql:%s"),m_szCreateItem);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
// 创建任务日志表
if (m_pSQLConnection->Exec(m_szCreateTask,nYear,nMonth) != 0)
{
//失败
OutputMsg(rmError,_T("建表任务表失败sql:%s"),m_szCreateTask);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
// 创建活动日志表
if (m_pSQLConnection->Exec(m_szCreateActivity,nYear,nMonth) != 0)
{
//失败
OutputMsg(rmError,_T("建表活动表失败sql:%s"),m_szCreateActivity);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
if (m_pSQLConnection->Exec(m_szCreateRechargeAll) != 0)
{
OutputMsg(rmError,_T("建表充值查询表失败sql:%s"),m_szCreateRechargeAll);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
if (m_pSQLConnection->Exec(m_szCreateRoleAll) != 0)
{
OutputMsg(rmError,_T("建表角色查询表失败sql:%s"),m_szCreateRoleAll);
isSucceed =false;
}
else m_pSQLConnection->ResetQuery();
//下一月
nMonth++;
if (nMonth > 12)
{
nMonth = 1;
nYear++;
}
}
DeleteCommonTable(nSpid,nServerIndex);
if(isSucceed)
{
m_nextCreateTtableTick = nCurrentTick + CREATE_LOCALTABLE_INTERVAL ; //下次调用是10天以后的事情
}
}
#ifdef WIN32
__except(DefaultExceptHandler(GetExceptionInformation()))
{
m_pSQLConnection->ResetQuery();
m_nextCreateTtableTick =0;
}
#endif
}
VOID CLocalLogClientSocket::DeleteCommonTable(int nSpid,int nServerIndex)
{
struct tm;
SYSTEMTIME Systime;
GetLocalTime( &Systime );
int nDay = Systime.wDay;
int nMonth = Systime.wMonth;
int nYear = Systime.wYear;
nMonth -= 2;
if(nMonth <= 0)
{
nMonth += 12;
nYear--;
}
for(int j=1;j<=nMonth;j++)
{
char szSql[1024];
// 删除旧的资产日志表
OutputMsg(rmTip,"删表 currency_%d%02d",nYear,j);
sprintf(szSql,m_szDeleteCurrency,nYear,j);
if (m_pSQLConnection->RealExec(szSql,strlen(szSql)))
{
OutputMsg(rmError,_T("删表失败sql:%s"),szSql);//失败
}
else m_pSQLConnection->ResetQuery();
// 删除旧的商城日志表
OutputMsg(rmTip,"删表 shop_%d%02d",nYear,j);
sprintf(szSql,m_szDeleteShop,nYear,j);
if (m_pSQLConnection->RealExec(szSql,strlen(szSql)))
{
OutputMsg(rmError,_T("删表失败sql:%s"),szSql);//失败
}
else m_pSQLConnection->ResetQuery();
// 删除旧的道具日志表
OutputMsg(rmTip,"删表 item_%d%02d",nYear,j);
sprintf(szSql,m_szDeleteItem,nYear,j);
if (m_pSQLConnection->RealExec(szSql,strlen(szSql)))
{
OutputMsg(rmError,_T("删表失败sql:%s"),szSql);//失败
}
else m_pSQLConnection->ResetQuery();
// 删除旧的任务日志表
OutputMsg(rmTip,"删表 task_%d%02d",nYear,j);
sprintf(szSql,m_szDeleteTask,nYear,j);
if (m_pSQLConnection->RealExec(szSql,strlen(szSql)))
{
OutputMsg(rmError,_T("删表失败sql:%s"),szSql);//失败
}
else m_pSQLConnection->ResetQuery();
// 删除旧的活动日志表
OutputMsg(rmTip,"删表 activity_%d%02d",nYear,j);
sprintf(szSql,m_szDeleteActivity,nYear,j);
if (m_pSQLConnection->RealExec(szSql,strlen(szSql)))
{
OutputMsg(rmError,_T("删表失败sql:%s"),szSql);//失败
}
else m_pSQLConnection->ResetQuery();
}
//DelLastYearTable(nSpid,nServerIndex);
}
void CLocalLogClientSocket::DelLastYearTable(int nSpid,int nServerIndex)
{
int nMonth = 12;
int nYear = 2012;
for(int j=1;j<=nMonth;j++)
{
for(int i=0;i<30;i++)
{
char date[20];
sprintf(date,"%d%d%d",nYear,j,i);
char szSql[1024];
sprintf(szSql,m_szDeleteCommonSql,nSpid,nServerIndex,nYear,j,i);
//OutputMsg(rmTip,"删表 szSql=%s",szSql);
if (m_pSQLConnection->RealExec(szSql,strlen(szSql)))
{
//失败
OutputMsg(rmError,_T("删表失败sql:%s"),szSql);
}
else
{
m_pSQLConnection->ResetQuery();
}
}
}
}