www.pudn.com > daothreadfix.zip > MultiDaoRecordSet.cpp
// MultiDaoRecordSet.cpp : implementation file
//
#define MULTIDAORECORDSET_CPP
#include "stdafx.h"
#include "MultiDaoRecordSet.h"
#include "daothread.h"
#include "mainfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMultiDaoRecordSet
IMPLEMENT_DYNAMIC(CMultiDaoRecordSet, CDaoRecordset)
CMultiDaoRecordSet::CMultiDaoRecordSet(CDaoDatabase* pdb)
: CDaoRecordset(pdb)
{
//{{AFX_FIELD_INIT(CMultiDaoRecordSet)
//}}AFX_FIELD_INIT
m_nDefaultType = dbOpenDynaset;
}
//jtm
//thread safe destructor....
CMultiDaoRecordSet::~CMultiDaoRecordSet()
{
if (IsOpen())
Close();
// Clean up database if necessary
if (m_pDatabase != NULL && (m_nStatus & AFX_DAO_IMPLICIT_DB))
{
m_pDatabase->Close();
delete m_pDatabase;
m_pDatabase = NULL;
}
}
CString CMultiDaoRecordSet::GetDefaultDBName()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
return "TEST.mdb";
}
/////////////////////////////////////////////////////////////////////////////
// CMultiDaoRecordSet diagnostics
//jtm
//multi thread safe functoins
void CMultiDaoRecordSet::Open(int nOpenType, LPCTSTR lpszSQL, int nOptions)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Open(nOpenType, lpszSQL, nOptions);
}
else
{
pParam1 = (void *)&nOpenType;
pParam2 = (void *)lpszSQL;
pParam3 = (void *)&nOptions;
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoOpen, (LPARAM)this);
}
}
}
void CMultiDaoRecordSet::Close()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Close();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoClose, (LPARAM)this);
}
}
}
BOOL CMultiDaoRecordSet::IsOpen()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsOpen();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsOpen, (LPARAM)this);
}
else
{
TRACE("Is Open Called After App Closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::IsBOF()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsBOF();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsBOF, (LPARAM)this);
}
else
{
TRACE("IsBOF called after app closed.");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::IsEOF()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsEOF();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsEOF, (LPARAM)this);
}
else
{
TRACE("IsEOF Called After app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::IsDeleted()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsDeleted();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsDeleted, (LPARAM)this);
}
else
{
TRACE("IsDeleted called after app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::IsFieldDirty(void* pv)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsFieldDirty(pv);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = pv;
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsFieldDirty, (LPARAM)this);
}
else
{
TRACE("IsFieldDirty called after app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::IsFieldNull(void* pv)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsFieldNull(pv);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = pv;
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsFieldNull, (LPARAM)this);
}
else
{
TRACE("IsFieldNull called after app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::IsFieldNullable(void* pv)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::IsFieldNullable(pv);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = pv;
return (BOOL)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoIsFieldNullable, (LPARAM)this);
}
else
{
TRACE("IsFieldNullable called after app closed");
return FALSE;
}
}
}
CString CMultiDaoRecordSet::GetName()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetName();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (CString)*(CString *)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetName, (LPARAM)this);
}
else
{
TRACE("Get Name called after app closed");
return "ERROR";
}
}
}
short CMultiDaoRecordSet::GetType()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetType();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (short)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetType, (LPARAM)this);
}
else
{
TRACE("GetType called after app closed");
return 0;
}
}
}
short CMultiDaoRecordSet::GetEditMode()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetEditMode();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (short)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetEditMode, (LPARAM)this);
}
else
{
TRACE("GetEditMode called after app closed");
return 0;
}
}
}
CString CMultiDaoRecordSet::GetSQL()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetSQL();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (CString)*(CString *)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetSQL, (LPARAM)this);
}
else
{
TRACE("GetSQL called after app closed");
return "ERROR";
}
}
}
COleVariant CMultiDaoRecordSet::GetLastModifiedBookmark()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetLastModifiedBookmark();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (COleVariant)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetLastModifiedBookmark, (LPARAM)this);
}
else
{
TRACE("GetLastModifiedBookmark called after app closed");
COleVariant cv;
return cv; //????what to do????
}
}
}
long CMultiDaoRecordSet::GetRecordCount()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetRecordCount();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return (long)AfxGetMainWnd()->
SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetRecordCount, (LPARAM)this);
}
else
{
TRACE("GetRecordCount called after app closed");
return 0;
}
}
}
void CMultiDaoRecordSet::MoveNext()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::MoveNext();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoMoveNext,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::MovePrev()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::MovePrev();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoMovePrev,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::MoveFirst()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::MoveFirst();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoMoveFirst,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::MoveLast()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::MoveLast();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoMoveLast,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::Move(long lRows)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Move(lRows);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)&lRows;
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoMove,
(LPARAM)this);
}
}
}
BOOL CMultiDaoRecordSet::FindNext(LPCTSTR lpszFilter)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::FindNext(lpszFilter);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)lpszFilter;
return (BOOL)AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoFindNext,
(LPARAM)this);
}
else
{
TRACE("FindNext called after app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::FindPrev(LPCTSTR lpszFilter)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::FindPrev(lpszFilter);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)lpszFilter;
return (BOOL)AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoFindPrev,
(LPARAM)this);
}
else
{
TRACE("Find Prev called after app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::FindFirst(LPCTSTR lpszFilter)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::FindFirst(lpszFilter);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)lpszFilter;
return (BOOL)AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoFindFirst,
(LPARAM)this);
}
else
{
TRACE("FindFirst called after app closed");
return FALSE;
}
}
}
BOOL CMultiDaoRecordSet::FindLast(LPCTSTR lpszFilter)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::FindLast(lpszFilter);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)lpszFilter;
return (BOOL)AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoFindLast,
(LPARAM)this);
}
else
{
TRACE("FindLast called after app closed");
return FALSE;
}
}
return FALSE;
}
BOOL CMultiDaoRecordSet::Find(long lFindType, LPCTSTR lpszFilter)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::Find(lFindType, lpszFilter);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)&lFindType;
pParam2 = (void *)lpszFilter;
return (BOOL)AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoFind,
(LPARAM)this);
}
else
{
TRACE("Find called after app closed");
return FALSE;
}
}
}
COleVariant CMultiDaoRecordSet::GetBookmark()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
return CDaoRecordset::GetBookmark();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
return AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoGetBookmark,
(LPARAM)this);
}
else
{
TRACE("GetBookMark called after app closed");
COleVariant cv;
return cv; //??not sure what to do here...??
}
}
}
void CMultiDaoRecordSet::SetBookmark(COleVariant varBookmark)
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::SetBookmark(varBookmark);
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
pParam1 = (void *)&varBookmark;
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoSetBookmark,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::AddNew()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::AddNew();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoAddNew,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::Edit()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Edit();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoEdit,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::Update()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Update();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoUpdate,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::Delete()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Delete();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoDelete,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::CancelUpdate()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::CancelUpdate();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoCancelUpdate,
(LPARAM)this);
}
}
}
void CMultiDaoRecordSet::Requery()
{
CDAOTHREADApp *pApp = ((CDAOTHREADApp *)AfxGetApp());
if (pApp->pGUIThread == AfxGetThread())
{
CDaoRecordset::Requery();
}
else
{
if (IsWindow(AfxGetMainWnd()->GetSafeHwnd()))
{
AfxGetMainWnd()->SendMessage(WM_MULTIDAOMESSAGE, MultiDaoRequery,
(LPARAM)this);
}
}
}