|
- #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);
- }
- }
- }
|