|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: dbwrap.cxx
//
// Contents: C++ wrapper classes for DBCOMMANDTREE value structures
//
// Classes: CDbColId
//
// Functions:
//
// History: 6-22-95 srikants Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
//+-------------------------------------------------------------------------
//
// Member: CDbColId::CDbColId, public
//
// Synopsis: Default constructor
//
// Effects: Defines column with null guid and propid 0
//
// History: 19 Jul 1995 AlanW Created
//
//--------------------------------------------------------------------------
CDbColId::CDbColId() { eKind = DBKIND_PROPID; uName.ulPropid = 0; }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::CDbColId
//
// Synopsis: Construct a CDbColId
//
// Arguments: [guidPropSet] -
// [wcsProperty] -
//
// History: 6-06-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
CDbColId::CDbColId( GUID const & guidPropSet, WCHAR const * wcsProperty ) { eKind = DBKIND_GUID_PROPID; BOOL fSuccess = SetProperty( wcsProperty ); if (fSuccess) SetPropSet( guidPropSet ); }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::CDbColId
//
// Synopsis: Construct a CDbColId from a DBID
//
// Arguments: [propSpec] - DBID from which to initialize the node
//
// History: 6-20-95 srikants Created
//
// Notes: The column must be named by guid & number, or guid & name.
//
//----------------------------------------------------------------------------
CDbColId::CDbColId( DBID const & propSpec ) { BOOL fSuccess = TRUE;
eKind = DBKIND_GUID_PROPID;
CDbColId const * rhs = (CDbColId const *) &propSpec;
if ( rhs->IsPropertyName() ) { fSuccess = SetProperty( rhs->GetPropertyName() ); } else if ( rhs->IsPropertyPropid() ) { SetProperty( rhs->GetPropertyPropid() ); } else { return; }
if ( fSuccess && rhs->IsPropSetPresent() ) { SetPropSet( rhs->GetPropSet() ); } }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::CDbColId
//
// Synopsis: Construct a CDbColId from another CDbColId
//
// Arguments: [propSpec] - CDbColId from which to initialize the node
//
// History: 6-20-95 srikants Created
//
// Notes: The column must be named by guid & number, or guid & name.
//
//----------------------------------------------------------------------------
CDbColId::CDbColId( CDbColId const & propSpec ) { BOOL fSuccess = TRUE;
eKind = DBKIND_GUID_PROPID;
if ( propSpec.IsPropertyName() ) { fSuccess = SetProperty( propSpec.GetPropertyName() ); } else if ( propSpec.IsPropertyPropid() ) { SetProperty( propSpec.GetPropertyPropid() ); } else { return; }
if ( fSuccess && propSpec.IsPropSetPresent() ) { SetPropSet( propSpec.GetPropSet() ); } }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::SetProperty
//
// Synopsis:
//
// Arguments: [wcsProperty] -
//
// Returns:
//
// History: 6-06-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbColId::SetProperty( WCHAR const * wcsProperty ) { if ( !_IsValidKind() ) { eKind = DBKIND_GUID_PROPID; } else if ( DBKIND_NAME == eKind || DBKIND_GUID_NAME == eKind || DBKIND_PGUID_NAME == eKind ) { if ( uName.pwszName ) { CoTaskMemFree( uName.pwszName ); uName.pwszName = 0; } }
BOOL fResult = TRUE;
if ( wcsProperty ) { uName.pwszName = CDbCmdTreeNode::AllocAndCopyWString( wcsProperty ); if ( DBKIND_PROPID == eKind ) { eKind = DBKIND_NAME; } else if ( DBKIND_GUID_PROPID == eKind ) { eKind = DBKIND_GUID_NAME; } else if ( DBKIND_PGUID_PROPID == eKind ) { eKind = DBKIND_PGUID_NAME; }
fResult = (0 != uName.pwszName); }
return fResult; }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::operator=
//
// Synopsis:
//
// Arguments: [Property] -
//
// Returns:
//
// History: 6-12-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
CDbColId & CDbColId::operator=( CDbColId const & Property ) {
if ( !_IsValidKind() ) { eKind = DBKIND_GUID_PROPID; } else { Cleanup(); }
if ( DBKIND_GUID_PROPID == Property.eKind || DBKIND_PGUID_PROPID == Property.eKind || DBKIND_PROPID == Property.eKind ) { uName.ulPropid = Property.uName.ulPropid;
if ( DBKIND_PROPID == Property.eKind ) { eKind = DBKIND_PROPID; } else if ( DBKIND_GUID_PROPID == Property.eKind ) { eKind = DBKIND_GUID_PROPID; if ( DBKIND_GUID_PROPID == Property.eKind ) { uGuid.guid = Property.uGuid.guid; } else { uGuid.guid = *(Property.uGuid.pguid); } } } else { Win4Assert( DBKIND_GUID_NAME == Property.eKind || DBKIND_PGUID_NAME == Property.eKind || DBKIND_NAME == Property.eKind );
if ( SetProperty( Property.GetPropertyName() ) ) { SetPropSet( Property.GetPropSet() ); } }
return *this; }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::operator==
//
// Synopsis: Compare two column IDs for equality
//
// Arguments: [Property] - column ID to be compared with
//
// Returns: TRUE if Property is equivalent to this one, FALSE otherwise
//
// Notes: The PGUID forms are not considered equivalent to the
// forms with GUIDs embedded. It just isn't worth it!
//
// History: 6-13-95 srikants Created
//
//----------------------------------------------------------------------------
BOOL CDbColId::operator==( CDbColId const & Property ) const { if ( eKind != Property.eKind ) { return FALSE; }
if ( DBKIND_GUID_PROPID == eKind ) { return uName.ulPropid == Property.uName.ulPropid && uGuid.guid == Property.uGuid.guid; } else if ( DBKIND_GUID_NAME == eKind ) { return ( uGuid.guid == Property.uGuid.guid ) && ( 0 == _wcsicmp( uName.pwszName, Property.uName.pwszName ) ); } else if ( DBKIND_PROPID == eKind ) { return uName.ulPropid == Property.uName.ulPropid; } else if ( DBKIND_NAME == eKind ) { return 0 == _wcsicmp( uName.pwszName, Property.uName.pwszName ); } else if ( DBKIND_PGUID_PROPID == eKind ) { return uName.ulPropid == Property.uName.ulPropid && *uGuid.pguid == *Property.uGuid.pguid; } else if ( DBKIND_PGUID_NAME == eKind ) { return ( *uGuid.pguid == *Property.uGuid.pguid ) && ( 0 == _wcsicmp( uName.pwszName, Property.uName.pwszName ) ); } else return FALSE; }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns:
//
// History: 6-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbColId::Marshall( PSerStream & stm ) const { stm.PutULong( eKind );
switch ( eKind ) { case DBKIND_PROPID: stm.PutGUID( uGuid.guid ); break;
case DBKIND_GUID_NAME: stm.PutGUID( uGuid.guid ); CDbCmdTreeNode::PutWString( stm, uName.pwszName ); break;
case DBKIND_GUID_PROPID: stm.PutGUID( uGuid.guid ); stm.PutULong( uName.ulPropid ); break;
case DBKIND_NAME: CDbCmdTreeNode::PutWString( stm, uName.pwszName ); break;
case DBKIND_PGUID_NAME: case DBKIND_PGUID_PROPID:
if ( 0 != uGuid.pguid ) { stm.PutGUID( *uGuid.pguid ); } else { stm.PutGUID( CDbCmdTreeNode::guidNull ); }
if ( DBKIND_PGUID_PROPID == eKind ) { stm.PutULong( uName.ulPropid ); } else { CDbCmdTreeNode::PutWString( stm, uName.pwszName ); }
default: Win4Assert( !"Illegal Case Statement" ); } }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::UnMarshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns:
//
// History: 6-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbColId::UnMarshall( PDeSerStream & stm ) { eKind = stm.GetULong();
BOOL fSuccess = TRUE;
switch ( eKind ) { case DBKIND_PROPID: stm.GetGUID( uGuid.guid ); break;
case DBKIND_GUID_NAME: stm.GetGUID( uGuid.guid ); uName.pwszName = CDbCmdTreeNode::GetWString( stm, fSuccess );
// patch broken old clients
if ( fSuccess && 0 == uName.pwszName ) eKind = DBKIND_GUID_PROPID; break;
case DBKIND_GUID_PROPID: stm.GetGUID( uGuid.guid ); uName.ulPropid = stm.GetULong(); break;
case DBKIND_NAME: uName.pwszName = CDbCmdTreeNode::GetWString( stm, fSuccess );
// patch broken old clients
if ( fSuccess && 0 == uName.pwszName ) eKind = DBKIND_GUID_PROPID; break;
case DBKIND_PGUID_NAME: case DBKIND_PGUID_PROPID:
stm.GetGUID( uGuid.guid );
if ( DBKIND_PGUID_PROPID == eKind ) { eKind = DBKIND_GUID_PROPID; uName.ulPropid = stm.GetULong(); } else { eKind = DBKIND_GUID_NAME; uName.pwszName = CDbCmdTreeNode::GetWString( stm, fSuccess ); }
// We don't support these two yet -- so assert and return FALSE
// break;
default: Win4Assert( !"Illegal Case Statement" ); fSuccess = FALSE; }
return fSuccess; }
//+---------------------------------------------------------------------------
//
// Method: CDbColId::Cleanup, public
//
// Synopsis: Cleans out allocated fields in a CDbColId structure
//
// Returns:
//
// History: 6-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbColId::Cleanup() { WCHAR * pwszStr = 0;
switch ( eKind ) { case DBKIND_GUID_NAME: case DBKIND_NAME: pwszStr = (WCHAR *) uName.pwszName; uName.pwszName = 0; break;
case DBKIND_PGUID_NAME: pwszStr = (WCHAR *) uName.pwszName; uName.pwszName = 0; // NOTE: fall through
case DBKIND_PGUID_PROPID: CoTaskMemFree( uGuid.pguid ); uGuid.pguid = 0; }
if ( 0 != pwszStr ) { CoTaskMemFree( pwszStr ); } }
BOOL CDbColId::Copy( DBID const & rhs ) { CDbColId const * pRhs = (CDbColId *) &rhs; *this = *pRhs;
//
// If the source is a bogus NAME propid with a 0 value, don't fail
// the copy. This is true for broken old clients who pass a fully
// 0 DBID.
//
if ( DBKIND_GUID_NAME == rhs.eKind && 0 == rhs.uName.pwszName ) eKind = DBKIND_GUID_PROPID;
return IsValid(); }
//+---------------------------------------------------------------------------
//
// Member: CDbByGuid::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbByGuid::Marshall( PSerStream & stm ) const { stm.PutBlob( (BYTE *) &guid, sizeof(guid) ); stm.PutULong( (ULONG) cbInfo ); if ( cbInfo ) { Win4Assert( 0 != pbInfo ); stm.PutBlob( pbInfo, (ULONG) cbInfo ); } }
//+---------------------------------------------------------------------------
//
// Member: CDbByGuid::UnMarshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns: TRUE if successful; FALSE o/w
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbByGuid::UnMarshall( PDeSerStream & stm ) { _Cleanup();
stm.GetBlob( (BYTE *) &guid, sizeof(guid) ); cbInfo = stm.GetULong();
// Guard against attack
if ( cbInfo > 1000 ) return FALSE;
if ( cbInfo ) { pbInfo = (BYTE *) CoTaskMemAlloc( (ULONG) cbInfo ); if ( 0 != pbInfo ) { stm.GetBlob( pbInfo, (ULONG) cbInfo ); } }
return IsValid(); }
//+---------------------------------------------------------------------------
//
// Member: CDbByGuid::operator
//
// Synopsis:
//
// Arguments: [rhs] -
//
// Returns:
//
// History: 11-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
CDbByGuid & CDbByGuid::operator=( CDbByGuid const & rhs ) { _Cleanup();
guid = rhs.guid; cbInfo = rhs.cbInfo; if ( cbInfo ) { pbInfo = (BYTE *) CoTaskMemAlloc( (ULONG) cbInfo ); if ( 0 != pbInfo ) { RtlCopyMemory( pbInfo, rhs.pbInfo, cbInfo ); } }
return *this; }
//+---------------------------------------------------------------------------
//
// Member: CDbParameter::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbParameter::Marshall( PSerStream & stm ) const { if ( 0 != pwszName ) { stm.PutByte(1); stm.PutWString( pwszName ); } else { stm.PutByte(0); }
stm.PutULong( wType );
stm.PutULong( (ULONG) cbMaxLength );
if ( pNum ) { stm.PutByte(1); CDbNumeric * pNumeric = (CDbNumeric *) pNum; pNumeric->Marshall( stm ); } else { stm.PutByte(0); }
Win4Assert( sizeof(dwFlags) == sizeof(ULONG) );
stm.PutULong( dwFlags );
}
//+---------------------------------------------------------------------------
//
// Member: CDbParameter::_Cleanup
//
// Synopsis:
//
// History: 11-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbParameter::_Cleanup() { if ( pwszName ) { CoTaskMemFree( pwszName ); pwszName = 0; }
if ( pTypeInfo ) { pTypeInfo->Release(); pTypeInfo = 0; }
if ( pNum ) { CDbNumeric * pNumeric = (CDbNumeric *) pNum; delete pNumeric; pNum = 0; } }
//+---------------------------------------------------------------------------
//
// Member: CDbParameter::UnMarshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns: TRUE if successful; FALSE o/w
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbParameter::UnMarshall( PDeSerStream & stm ) { _Cleanup();
if ( stm.GetByte() ) { BOOL fSuccess; pwszName = CDbCmdTreeNode::GetWString( stm, fSuccess ); if ( 0 == pwszName || !fSuccess ) return FALSE; }
Win4Assert( sizeof(wType) == sizeof(ULONG) ); wType = (DBTYPE) stm.GetULong();
cbMaxLength = stm.GetULong();
if ( stm.GetByte() ) { CDbNumeric * pNumeric = new CDbNumeric(); if ( pNumeric ) { pNumeric->UnMarshall( stm ); pNum = pNumeric->CastToStruct(); } else { _Cleanup(); return FALSE; } }
Win4Assert( sizeof(dwFlags) == sizeof(ULONG) );
dwFlags = stm.GetULong();
return TRUE; }
//+---------------------------------------------------------------------------
//
// Member: CDbParameter::Copy
//
// Synopsis:
//
// Arguments: [rhs] -
//
// Returns:
//
// History: 11-21-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbParameter::Copy( DBPARAMETER const & rhs ) { _Cleanup();
if ( rhs.pwszName ) { pwszName = CDbCmdTreeNode::AllocAndCopyWString( rhs.pwszName ); if ( 0 == pwszName ) { return FALSE; } }
wType = rhs.wType;
if ( rhs.pTypeInfo ) { pTypeInfo = rhs.pTypeInfo; pTypeInfo->AddRef(); }
cbMaxLength = rhs.cbMaxLength;
if ( rhs.pNum ) { CDbNumeric * pTemp = new CDbNumeric( *rhs.pNum ); if ( 0 == pTemp ) { _Cleanup(); return FALSE; } }
dwFlags = rhs.dwFlags;
return TRUE; }
CDbProp::~CDbProp() { Cleanup(); }
void CDbProp::Cleanup() { ((CDbColId &)colid).Cleanup( );
//
// In their infinite wisdom, the OLE-DB headers are #pragma pack(2)
// which can mess up the alignment of this Variant.
//
#if (_X86_ == 1)
CStorageVariant * pVarnt = CastToStorageVariant( vValue ); pVarnt->SetEMPTY(); #else
CStorageVariant * pVarnt = CastToStorageVariant( vValue );
if ( (((ULONG_PTR)pVarnt) & 0x7) == 0 ) pVarnt->SetEMPTY(); else { VARIANT var; Win4Assert( sizeof(var) == sizeof(CStorageVariant) );
RtlCopyMemory( &var, pVarnt, sizeof(var) );
((CStorageVariant *)&var)->SetEMPTY();
RtlCopyMemory( pVarnt, &var, sizeof(var) ); } #endif
}
CDbPropSet::~CDbPropSet() { if (rgProperties) { for (unsigned i=0; i<cProperties; i++) GetProperty(i)->Cleanup();
deleteOLE(rgProperties); } }
CDbPropIDSet::~CDbPropIDSet() { deleteOLE(rgPropertyIDs); }
BOOL CDbPropIDSet::Copy( const DBPROPIDSET & rhs ) { if ( cPropertyIDs ) { deleteOLE(rgPropertyIDs); rgPropertyIDs = 0; cPropertyIDs = 0; }
guidPropertySet = rhs.guidPropertySet;
if ( rhs.cPropertyIDs ) { XArrayOLE<DBPROPID> aPropId; aPropId.InitNoThrow( rhs.cPropertyIDs ); if ( aPropId.IsNull() ) return FALSE;
RtlCopyMemory( aPropId.GetPointer(), rhs.rgPropertyIDs, rhs.cPropertyIDs * sizeof DBPROPID ); rgPropertyIDs = aPropId.Acquire(); cPropertyIDs = rhs.cPropertyIDs; }
return TRUE; }
//+---------------------------------------------------------------------------
//
// Member: CDbPropSet::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// History: 11-17-95 srikants Created
//
//----------------------------------------------------------------------------
void CDbPropSet::Marshall( PSerStream & stm ) const { stm.PutBlob( (BYTE *) &guidPropertySet, sizeof(guidPropertySet) );
stm.PutULong( cProperties );
for (unsigned i=0; i<cProperties; i++) GetProperty(i)->Marshall( stm ); }
//+---------------------------------------------------------------------------
//
// Member: CDbPropSet::UnMarshall
//
// Synopsis: Unmarshalls the object from a stream
//
// Arguments: [stm] -- The stream from which the object is unmarshalled
//
// Returns: TRUE if successful; FALSE o/w
//
// History: 11-17-95 srikants Created
//
//----------------------------------------------------------------------------
BOOL CDbPropSet::UnMarshall( PDeSerStream & stm ) { stm.GetBlob( (BYTE *) &guidPropertySet, sizeof(guidPropertySet) ); cProperties = stm.GetULong();
// Guard against attack
if ( cProperties > 100 ) return FALSE;
XArrayOLE<DBPROP> xDbProp; xDbProp.InitNoThrow( cProperties ); if ( xDbProp.IsNull() ) return FALSE;
CDbProp * pProps = (CDbProp *) xDbProp.Get();
BOOL fStatus = TRUE; unsigned cOk = 0; for (unsigned i=0; fStatus && i < cProperties; i++) { fStatus = pProps[i].UnMarshall( stm ); if ( fStatus ) cOk++; }
if (fStatus) { rgProperties = pProps; xDbProp.Acquire(); } else { for ( i = 0; i < cOk; i++ ) pProps[i].Cleanup();
cProperties = 0; rgProperties = 0; }
return fStatus; } //UnMarshall
//+---------------------------------------------------------------------------
//
// Member: CDbProp::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// History: 11-17-95 srikants Created
//
//----------------------------------------------------------------------------
void CDbProp::Marshall( PSerStream & stm ) const { stm.PutULong( dwPropertyID ); stm.PutULong( dwOptions ); stm.PutULong( dwStatus );
((CDbColId &)colid).Marshall( stm );
CStorageVariant const * pVarnt = CastToStorageVariant( vValue );
//
// In their infinite wisdom, the OLE-DB headers are #pragma pack(2)
// which can mess up the alignment of this Variant.
//
#if (_X86_ == 1)
pVarnt->Marshall( stm ); #else
if ( (((ULONG_PTR)pVarnt) & 0x7) == 0 ) pVarnt->Marshall( stm ); else { VARIANT var; RtlCopyMemory( &var, pVarnt, sizeof(var) );
((CStorageVariant *)&var)->Marshall( stm ); } #endif
} //Marshall
//+---------------------------------------------------------------------------
//
// Member: CDbProp::UnMarshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns: TRUE if successful; FALSE o/w
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbProp::UnMarshall( PDeSerStream & stm ) { dwPropertyID = stm.GetULong( ); dwOptions = stm.GetULong( ); dwStatus = stm.GetULong( );
((CDbColId &)colid).Cleanup();
if ( !((CDbColId &)colid).UnMarshall( stm ) ) return FALSE;
//
// The OLE-DB headers are #pragma pack(2), which can mess up the
// alignment of this Variant. As a work-around, unmarshall into a
// variant on the stack, then copy the bytes over to vVariant.
//
CStorageVariant temp( stm ); if ( !temp.IsValid() ) return FALSE;
RtlCopyMemory( &vValue, &temp, sizeof VARIANT ); RtlZeroMemory( &temp, sizeof temp );
return TRUE; } //UnMarshall
//+---------------------------------------------------------------------------
//
// Member: CDbPropSet::Copy
//
// Synopsis: Copies a prop set
//
// Arguments: [rhs] - the source prop set
//
// Returns: TRUE if successful, FALSE otherwise
//
// History: 11-21-95 srikants Created
//
//----------------------------------------------------------------------------
BOOL CDbPropSet::Copy( const DBPROPSET & rhs ) { //
// Cleanup existing properties.
//
if ( rgProperties ) { for (unsigned i=0; i<cProperties; i++) GetProperty(i)->Cleanup();
deleteOLE(rgProperties); rgProperties = 0; }
guidPropertySet = rhs.guidPropertySet; cProperties = rhs.cProperties;
if (cProperties == 0) return TRUE;
XArrayOLE<DBPROP> xDbProp; xDbProp.InitNoThrow( cProperties ); if ( xDbProp.IsNull() ) return FALSE;
CDbProp * pProps = (CDbProp *) xDbProp.Get();
BOOL fStatus = TRUE; ULONG cOk = 0; for (unsigned i=0; fStatus && i<cProperties; i++) { fStatus = pProps[i].Copy( rhs.rgProperties[i] ); if ( fStatus ) cOk++; }
if (fStatus) { rgProperties = pProps; xDbProp.Acquire(); } else { for ( i = 0; i < cOk; i++ ) pProps[ i ].Cleanup();
cProperties = 0; rgProperties = 0; }
return fStatus; }
//+---------------------------------------------------------------------------
//
// Member: CDbProp::Copy
//
// Synopsis:
//
// Arguments: [rhs] -
//
// Returns:
//
// History: 11-21-95 srikants Created
//
//----------------------------------------------------------------------------
#if CIDBG == 1
LONG g_cDbPropCopies = 0; #endif
BOOL CDbProp::Copy( const DBPROP & rhs ) { #if CIDBG == 1
g_cDbPropCopies++; #endif
dwPropertyID = rhs.dwPropertyID; dwOptions = rhs.dwOptions; dwStatus = rhs.dwStatus;
#if (_X86_ == 1)
BOOL fOK = ((CDbColId &) colid).Copy( rhs.colid );
if ( !fOK ) return FALSE;
* CastToStorageVariant( vValue ) = * CastToStorageVariant( rhs.vValue );
return CastToStorageVariant( vValue )->IsValid();
#else
// rhs.colid is NOT 8 Byte aligned
DBID rhsDbId, lhsDbId;
RtlCopyMemory( &rhsDbId, &rhs.colid, sizeof DBID ); RtlCopyMemory( &lhsDbId, &colid, sizeof DBID ); BOOL fOK = ((CDbColId &)lhsDbId).Copy( rhsDbId ); RtlCopyMemory( &colid, &lhsDbId, sizeof DBID );
if ( !fOK ) return FALSE;
// vValue is not 8 Byte aligned
VARIANT lhsVar, rhsVar; RtlCopyMemory( &rhsVar, &rhs.vValue, sizeof VARIANT ); RtlCopyMemory( &lhsVar, &vValue, sizeof VARIANT );
CStorageVariant * pLeft = CastToStorageVariant( lhsVar ); CStorageVariant const * pRight = CastToStorageVariant( rhsVar ); *pLeft = *pRight;
RtlCopyMemory( &vValue, &lhsVar, sizeof VARIANT ); return pLeft->IsValid();
#endif
} //Copy
//+---------------------------------------------------------------------------
//
// Member: CDbContentVector::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbContentVector::Marshall( PSerStream & stm ) const { Win4Assert( !"Not Yet Implemented" ); }
//+---------------------------------------------------------------------------
//
// Member: CDbContentVector::UnMarshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns: TRUE if successful; FALSE o/w
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbContentVector::UnMarshall( PDeSerStream & stm ) { Win4Assert( !"Not Yet Implemented" ); return TRUE; }
//+---------------------------------------------------------------------------
//
// Member: CDbNumeric::Marshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CDbNumeric::Marshall( PSerStream & stm ) const { stm.PutByte( precision ); stm.PutByte( scale ); stm.PutByte( sign ); stm.PutBlob( (BYTE *) &val[0], sizeof(val) ); }
//+---------------------------------------------------------------------------
//
// Member: CDbNumeric::UnMarshall
//
// Synopsis:
//
// Arguments: [stm] -
//
// Returns: TRUE if successful; FALSE o/w
//
// History: 11-17-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
BOOL CDbNumeric::UnMarshall( PDeSerStream & stm ) { precision = stm.GetByte(); scale = stm.GetByte(); sign = stm.GetByte(); stm.GetBlob( (BYTE *) &val[0], sizeof(val) );
return TRUE; }
|