Files
wnmj-normal/Servers/服务器组件/游戏服务器/DBCorrespondManager.cpp
2026-03-03 13:56:44 +08:00

200 lines
4.2 KiB
C++

#include "StdAfx.h"
#include "DBCorrespondManager.h"
//////////////////////////////////////////////////////////////////////////
//构造函数
CDBCorrespondManager::CDBCorrespondManager(void)
{
m_bService=false;
m_pIKernelDataBaseEngine = NULL;
}
//析构函数
CDBCorrespondManager::~CDBCorrespondManager(void)
{
m_pIKernelDataBaseEngine=NULL;
ClearAmortizeData();
m_DBRequestUserArray.RemoveAll();
}
//接口查询
VOID * CDBCorrespondManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDBCorrespondManager,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDBCorrespondManager,Guid,dwQueryVer);
return NULL;
}
//启动服务
bool CDBCorrespondManager::StartService()
{
ASSERT(!m_bService);
m_bService=true;
return true;
}
//停止服务
bool CDBCorrespondManager::ConcludeService()
{
CWHDataLocker DataLocker(m_AsyncCritical);
m_bService=false;
ClearAmortizeData();
m_DBRequestUserArray.RemoveAll();
return true;
}
//配置模块
bool __cdecl CDBCorrespondManager::InitDBCorrespondManager(IDataBaseEngine * pIDataBaseEngine)
{
m_pIKernelDataBaseEngine = pIDataBaseEngine;
return true;
}
//请求事件
bool __cdecl CDBCorrespondManager::PostDataBaseRequest(DWORD dwUserID, WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize, BYTE cbCache)
{
//设置映射
CWHDataLocker DataLocker(m_AsyncCritical);
//缓存处理
AmortizeSyncData(dwUserID, wRequestID,dwContextID,pData,wDataSize,cbCache);
//执行缓冲
PerformAmortisation();
return true;
}
//请求完成
bool __cdecl CDBCorrespondManager::OnPostRequestComplete(DWORD dwUserID, bool bSucceed)
{
//设置映射
CWHDataLocker DataLocker(m_AsyncCritical);
//清除投递记录
INT_PTR nIndex = GetUserArrayIndex(dwUserID);
if(nIndex != -1) m_DBRequestUserArray.RemoveAt(nIndex);
//清除数据
POSITION pos = m_DBRequestList.GetHeadPosition();
while(pos != NULL)
{
POSITION tempPos = pos;
tagDBRequestHead *pDBRequestHead = m_DBRequestList.GetNext(pos);
if(pDBRequestHead->dwUserID == dwUserID)
{
//清除
if(pDBRequestHead->cbCache == FALSE || bSucceed)
{
m_DBRequestList.RemoveAt(tempPos);
delete [] ((BYTE*)pDBRequestHead);
}
break;
}
}
//执行缓冲
PerformAmortisation();
return true;
}
//定时事件
bool __cdecl CDBCorrespondManager::OnTimerNotify()
{
//设置映射
CWHDataLocker DataLocker(m_AsyncCritical);
//执行缓冲
PerformAmortisation();
return true;
}
//已经提交请求
bool CDBCorrespondManager::IsPostDBRequest(DWORD dwUserID)
{
for(INT_PTR i=0; i<m_DBRequestUserArray.GetCount(); i++)
{
if(dwUserID == m_DBRequestUserArray[i]) return true;
}
return false;
}
//获得索引
INT_PTR CDBCorrespondManager::GetUserArrayIndex(DWORD dwUserID)
{
for(INT_PTR i=0; i<m_DBRequestUserArray.GetCount(); i++)
{
if(dwUserID == m_DBRequestUserArray[i]) return i;
}
return -1;
}
//缓冲请求
bool CDBCorrespondManager::AmortizeSyncData(DWORD dwUserID, WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize, BYTE cbCache)
{
//定义变量
WORD wBuffSize = sizeof(tagDBRequestHead)+wDataSize;
BYTE *pBuff = new BYTE[wBuffSize];
ZeroMemory(pBuff, wBuffSize);
tagDBRequestHead *pDBRequestHead = (tagDBRequestHead*)pBuff;
//填充数据
pDBRequestHead->cbCache = cbCache;
pDBRequestHead->dwUserID = dwUserID;
pDBRequestHead->dwContextID = dwContextID;
pDBRequestHead->wRequestID = wRequestID;
pDBRequestHead->wDataSize = wDataSize;
CopyMemory(((VOID*)(pDBRequestHead+1)), pData, wDataSize);
//加入链表
m_DBRequestList.AddTail(pDBRequestHead);
return true;
}
//执行缓冲
VOID CDBCorrespondManager::PerformAmortisation()
{
//遍历数据
POSITION pos = m_DBRequestList.GetHeadPosition();
while(pos != NULL)
{
tagDBRequestHead *pDBRequestHead = m_DBRequestList.GetNext(pos);
//投递请求
if(!IsPostDBRequest(pDBRequestHead->dwUserID))
{
if(m_pIKernelDataBaseEngine)
{
m_DBRequestUserArray.Add(pDBRequestHead->dwUserID);
m_pIKernelDataBaseEngine->PostDataBaseRequest(pDBRequestHead->wRequestID, pDBRequestHead->dwContextID, (VOID*)(pDBRequestHead+1), pDBRequestHead->wDataSize);
}
}
}
}
//清除缓存
VOID CDBCorrespondManager::ClearAmortizeData()
{
while(m_DBRequestList.GetCount() > 0)
{
tagDBRequestHead * pRqHead = m_DBRequestList.RemoveHead();
if(pRqHead)
{
delete [] ((BYTE*)pRqHead);
}
pRqHead = nullptr;
}
}