#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; icbCache = 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; } }