|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: PIDXTBL.HXX
//
// Contents: Index Table
//
// Classes: PIndexTable
//
// History: 14-Jul-93 BartoszM Created.
// 07-Feb-94 SrikantS Added ChangeLog and FreshLog support.
//
//----------------------------------------------------------------------------
#pragma once
class PSaveProgressTracker;
enum IndexType { itMaster, // master index
itShadow, // shadow index
itZombie, // deleted, but still in use by queries
itDeleted, // special index id for deleted objects
itPartition, // special type for partitions
itChangeLog, // special type for change log
itFreshLog , // special type for fresh log
itPhraseLat, // Special type for phrase lattice object
itKeyList, // special type for the keylist
itMMLog, // Master Merge Log
itNewMaster, // The new master index created during master merge
itMMKeyList // Key list participating in a master merge.
};
//
// Merge set flag. May not overlap with any IndexType
// The old master index, shadow indexes,
// and the old deleted index form a merge set
//
#define itMergeSet 0x8000
#define IDX_TYPE_BITS 0xffff
#define IDX_VERSION_BITS 0xff0000
class PStorage; class CIndex; class CPersIndex; class CTransaction; class PIndexTabIter; class CPartInfoList; class SPartInfoList; class CPartInfo; class PRcovStorageObj;
//+---------------------------------------------------------------------------
//
// Class: CIndexRecord
//
// Purpose: Index record in a table
//
// History: 18-Mar-92 AmyA Created.
// 14-Jul-93 Bartoszm Split from idxman.hxx
//
//----------------------------------------------------------------------------
#include <pshpack4.h>
class CIndexRecord { public:
INDEXID Iid() const { return _iid; }
ULONG Type() const { return (_type & IDX_TYPE_BITS); }
void SetType( ULONG type ) { _type = type | CURRENT_VERSION_STAMP ; }
ULONG VersionStamp() const { return _type & IDX_VERSION_BITS; }
WORKID ObjectId () const { return _objectId; }
BOOL IsMergeSet() const { return(_type & itMergeSet); }
WORKID MaxWorkId() const { return _maxWorkId; }
LONGLONG GetTimeStamp() const { return _timeStamp; }
// USN Usn() const { return _usn; }
public:
WORKID _objectId;
INDEXID _iid;
ULONG _type;
WORKID _maxWorkId;
LONGLONG _timeStamp; // for debugging - tracking update order
LONGLONG _reserved; // for future use - without forcing a
// version change.
}; #include <poppack.h>
const PARTITIONID partidDefault = 1; const PARTITIONID partidFresh1 = 0xfffd; const PARTITIONID partidFresh2 = 0xfffc;
class CShadowMergeSwapInfo {
public:
CIndexRecord _recNewIndex; // Index record of the new index
unsigned _cIndexOld; // Count of the old indexes
INDEXID* _aIidOld; // Array of old iids to be swapped
WORKID _widOldFreshLog; // WorkId of the old fresh log
WORKID _widNewFreshLog; // WorkId of the new fresh log
};
class CMasterMergeSwapInfo {
public:
CIndexRecord _recNewIndex; // Index record of the new index
unsigned _cIndexOld; // Count of the old indexes
INDEXID* _aIidOld; // Array of old iids to be swapped
WORKID _widOldFreshLog; // WorkId of the old fresh log
WORKID _widNewFreshLog; // WorkId of the new fresh log
PARTITIONID _partid; // Partition Id in which the master
// merge completed.
CIndexRecord _recNewKeyList; // Record for the new key list.
INDEXID _iidOldKeyList; // IndexId of the old key list.
WORKID _widMMLog; // WorkId of the master merge log.
};
//+---------------------------------------------------------------------------
//
// Class: PIndexTable
//
// Purpose: Manages Indexes.
// Contains the table of persistent indexes
// and partitions.
//
// History: 22-Mar-91 BartoszM Created.
// 07-Mar-92 AmyA -> FAT
// 14-Jul-93 Bartoszm Split from idxman.hxx
//
//----------------------------------------------------------------------------
class PIndexTable { public:
PIndexTable() : _iidDeleted( iidInvalid ) {} virtual ~PIndexTable() {}
void AddPartition ( PARTITIONID partid ){ AddObject( partid, itPartition, 0 ); }
CPartInfoList * QueryBootStrapInfo();
virtual void AddMMergeObjects( PARTITIONID partid, CIndexRecord & recNewMaster, WORKID widMMLog, WORKID widMMKeyList, INDEXID iidDelOld, INDEXID iidDelNew ) = 0;
virtual void AddObject( PARTITIONID partid, IndexType it, WORKID wid ) = 0;
virtual void DeleteObject( PARTITIONID partid, IndexType it, WORKID wid ) = 0;
virtual void SwapIndexes ( CShadowMergeSwapInfo & info ) = 0;
virtual void SwapIndexes ( CMasterMergeSwapInfo & info ) = 0;
virtual void RemoveIndex ( INDEXID iid ) = 0;
virtual PIndexTabIter* QueryIterator() = 0;
virtual PStorage& GetStorage() = 0;
virtual void AddIndex( INDEXID iid, IndexType it, WORKID maxWid, WORKID objId) = 0;
const INDEXID GetDeletedIndex() const { return _iidDeleted; } void SetDeletedIndex( INDEXID iidDeleted ) { AddIndex( iidDeleted, itDeleted, 0, widInvalid ); _iidDeleted = iidDeleted; }
virtual void LokEmpty() = 0;
virtual void LokMakeBackupCopy( PStorage & storage, BOOL fFullSave, PSaveProgressTracker & tracker ) = 0; protected:
INDEXID _iidDeleted;
private:
WORKID CreateAndAddIt( IndexType it, PARTITIONID partId ); CPartInfo * CreateOrGet( SPartInfoList & pList, PARTITIONID partId ); virtual PRcovStorageObj & GetIndexTableObj() = 0; };
class SIndexTable { public: SIndexTable ( PIndexTable* pIdxTbl ): _pIdxTbl(pIdxTbl) { END_CONSTRUCTION ( SIndexTable); } ~SIndexTable () { delete _pIdxTbl; } PIndexTable* operator->() { return _pIdxTbl; } PIndexTable& operator * () { return *_pIdxTbl; } private: PIndexTable* _pIdxTbl; };
class PIndexTabIter { public: virtual ~PIndexTabIter() {} virtual BOOL Begin() = 0; virtual BOOL NextRecord ( CIndexRecord& record ) = 0; };
class SIndexTabIter { public: SIndexTabIter( PIndexTabIter * pIdxTabIter ) : _pIdxTabIter(pIdxTabIter) { END_CONSTRUCTION( SIndexTabIter ); } ~SIndexTabIter() { delete _pIdxTabIter; } PIndexTabIter* operator->() { return _pIdxTabIter; } PIndexTabIter& operator*() { return *_pIdxTabIter; } private: PIndexTabIter * _pIdxTabIter; };
|