200 lines
4.2 KiB
C++
200 lines
4.2 KiB
C++
|
|
#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;
|
|||
|
|
}
|
|||
|
|
}
|