📄 daodfx.cpp
字号:
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "math.h"
#ifdef AFX_DB_SEG
#pragma code_seg(AFX_DB_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
//////////////////////////////////////////////////////////////////////////
// Helpers
// Helpers for floating point operations
AFX_STATIC_DATA const float _afxFloatPseudoNull = AFX_RFX_SINGLE_PSEUDO_NULL;
AFX_STATIC_DATA const double _afxDoublePseudoNull = AFX_RFX_DOUBLE_PSEUDO_NULL;
// Long binary allocation helper
void AFX_CDECL AllocLongBinary(CLongBinary& lb, DWORD dwDataLength);
// Memory allocation callbacks used by ICDAOGetRows
STDAPI DaoStringAllocCallback(DWORD dwLen, DWORD pData, void** ppv);
STDAPI DaoBinaryAllocCallback(DWORD dwLen, DWORD pData, void** ppv);
STDAPI DaoLongBinaryAllocCallback(DWORD dwLen, DWORD pData, void** ppv);
//////////////////////////////////////////////////////////////////////////
// CDaoFieldExchange
CDaoFieldExchange::CDaoFieldExchange(UINT nOperation,
CDaoRecordset* prs, void* pvField)
{
ASSERT(nOperation < MaxDFXOperation);
m_nFieldType = none;
m_nOperation = nOperation;
m_prs = prs;
m_pvField = pvField;
m_nField = 0;
m_nParam = 0;
}
BOOL CDaoFieldExchange::IsValidOperation()
{
if (m_nOperation >= MaxDFXOperation)
{
// Invalid operation
ASSERT(FALSE);
return FALSE;
}
// Operations valid for both field types
#ifdef _DEBUG
if (m_nOperation == DumpField || m_nOperation == SetFieldNull)
return TRUE;
#endif
// Operations only valid for outputColumn OR param types
if ((m_nOperation == AddToParameterList) ||
(m_nOperation == BindParam))
return (m_nFieldType == param);
else
return (m_nFieldType == outputColumn);
}
void CDaoFieldExchange::AppendParamType(CString& strParamList,
DWORD dwParamType)
{
switch (dwParamType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
strParamList += " Text";
break;
case AFX_RFX_BINARY:
strParamList += " LongBinary";
break;
case AFX_RFX_LONGBINARY:
strParamList += " LongBinary";
break;
case AFX_RFX_BOOL:
strParamList += " Bit";
break;
case AFX_RFX_BYTE:
strParamList += " Byte";
break;
case AFX_RFX_SHORT:
strParamList += " Short";
break;
case AFX_RFX_LONG:
strParamList += " Long";
break;
case AFX_RFX_CURRENCY:
strParamList += " Currency";
break;
case AFX_RFX_SINGLE:
strParamList += " IEEESingle";
break;
case AFX_RFX_DOUBLE:
strParamList += " IEEEDouble";
break;
case AFX_RFX_DATE:
strParamList += " DateTime";
break;
}
}
CDaoFieldCache* CDaoFieldExchange::GetCacheValue(CDaoRecordset* prs, void* pv)
{
// Lookup storage locations
void* pvCache;
if (!prs->m_pMapFieldCache->Lookup(pv, pvCache))
AfxThrowDaoException(AFX_DAO_ERROR_DFX_BIND);
return (CDaoFieldCache*)pvCache;
}
void CDaoFieldExchange::SetNullValue(void* pv, DWORD dwDataType)
{
switch (dwDataType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
((CString*)pv)->Empty();
break;
case AFX_RFX_BINARY:
((CByteArray*)pv)->SetSize(0);
break;
case AFX_RFX_LONGBINARY:
((CLongBinary*)pv)->m_dwDataLength = 0;
break;
case AFX_RFX_BOOL:
*(BOOL*)pv = AFX_RFX_BOOL_PSEUDO_NULL;
break;
case AFX_RFX_BYTE:
*(BYTE*)pv = AFX_RFX_BYTE_PSEUDO_NULL;
break;
case AFX_RFX_SHORT:
*(short*)pv = AFX_RFX_SHORT_PSEUDO_NULL;
break;
case AFX_RFX_LONG:
*(long*)pv = AFX_RFX_LONG_PSEUDO_NULL;
break;
case AFX_RFX_CURRENCY:
((COleCurrency*)pv)->SetStatus(COleCurrency::null);
break;
case AFX_RFX_SINGLE:
*(float*)pv = _afxFloatPseudoNull;
break;
case AFX_RFX_DOUBLE:
*(double*)pv = _afxDoublePseudoNull;
break;
case AFX_RFX_DATE:
((COleDateTime*)pv)->SetStatus(COleDateTime::null);
break;
}
}
BOOL CDaoFieldExchange::IsNullValue(void* pv, DWORD dwDataType)
{
BOOL bNull = FALSE;
switch (dwDataType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
if (((CString*)pv)->IsEmpty())
bNull = TRUE;
break;
case AFX_RFX_BINARY:
if (((CByteArray*)pv)->GetSize() == 0)
bNull = TRUE;
break;
case AFX_RFX_LONGBINARY:
if (((CLongBinary*)pv)->m_dwDataLength == 0)
bNull = TRUE;
break;
case AFX_RFX_BOOL:
if (*(BOOL*)pv == AFX_RFX_BOOL_PSEUDO_NULL)
bNull = TRUE;
break;
case AFX_RFX_BYTE:
if (*(BYTE*)pv == AFX_RFX_BYTE_PSEUDO_NULL)
bNull = TRUE;
break;
case AFX_RFX_SHORT:
if (*(short*)pv == AFX_RFX_SHORT_PSEUDO_NULL)
bNull = TRUE;
break;
case AFX_RFX_LONG:
if (*(long*)pv == AFX_RFX_LONG_PSEUDO_NULL)
bNull = TRUE;
break;
case AFX_RFX_CURRENCY:
if (((COleCurrency*)pv)->GetStatus() == COleCurrency::null)
bNull = TRUE;
break;
case AFX_RFX_SINGLE:
if (*(float*)pv == _afxFloatPseudoNull)
bNull = TRUE;
break;
case AFX_RFX_DOUBLE:
if (*(double*)pv == _afxDoublePseudoNull)
bNull = TRUE;
break;
case AFX_RFX_DATE:
if (((COleDateTime*)pv)->GetStatus() == COleDateTime::null)
bNull = TRUE;
break;
}
return bNull;
}
void CDaoFieldExchange::AllocCacheValue(CDaoFieldCache*& pCache,
DWORD dwDataType)
{
// Initialize a new field cache
pCache = new CDaoFieldCache;
pCache->m_nStatus = 0;
switch (dwDataType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
pCache->m_pvData = new CString();
pCache->m_nDataType = AFX_RFX_TEXT;
break;
case AFX_RFX_BINARY:
pCache->m_pvData = new CByteArray();
pCache->m_nDataType = AFX_RFX_BINARY;
break;
case AFX_RFX_LONGBINARY:
pCache->m_pvData = new CLongBinary();
pCache->m_nDataType = AFX_RFX_LONGBINARY;
break;
case AFX_RFX_BOOL:
pCache->m_nDataType = AFX_RFX_BOOL;
break;
case AFX_RFX_BYTE:
pCache->m_nDataType = AFX_RFX_BYTE;
break;
case AFX_RFX_SHORT:
pCache->m_nDataType = AFX_RFX_SHORT;
break;
case AFX_RFX_LONG:
pCache->m_nDataType = AFX_RFX_LONG;
break;
case AFX_RFX_CURRENCY:
pCache->m_pvData = new COleCurrency();
pCache->m_nDataType = AFX_RFX_CURRENCY;
break;
case AFX_RFX_SINGLE:
pCache->m_nDataType = AFX_RFX_SINGLE;
break;
case AFX_RFX_DOUBLE:
pCache->m_pvData = new double;
pCache->m_nDataType = AFX_RFX_DOUBLE;
break;
case AFX_RFX_DATE:
pCache->m_pvData = new COleDateTime();
pCache->m_nDataType = AFX_RFX_DATE;
break;
}
}
void CDaoFieldExchange::DeleteCacheValue(CDaoFieldCache* pCache,
DWORD dwDataType)
{
switch (dwDataType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
delete (CString*)pCache->m_pvData;
break;
case AFX_RFX_BINARY:
delete (CByteArray*)pCache->m_pvData;
break;
case AFX_RFX_LONGBINARY:
delete (CLongBinary*)pCache->m_pvData;
break;
case AFX_RFX_BOOL:
case AFX_RFX_BYTE:
case AFX_RFX_SHORT:
case AFX_RFX_LONG:
case AFX_RFX_SINGLE:
break;
case AFX_RFX_CURRENCY:
delete (COleCurrency*)pCache->m_pvData;
break;
case AFX_RFX_DOUBLE:
delete (double*)pCache->m_pvData;
break;
case AFX_RFX_DATE:
delete (COleDateTime*)pCache->m_pvData;
break;
}
delete pCache;
pCache = NULL;
}
void CDaoFieldExchange::CopyValue(void* pvSrc, void* pvDest,
DWORD dwDataType)
{
switch (dwDataType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
*(CString*)pvDest = *(CString*)pvSrc;
break;
case AFX_RFX_BINARY:
((CByteArray*)pvDest)->Copy(*(CByteArray*)pvSrc);
break;
case AFX_RFX_LONGBINARY:
{
CLongBinary* pLongBinarySrc = (CLongBinary*)pvSrc;
CLongBinary* pLongBinaryDest = (CLongBinary*)pvDest;
// Reallocate memory in destination if necessary
AllocLongBinary(*pLongBinaryDest, pLongBinarySrc->m_dwDataLength);
pLongBinaryDest->m_dwDataLength =
pLongBinarySrc->m_dwDataLength;
BYTE* pbSrc = (BYTE*)::GlobalLock(pLongBinarySrc->m_hData);
BYTE* pbDest = (BYTE*)::GlobalLock(pLongBinaryDest->m_hData);
memcpy(pbDest, pbSrc, pLongBinarySrc->m_dwDataLength);
::GlobalUnlock(pLongBinarySrc->m_hData);
::GlobalUnlock(pLongBinaryDest->m_hData);
}
break;
case AFX_RFX_BOOL:
*(BOOL*)pvDest = *(BOOL*)pvSrc;
break;
case AFX_RFX_BYTE:
*(BYTE*)pvDest = *(BYTE*)pvSrc;
break;
case AFX_RFX_SHORT:
*(short*)pvDest = *(short*)pvSrc;
break;
case AFX_RFX_LONG:
*(long*)pvDest = *(long*)pvSrc;
break;
case AFX_RFX_CURRENCY:
*(COleCurrency*)pvDest = *(COleCurrency*)pvSrc;
break;
case AFX_RFX_SINGLE:
*(float*)pvDest = *(float*)pvSrc;
break;
case AFX_RFX_DOUBLE:
*(double*)pvDest = *(double*)pvSrc;
break;
case AFX_RFX_DATE:
*(COleDateTime*)pvDest = *(COleDateTime*)pvSrc;
break;
}
}
BOOL CDaoFieldExchange::CompareValue(void* pvSrc, void* pvDest,
DWORD dwDataType)
{
BOOL bDirty = FALSE;
switch (dwDataType)
{
default:
ASSERT(FALSE);
break;
case AFX_RFX_TEXT:
if (*(CString*)pvDest != *(CString*)pvSrc)
bDirty = TRUE;
break;
case AFX_RFX_BINARY:
{
CByteArray* pByteArraySrc = (CByteArray*)pvSrc;
CByteArray* pByteArrayDest = (CByteArray*)pvDest;
int nSize = pByteArraySrc->GetSize();
// If sizes don't compare, must be dirty
if (nSize != pByteArrayDest->GetSize())
bDirty = TRUE;
else
{
// If sizes compare, compare the data
if (memcmp(&pByteArrayDest[0], &pByteArraySrc[0], nSize) != 0)
bDirty = TRUE;
}
}
break;
case AFX_RFX_LONGBINARY:
{
CLongBinary* pLongBinarySrc = (CLongBinary*)pvSrc;
CLongBinary* pLongBinaryDest = (CLongBinary*)pvDest;
BYTE* pbSrc = (BYTE*)::GlobalLock(pLongBinarySrc->m_hData);
BYTE* pbDest = (BYTE*)::GlobalLock(pLongBinaryDest->m_hData);
// If sizes don't compare, must be dirty
if (pLongBinarySrc->m_dwDataLength !=
pLongBinaryDest->m_dwDataLength)
{
bDirty = TRUE;
}
else
{
// If sizes compare, compare the data
if (memcmp(pbDest, pbSrc, pLongBinarySrc->m_dwDataLength) != 0)
bDirty = TRUE;
}
::GlobalUnlock(pLongBinarySrc->m_hData);
::GlobalUnlock(pLongBinaryDest->m_hData);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -