windows-nt/Source/XPSP1/NT/inetsrv/query/icommand/dbwrap.cxx
2020-09-26 16:20:57 +08:00

1292 lines
28 KiB
C++

//+---------------------------------------------------------------------------
//
// 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;
}