Files
mir_server/server/LocalLogServer/LocalLogClientSocket.cpp

514 lines
13 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#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();
}
}
}
}