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

206 lines
5.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 2001.
//
// File: FRESHCUR.CXX
//
// Contents: Fresh Cursor
//
// Classes: CFreshCursor
//
// History: 16-May-91 BartoszM Created.
// 28-Feb-92 AmyA Added HitCount()
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "freshcur.hxx"
#include "fresh.hxx"
#include "fretest.hxx"
#include "resman.hxx"
#include "indsnap.hxx"
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::LoadWorkId, private
//
// Synopsis: Load current wid and occurrence
//
// History: 16-May-91 BartoszM Created
//
//----------------------------------------------------------------------------
__forceinline void CFreshCursor::LoadWorkId ()
{
_wid = _cur->WorkId();
if ( widInvalid == _wid )
return;
_iid = _cur->IndexId();
_pid = _cur->Pid();
while ( _indSnap.GetFresh()->IsCorrectIndex( _iid, _wid ) ==
CFreshTest::Invalid )
{
_wid = _cur->NextWorkId();
if ( widInvalid == _wid )
return;
_iid = _cur->IndexId();
}
_pid = _cur->Pid();
} //LoadWorkId
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::CFreshCursor, public
//
// Synopsis: Create a sursor that merges a number of cursors.
//
// Arguments: [cur] -- cursor to be pruned
//
// History: 16-May-91 BartoszM Created
//
//----------------------------------------------------------------------------
CFreshCursor::CFreshCursor( XCursor & cur, CIndexSnapshot& indSnap )
: _cur( cur ),
_indSnap ( indSnap ) // acquire it
{
LoadWorkId();
}
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::WorkIdCount, public
//
// Synopsis: return wid count
//
// Expects: cursor positioned after key
//
// History: 21-Jun-91 BartoszM Created
// 15-Jul-92 KyleP Call doesn't make sense.
//
//----------------------------------------------------------------------------
ULONG CFreshCursor::WorkIdCount()
{
ciAssert (( FALSE && "CFreshCursor::WorkIdCount called" ));
return ( 0 );
}
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::WorkId, public
//
// Synopsis: Get current work id.
//
// History: 16-May-91 BartoszM Created
//
//----------------------------------------------------------------------------
WORKID CFreshCursor::WorkId()
{
return _wid;
}
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::NextWorkId, public
//
// Synopsis: Move to next work id
//
// Returns: Target work id or widInvalid if no more wid's for current key
//
// Effects: Changes current IndexId.
//
// History: 16-May-91 BartoszM Created
//
// Notes: The same work id may be returned multiple times,
// corresponding to multiple indexes.
//
//----------------------------------------------------------------------------
WORKID CFreshCursor::NextWorkId()
{
_cur->NextWorkId();
LoadWorkId();
return _wid;
}
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::HitCount, public
//
// Synopsis: returns the occurrence count
//
// Returns: occurrence count for current wid
//
// History: 28-Feb-92 AmyA Created
//
//----------------------------------------------------------------------------
ULONG CFreshCursor::HitCount()
{
ciAssert( _wid != widInvalid );
return _cur->HitCount();
}
void CFreshCursor::RatioFinished (ULONG& denom, ULONG& num)
{
_cur->RatioFinished (denom, num);
Win4Assert( denom > 0 );
}
//+---------------------------------------------------------------------------
//
// Member: CFreshCursor::Rank, public
//
// Synopsis: returns the rank for _cur
//
// Returns: rank for current wid
//
// History: 14-Apr-92 AmyA Created
//
//----------------------------------------------------------------------------
LONG CFreshCursor::Rank()
{
ciAssert( _wid != widInvalid );
Win4Assert( _cur->Rank() >= 0 );
Win4Assert( _cur->Rank() <= MAX_QUERY_RANK );
return _cur->Rank();
}
//+-------------------------------------------------------------------------
//
// Member: CFreshCursor::GetRankVector, public
//
// Effects: Returns the weights from a vector cursor. No effect
// for non-vector cursors.
//
// Arguments: [pulVector] -- Pointer to array of ULONG into which the
// vector elements are returned.
//
// Returns: The number of elements stored in [pulVector].
//
// History: 15-Jul-92 KyleP Created
//
//--------------------------------------------------------------------------
ULONG CFreshCursor::GetRankVector( LONG * plVector, ULONG cElements )
{
ciAssert( _wid != widInvalid );
return( _cur->GetRankVector( plVector, cElements ) );
}