windows-nt/Source/XPSP1/NT/inetsrv/query/cindex/pindex.hxx
2020-09-26 16:20:57 +08:00

262 lines
6.5 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1992.
//
// File: PINDEX.HXX
//
// Contents: Persistent Index
//
// Classes: CPersIndex
//
// History: 3-Apr-91 BartoszM Created stub.
//
//----------------------------------------------------------------------------
#pragma once
#include "dindex.hxx"
class PStorage;
class CFreshTest;
class PDirectory;
class COccCurStack;
class CRSemiInfinitePage;
class CIndexSnapshot;
class CIndexRecord;
class CWKeyList;
class CKeyList;
//+---------------------------------------------------------------------------
//
// Class: CPersIndex (pi)
//
// Purpose: Encapsulate directory and give access to pages
//
// Interface:
//
// History: 20-Apr-91 KyleP Added Merge method
// 03-Apr-91 BartoszM Created stub.
//
//----------------------------------------------------------------------------
const LONGLONG eSigPersIndex = 0x58444e4953524550i64; // "PERSINDX"
class CPersIndex : public CDiskIndex
{
friend class CMasterMergeIndex;
friend class CMasterMergeIndex;
public:
// new index from scratch
CPersIndex(
PStorage & storage,
WORKID objectId,
INDEXID iid,
unsigned c4KPages,
CDiskIndex::EDiskIndexType idxType
);
CPersIndex(
PStorage & storage,
WORKID objectId,
INDEXID iid,
WORKID widMax,
CDiskIndex::EDiskIndexType idxType,
PStorage::EOpenMode mode,
BOOL fReadDir );
void Remove();
void Merge( CIndexSnapshot& indSnap,
const CPartition & partn,
CCiFrmPerfCounter & mergeProgress,
BOOL fGetRW );
CKeyCursor * QueryCursor();
CKeyCursor * QueryKeyCursor(const CKey * pKey);
//
// From CQueriable
//
COccCursor * QueryCursor( const CKey * pkey,
BOOL isRange,
ULONG & cMaxNodes );
COccCursor * QueryRangeCursor( const CKey * pkey,
const CKey * pkeyEnd,
ULONG & cMaxNodes );
COccCursor * QuerySynCursor( CKeyArray & keyArr,
BOOL isRange,
ULONG & cMaxNodes );
unsigned Size () const;
WORKID ObjectId() const
{ return _xPhysIndex->ObjectId(); }
void FillRecord ( CIndexRecord& record );
inline void AbortMerge();
void ClearAbortMerge() { _fAbortMerge = FALSE; }
#ifdef KEYLIST_ENABLED
CRWStore * ComputeRelevantWords(ULONG cRows,ULONG cRW,WORKID *pwid,
CKeyList *pkl);
CRWStore * AcquireRelevantWords();
#endif // KEYLIST_ENABLED
CPhysIndex & GetIndex() { return _xPhysIndex.GetReference(); }
#ifdef CIEXTMODE
void CiExtDump(void *ciExtSelf);
#endif
virtual void MakeBackupCopy( PStorage & storage,
WORKID wid,
PSaveProgressTracker & tracker );
protected:
PDirectory & GetDirectory() { return _xDir.GetReference(); }
SStorageObject & GetObj() { return _obj; }
void CreateRange( COccCurStack & curStk,
const CKey * pkey,
const CKey * pkeyEnd,
ULONG & cMaxNodes );
ULONG ShrinkFromFront( ULONG ulFirstPage, ULONG ulNumPages )
{
if ( _storage.SupportsShrinkFromFront() )
return _xPhysIndex->ShrinkFromFront( ulFirstPage, ulNumPages);
return 0;
}
const LONGLONG _sigPersIndex;
XPtr<PDirectory> _xDir;
XPtr<CPhysIndex> _xPhysIndex;
PStorage & _storage;
SStorageObject _obj;
BOOL _fAbortMerge;
};
//+-------------------------------------------------------------------------
//
// Member: CPersIndex::AbortMerge, public
//
// Synopsis: Sets flag to abort merge in 'reasonably short time'
//
// History: 13-Aug-93 KyleP Created
//
// Notes: Although the _fAbortMerge flag is accessed w/o lock
// from multiple threads there's no contention problem. It's
// a boolean flag and if we miss the set on one pass we'll
// get it on the next.
//
//--------------------------------------------------------------------------
inline void CPersIndex::AbortMerge()
{
_fAbortMerge = TRUE;
}
//+---------------------------------------------------------------------------
//
// Class: CMergeSourceCursor
//
// Purpose: Smart pointer to a merge cursor
//
// History: 29-Aug-92 BartoszM Created
//
//----------------------------------------------------------------------------
class CMergeSourceCursor
{
public:
CMergeSourceCursor ( CIndexSnapshot & indSnap, const CKeyBuf * pKey = 0 );
CMergeSourceCursor ( CKeyCursor * pCurSrc ) : _pCurSrc(pCurSrc) {}
~CMergeSourceCursor ();
BOOL IsEmpty() const { return 0 == _pCurSrc; }
CKeyCursor* operator->() { return(_pCurSrc); }
CKeyCursor* Acquire()
{ CKeyCursor * pTemp = _pCurSrc; _pCurSrc = 0; return pTemp; }
private:
CKeyCursor* _pCurSrc;
};
//+--------------------------------------------------------------------------
//
// Class: CPersIndexCursor
//
// Purpose: Smart pointer to a persistent index key cursor
//
// History: 17-Jun-94 dlee Created
//
//---------------------------------------------------------------------------
class CPersIndexCursor
{
public:
CPersIndexCursor(CPersIndex *pIndex) : _pCursor(0)
{
_pCursor = pIndex->QueryCursor();
}
~CPersIndexCursor() { delete _pCursor; }
CKeyCursor* operator->() { return(_pCursor); }
private:
CKeyCursor *_pCursor;
};
//+--------------------------------------------------------------------------
//
// Class: CSetReadAhead
//
// Purpose: Sets the hint in the storage object to favor read-ahead
// when appropriate, then revert to the original state.
//
// History: 4-Nov-98 dlee Created
//
//---------------------------------------------------------------------------
class CSetReadAhead
{
public:
CSetReadAhead( PStorage & storage ) :
_storage( storage ),
_fOldValue( storage.FavorReadAhead() )
{
_storage.SetFavorReadAhead( TRUE );
}
~CSetReadAhead()
{
_storage.SetFavorReadAhead( _fOldValue );
}
private:
PStorage & _storage;
BOOL _fOldValue;
};