//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1991 - 2000. // // File: PARTN.HXX // // Contents: Content Index Partition // // Classes: CPartition // // History: 22-Mar-91 BartoszM Created. // //---------------------------------------------------------------------------- #pragma once //+--------------------------------------------------------------------------- // // Class: CPartition (part) // // Purpose: To partition the content index into manageable pieces // // History: 22-Mar-91 BartoszM Created. // //---------------------------------------------------------------------------- #include #include #include #include "idxlst.hxx" #include "set.hxx" #include "merge.hxx" #include "changes.hxx" class CIndexId; class CContentIndex; class CCursor; class CKey; class CQParse; class CTransaction; class CMergeTrans; class PStorage; class CFresh; class CChangeTrans; class CResManager; class CPersIndex; class CIndexSnapshot; class CNotificationTransaction; //+--------------------------------------------------------------------------- // // Class: CPartition // // Purpose: Encapsulates information in a partition // // History: 21-Nov-94 DwightKr Added this header // //---------------------------------------------------------------------------- const LONGLONG eSigPartition = 0x4e4f495454524150i64; // "PARTTION" class CPartition { public: CPartition ( WORKID wid, PARTITIONID partID, PStorage& storage, CCiFrameworkParams & frmwrkParams ); ~CPartition (); // Methods involving _changes void LokEmpty(); NTSTATUS LokDismount( CChangeTrans & xact ) { return _changes.LokDismount( xact ); } unsigned LokCountUpdates() const { return _changes.LokCount(); } unsigned LokCountSecUpdates() const { return _changes.LokCountSec(); } void LokQueryPendingUpdates ( CChangeTrans & xact, unsigned max, CDocList& docList ) { _changes.LokQueryPendingUpdates( xact, max, docList ); } BOOL LokGetPendingUpdates( WORKID * aWid, unsigned & cWid ) { return( _changes.LokGetPendingUpdates( aWid, cWid ) ); } void LokRefileDocs( const CDocList & docList ) { _changes.LokRefileDocs( docList ); } void LokAppendRefiledDocs( CChangeTrans & xact ) { _changes.LokAppendRefiledDocs( xact ); } SCODE LokUpdateDocument( CChangeTrans & xact, WORKID wid, USN usn, VOLUMEID volumeId, ULONG flags, ULONG retries, ULONG cSecQRetries ) { return _changes.LokUpdateDocument ( xact, wid, usn, volumeId, flags, retries, cSecQRetries ); } void LokFlushUpdates() { _changes.LokFlushUpdates(); } void LokAddToSecQueue( CChangeTrans & xact, WORKID wid, VOLUMEID volumeId, ULONG cSecQRetries ) { _changes.LokAddToSecQueue( xact, wid, volumeId, cSecQRetries ); } void LokRefileSecQueue( CChangeTrans & xact ) { _changes.LokRefileSecQueue( xact ); } void LokDisableUpdates() { _changes.LokDisableUpdates(); } void LokEnableUpdates( BOOL fFirstTimeUpdatesAreEnabled ) { _changes.LokEnableUpdates( fFirstTimeUpdatesAreEnabled ); } // log creation of new wordlist void LokDone ( CChangeTrans & xact, INDEXID iid, CDocList& docList ) { _changes.LokDone ( xact, iid , docList ); } void LokCompact() { _changes.LokCompact(); } // methods involving indexes unsigned LokIndexCount() const; unsigned WordListCount() const; unsigned LokIndexSize() const; unsigned LokGetIndexes ( CIndex** apIndex ); PARTITIONID GetId() const; INDEXID LokMakeWlstId (); INDEXID LokMakePersId (); void RegisterId ( CIndexId iid ); void FreeIndexId ( CIndexId iid ); void AddIndex ( CIndex* ind ); CIndex* LokRemoveIndex ( INDEXID iid ); BOOL LokIsPersIndexValid( CIndexId iid ) const { Win4Assert( iid.IsPersistent() ); return( !_setPersIid.Contains( iid.PersId() ) ); } void Swap ( CMergeTrans& xact, CIndex * new_index, unsigned cInd, INDEXID old_indexes[] ); CIndex** LokQueryMergeIndexes ( unsigned & count, MergeType mt ); CIndex** LokQueryIndexesForBackup ( unsigned & count, BOOL fFull ); BOOL LokCheckMerge(MergeType mt); BOOL LokCheckLowMemoryMerge() { return (WordListCount() > 0); } BOOL LokCheckWordlistMerge(); void LokDeleteWIDsInPersistentIndexes( CChangeTrans & xact, CFreshTest & freshTestLatest, CFreshTest & freshTestAtMerge, CDocList & docList, CNotificationTransaction & notifTrans ) { _changes.LokDeleteWIDsInPersistentIndexes( xact, freshTestLatest, freshTestAtMerge, docList, notifTrans ); } void SetMMergeObjectIds( WORKID widMasterLog, WORKID widNewMaster, WORKID widCurrentMaster ) { _widMasterLog = widMasterLog; _widNewMaster = widNewMaster; _widCurrentMaster = widCurrentMaster; } void GetMMergeObjectIds( WORKID & widMasterLog, WORKID & widNewMaster, WORKID & widCurrentMaster ) { widMasterLog = _widMasterLog; widNewMaster = _widNewMaster; widCurrentMaster = _widCurrentMaster; } WORKID GetChangeLogObjectId() { return _widChangeLog; } BOOL InMasterMerge() { return _widMasterLog != widInvalid; } CIndex** LokQueryMMergeIndexes ( unsigned & count, PRcovStorageObj & objMMLog ); void SerializeMMergeIndexes( unsigned count, const CIndex * aIndexes[], PRcovStorageObj & objMMLog ); CPersIndex * CPartition::GetCurrentMasterIndex(); void SetOldMasterIndex(CPersIndex *pIndex) { _pOldMasterIndex = pIndex; } CPersIndex * CPartition::GetOldMasterIndex() { return _pOldMasterIndex; } void SetNewMasterIid( INDEXID iid) { _iidNewMasterIndex = iid; } INDEXID GetNewMasterIid() { return _iidNewMasterIndex; } void TakeMMergeIndSnap( CIndexSnapshot * pMMergeIndSnap ) { Win4Assert( 0 == _pMMergeIndSnap ); _pMMergeIndSnap = pMMergeIndSnap; } CIndexSnapshot * GetMMergeIndSnap() { return _pMMergeIndSnap; } CIndexSnapshot * AcquireMMergeIndSnap() { CIndexSnapshot * pTemp = _pMMergeIndSnap; _pMMergeIndSnap = 0; return(pTemp); } CRWStore * RetrieveRelevantWords(BOOL fAcquire) { CRWStore *p = _pRWStore; if (fAcquire) _pRWStore = 0; return p; } void SetRelevantWords(CRWStore *pRWStore) { delete _pRWStore; _pRWStore = pRWStore; } CIndex ** LokZombify(unsigned & cInd); void LokEmptyChangeLog() { _changes.LokEmpty(); } void SetResMan( CResManager * pResMan, BOOL fPushFiltering ) { _changes.SetResMan( pResMan, fPushFiltering ); } // // Lok not necessary for setting and checking the cleaning up // status. // void PrepareForCleanup() { _fCleaningUp = TRUE; } BOOL IsCleaningUp() const { return _fCleaningUp; } #ifdef CIEXTMODE void CiExtDump(void *ciExtSelf); #endif private: #if CIDBG==1 CIndex * LokGetIndex( CIndexId iid ); #endif // CIDBG==1 const LONGLONG _sigPartition; CSet _setPersIid; ULONG _wlid; CCiFrameworkParams & _frmwrkParams; PARTITIONID _id; ULONG _queryCount; CChange _changes; // log of pending changes CIndexList _idxlst; WORKID _widMasterLog; WORKID _widNewMaster; WORKID _widCurrentMaster; WORKID _widChangeLog; INDEXID _iidNewMasterIndex; CPersIndex * _pOldMasterIndex; CRWStore * _pRWStore; CIndexSnapshot * _pMMergeIndSnap; // Snap-shot belonging to an // on going master merge (if any) PStorage & _storage; BOOL _fCleaningUp; // Flag set to true if we are // cleaning up for a shutdown or // dimsount. One way flag. Once // turned on, it will not be turned // off. }; //+--------------------------------------------------------------------------- // // Member: CPartition::LokIndexCount, public // // History: 08-Oct-91 BartoszM Created. // //---------------------------------------------------------------------------- inline unsigned CPartition::LokIndexCount() const { return _idxlst.Count(); } //+--------------------------------------------------------------------------- // // Member: CPartition::WordListCount, public // // History: 10-May-93 AmyA Created. // //---------------------------------------------------------------------------- inline unsigned CPartition::WordListCount() const { return _idxlst.CountWlist(); } //+--------------------------------------------------------------------------- // // Member: CPartition::LokIndexSize, public // // History: 15-Apr-94 t-joshh Created. // //---------------------------------------------------------------------------- inline unsigned CPartition::LokIndexSize() const { return _idxlst.IndexSize(); } //+--------------------------------------------------------------------------- // // Member: CPartition::GetId, public // // History: 08-Oct-91 BartoszM Created. // //---------------------------------------------------------------------------- inline PARTITIONID CPartition::GetId() const { return _id; } //+--------------------------------------------------------------------------- // // Member: CPartition::LokRemoveIndex, public // // Arguments: [iid] -- index id // // History: 13-Nov-91 BartoszM Created. // //---------------------------------------------------------------------------- inline CIndex* CPartition::LokRemoveIndex( INDEXID iid ) { return _idxlst.Remove(iid); }