Files
wnmj/Servers/服务器组件/游戏服务器/DBCorrespondManager.cpp

200 lines
4.2 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "DBCorrespondManager.h"
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CDBCorrespondManager::CDBCorrespondManager(void)
{
m_bService=false;
m_pIKernelDataBaseEngine = NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CDBCorrespondManager::~CDBCorrespondManager(void)
{
m_pIKernelDataBaseEngine=NULL;
ClearAmortizeData();
m_DBRequestUserArray.RemoveAll();
}
//<2F>ӿڲ<D3BF>ѯ
VOID * CDBCorrespondManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IDBCorrespondManager,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IDBCorrespondManager,Guid,dwQueryVer);
return NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CDBCorrespondManager::StartService()
{
ASSERT(!m_bService);
m_bService=true;
return true;
}
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
bool CDBCorrespondManager::ConcludeService()
{
CWHDataLocker DataLocker(m_AsyncCritical);
m_bService=false;
ClearAmortizeData();
m_DBRequestUserArray.RemoveAll();
return true;
}
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
bool __cdecl CDBCorrespondManager::InitDBCorrespondManager(IDataBaseEngine * pIDataBaseEngine)
{
m_pIKernelDataBaseEngine = pIDataBaseEngine;
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool __cdecl CDBCorrespondManager::PostDataBaseRequest(DWORD dwUserID, WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize, BYTE cbCache)
{
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
CWHDataLocker DataLocker(m_AsyncCritical);
//<2F><><EFBFBD><EFBFBD><E6B4A6>
AmortizeSyncData(dwUserID, wRequestID,dwContextID,pData,wDataSize,cbCache);
//ִ<>л<EFBFBD><D0BB><EFBFBD>
PerformAmortisation();
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool __cdecl CDBCorrespondManager::OnPostRequestComplete(DWORD dwUserID, bool bSucceed)
{
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
CWHDataLocker DataLocker(m_AsyncCritical);
//<2F><><EFBFBD><EFBFBD>Ͷ<EFBFBD>ݼ<EFBFBD>¼
INT_PTR nIndex = GetUserArrayIndex(dwUserID);
if(nIndex != -1) m_DBRequestUserArray.RemoveAt(nIndex);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POSITION pos = m_DBRequestList.GetHeadPosition();
while(pos != NULL)
{
POSITION tempPos = pos;
tagDBRequestHead *pDBRequestHead = m_DBRequestList.GetNext(pos);
if(pDBRequestHead->dwUserID == dwUserID)
{
//<2F><><EFBFBD><EFBFBD>
if(pDBRequestHead->cbCache == FALSE || bSucceed)
{
m_DBRequestList.RemoveAt(tempPos);
delete [] ((BYTE*)pDBRequestHead);
}
break;
}
}
//ִ<>л<EFBFBD><D0BB><EFBFBD>
PerformAmortisation();
return true;
}
//<2F><>ʱ<EFBFBD>¼<EFBFBD>
bool __cdecl CDBCorrespondManager::OnTimerNotify()
{
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
CWHDataLocker DataLocker(m_AsyncCritical);
//ִ<>л<EFBFBD><D0BB><EFBFBD>
PerformAmortisation();
return true;
}
//<2F>Ѿ<EFBFBD><D1BE><EFBFBD><E1BDBB><EFBFBD><EFBFBD>
bool CDBCorrespondManager::IsPostDBRequest(DWORD dwUserID)
{
for(INT_PTR i=0; i<m_DBRequestUserArray.GetCount(); i++)
{
if(dwUserID == m_DBRequestUserArray[i]) return true;
}
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CDBCorrespondManager::AmortizeSyncData(DWORD dwUserID, WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize, BYTE cbCache)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD wBuffSize = sizeof(tagDBRequestHead)+wDataSize;
BYTE *pBuff = new BYTE[wBuffSize];
ZeroMemory(pBuff, wBuffSize);
tagDBRequestHead *pDBRequestHead = (tagDBRequestHead*)pBuff;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pDBRequestHead->cbCache = cbCache;
pDBRequestHead->dwUserID = dwUserID;
pDBRequestHead->dwContextID = dwContextID;
pDBRequestHead->wRequestID = wRequestID;
pDBRequestHead->wDataSize = wDataSize;
CopyMemory(((VOID*)(pDBRequestHead+1)), pData, wDataSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_DBRequestList.AddTail(pDBRequestHead);
return true;
}
//ִ<>л<EFBFBD><D0BB><EFBFBD>
VOID CDBCorrespondManager::PerformAmortisation()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POSITION pos = m_DBRequestList.GetHeadPosition();
while(pos != NULL)
{
tagDBRequestHead *pDBRequestHead = m_DBRequestList.GetNext(pos);
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!IsPostDBRequest(pDBRequestHead->dwUserID))
{
if(m_pIKernelDataBaseEngine)
{
m_DBRequestUserArray.Add(pDBRequestHead->dwUserID);
m_pIKernelDataBaseEngine->PostDataBaseRequest(pDBRequestHead->wRequestID, pDBRequestHead->dwContextID, (VOID*)(pDBRequestHead+1), pDBRequestHead->wDataSize);
}
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID CDBCorrespondManager::ClearAmortizeData()
{
while(m_DBRequestList.GetCount() > 0)
{
tagDBRequestHead * pRqHead = m_DBRequestList.RemoveHead();
if(pRqHead)
{
delete [] ((BYTE*)pRqHead);
}
pRqHead = nullptr;
}
}