//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 2000 // // File: RowMan.cxx // // Contents: Distributed HROW manager. // // Classes: CHRowManager // // History: 05-Jun-95 KyleP Created // 14-JAN-97 KrishnaN Undefined CI_INETSRV and related changes // //---------------------------------------------------------------------------- #include #pragma hdrstop #include "rowman.hxx" //+--------------------------------------------------------------------------- // // Member: CHRowManager::CHRowManager, public // // Synopsis: Initializes row manager. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- CHRowManager::CHRowManager() : _aHRow( 0 ), _cHRow( 50 ), _iFirstFree( 0 ), _cChild( 0 ), _ahrowHint( 0 ) { _aHRow = new CHRow [_cHRow]; for ( unsigned i = 0; i < _cHRow-1; i++ ) { _aHRow[i].Link( i + 1 ); } _aHRow[_cHRow-1].Link( -1 ); } //+--------------------------------------------------------------------------- // // Member: CHRowManager::~CHRowManager, public // // Synopsis: Destructor // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- CHRowManager::~CHRowManager() { #if CIDBG == 1 for ( unsigned i = 0; i < _cHRow; i++ ) { if ( _aHRow[i].IsInUse() ) vqDebugOut(( DEB_WARN, "CHRowManager: HROW %d still in use\n", i )); Win4Assert( !_aHRow[i].IsInUse() ); } #endif delete [] _aHRow; delete [] _ahrowHint; } //+--------------------------------------------------------------------------- // // Member: CHRowManager::TrackSiblings, public // // Synopsis: Turns on tracking of siblings. // // Arguments: [cChild] -- Number of child cursors. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- void CHRowManager::TrackSiblings( unsigned cChild ) { _cChild = cChild; _ahrowHint = new HROW [_cHRow * _cChild]; } //+--------------------------------------------------------------------------- // // Member: CHRowManager::Add, public // // Synopsis: Adds a new HROW to be tracked. // // Arguments: [iChild] -- Index of governing child cursor. // [hrow] -- HROW used by child cursor // // Returns: HROW used by distributed row manager. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- HROW CHRowManager::Add( unsigned iChild, HROW hrow ) { int iCurrent = InnerAdd( iChild, hrow ); vqDebugOut(( DEB_ITRACE, "CHRowManager::Add HROW distr=%d child=%d,%d\n", iCurrent, iChild, hrow)); if ( IsTrackingSiblings() ) { RtlFillMemory( _ahrowHint + (iCurrent * _cChild), _cChild * sizeof(HROW), 0xFF ); _ahrowHint[iCurrent*_cChild + iChild] = hrow; } return (HROW)( iCurrent+1 ); // we are 0 based while hrow is 1 based } //+--------------------------------------------------------------------------- // // Member: CHRowManager::Add, public // // Synopsis: Adds a new HROW to be tracked, including hints. // // Arguments: [iChild] -- Index of governing child cursor. // [ahrow] -- Array of HROW, one per child cursor. // // Returns: HROW used by distributed row manager. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- HROW CHRowManager::Add( unsigned iChild, HROW const * ahrow ) { int iCurrent = InnerAdd( iChild, ahrow[iChild] ); vqDebugOut(( DEB_ITRACE, "CHRowManager::Add HROW distr=%d child=%d,%d\n", iCurrent, iChild, ahrow[iChild] )); RtlCopyMemory( _ahrowHint + (iCurrent * _cChild), ahrow, _cChild * sizeof(HROW) ); return (HROW)( iCurrent+1 ); // we are 0 based while hrow is 1 based } //+--------------------------------------------------------------------------- // // Member: CHRowManager::AddRef, public // // Synopsis: De-refs a given hrow // // Arguments: [hrow] -- Distributed hrow // // History: 11-sept-2000 slarimor Created. // //---------------------------------------------------------------------------- void CHRowManager::AddRef( HROW hrow ) { unsigned iCurrent = ConvertAndValidate( hrow ); _aHRow[iCurrent].AddRef(); } //+--------------------------------------------------------------------------- // // Member: CHRowManager::Release, public // // Synopsis: De-refs a given hrow // // Arguments: [hrow] -- Distributed hrow // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- void CHRowManager::Release( HROW hrow ) { unsigned iCurrent = ConvertAndValidate( hrow ); _aHRow[iCurrent].Release(); if ( !_aHRow[iCurrent].IsInUse() ) { _aHRow[iCurrent].Link( _iFirstFree ); _iFirstFree = iCurrent; } } //+--------------------------------------------------------------------------- // // Member: CHRowManager::IsSame, public // // Synopsis: Compares HROWs. // // Arguments: [hrow1] -- Distributed hrow // [hrow1] -- Distributed hrow // // Returns: FALSE. We can't compare rows right now. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- BOOL CHRowManager::IsSame( HROW hrow1, HROW hrow2 ) { // NTRAID#DB-NTBUG9-84054-2000/07/31-dlee Distributed queries don't implement hrow identity IsSame() method return( FALSE ); } //+--------------------------------------------------------------------------- // // Member: CHRowManager::Grow, private // // Synopsis: Grow HROW free space. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- void CHRowManager::Grow() { // // Allocate new array. // unsigned cTemp = _cHRow * 2; CHRow * pTemp = new CHRow [cTemp]; // // Transfer old data. // RtlCopyMemory( pTemp, _aHRow, _cHRow * sizeof(_aHRow[0]) ); // // Link new elements into free list. // Win4Assert( _iFirstFree == -1 ); for ( unsigned i = _cHRow; i < cTemp-1; i++ ) { pTemp[i].Link( i + 1 ); } pTemp[cTemp-1].Link( -1 ); // // Out with the old, and in with the new. // delete [] _aHRow; _aHRow = pTemp; // // And now the same thing for the hint. Note that we've completely taken // care of memory leaks for _aHRow before moving on to the hints. // if ( IsTrackingSiblings() ) { HROW * pTempHint = new HROW [cTemp * _cChild]; RtlCopyMemory( pTempHint, _ahrowHint, _cHRow*_cChild*sizeof(_ahrowHint[0]) ); delete [] _ahrowHint; _ahrowHint = pTempHint; } _iFirstFree = _cHRow; _cHRow = cTemp; } //Grow