mirror of https://github.com/tongzx/nt5src
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
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 );
|
|
}
|