//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1991 - 1998. // // File: INDSNAP.CXX // // Contents: Array of Indexes // // Classes: CIndexSnapshot // // History: 28-Apr-92 BartoszM Created // //---------------------------------------------------------------------------- #include #pragma hdrstop #include #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 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 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 ); }