//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: DBColumn.cxx // // Contents: C++ wrappers for OLE-DB columns and sort keys // // Classes: CDbColumns // CDbSortKey // CDbSortSet // // History: 20 Jul 1995 AlanW Created // //-------------------------------------------------------------------------- #include #pragma hdrstop // // Methods for CDbColumns // CDbColumns::CDbColumns( unsigned size ) : _size( size ), _cCol( 0 ), _aCol( 0 ) { if ( _size > 0 ) { _aCol = (CDbColId *)CoTaskMemAlloc( _size * sizeof(CDbColId) ); if ( 0 == _aCol ) { _size = 0; } else memset( _aCol, DBKIND_GUID_PROPID, _size * sizeof( CDbColId ) ); } } CDbColumns::CDbColumns( CDbColumns const & src ) : _size( src._cCol ), _cCol( 0 ) { if ( _size > 0 ) { _aCol = (CDbColId *)CoTaskMemAlloc( _size * sizeof( CDbColId ) ); if ( 0 != _aCol ) { memset( _aCol, DBKIND_GUID_PROPID, _size * sizeof( CDbColId ) ); while( _cCol < src._cCol ) { if ( !Add( src.Get( _cCol ), _cCol ) ) break; } } else { _size = 0; } } } CDbColumns::~CDbColumns() { if ( _size > 0 ) { for ( unsigned i = 0; i < _cCol; i++ ) _aCol[i].CDbColId::~CDbColId(); if ( _aCol ) CoTaskMemFree( _aCol ); } } #if 0 // NOTE: Marshall & Unmarshall not needed at this time. void CDbColumns::Marshall( PSerStream & stm ) const { stm.PutULong( _cCol ); for ( unsigned i = 0; i < _cCol; i++ ) { _aCol[i].Marshall( stm ); } } CDbColumns::CDbColumns( PDeSerStream & stm ) { _size = stm.GetULong(); if ( _size > 0 ) { _aCol = (CDbColId *)CoTaskMemAlloc( _size * sizeof( CDbColId ) ); if ( 0 != _aCol ) { for( _cCol = 0; _cCol < _size; _cCol++ ) { CDbColId ps(stm); Add( ps, _cCol ); } } else { _size = 0; } } } #endif // 0 - Marshall and Unmarshall not needed now. BOOL CDbColumns::Add( CDbColId const & Property, unsigned pos ) { while ( pos >= _size ) { unsigned cNew = (_size > 0) ? (_size * 2) : 1; CDbColId * aNew = (CDbColId *)CoTaskMemAlloc( cNew * sizeof( CDbColId ) ); if ( 0 == aNew ) return FALSE; memcpy( aNew, _aCol, _cCol * sizeof( CDbColId ) ); memset( aNew + _cCol, DBKIND_GUID_PROPID, (cNew - _cCol) * sizeof( CDbColId ) ); if ( 0 != _aCol ) CoTaskMemFree( _aCol ); _aCol = aNew; _size = cNew; } _aCol[pos] = Property; if ( pos >= _cCol ) _cCol = pos + 1; return( TRUE ); } void CDbColumns::Remove( unsigned pos ) { if ( pos < _cCol ) { _aCol[pos].CDbColId::~CDbColId(); _cCol--; RtlMoveMemory( _aCol + pos, _aCol + pos + 1, (_cCol - pos) * sizeof( CDbColId ) ); } } // // Methods for CDbSortSet // CDbSortSet::CDbSortSet( unsigned size ) : _size( size ), _csk( 0 ), _ask( 0 ) { if ( _size > 0 ) { _ask = (CDbSortKey *)CoTaskMemAlloc( _size * sizeof( CDbSortKey ) ); if ( _ask == 0 ) { _size = 0; } else { memset( _ask, DBKIND_GUID_PROPID, _size * sizeof( CDbSortKey ) ); } } } CDbSortSet::CDbSortSet( CDbSortSet const & src ) : _size( src._csk ), _csk( 0 ), _ask( 0 ) { if ( _size > 0 ) { _ask = (CDbSortKey *)CoTaskMemAlloc( _size * sizeof( CDbSortKey ) ); if ( 0 != _ask ) { memset( _ask, DBKIND_GUID_PROPID, _size * sizeof( CDbSortKey ) ); while( _csk < src._csk ) { if ( !Add( src.Get( _csk ), _csk ) ) { break; } } } else { _size = 0; } } } #if 0 // NOTE: Marshall & Unmarshall not needed at this time. void CDbSortKey::Marshall( PSerStream & stm ) const { // // NOTE: Order is important! // _property.Marshall( stm ); stm.PutULong( _dwOrder ); } CDbSortKey::CDbSortKey( PDeSerStream & stm ) : _property( stm ), _dwOrder( stm.GetULong() ) { } #endif // 0 - Marshall and Unmarshall not needed now. CDbSortSet::~CDbSortSet() { if ( _size > 0 ) { for ( unsigned i = 0; i < _csk; i++ ) { _ask[i].GetProperty().CDbColId::~CDbColId(); } if ( _ask ) { CoTaskMemFree( _ask ); } } } #if 0 // NOTE: Marshall & Unmarshall not needed at this time. void CDbSortSet::Marshall( PSerStream & stm ) const { stm.PutULong( _csk ); for ( unsigned i = 0; i < _csk; i++ ) { _ask[i].Marshall( stm ); } } CDbSortSet::CDbSortSet( PDeSerStream & stm ) : _csk( stm.GetULong() ), _size( _csk ) { _ask = (CDbSortKey *)CoTaskMemAlloc( _csk * sizeof( CDbSortKey ) ); for ( unsigned i = 0; i < _csk; i++ ) { CDbSortKey sk(stm); Add( sk, i ); } } #endif // 0 - Marshall and Unmarshall not needed now. BOOL CDbSortSet::Add( CDbSortKey const & sk, unsigned pos ) { while ( pos >= _size ) { unsigned cNew = (_size > 0) ? (_size * 2) : 1; CDbSortKey * aNew = (CDbSortKey *)CoTaskMemAlloc( cNew * sizeof( CDbSortKey ) ); if ( 0 == aNew ) return FALSE; memcpy( aNew, _ask, _csk * sizeof( CDbSortKey ) ); memset( aNew + _csk, DBKIND_GUID_PROPID, (cNew - _csk) * sizeof( CDbSortKey ) ); CoTaskMemFree( _ask ); _ask = aNew; _size = cNew; } _ask[pos] = sk; if ( !_ask[pos].IsValid() ) return FALSE; if ( pos >= _csk ) _csk = pos + 1; return TRUE; } BOOL CDbSortSet::Add( CDbColId const & property, ULONG dwOrder, unsigned pos ) { CDbSortKey sk( property, dwOrder ); if ( !sk.IsValid() ) return FALSE; return Add( sk, pos ); } void CDbSortSet::Remove( unsigned pos ) { if ( pos < _csk ) { _ask[pos].GetProperty().CDbColId::~CDbColId(); _csk--; RtlMoveMemory( _ask + pos, _ask + pos + 1, (_csk - pos) * sizeof( CDbSortKey ) ); } }