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

1315 lines
31 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"
#include "SysApi.h"
int CDBDataClientHandler::s_nDBHandleSleep = 6;
CDBDataClientHandler::CDBDataClientHandler()
{
m_lStop = 1;
m_lHasStart = 0;
m_bHasReadOp = FALSE;
m_lLogicIsRunning =0; //逻辑处理线程是否在运行中
#ifdef WIN32
m_hStartEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
#else
sem_init( &m_hStartEvent, 0, 0 ) ;
sem_init( &m_hStopEvent, 0, 0 ) ;
#endif
StartWorkThread();
m_sMsgList.setLock(&m_sMsgListLock);
m_sFreeList.setLock(&m_sFreeListLock);
m_memoryTimer =0;
}
CDBDataClientHandler::~CDBDataClientHandler()
{
StopWorkThread();
#ifdef WIN32
CloseHandle(m_hStartEvent);
CloseHandle(m_hStopEvent);
#else
sem_destroy(&m_hStartEvent);
sem_destroy(&m_hStopEvent);
#endif
DestroyPacketList(m_sMsgList);
DestroyPacketList(m_sFreeList);
}
void CDBDataClientHandler::AddMessage(jxSrvDef::INTERSRVCMD nCmd, CDataPacketReader& packet)
{
if (nCmd <= 0 || m_lStop)
return;
if (IsReadCmd(nCmd))
SetReadOpFlag(TRUE);
// construct cache data packet
CDataPacket *cache_pkg = AllocPacket();
if (!cache_pkg)
{
OutputMsg(rmError, _T("DBDataCacheError allocPacket failed"));
return;
}
size_t nLen = packet.getAvaliableLength();
cache_pkg->setLength(nLen + sizeof(WORD));
(*cache_pkg) << nCmd;
cache_pkg->writeBuf(packet.getOffsetPtr(), nLen);
cache_pkg->setPosition(0);
const char* pData = cache_pkg->getMemoryPtr();
// add packet to append list of m_sMsgList
m_sMsgList.append(cache_pkg);
}
void CDBDataClientHandler::Trace()
{
OutputMsg(rmNormal,"--------------CDBDataClientHandler start----------");
m_LogicDBReqHandler.Trace();
m_sActorCacheData.Trace();
INT_PTR msgSize=0,nCount=0;
OutputMsg(rmNormal,"---msg start---");
CBufferAllocator::ALLOCATOR_MEMORY_INFO memoryInfo;
GetBuffAlloc().GetMemoryInfo(&memoryInfo);
OutputMsg(rmNormal,"super alloc=%d,free=%d",(int)memoryInfo.SuperBuffer.dwAllocSize,(int)memoryInfo.SuperBuffer.dwFreeSize);
OutputMsg(rmNormal,"large alloc=%d,free=%d",(int)memoryInfo.LargeBuffer.dwAllocSize,(int)memoryInfo.LargeBuffer.dwFreeSize);
OutputMsg(rmNormal,"middle alloc=%d,free=%d",(int)memoryInfo.MiddleBuffer.dwAllocSize,(int)memoryInfo.MiddleBuffer.dwFreeSize);
OutputMsg(rmNormal,"small alloc=%d,free=%d",(int)memoryInfo.SmallBuffer.dwAllocSize,(int)memoryInfo.SmallBuffer.dwFreeSize);
//消息的长度
for(INT_PTR i=0;i <m_sMsgList.count(); i++ )
{
// get first packet
CDataPacket* packet = m_sMsgList[i];
if(packet)
{
nCount ++;
msgSize += packet->getMemorySize();
}
}
OutputMsg(rmNormal,"msg List Size=%d,packCount=%d",(int)msgSize,(int)nCount);
//freelist长度
msgSize=0;
nCount=0;
for(INT_PTR i=0;i <m_sFreeList.count(); i++ )
{
// get first packet
CDataPacket* packet = m_sFreeList[i];
if(packet)
{
msgSize += packet->getMemorySize();
nCount ++;
}
}
OutputMsg(rmNormal,"free list Size=%d,packCount=%d",(int)msgSize,(int)nCount);
OutputMsg(rmNormal,"---msg end---");
OutputMsg(rmNormal,"--------------CDBDataClientHandler end----------");
}
bool CDBDataClientHandler::IsReadCmd(jxSrvDef::INTERSRVCMD nCmd)
{
bool bResult = false;
switch (nCmd)
{
case dcInitDB:
case dcSetGambleFlag:
case dcUpdateGateUserInfo:
case dcResActorDbSessionData: // 逻辑服务器收到了玩家的数据返回
case dcQuery: // 查询玩家角色数据
case dcQuerySubSystemData:
case dcLoadQuest: // 装载任务数据
case dcLoadDepotItem: // 装载仓库物品数据
case dcLoadBagItem: // 装载背包物品数据
case dcLoadEquipItem: // 装载装备物品数据
case dcLoadActiveBag: // 装载活动背包物品数据
case dcGetActiveItem: // 提取活动物品
case dcDeleteActiveItem: // 删除获取物品
case dcLoadVar: // 加载角色脚本变量数据
case dcLoadGuildList: // 帮派组件读入所有帮派的数据
case dcLoadActorApplyResult: // 玩家申请结果
case dcLoadGuildDetail: // 帮派的详细数据
case dcLoadGuildApplyLists: // 行会申请列表
case dcDealGuildApply: // 处理行会申请
case dcLoadGuildSkill: // 帮派技能的数据
case dcAddGuild: // 增加帮派
case dcDeleteGuild: // 解散帮派
//case dcSaveGuild: // 保存帮派的信息
case dcAddMember: // 增加帮派成员
case dcLoadActorGuild: // 读入个人帮派信息
case dcDeleteMember: // 删除某个成员
case dcAddMemberOffLine: // 帮派增加一个不在线的成员,数据服务器要返回这个成员的详细数据
//case dcSaveGuildSkill: //保存帮派技能信息
case dcInitGuildSkill: //初始化帮派技能
case dcLoadMsg: // 读取用户的消息数据
case dcDeleteMsg: // 删除某条消息
case dcAddMsg: // 增加用户一条信息
case dcAddMsgByActorName:
case dcLoadBaseRank:
//case dcSaveBaseRank:
case dcLoadPetDetailData:
case dcLogout:
case dcLoadRelation:
case dcLoadOfflineUserInfo:
case dcLoadOfflineUserHeroInfo:
case dcLoadGuildDepotItem:
case dcLoadGuildEvent:
case dcLoadGuildDepotRecord:
//case dcSaveGuildDepotRecord:
case dcLoadCombatRankInfo:
case dcLoadCmobatGameInfo:
//case dcSaveCombatGameInfo:
case dcLoadCombatRecord:
//case dcSaveCombatRecord:
case dcUpdateCombatBaseInfo:
case dcLoadFriendsData:
//case dcSaveFriendsData:
case dcDeleteFriendData:
case dcAddFriendChatMsg:
case dcLoadFriendChatMsg:
case dcLoadTopLevelActor:
case dcLoadTopLevelActorData:
case dcLoadActorConsumeRank:
case dcLoadTopicBattleData:
case dcQueryActorExists:
case dcLoadGameSetData:
case dcLoadSwingLevelData:
case dcLoadTopicHeroData:
case dcLoadAllActivityData:
case dcAddFilterWordsMsg:
case dcBackRemoveItem:
case dcBackRemoveMoney:
case dcSendDbServerStopCmd:
case dcLoadCombinLevelActor:
case dcLoadCombinBattleActor:
case dcUpdateActorState:
case dcReloadCrossConfig:
case dcLoadActorBuildingData:
case dcLoadMail: //邮件
case dcSaveOfflineMail:
case dcLoadFriendOffline: //装载N天不上线的玩家
case dcLoadNewTitleData:
case dcLoadDeathData:
case dcLoadDeathDropData:
case dcLoadActivityList:
case dcLoadPersonActivity:
case dcLoadReviveDurationData:
bResult = true;
break;
}
return bResult;
}
/*处理来自于LogicalServer的DB操作请求
有的请求直接操作,有的请求可能先放入缓存,待一段时间后执行
*/
void CDBDataClientHandler::HandleDBMessage(jxSrvDef::INTERSRVCMD nCmd, CDataPacket &packet)
{
unsigned int nActorID = 0;
switch (nCmd)
{
//////////////////////////////////////////////////////////////////////////
// read request
//////////////////////////////////////////////////////////////////////////
case dcInitDB:
{
/*if (m_pClient)
m_pClient->ExecuInitDb(); */
m_LogicDBReqHandler.ExecuInitDb(packet);
m_LogicDBReqHandler.UpdateCharOnlineStatus(0, 0);//启动时清空在线标识,防宕机有留存,暂没支持多服共用一个数据库的情况
break;
}
case dcSetGambleFlag:
{
int nFlag;
packet >> nFlag ;
CDBDataServer::m_bGableIsClose = nFlag ?true:false;
break;
}
case dcUpdateGateUserInfo:
{
//m_pClient->UpdateLogicGateUserInfo(packet);
//m_LogicDBReqHandler.UpdateLogicGateUserInfo(packet);
break;
}
case dcResActorDbSessionData: // 逻辑服务器收到了玩家的数据返回
{
/*if (m_pClient)
m_pClient->OnResponseDbSessionData(packet);*/
m_LogicDBReqHandler.OnResponseDbSessionData(packet);
break;
}
case dcSendDbServerStopCmd:
{
m_LogicDBReqHandler.LogicSendStopDbServerCmd(packet);
break;
}
case dcReloadCrossConfig:
{
m_LogicDBReqHandler.OnReloadCrossConfig(packet);
break;
}
case dcQuery: // 查询玩家角色数据
{
unsigned int nActorId = m_LogicDBReqHandler.QueryActorFromDB(packet);
if (CDBDataServer *pDataServer = CDBServer::s_pDBEngine->getDataServer())
{
pDataServer->m_ActorIdMapLock.Lock();
pDataServer->m_ActorIdMap[nActorId] = true;
pDataServer->m_ActorIdMapLock.Unlock();
}
//if (m_pClient)
//{
// m_pClient->m_LogicDBRequestHandler.QueryActorFromDB(packet);
//}
// //m_pClient->QueryActorFromDB(packet);
//else
// OutputMsg(rmError, _T("dcQuery error, m_pClient is null"));
break;
}
//获取玩家战力排行前1000名的
case dcLoadCombatRankInfo:
{
m_LogicDBReqHandler.LoadActorCombatRank(packet);
break;
}
//职业宗师竞技基本信息
case dcLoadCmobatGameInfo:
{
m_LogicDBReqHandler.LoadActorCombatBaseInfo(packet);
break;
}
case dcUpdateCombatBaseInfo:
{
m_LogicDBReqHandler.UpdateActorCombatAward(packet);
break;
}
//保存职业宗师竞技基本信息
case dcSaveCombatGameInfo:
{
m_sActorCacheData.CacheData(enCT_CombatGameData, packet);
break;
}
//战力竞技日志
case dcLoadCombatRecord:
{
m_LogicDBReqHandler.LoadActorCombatLog(packet);
break;
}
//保存战力竞技日志
case dcSaveCombatRecord:
{
m_sActorCacheData.CacheData(enCT_CombatRecordData, packet);
break;
}
case dcLoadFriendsData:
{
//m_LogicDBReqHandler.LoadActorFriendsData(packet);
break;
}
case dcLoadDeathData:
{
//m_LogicDBReqHandler.LoadActorDeathData(packet);
break;
}
case dcLoadCircleCount:
{
m_LogicDBReqHandler.LoadCircleCount();
break;
}
case dcLoadDeathDropData:
{
m_LogicDBReqHandler.LoadActorDeathDropData(packet);
break;
}
case dcAddFilterWordsMsg:
{
m_LogicDBReqHandler.AddFilterWordsDbMsg(packet);
break;
}
case dcBackRemoveItem:
{
m_LogicDBReqHandler.BackRemoveItem(packet);
break;
}
case dcBackRemoveMoney:
{
m_LogicDBReqHandler.BackRemoveMoney(packet);
break;
}
case dcSaveFriendsData:
{
//m_sActorCacheData.CacheData(enCT_FriendData, packet);
m_LogicDBReqHandler.SaveActorFriendsData(packet);
break;
}
case dcSaveDeathData:
{
//
//m_sActorCacheData.CacheData(enCT_DeathData, packet);
m_LogicDBReqHandler.SaveActorDeathData(packet);
break;
}
case dcSaveDeathDropData:
{
m_sActorCacheData.CacheData(enCT_DeathDropData, packet);
break;
}
case dcDeleteFriendData:
{
m_LogicDBReqHandler.DeleteActorFriendData(packet);
break;
}
case dcAddFriendChatMsg:
{
m_LogicDBReqHandler.AddFriendChatMsg(packet);
break;
}
case dcLoadFriendChatMsg:
{
m_LogicDBReqHandler.LoadFriendChatMsgData(packet);
break;
}
case dcLoadGameSetData:
{
m_LogicDBReqHandler.LoadActorGameSetData(packet);
break;
}
case dcSaveGameSetData:
{
m_sActorCacheData.CacheData(enCT_GameSetData, packet);
//m_LogicDBReqHandler.SaveActorGameSetData(packet);
break;
}
case dcLoadTopLevelActor:
{
m_LogicDBReqHandler.LoadTopLevelActorData(packet);
break;
}
case dcLoadTopLevelActorData:
{
m_LogicDBReqHandler.LoadTopLevelActorOneData(packet);
break;
}
case dcLoadCombinLevelActor:
{
m_LogicDBReqHandler.LoadCombineLevelActorData(packet);
break;
}
case dcLoadCombinBattleActor:
{
m_LogicDBReqHandler.LoadCombineBattleActorData(packet);
break;
}
case dcLoadSwingLevelData:
{
m_LogicDBReqHandler.LoadActorSwingLevelData(packet);
break;
}
case dcLoadTopicHeroData:
{
m_LogicDBReqHandler.LoadActorHeroTopicRankData(packet);
break;
}
case dcLoadAllActivityData:
{
m_LogicDBReqHandler.LoadAllActivityData(packet);
break;
}
case dcLoadActorConsumeRank:
{
m_LogicDBReqHandler.LoadActorConsumeRank(packet);
break;
}
case dcLoadTopicBattleData:
{
m_LogicDBReqHandler.LoadActorTopicBattle(packet);
break;
}
case dcQuerySubSystemData:
{
//if (m_pClient)
// m_pClient->QueryActoSubSystemData(packet); // 装载玩家子系统数据
m_LogicDBReqHandler.QueryActoSubSystemData(packet);
break;
}
case dcLoadQuest: // 装载任务数据
{
/*if (m_pClient)
m_pClient->QueryQuestFromDB(packet);*/
m_LogicDBReqHandler.QueryQuestFromDB(packet);
break;
}
case dcLoadFriendOffline: //装载N天没上线的玩家
{
m_LogicDBReqHandler.LoadFiendOfflineData(packet);
break;
}
case dcLoadDepotItem: // 装载仓库物品数据
{
int nRawServerId = 0, nLoginServerId;
packet >> nRawServerId >> nLoginServerId >> nActorID;
/*if (m_pClient)
m_pClient->QueryItems(nActorID,itItemDepot);*/
m_LogicDBReqHandler.QueryItems(nActorID, itItemDepot, nRawServerId, nLoginServerId);
break;
}
case dcLoadBagItem: // 装载背包物品数据
case dcLoadEquipItem: // 装载装备物品数据
{
break;
}
case dcLoadActiveBag: // 装载活动背包物品数据
{
m_LogicDBReqHandler.LoadUserActiveItem(packet);
/*if (m_pClient)
m_pClient->LoadUserActiveItem(packet);*/
break;
}
case dcGetActiveItem: // 提取活动物品
{
/*if (m_pClient)
m_pClient->GetUserActiveItem(packet);*/
m_LogicDBReqHandler.GetUserActiveItem(packet);
break;
}
case dcDeleteActiveItem: // 删除获取物品
{
/*if (m_pClient)
m_pClient->RemoveUserActiveItem(packet);*/
m_LogicDBReqHandler.RemoveUserActiveItem(packet);
break;
}
case dcLoadVar: // 加载角色脚本变量数据
{
/*if (m_pClient)
m_pClient->QueryActorScriptData(nActorID);*/
m_LogicDBReqHandler.QueryActorScriptData(packet);
break;
}
case dcLoadActivityList:
{
m_LogicDBReqHandler.LoadActivityList(packet);
break;
}
case dcSaveActivityList:
{
m_LogicDBReqHandler.SaveActivityList(packet);
break;
}
case dcLoadPersonActivity:
{
int nRawServerId = 0, nLoginServerId;
packet >> nRawServerId >> nLoginServerId >> nActorID;
m_LogicDBReqHandler.LoadActorActivity(packet, nActorID, nRawServerId, nLoginServerId);
break;
}
case dcSavePersonActivity:
{
int nRawServerId = 0, nLoginServerId;
packet >> nRawServerId >> nLoginServerId >> nActorID;
m_LogicDBReqHandler.SaveActorActivity(packet, nActorID, nRawServerId, nLoginServerId);
break;
}
case dcSaveofflineAchieve:
{
m_LogicDBReqHandler.SaveOfflineAchieveMentInfo(packet);
break;
}
case dcLoadofflineAchieve:
{
m_LogicDBReqHandler.LoadOfflineAchieveMentInfo(packet);
break;
}
case dcLoadGuildList: // 帮派组件读入所有帮派的数据
{
/*if (m_pClient)
m_pClient->LoadGuildList(packet);*/
m_LogicDBReqHandler.LoadGuildList(packet);
break;
}
case dcLoadActorApplyResult: // 全局玩家行会申请结果
{
m_LogicDBReqHandler.LoadActorApplyResult(packet);
break;
}
case dcSaveActorApplyResult:
{
m_LogicDBReqHandler.SaveActorApplyResult(packet);
break;
}
case dcLoadGuildDetail: // 帮派的详细数据
{
/*if (m_pClient)
m_pClient->LoadGuildDetail(packet);*/
m_LogicDBReqHandler.LoadGuildDetail(packet);
break;
}
case dcLoadGuildApplyLists: //加载帮派申请
{
m_LogicDBReqHandler.LoadGuildApplyList(packet);
break;
}
case dcDealGuildApply: //处理帮派申请
{
m_LogicDBReqHandler.DealGuildApply(packet);
break;
}
case dcLoadGuildSkill: //帮派技能的数据
{
/*if (m_pClient)
m_pClient->LoadGuildSkillDb(packet);*/
m_LogicDBReqHandler.LoadGuildSkillDb(packet);
break;
}
case dcLoadActorBuildingData:
{
m_LogicDBReqHandler.LoadActorBuildingDb(packet);
break;
}
case dcAddGuild: // 增加帮派
{
/*if (m_pClient)
m_pClient->AddGuild(packet);*/
m_LogicDBReqHandler.AddGuild(packet);
break;
}
case dcDeleteGuild: // 解散帮派
{
/*if (m_pClient)
m_pClient->DeleteGuild(packet);*/
m_LogicDBReqHandler.DeleteGuild(packet);
break;
}
case dcSaveGuild: // 保存帮派的信息
{
/*if (m_pClient)
m_pClient->SaveGuild(packet);*/
m_LogicDBReqHandler.SaveGuild(packet);
break;
}
case dcAddMember: // 增加帮派成员
{
/*if (m_pClient)
m_pClient->AddGuildMember(packet);*/
m_LogicDBReqHandler.AddGuildMember(packet);
break;
}
case dcSaveGuildSkill: // 增加帮派成员
{
/*if (m_pClient)
m_pClient->SaveGuildSkill(packet);*/
m_LogicDBReqHandler.SaveGuildSkill(packet);
break;
}
case dcSaveGuildEvent:
{
/*if (m_pClient)
m_pClient->SaveGuildEventDb(packet);*/
m_LogicDBReqHandler.SaveGuildEventDb(packet);
break;
}
case dcSaveGuildDepotItem:
{
m_LogicDBReqHandler.SaveGuildDepotDb(packet);
break;
}
case dcLoadGuildDepotItem:
{
m_LogicDBReqHandler.LoadGuildDepoyFromDb(packet);
break;
}
case dcLoadGuildDepotRecord:
{
m_LogicDBReqHandler.LoadGuildDepotRecordDb(packet);
break;
}
case dcSaveGuildDepotRecord:
{
m_LogicDBReqHandler.SaveGuildDepotRecordDb(packet);
break;
}
case dcLoadGuildEvent:
{
/*if (m_pClient)
m_pClient->LoadGuildEventDb(packet);*/
m_LogicDBReqHandler.LoadGuildEventDb(packet);
break;
}
case dcInitGuildSkill: //初始化帮派技能
{
/*if (m_pClient)
m_pClient->InitGuildSkillInfo(packet);*/
m_LogicDBReqHandler.InitGuildSkillInfo(packet);
break;
}
case dcLoadActorGuild: // 读入个人帮派信息
{
break;
}
case dcDeleteMember: // 删除某个成员
{
/*if (m_pClient)
m_pClient->DeleteMember(packet);*/
m_LogicDBReqHandler.DeleteMember(packet);
break;
}
case dcAddMemberOffLine: // 帮派增加一个不在线的成员,数据服务器要返回这个成员的详细数据
{
/*if (m_pClient)
m_pClient->AddMemberOffLine(packet);*/
m_LogicDBReqHandler.AddMemberOffLine(packet);
break;
}
case dcLoadMsg: // 读取用户的消息数据
{
/*if (m_pClient)
m_pClient->LoadMsgList(packet);*/
m_LogicDBReqHandler.LoadMsgList(packet);
break;
}
case dcDeleteMsg: // 删除某条消息
{
/*if (m_pClient)
m_pClient->DeleteMsg(packet);*/
m_LogicDBReqHandler.DeleteMsg(packet);
break;
}
case dcAddMsg: // 增加用户一条信息
{
/*if (m_pClient)
m_pClient->AddMsg(packet);*/
m_LogicDBReqHandler.AddMsg(packet);
break;
}
case dcAddMsgByActorName:
{
/*if (m_pClient)
m_pClient->AddMsgByName(packet);*/
m_LogicDBReqHandler.AddMsgByName(packet);
break;
}
case dcLoadBaseRank:
{
/*if (m_pClient)
m_pClient->LoadBaseRank(packet); */
m_LogicDBReqHandler.LoadBaseRank(packet);
break;
}
case dcSaveBaseRank:
{
/*if (m_pClient)
m_pClient->SaveBaseRank(packet); */
m_sActorCacheData.SaveAllActorDataImmediately();
m_LogicDBReqHandler.SaveBaseRank(packet);
break;
}
case dcSaveBaseRankCS://跨服的排行榜保存数据
{
OutputMsg(rmTip,"[dcSaveBaseRankCS]1 跨服的排行榜保存数据 !" );
m_sActorCacheData.SaveAllActorDataImmediately();
m_LogicDBReqHandler.SaveBaseRankCS(packet);
break;
}
case dcLoadPetDetailData:
{
//QueryPetDetailData(inPacket);
break;
}
case dcSaveRelation:
{
/*if(m_pClient)
m_pClient->SaveRelation(packet);*/
m_LogicDBReqHandler.SaveRelation(packet);
break;
}
case dcSaveOfflineInfo:
{
m_LogicDBReqHandler.SaveOfflineActorProperty(packet);
break;
}
case dcSaveCustomInfo:
{
m_LogicDBReqHandler.SaveActorCustomInfo(packet);
break;
}
case dcSaveCustomInfoUnForbid:
{
m_LogicDBReqHandler.SaveActorCustomInfoUnForbid(packet);
break;
}
case dcSaveCustomInfoCustomTitleId:
{
m_LogicDBReqHandler.SaveActorCustomInfoCustomTitleId(packet);
break;
}
case dcLoadCustomInfo:
{
m_LogicDBReqHandler.QueryActorCustomInfo(packet);
break;
}
case dcLoadCustomInfoUnForbid:
{
m_LogicDBReqHandler.QueryActorCustomInfoUnForbid(packet);
break;
}
case dcLoadCustomInfoCustomTitleId:
{
m_LogicDBReqHandler.QueryActorCustomInfoCustomTitleId(packet);
break;
}
case dcLoadOfflineUserInfo:
{
/*if(m_pClient)
m_pClient->QueryOfflineUserInfo(packet);*/
m_LogicDBReqHandler.QueryOfflineUserInfo(packet);
break;
}
case dcLoadOfflineUserHeroInfo:
{
/*if(m_pClient)
m_pClient->QueryOfflineUserInfo(packet);*/
m_LogicDBReqHandler.QueryOfflineUserHeroInfo(packet);
break;
}
case dcUpdateChallengeData:
{
//if (m_pClient)
//{
// // 即时保存数据
// m_sActorCacheData.SaveAllActorDataImmediately();
// m_pClient->UpdateChallengeData(packet);
//}
m_sActorCacheData.SaveAllActorDataImmediately();
m_LogicDBReqHandler.UpdateChallengeData(packet);
break;
}
case dcSaveStaticCount:
{
m_LogicDBReqHandler.SaveActorStaticCounts(packet);
break;
}
case dcSaveActorStrengthenInfo:
{
m_LogicDBReqHandler.SaveActorStrengthenInfo(packet);
break;
}
//////////////////////////////////////////////////////////////////////////
// write request
//////////////////////////////////////////////////////////////////////////
case dcLogout:
{
m_sActorCacheData.OnActorLogout(packet);
break;
}
case dcSave: // 保存角色基本数据
{
m_sActorCacheData.CacheData(enCT_ActorBasicData, packet);
break;
}
case dcSaveQuest: // 保存角色任务数据
{
m_sActorCacheData.CacheData(enCT_QuestData, packet);
break;
}
case dcSaveSkill: // 保存角色技能数据
{
m_sActorCacheData.CacheData(enCT_SkillData, packet);
break;
}
case dcSaveOtherGameSets: // 保存游戏新设置数据
{
m_sActorCacheData.CacheData(enCT_GameOtherSetData, packet);
break;
}
case dcSaveDepotItem: // 保存仓库物品13
{
m_sActorCacheData.CacheData(enCT_DepotItemData, packet);
break;
}
case dcSaveBagItem: // 保存背包物品数据
{
m_LogicDBReqHandler.SaveItems(packet);
//m_sActorCacheData.CacheData(enCT_BagItemData, packet);
break;
}
case dcSaveEquipItem: // 保存装备物品
{
// m_sActorCacheData.CacheData(enCT_EquipItemData, packet);
m_LogicDBReqHandler.SaveItems(packet);
break;
}
case dcSaveHeroItem: // 保存宠物的装备
{
m_sActorCacheData.CacheData(enCT_PetItemData, packet);
break;
}
case dcSaveVar: // 保存角色脚本变量
{
m_sActorCacheData.CacheData(enCT_ScriptData, packet);
break;
}
case dcSaveActorGuild: // 保存个人帮派信息
{
m_sActorCacheData.CacheData(enCT_GuildData, packet);
break;
}
case dcSaveHeroData:
{
m_sActorCacheData.CacheData(enCT_PetData, packet);
break;
}
case dcSaveHeroSkillData:
{
m_sActorCacheData.CacheData(enCT_PetSkillData, packet);
break;
}
case dcQueryActorExists:
{
m_LogicDBReqHandler.QueryActorExists(packet);
break;
}
case dcUpdateActorState:
{
m_LogicDBReqHandler.UpdateCharStatus(packet);
break;
}
case dcLoadMail:
{
m_LogicDBReqHandler.LoadActorMail(packet);
break;
}
case dcSaveMail:
{
m_LogicDBReqHandler.SaveActorMail(packet);
break;
}
case dcSaveOfflineMail:
{
m_LogicDBReqHandler.AddActorOfflineMail(packet);
break;
}
case dcLoadNewServerMail:
{
int nServerId = 0, nRawServerId = 0;
packet >> nRawServerId >> nServerId;
int nMaxServerMailId = 0;
packet >> nMaxServerMailId;
m_LogicDBReqHandler.LoadNewServerMail(nServerId, nRawServerId, nMaxServerMailId);
break;
}
case dcSaveNewServerMail:
{
m_LogicDBReqHandler.SaveNewServerMail(packet);
break;
}
case dcAddNewServerMail:
{
m_LogicDBReqHandler.AddNewServerMail(packet);
break;
}
case dcSaveAlmirahItem: // 保存装备物品
{
m_sActorCacheData.CacheData(enCT_AlmirahItemData, packet);
break;
}
case dcLoadNewTitleData:
{
m_LogicDBReqHandler.LoadActorNewTitleData(packet);
break;
}
case dcSaveNewTitleData:
{
m_LogicDBReqHandler.SaveActorNewTitleData(packet);
break;
}
case dcSaveConsignmentItem:
{
m_LogicDBReqHandler.SaveConsignmentItem(packet);
break;
}
case dcLoadConsignmentItem:
{
m_LogicDBReqHandler.LoadConsignmentItem(packet);
break;
}
case dcSaveActorConsignment:
{
m_sActorCacheData.CacheData(enCT_ConsignData, packet);
break;
}
case dcLoadConsignmentIncome:
{
m_LogicDBReqHandler.LoadConsignmentIncome(packet);
break;
}
case dcSaveAchieveMent:
{
m_LogicDBReqHandler.SaveActorAchieveMentInfo(packet);
break;
}
case dcLoadFee:
{
int nRawServerId = 0, nLoginServerId;
packet >> nRawServerId >> nLoginServerId >> nActorID;
m_LogicDBReqHandler.LoadFee(packet, nActorID, nRawServerId, nLoginServerId);
break;
}
case dcClearFee:
{
int nRawServerId = 0, nLoginServerId;
packet >> nRawServerId >> nLoginServerId >> nActorID;
m_LogicDBReqHandler.DelFee(packet, nActorID, nRawServerId, nLoginServerId);
break;
}
case dcLoadGhostInfo:
{
m_LogicDBReqHandler.LoadActorGhost(packet);
break;
}
case dcSaveGhostInfo:
{
m_LogicDBReqHandler.SaveActorGhost(packet);
break;
}
case dcLoadCrossGuildId:
{
m_LogicDBReqHandler.LoadCrossGuildId(packet);
break;
}
case dcSaveHallowsSystemInfo:
{
m_LogicDBReqHandler.SaveHallowsSystemInfo(packet);
break;
}
case dcLoadHallowsSystemInfo:
{
m_LogicDBReqHandler.LoadHallowsSystemInfo(packet);
break;
}
case dcLoadReviveDurationData:
{
m_LogicDBReqHandler.LoadReviveDurationSystemInfo(packet);
break;
}
case dcSaveReviveDurationData:
{
m_LogicDBReqHandler.SaveReviveDurationSystemInfo(packet);
break;
}
case dcSaveLootPetData:
{
m_LogicDBReqHandler.SaveLootPetToDB(packet);
break;
}
case dcLoadRebateData:
{
m_LogicDBReqHandler.QueryRebateData(packet);
break;
}
case dcLoadNextDayRebateData:
{
m_LogicDBReqHandler.QueryNextDayRebateData(packet);
break;
}
case dcUpdateRebateData:
{
m_LogicDBReqHandler.UpdateRebateData(packet);
break;
}
case dcSaveRebateData:
{
m_LogicDBReqHandler.SaveRebateToDB(packet);
break;
}
case dcClearRebateData:
{
m_LogicDBReqHandler.ClearRebateData(packet);
break;
}
case dcBackChangeTradingQuota:
{
m_LogicDBReqHandler.ChangeActorTradingQuota(packet);
break;
}
case dcLoadCustomTitleData:
{
m_LogicDBReqHandler.LoadActorCustomTitleData(packet);
break;
}
case dcSaveCustomTitleData:
{
m_LogicDBReqHandler.SaveActorCustomTitleData(packet);
break;
}
// case dcLoadBossInfo:
// {
// m_LogicDBReqHandler.LoadBossList(packet);
// break;
// }
// case dcSaveBossInfo:
// {
// m_LogicDBReqHandler.SaveBossList(packet);
// break;
// }
default:
OutputMsg(rmError, _T("%s recv unknown dbrequest cmd[id=%d]"), __FUNCTION__, (int)nCmd);
break;
}
}
bool CDBDataClientHandler::Start(ILogicDBRequestHost* pHost, CSQLConenction *lpSQLConnection)
{
m_pHost = pHost;
m_LogicDBReqHandler.SetRequestHost(m_pHost);
m_LogicDBReqHandler.SetSQLConnection(lpSQLConnection);
m_sActorCacheData.SetDBClient(m_pHost, this);
if (TRUE == ::InterlockedCompareExchange(&m_lStop, FALSE, TRUE))
{
#ifdef WIN32
ResetEvent(m_hStopEvent);
#endif
//如果已经启动了,则不需要等待
if(FALSE== ::InterlockedCompareExchange(&m_lHasStart, TRUE, FALSE) )
{
//如果已经启动了,那么就不等待了
if( TRUE== ::InterlockedCompareExchange(&m_lLogicIsRunning, TRUE, TRUE) )
{
}
else
{
OutputMsg(rmNormal, _T("Mgr Start: wait for StartEvent 1 minutes ,CurThreadId=%d"), GetCurrentThreadId());
#ifdef WIN32
WaitForSingleObject(m_hStartEvent, 60000);
#else
struct timespec tm ;
clock_gettime(CLOCK_REALTIME, &tm);
tm.tv_sec += 60;
sem_timedwait(&m_hStartEvent, &tm);
#endif
}
}
else
{
OutputMsg(rmNormal, _T("Mgr Start: ThreadLogicProc has Start already. CurThreadId=%d"), GetCurrentThreadId());
}
OutputMsg(rmNormal, _T("Mgr Start: finish and return, CurThreadId=%d"), GetCurrentThreadId());
return true;
}
else
{
::InterlockedCompareExchange(&m_lHasStart, TRUE, FALSE);
OutputMsg(rmNormal, _T("Mgr Start: ThreadLogicProc Is Running Already,CurThreadId=%d"),GetCurrentThreadId());
return false;
}
}
bool CDBDataClientHandler::Stop()
{
::InterlockedCompareExchange(&m_lHasStart,FALSE , TRUE);
if (FALSE == ::InterlockedCompareExchange(&m_lStop, TRUE, FALSE))
{
StopWorkThread();
#ifdef WIN32
ResetEvent(m_hStartEvent);
#endif
//如果已经退出了就不等待了,否则等待3分钟防止线程异常退出的时候没有信号的情况
//如果已经在运行,则等待,否则直接退出
if( TRUE== ::InterlockedCompareExchange(&m_lLogicIsRunning, TRUE, TRUE) )
{
OutputMsg(rmNormal, _T("Mgr Stop: CurThreadId=%d,wait for ThreadLogicProc quit 4 minuts..."), GetCurrentThreadId());
#ifdef WIN32
WaitForSingleObject(m_hStopEvent, 240000);
#else
struct timespec tm ;
clock_gettime(CLOCK_REALTIME, &tm);
tm.tv_sec += 240;
sem_timedwait(&m_hStopEvent, &tm);
#endif
}
OutputMsg(rmNormal, _T("Mgr Stop: finish and return. CurThreadId=%d"), GetCurrentThreadId());
return true;
}
else
{
OutputMsg(rmNormal, _T("Mgr Stop: ThreadLogicProc Is Stopped Already, CurThreadId=%d"),GetCurrentThreadId());
return false;
}
}
void CDBDataClientHandler::OnRountine()
{
//如果没有启动的话,则长期等待
Sleep(1000);
while( FALSE== ::InterlockedCompareExchange(&m_lHasStart,FALSE , FALSE))
{
Sleep(50);
}
#ifdef WIN32
SetEvent(m_hStartEvent);
#else
sem_post(&m_hStartEvent);
#endif
::InterlockedCompareExchange(&m_lLogicIsRunning,TRUE , FALSE);
ThreadLogicProc();
::InterlockedCompareExchange(&m_lLogicIsRunning, FALSE, TRUE);
#ifdef WIN32
SetEvent(m_hStopEvent);
#else
sem_post(&m_hStopEvent);
#endif
}
void CDBDataClientHandler::ThreadLogicProc()
{
OutputMsg(rmNormal, _T("ThreadLogicProc Start! CurThreadId=%d"), GetCurrentThreadId());
while (!m_lStop)
{
RunOne();
Sleep(s_nDBHandleSleep);
}
// call before quit thread
m_sActorCacheData.SaveAllActorDataImmediately();
OutputMsg(rmNormal, _T("ThreadLogicProc Stop! curThreadId=%d"), GetCurrentThreadId());
}
void CDBDataClientHandler::RunOne()
{
#ifdef _USE_TRY_CATCH
__try
{
#endif
TICKCOUNT tc = _getTickCount();
// append write list to read list
if (m_sMsgList.appendCount() > 0)
m_sMsgList.flush();
// iterate all data in list, this is high priority
while (m_sMsgList.count() > 0)
{
// get first packet
CDataPacket* packet = m_sMsgList[0];
jxSrvDef::INTERSRVCMD nCmd;
*packet >> nCmd;
// handle packet
HandleDBMessage(nCmd, *packet);
// free packet
m_sMsgList.remove(0);
FreePacket(packet);
}
// for write handle, this is low priority
SetReadOpFlag(FALSE);
m_sActorCacheData.RunOne(tc);
if(m_memoryTimer <= tc)
{
m_memoryTimer = tc + 300000; //5分钟
CheckMemory(false);
}
#ifdef _USE_TRY_CATCH
}
__except(CustomExceptHandler(GetExceptionInformation()))
{
/*
CSQLConenction* pConnect = m_LogicDBReqHandler.GetSqlConnection();
if(pConnect)
{
pConnect->ResetQuery(); //释放以避免死锁
}
*/
}
#endif
}
CDataPacket* CDBDataClientHandler::AllocPacket()
{
// here code is same to following, don't merge because of efficient thinking
if (m_sFreeList.count() > 0)
{
CDataPacket* pkg = m_sFreeList.pop();
pkg->setLength(0);
return pkg;
}
if (m_sFreeList.appendCount() > 0)
m_sFreeList.flush();
if (m_sFreeList.count() <= 0 )
allocSendPacketList(m_sFreeList, 512);
CDataPacket* pkg = m_sFreeList.pop();
pkg->setLength(0);
return pkg;
}
void CDBDataClientHandler::FreePacket(CDataPacket* packet)
{
m_sFreeList.append(packet);
}
void CDBDataClientHandler::DestroyPacketList(CQueueList<CDataPacket*>& pkgList)
{
if (pkgList.appendCount() > 0)
pkgList.flush();
for (INT_PTR i = pkgList.count()-1; i >= 0; i--)
{
CDataPacket* pkg = pkgList[i];
pkg->~CDataPacket();
}
pkgList.clear();
}