诸暨麻将添加redis
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

199 líneas
4.8 KiB

  1. #include "StdAfx.h"
  2. #include "DBCorrespondManager.h"
  3. //////////////////////////////////////////////////////////////////////////
  4. //构造函数
  5. CDBCorrespondManager::CDBCorrespondManager(void)
  6. {
  7. m_bService = false;
  8. m_pIKernelDataBaseEngine = NULL;
  9. }
  10. //析构函数
  11. CDBCorrespondManager::~CDBCorrespondManager(void)
  12. {
  13. m_pIKernelDataBaseEngine = NULL;
  14. ClearAmortizeData();
  15. m_DBRequestUserArray.RemoveAll();
  16. }
  17. //接口查询
  18. VOID * CDBCorrespondManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  19. {
  20. QUERYINTERFACE(IDBCorrespondManager, Guid, dwQueryVer);
  21. QUERYINTERFACE_IUNKNOWNEX(IDBCorrespondManager, Guid, dwQueryVer);
  22. return NULL;
  23. }
  24. //启动服务
  25. bool CDBCorrespondManager::StartService()
  26. {
  27. ASSERT(!m_bService);
  28. m_bService = true;
  29. return true;
  30. }
  31. //停止服务
  32. bool CDBCorrespondManager::ConcludeService()
  33. {
  34. CWHDataLocker DataLocker(m_AsyncCritical);
  35. m_bService = false;
  36. ClearAmortizeData();
  37. m_DBRequestUserArray.RemoveAll();
  38. return true;
  39. }
  40. //配置模块
  41. bool __cdecl CDBCorrespondManager::InitDBCorrespondManager(IDataBaseEngine * pIDataBaseEngine)
  42. {
  43. m_pIKernelDataBaseEngine = pIDataBaseEngine;
  44. return true;
  45. }
  46. //请求事件
  47. bool __cdecl CDBCorrespondManager::PostDataBaseRequest(DWORD dwUserID, WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize, BYTE cbCache)
  48. {
  49. //设置映射
  50. CWHDataLocker DataLocker(m_AsyncCritical);
  51. //缓存处理
  52. AmortizeSyncData(dwUserID, wRequestID, dwContextID, pData, wDataSize, cbCache);
  53. //执行缓冲
  54. PerformAmortisation();
  55. return true;
  56. }
  57. //请求完成
  58. bool __cdecl CDBCorrespondManager::OnPostRequestComplete(DWORD dwUserID, bool bSucceed)
  59. {
  60. //设置映射
  61. CWHDataLocker DataLocker(m_AsyncCritical);
  62. //清除投递记录
  63. INT_PTR nIndex = GetUserArrayIndex(dwUserID);
  64. if (nIndex != -1) m_DBRequestUserArray.RemoveAt(nIndex);
  65. //清除数据
  66. POSITION pos = m_DBRequestList.GetHeadPosition();
  67. while (pos != NULL)
  68. {
  69. POSITION tempPos = pos;
  70. tagDBRequestHead *pDBRequestHead = m_DBRequestList.GetNext(pos);
  71. if (pDBRequestHead->dwUserID == dwUserID)
  72. {
  73. //清除
  74. if (pDBRequestHead->cbCache == FALSE || bSucceed)
  75. {
  76. m_DBRequestList.RemoveAt(tempPos);
  77. delete[]((BYTE*)pDBRequestHead);
  78. }
  79. break;
  80. }
  81. }
  82. //执行缓冲
  83. PerformAmortisation();
  84. return true;
  85. }
  86. //定时事件
  87. bool __cdecl CDBCorrespondManager::OnTimerNotify()
  88. {
  89. //设置映射
  90. CWHDataLocker DataLocker(m_AsyncCritical);
  91. //执行缓冲
  92. PerformAmortisation();
  93. return true;
  94. }
  95. //已经提交请求
  96. bool CDBCorrespondManager::IsPostDBRequest(DWORD dwUserID)
  97. {
  98. for (INT_PTR i = 0; i < m_DBRequestUserArray.GetCount(); i++)
  99. {
  100. if (dwUserID == m_DBRequestUserArray[i]) return true;
  101. }
  102. return false;
  103. }
  104. //获得索引
  105. INT_PTR CDBCorrespondManager::GetUserArrayIndex(DWORD dwUserID)
  106. {
  107. for (INT_PTR i = 0; i < m_DBRequestUserArray.GetCount(); i++)
  108. {
  109. if (dwUserID == m_DBRequestUserArray[i]) return i;
  110. }
  111. return -1;
  112. }
  113. //缓冲请求
  114. bool CDBCorrespondManager::AmortizeSyncData(DWORD dwUserID, WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize, BYTE cbCache)
  115. {
  116. //定义变量
  117. WORD wBuffSize = sizeof(tagDBRequestHead)+wDataSize;
  118. BYTE *pBuff = new BYTE[wBuffSize];
  119. ZeroMemory(pBuff, wBuffSize);
  120. tagDBRequestHead *pDBRequestHead = (tagDBRequestHead*)pBuff;
  121. //填充数据
  122. pDBRequestHead->cbCache = cbCache;
  123. pDBRequestHead->dwUserID = dwUserID;
  124. pDBRequestHead->dwContextID = dwContextID;
  125. pDBRequestHead->wRequestID = wRequestID;
  126. pDBRequestHead->wDataSize = wDataSize;
  127. CopyMemory(((VOID*)(pDBRequestHead + 1)), pData, wDataSize);
  128. //加入链表
  129. m_DBRequestList.AddTail(pDBRequestHead);
  130. return true;
  131. }
  132. //执行缓冲
  133. VOID CDBCorrespondManager::PerformAmortisation()
  134. {
  135. //遍历数据
  136. POSITION pos = m_DBRequestList.GetHeadPosition();
  137. while (pos != NULL)
  138. {
  139. tagDBRequestHead *pDBRequestHead = m_DBRequestList.GetNext(pos);
  140. //投递请求
  141. if (!IsPostDBRequest(pDBRequestHead->dwUserID))
  142. {
  143. if (m_pIKernelDataBaseEngine)
  144. {
  145. m_DBRequestUserArray.Add(pDBRequestHead->dwUserID);
  146. m_pIKernelDataBaseEngine->PostDataBaseRequest(pDBRequestHead->wRequestID, pDBRequestHead->dwContextID, (VOID*)(pDBRequestHead + 1), pDBRequestHead->wDataSize);
  147. }
  148. }
  149. }
  150. }
  151. //清除缓存
  152. VOID CDBCorrespondManager::ClearAmortizeData()
  153. {
  154. while (m_DBRequestList.GetCount() > 0)
  155. {
  156. tagDBRequestHead * pRqHead = m_DBRequestList.RemoveHead();
  157. if (pRqHead)
  158. {
  159. delete[]((BYTE*)pRqHead);
  160. }
  161. }
  162. }