windows-nt/Source/XPSP1/NT/inetsrv/query/bigtable/tputget.hxx
2020-09-26 16:20:57 +08:00

318 lines
8.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: tputget.hxx
//
// Contents: Classes to add, retrieve and locate rows in the large table.
//
// Classes: CTableRowPutter, CTableRowGetter, CTableRowLocator
//
// Functions:
//
// History: 4-17-95 srikants Created
//
//----------------------------------------------------------------------------
#pragma once
#include <bigtable.hxx>
class CTableWindow;
class CTableBucket;
//+---------------------------------------------------------------------------
//
// Class: CTableRowPutter
//
// Purpose: A class to add a row to the large table.
//
// History: 4-17-95 srikants Created
//
//----------------------------------------------------------------------------
class CTableRowPutter
{
public:
CTableRowPutter( CLargeTable & largeTable, CRetriever & obj ) :
_largeTable(largeTable),
_segListMgr(largeTable._GetSegListMgr()),
_segList(_segListMgr.GetList()),
_comparator(largeTable._keyCompare.GetReference()),
_currRow(largeTable._currRow.GetReference()),
_obj(obj),
_fNewWindowCreated(FALSE)
{
_currRow.PreSet( & _obj, & _largeTable._vtInfoSortKey );
}
CTableSegment * LokFindSegToInsert( CTableSegment * pSegHint = 0 );
CTableSegment * LokSplitOrAddSegment( CTableSegment * pSegment );
BOOL LokIsNewWindowCreated() const { return _fNewWindowCreated; }
private:
//
// LargeTable and the segment list manager references.
//
CLargeTable & _largeTable;
CSegListMgr & _segListMgr;
CTableSegList & _segList;
CTableKeyCompare & _comparator;
CTableRowKey & _currRow;
CRetriever & _obj;
//
// Flag set to TRUE if a new window was created and added to the
// table before adding the row.
//
BOOL _fNewWindowCreated;
//
// Result of comparison with the current segment. Used to locate
// the segment into which the row must be inserted.
//
CCompareResult _cmpCurr;
CTableSegment * _IsHintGood( CTableSegment * pSegHint );
BOOL _LokShouldUseNext( int icmp, CTableSegment * pSeg );
};
class CRegionTransformer;
//+---------------------------------------------------------------------------
//
// Class: CTableRowLocator
//
// Purpose: A class to locate a requested row in the large table.
//
// History: 4-19-95 srikants Created
//
//----------------------------------------------------------------------------
class CTableRowLocator
{
public:
CTableRowLocator( CLargeTable & largeTable, WORKID widStart,
LONG iRowOffset, CI_TBL_CHAPT chapt )
: _largeTable(largeTable),
_segListMgr(largeTable._GetSegListMgr()),
_segList(_segListMgr.GetList()),
_widStart(widStart),
_iRowOffset( iRowOffset ),
_widFound(widInvalid),
_cRowsBeyond(0),
_chapt(chapt)
{
}
SCODE LokLocate( HWATCHREGION hRegion,
BOOL fAsync,
CDoubleTableSegIter & iter,
CRegionTransformer & transformer );
void LokRelocate( BOOL fAsync, CDoubleTableSegIter & iter,
CRegionTransformer & transformer,
XPtr<CTableBucket> & xBktToExplode,
CDynStack<CTableBucket> & xBktToConvert );
void LokSimulateFetch( CDoubleTableSegIter & iter,
CRegionTransformer & transformer,
CDynStack<CTableBucket> & xBktToConvert );
void SetLocateInfo( WORKID widStart, LONG iRowOffset )
{
_widStart = widStart;
_iRowOffset = iRowOffset;
}
WORKID GetWorkIdFound() const { return _widFound; }
void SeekAndSetFetchBmk( WORKID wid, CDoubleTableSegIter & iter );
DBROWCOUNT GetBeyondTableCount() const { return _cRowsBeyond; }
BOOL IsOffsetFound( CDoubleTableSegIter & iter, DBROWCOUNT offset );
private:
//
// LargeTable and the segment list manager references.
//
CLargeTable & _largeTable;
CSegListMgr & _segListMgr;
CTableSegList & _segList;
//
// The parameters for the search.
//
WORKID _widStart;
LONG _iRowOffset;
CI_TBL_CHAPT _chapt;
//
// Results of a locate.
//
WORKID _widFound;
DBROWCOUNT _cRowsBeyond;
void _RelocateThruBuckets( BOOL fAsync, CDoubleTableSegIter & iter ,
CRegionTransformer & transformer,
XPtr<CTableBucket> & xBktToExplode );
};
//+---------------------------------------------------------------------------
//
// Member: CTableRowLocator::IsOffsetFound
//
// Synopsis: Determines whether the current segment in the iterator has
// the row indicated by the _cRowsResidual or not, ie, does the
// current segment in the iterator has the requested row or
// not.
//
// Arguments: [iter] - The iterator on the segment list.
//
// Returns: TRUE if the requested row is located.
// FALSE o/w.
//
// History: 7-26-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
inline BOOL CTableRowLocator::IsOffsetFound(
CDoubleTableSegIter& iter,
DBROWCOUNT offset )
{
Win4Assert( offset >= 0 );
return !_segList.AtEnd(iter) &&
offset < (DBROWCOUNT) iter.GetSegment()->RowCount();
}
//+---------------------------------------------------------------------------
//
// Class: CTableRowGetter
//
// Purpose: A class to fetch rows from the table.
//
// History: 4-19-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CTableRowGetter
{
public:
CTableRowGetter( CLargeTable & largeTable,
CTableColumnSet const & outColumns,
CGetRowsParams & getParams,
CI_TBL_CHAPT chapt,
HWATCHREGION hRegion);
SCODE LokGetRowsAtSegment( CTableSegment * pStartSeg,
WORKID widStart,
BOOL fAsync,
XPtr<CTableBucket> & xBktToExplode );
CTableBucket * LokGetBucketToExpand() { return _pBucketToExpand; }
void ClearBucketToExpand() { _pBucketToExpand = 0; }
WORKID GetLastWorkId() const { return _widLastTransferred; }
BOOL IsDone() const { return 0 == _pBucketToExpand; }
void SetRowsToTransfer( ULONG cRowsToTransfer );
long GetRowsToTransfer() const { return (long) _cRowsToTransfer; }
void DecrementRowsToTransfer( ULONG cDiff )
{
if ( cDiff < _cRowsToTransfer )
{
_cRowsToTransfer -= cDiff;
}
else
{
_cRowsToTransfer = 0;
}
}
private:
//
// Large table and the segment list management members.
//
CLargeTable & _largeTable;
CSegListMgr & _segListMgr;
CTableSegList & _segList;
//
// Input and output parameters to the GetRows call.
//
CTableColumnSet const & _outColumns;
CGetRowsParams & _getParams;
CI_TBL_CHAPT _chapt;
HWATCHREGION _hRegion;
//
// MAX Number of rows to be transferred
//
ULONG _cRowsToTransfer;
//
// The bucket that must be converted into a window before any more
// rows can be retrieved.
//
CTableBucket * _pBucketToExpand;
//
// The workid that was transferred last.
//
WORKID _widLastTransferred;
//
// State information used during retrieval of rows.
//
WORKID _widStart;
ULONG _cBktRowsToExpand;
SCODE _status;
BOOL _fAsync;
void _Reset()
{
_pBucketToExpand = 0;
}
void _InitForGetRows( WORKID widStart, BOOL fAsync )
{
_widStart = widStart;
_cBktRowsToExpand = _cRowsToTransfer;
_status = S_OK;
_fAsync = fAsync;
_pBucketToExpand = 0;
}
BOOL _GetRowsFromWindow( CDoubleTableSegIter & iter );
BOOL _ProcessBucket( CDoubleTableSegIter & iter,
XPtr<CTableBucket> & xBktToExplode );
};