|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 2000.
//
// File: colmastr.cxx
//
// Contents: Classes dealing with the table master column description.
//
// Classes: CColumnMasterDesc - A master column description
// CColumnMasterArray - A simple array of master columns
// CColumnMasterSet - An managed set of master columns
//
// Functions:
//
// History: 28 Feb 1994 AlanW Created
//
//--------------------------------------------------------------------------
#include "pch.cxx"
#pragma hdrstop
#include <tablecol.hxx>
#include <coldesc.hxx>
#include "tabledbg.hxx"
#include "colcompr.hxx"
#include "propdata.hxx"
//
// Generate the implementation of the master set base class
//
IMPL_DYNARRAY( CColumnMasterArray, CColumnMasterDesc )
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterSet::CColumnMasterSet, public
//
// Synopsis: Constructor for a master column set.
//
// Arguments: [pcol] -- A description of the initial output column set
//
// Notes:
//
//--------------------------------------------------------------------------
CColumnMasterSet::CColumnMasterSet( const CColumnSet * const pcol ) : _iNextFree( 0 ), _aMasterCol( pcol->Size() ), _fHasUserProp( FALSE ) { for (unsigned iCol = 0; iCol< pcol->Size(); iCol++) { PROPID pid = pcol->Get(iCol);
if ( IsUserDefinedPid( pid ) ) _fHasUserProp = TRUE;
CColumnMasterDesc MasterCol( pid );
Add( MasterCol ); } }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterSet::Find, private
//
// Synopsis: Find a master column description in a master column set.
//
// Arguments: [propid] -- The property ID of the column to be located
// [riPos] -- If found, returns the position of the column
// description in the dynamic array.
//
// Returns: CColumnMasterDesc* - a pointer to the master column
// description if found, otherwise NULL
//
// Notes:
//
//--------------------------------------------------------------------------
inline CColumnMasterDesc * CColumnMasterSet::Find( const PROPID propid, unsigned& riCol ) { Win4Assert(_iNextFree <= Size());
for (riCol = 0; riCol < _iNextFree; riCol++) { if (_aMasterCol.Get(riCol)->PropId == propid) return _aMasterCol.Get(riCol); } return NULL; }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterSet::Find, public
//
// Synopsis: Find a master column description in a master column set.
//
// Arguments: [propid] -- The property ID of the column to be located
//
// Returns: CColumnMasterDesc* - a pointer to the master column
// description if found, otherwise NULL
//
// Notes:
//
//--------------------------------------------------------------------------
CColumnMasterDesc* CColumnMasterSet::Find( const PROPID propid ) { unsigned iCol;
return Find(propid, iCol); }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterSet::Add, public
//
// Synopsis: Add a master column description to a master column set.
//
// Arguments: [xpNewCol] -- A reference to the column description to be
// added.
//
// Returns: CColumnMasterDesc* - a pointer to the master column
// description added
//
// Notes: If a property description with the same property ID
// is already in the column set, the new column is not
// added, but the previous column is used.
//
//--------------------------------------------------------------------------
CColumnMasterDesc* CColumnMasterSet::Add( XPtr<CColumnMasterDesc> & xpNewCol ) { CColumnMasterDesc* pCol = Find(xpNewCol->PropId);
if ( 0 != pCol ) return pCol;
//
// Column was not found in the existing set, add it.
//
unsigned iCol = _iNextFree++; if (iCol >= _aMasterCol.Size()) _aMasterCol.Add(0, iCol); // force the array to grow
_aMasterCol.Add(xpNewCol.Acquire(), iCol); return _aMasterCol.Get(iCol); }
CColumnMasterDesc* CColumnMasterSet::Add( CColumnMasterDesc const & rColDesc ) { CColumnMasterDesc* pCol = Find(rColDesc.PropId);
if ( 0 != pCol ) return pCol;
//
// Column was not found in the existing set, add it.
//
// PERFFIX: to avoid the compression restriction, use the method above.
Win4Assert(! rColDesc.IsCompressedCol() );
CColumnMasterDesc* pNewCol = new CColumnMasterDesc;
XPtr<CColumnMasterDesc> xCol( pNewCol );
*pNewCol = rColDesc;
unsigned iCol = _iNextFree++; _aMasterCol.Add(pNewCol, iCol);
xCol.Acquire();
return _aMasterCol.Get(iCol); }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterDesc::CColumnMasterDesc, public
//
// Synopsis: Constructor for a master column description.
//
// Arguments: [PropertyId] -- the PROPID for the column
// [DataTyp] -- data type of column
//
// Notes:
//
//--------------------------------------------------------------------------
CColumnMasterDesc::CColumnMasterDesc( PROPID PropertyId, VARTYPE DataTyp) : PropId( PropertyId ), DataType( DataTyp ), _cbData( 0 ), _fComputedProperty( FALSE ), _PredominantType( VT_EMPTY ), _fUniformType( TRUE ), _fNotVariantType (FALSE), _pCompression( NULL ), _CompressMasterID( 0 ) { if ( DataType == VT_EMPTY ) { DataType = PropIdToType( PropId ); } }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterDesc::CColumnMasterDesc, public
//
// Synopsis: Constructor for a master column description from a
// sort key description.
//
// Arguments: [rSortKey] -- A description of a sort key
//
// Notes:
//
//--------------------------------------------------------------------------
CColumnMasterDesc::CColumnMasterDesc( SSortKey& rSortKey ) : PropId( rSortKey.pidColumn ), DataType( PropIdToType(rSortKey.pidColumn) ), _cbData( 0 ), _fComputedProperty( FALSE ), _PredominantType( VT_EMPTY ), _fUniformType( TRUE ), _fNotVariantType (FALSE), _pCompression( NULL ), _CompressMasterID( 0 ) { }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterDesc::~CColumnMasterDesc, public
//
// Synopsis: Destructor for a master column description.
//
// Notes:
//
//--------------------------------------------------------------------------
CColumnMasterDesc::~CColumnMasterDesc( ) { if (_pCompression && _CompressMasterID == 0) delete _pCompression; }
//+-------------------------------------------------------------------------
//
// Member: CColumnMasterDesc::SetCompression, public
//
// Synopsis: Install a global compression for a master column.
//
// Arguments: [pCompr] -- A pointer to the compressor for the
// column
// [SharedID] -- If non-zero, the master column ID
// for a shared compression.
//
// Notes:
//
//--------------------------------------------------------------------------
VOID CColumnMasterDesc::SetCompression( CCompressedCol* pCompr, PROPID SharedID ) { if (_pCompression && _CompressMasterID == 0) delete _pCompression;
_pCompression = pCompr; _CompressMasterID = SharedID; }
|