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

191 lines
4.2 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 jxInterSrvComm::DbServerProto;
const char sGlobalVarFile[] = "./data/runtime/globalVar_";
CGlobalVarMgr::CGlobalVarMgr()
{
m_boInited = false;
m_hasModify =false;
m_saveDataPack.setAllocator(GetLogicServer()->GetBuffAllocator());
//Load();
}
CGlobalVarMgr::~CGlobalVarMgr()
{
Destroy();
}
VOID CGlobalVarMgr::Load()
{
//CDataClient* pDbClient = GetLogicServer()->GetDbClient();
//if (!m_boInited && pDbClient->connected())
//{
// CDataPacket& DataPacket =pDbClient->allocProtoPacket(dcLoadVar);
// DataPacket << (int)0;
// GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
//}
///改成读本地文件
char sFile[256];
sprintf_s(sFile,sizeof(sFile),"%s%d.bin",sGlobalVarFile,GetLogicServer()->GetServerIndex());
wylib::stream::CMemoryStream ms;
if ( ms.loadFromFile(sFile) > 0 )
{
m_Var.loadFromMemory((char*)ms.getMemory(),(size_t)ms.getSize());
}
m_boInited = true;
CDataClient* pDbClient = GetLogicServer()->GetDbClient();
if (pDbClient->connected())
{
CDataPacket& DataPacket =pDbClient->allocProtoPacket(dcLoadCircleCount);
GetLogicServer()->GetDbClient()->flushProtoPacket(DataPacket);
}
}
void CGlobalVarMgr::OnDbRetData( INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader )
{
if(nCmd == dcLoadVar )
{
if (nErrorCode == reSucc)
{
m_Var.loadFromMemory(reader.getOffsetPtr(), reader.getAvaliableLength());
m_boInited = true;
}
else
{
OutputMsg(rmError,_T("load globalVar error!errcode=%d"),nErrorCode);
m_boInited = false;
}
}
}
void CGlobalVarMgr::DelDbRetData(INT_PTR nCmd, void* data, size_t len)
{
CDataPacketReader pack(data, len);
if(nCmd == dcLoadCircleCount)
{
BYTE count = 0;
BYTE errorcode = 0;
pack >> errorcode;
if(errorcode == reSucc)
{
m_CircleMap.clear();
pack >> count;
for(int i = 0; i < count; i++)
{
int nCircle = 0;
int nCount;
pack >> nCount;
pack >> nCircle;
m_CircleMap[nCircle] = nCount;
}
}
}
}
int CGlobalVarMgr::GetCountByCircleLevel(int nCircleLevel )
{
// std::map<int, int>::iterator it = m_CircleMap.find(nCircleLevel);
// if(it != m_CircleMap.end())
// {
// return it->second;
// }
int nCount = 0;
std::map<int, int>::iterator it = m_CircleMap.begin();
for(; it != m_CircleMap.end(); it++)
{
if(it->first >= nCircleLevel)
nCount += it->second;
}
return nCount;
}
void CGlobalVarMgr::AddCountByCircleLevel(int nCircleLevel, int nCount)
{
std::map<int, int>::iterator it = m_CircleMap.find(nCircleLevel);
if(it != m_CircleMap.end())
{
m_CircleMap[nCircleLevel] += nCount;
SubCountByCircleLevel(nCircleLevel-1);
}
else
{
m_CircleMap.insert(std::make_pair(nCircleLevel, nCount));
}
}
void CGlobalVarMgr::SubCountByCircleLevel(int nCircleLevel)
{
std::map<int, int>::iterator it = m_CircleMap.find(nCircleLevel);
if(it != m_CircleMap.end())
{
if(it->second > 0)
m_CircleMap[nCircleLevel]--;
}
}
VOID CGlobalVarMgr::RunOne()
{
TICKCOUNT nCurr = _getTickCount();
if (m_timer.CheckAndSet(nCurr))
{
Save();
}
}
void CGlobalVarMgr::Save()
{
if(!m_hasModify ) return;
DECLARE_TIME_PROF("CGlobalVarMgr::Save");
#ifdef _USE_TRY_CATCH
#ifdef WIN32
__try
#endif
#endif
{
///改成保存到文件
char sFile[256];
sprintf_s(sFile,sizeof(sFile),"%s%d.bin",sGlobalVarFile,GetLogicServer()->GetServerIndex());
CCLVariant *pContinueVar = &m_Var;
wylib::stream::CMemoryStream ms;
m_saveDataPack.setLength(4096);//预留4K空间
//m_saveDataPack.adjustOffset(0);
m_saveDataPack.setPosition(0); //每次存盘要重置偏移
size_t savesize = 0;
while (true)
{
savesize = pContinueVar->saveToMemory(m_saveDataPack.getOffsetPtr(), m_saveDataPack.getAvaliableCapacity(), &pContinueVar);
m_saveDataPack.adjustOffset(savesize);
if (!pContinueVar)
break;
//这里修改了一处死循环问题是大小大于4096将无法申请空间
m_saveDataPack.setLength(m_saveDataPack.getLength() + 4096);//每次增长4K
OutputMsg(rmWaning,_T("GLOBAL VAL the var data too large"));
}
ms.write(m_saveDataPack.getMemoryPtr(),m_saveDataPack.getPosition());
ms.saveToFile(sFile);
}
#ifdef _USE_TRY_CATCH
#ifdef WIN32
__except(CustomExceptHandler(GetExceptionInformation()))
{
}
#endif
#endif
m_hasModify =false;
}