416 lines
12 KiB
C++
416 lines
12 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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 <prcstob.hxx>
|
|
#include <rwex.hxx>
|
|
#include <doclist.hxx>
|
|
|
|
#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);
|
|
}
|
|
|
|
|