Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

371 lines
11 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1998.
//
// File: INDSNAP.CXX
//
// Contents: Array of Indexes
//
// Classes: CIndexSnapshot
//
// History: 28-Apr-92 BartoszM Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <orcursor.hxx>
#include "indsnap.hxx"
#include "partn.hxx"
#include "resman.hxx"
#include "mcursor.hxx"
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::CIndexSnapshot, public
//
// Synopsis: Constructor
//
// Arguments: [resman] -- reference to the resource manager
//
// History: 28-Apr-92 BartoszM Created.
//
//----------------------------------------------------------------------------
CIndexSnapshot::CIndexSnapshot (CResManager& resman)
:_resman(resman), _cInd(0), _apIndex(0), _pFreshTest(0)
{
_resman.ReferenceQuery();
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::CIndexSnapshot, public
//
// Synopsis: Copy Constructor
//
// Arguments: [src] -- reference to the src CIndexSnapshot to be copied
//
// History: 28-Apr-92 BartoszM Created.
//
//----------------------------------------------------------------------------
CIndexSnapshot::CIndexSnapshot (CIndexSnapshot& src )
:_resman(src._resman), _cInd(src._cInd), _apIndex(src._apIndex),
_pFreshTest(src._pFreshTest)
{
_resman.ReferenceQuery();
// transfer ownership
src._cInd = 0;
src._apIndex = 0;
src._pFreshTest = 0;
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::LokInit, public
//
// Synopsis: Initializes _pFreshTest and _apIndex (one partition)
// Used for merges.
//
// Arguments: [part] -- partition to retrieve array of indexes from
// [mt] -- merge type for retrieving array of indexes
//
// History: 28-Apr-92 BartoszM Created.
//
//----------------------------------------------------------------------------
// ResMan LOCKED
void CIndexSnapshot::LokInit ( CPartition& part, MergeType mt )
{
// initialize fresh test
_pFreshTest = _resman._fresh.LokGetFreshTest();
_apIndex = part.LokQueryMergeIndexes( _cInd, mt );
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::LokInitForBackup
//
// Synopsis: Initializes the _apIndex (one partition) for backing up the
// indexes.
//
// Arguments: [part] - Partition
// [fFull] - Set to TRUE if full backup of indexes is required.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
void CIndexSnapshot::LokInitForBackup ( CPartition& part, BOOL fFull )
{
// initialize the indexes
_apIndex = part.LokQueryIndexesForBackup( _cInd, fFull );
}
//+---------------------------------------------------------------------------
//
// Function: LokInitFreshTest
//
// Synopsis: Initializes _pFreshTest by getting the current fresh test
// from resman.
//
// Arguments: (none)
//
// History: 9-29-94 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CIndexSnapshot::LokInitFreshTest()
{
_pFreshTest = _resman._fresh.LokGetFreshTest();
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::Init, public
//
// Synopsis: Initializes _pFreshTest and _apIndex (more than one partition)
// Used for queries.
//
// Arguments: [cPart] -- number of partitions to retrieve indexes from
// [aPartId] -- array of partitions to retrieve indexes from
// [cPendingUpdates] -- Look for this many pending changes
// per partition.
// [pFlags] -- (ret arg) flag for status of indexes
//
// Modifies: pFlags to reflect status of indexes
//
// History: 28-Apr-92 BartoszM Created.
// 08-Sep-92 AmyA Added pFlags
// 18-Nov-94 KyleP Add search for pending changes
//
//----------------------------------------------------------------------------
void CIndexSnapshot::Init ( unsigned cPart,
PARTITIONID* aPartId,
ULONG cPendingUpdates,
ULONG* pFlags )
{
// uses resman lock
_apIndex = _resman.QueryIndexes ( cPart,
aPartId,
&_pFreshTest,
_cInd,
cPendingUpdates,
&_curPending,
pFlags );
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::LokRestart, public
//
// Synopsis: Initializes _apIndex (one partition) which constitute
// the master merge set. It does NOT initialize the _pFreshTest
// as _pFreshTest is initialized when the master merge is
// restarted.
//
// Arguments: [part] -- partition to retrieve array of indexes from
// [mMergeLog] -- master merge log, contains list of indexes
// participating i the current master merge
//
// History: 08-Apr-94 DwightKr Created.
//
//----------------------------------------------------------------------------
void CIndexSnapshot::LokRestart ( CPartition& part, PRcovStorageObj & mMergeLog )
{
_apIndex = part.LokQueryMMergeIndexes( _cInd, mMergeLog );
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::~CIndexSnapshot, public
//
// Synopsis: Destructor
//
// History: 28-Apr-92 BartoszM Created.
//
//----------------------------------------------------------------------------
CIndexSnapshot::~CIndexSnapshot()
{
// release old indexes and fresh test (takes lock)
_resman.ReleaseIndexes ( _cInd, _apIndex, _pFreshTest );
delete _apIndex;
_resman.DereferenceQuery();
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::MaxWorkId, public
//
// Synopsis: Returns the maximum work id for all indexes in snapshot
//
// History: 28-Apr-92 BartoszM Created.
//
//----------------------------------------------------------------------------
WORKID CIndexSnapshot::MaxWorkId()
{
WORKID widMax = _apIndex[0]->MaxWorkId();
for ( unsigned i = 1; i < _cInd; i++ )
if ( _apIndex[i]->MaxWorkId() > widMax )
widMax = _apIndex[i]->MaxWorkId();
return(widMax);
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::TotalSizeInPages, public
//
// Synopsis: Returns the size estimate in CI_PAGE's
//
// History: 18-Mar-93 BartoszM Created.
//
//----------------------------------------------------------------------------
unsigned CIndexSnapshot::TotalSizeInPages()
{
unsigned cpage = 0;
for ( unsigned i = 0; i < _cInd; i++ )
cpage += _apIndex[i]->Size();
return cpage;
}
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::QueryMergeCursor, public
//
// Synopsis: Create source cursor for merge
//
// History: 20-Aug-91 BartoszM Created.
// 28-Apr-92 BartoszM Moved from CPersIndex to CIndexSnapshot
//
//----------------------------------------------------------------------------
CKeyCursor * CIndexSnapshot::QueryMergeCursor(const CKey * pKey)
{
XPtr<CKeyCursor> xRawCursor;
if ( 1 == _cInd )
{
if (0 == pKey)
xRawCursor.Set( _apIndex[0]->QueryCursor() );
else
xRawCursor.Set( _apIndex[0]->QueryKeyCursor( pKey ) );
if ( !xRawCursor.IsNull() && xRawCursor->GetKey() == 0 )
xRawCursor.Free();
}
else
{
CKeyCurStack stkCur;
for ( UINT i = 0; i < _cInd; i++ )
{
XPtr<CKeyCursor> xCur;
if (0 == pKey)
xCur.Set( _apIndex[i]->QueryCursor() );
else
xCur.Set( _apIndex[i]->QueryKeyCursor( pKey ) );
if ( !xCur.IsNull() && 0 != xCur->GetKey() )
{
stkCur.Push( xCur.GetPointer() );
xCur.Acquire();
}
}
if ( 0 != stkCur.Count() )
xRawCursor.Set( new CMergeCursor ( stkCur ) );
}
return xRawCursor.Acquire();
} //QueryMergeCursor
//+---------------------------------------------------------------------------
//
// Member: CIndexSnapshot::AppendPendingUpdates, public
//
// Synopsis: Creates a cursor for pending documents
//
// History: 7-Oct-98 dlee Added header; author unknown
//
//----------------------------------------------------------------------------
void CIndexSnapshot::AppendPendingUpdates( XCursor & cur )
{
if ( _curPending.Count() > 0 )
{
if ( !cur.IsNull() )
_curPending.Push( cur.Acquire() );
cur.Set( new COrCursor( _curPending.Count(), _curPending ) );
}
} //AppendPendingUpdates
//+---------------------------------------------------------------------------
//
// Function: LokGiveIndexes
//
// Synopsis: Transfers the control of the array of indexes to the caller.
//
// Effects: _apIndex and _cInd will both be set to 0.
//
// Arguments: [cInd] -- On output, will have the count of the number of
// valid indexes in the returned array of indexes.
//
// Returns: array of indexes which belonged to this snapshot.
//
// History: 9-29-94 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
CIndex ** CIndexSnapshot::LokGiveIndexes( unsigned & cInd )
{
cInd = _cInd;
CIndex ** pTemp = _apIndex;
_cInd = 0;
_apIndex = 0;
return( pTemp );
}
//+---------------------------------------------------------------------------
//
// Function: LokTakeIndexes
//
// Synopsis: Takes control of the indexes from the source snapshot.
//
// Arguments: [src] -- Source snapshot.
//
// History: 9-29-94 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CIndexSnapshot::LokTakeIndexes( CIndexSnapshot & src )
{
Win4Assert( 0 == _apIndex && 0 == _cInd );
_apIndex = src.LokGiveIndexes( _cInd );
}