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

134 lines
3.7 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1998.
//
// File: CIDIR.HXX
//
// Contents: Persistent directory
//
// Classes: CiDirectory
//
// History: 3-Apr-91 BartoszM Created stub.
// 3-May-96 dlee Don't read it in -- map on-disk data
//
//----------------------------------------------------------------------------
#pragma once
#include <pdir.hxx>
#include <pstore.hxx>
class CiStorage;
class CiDirectoryIter;
class PMmStream;
//+---------------------------------------------------------------------------
//
// Class: CiDirectory
//
// Purpose: Persistent Directory
//
// History: 13-Jun-91 BartoszM Created
//
//----------------------------------------------------------------------------
class CiDirectory : public PDirectory
{
public:
CiDirectory( CiStorage & storage,
WORKID objectId,
PStorage::EOpenMode mode );
void Add( BitOffset& posKey, const CKeyBuf& key );
void Close();
void Seek( const CKey& key, CKeyBuf *pKeyInit, BitOffset& off );
void Seek( const CKeyBuf& key, CKeyBuf *pKeyInit, BitOffset& off );
void SeekNext( const CKeyBuf &key, CKeyBuf *pKeyInit, BitOffset& off );
unsigned CountLeaf() const { return _cKeys; }
void LokBuildDir(const CKeyBuf & maxKey );
void LokFlushDir(const CKeyBuf & maxKey );
void DeleteKeysAfter( const CKeyBuf & key );
void MakeBackupCopy( PStorage & dstStorage,
PSaveProgressTracker & progressTracker );
#if (CIDBG == 1)
CKeyBuf const & GetLastKey()
{
return _keyLast;
}
BitOffset const & GetBitOffsetLastAdded()
{
return _bitOffLastAdded;
}
void SetBitOffsetLastAdded( ULONG page, ULONG offset )
{
_bitOffLastAdded.SetPage( page );
_bitOffLastAdded.SetOff( offset );
}
#endif // CIDBG == 1
// for debugging
unsigned Level1Count() { return _cKeys; }
unsigned Level2Count() { return _cLevel2Keys; }
CDirectoryKey & GetLevel1Key( unsigned i ) { return *_aKeys[i]; }
CDirectoryKey & GetLevel2Key( unsigned i ) { return *_aLevel2Keys[i]; }
private:
// This must be a power of 2. Avg CDirectoryKey size on index1 is
// 36.3 bytes, which means 112.8 keys per 4096k page. A fanout of
// 64 means about 1.5 page hits per seek, and a Level2 total size
// of about 39k.
enum { eDirectoryFanOut = 64 };
void LokClose();
ULONG DoSeekForKeyBuf( const CKeyBuf & key,
CDirectoryKey ** aKeys,
ULONG low,
ULONG cKeys );
void GrowIfNeeded( unsigned cbToGrow );
void LokWriteKey( const CKeyBuf & key,
BitOffset & bitOffset );
void ReadIn( BOOL fWrite = FALSE );
void ReMapIfNeeded( void );
WORKID _objectId;
unsigned _cKeys;
unsigned _cLevel2Keys;
XArray<CDirectoryKey *> _aKeys;
XArray<CDirectoryKey *> _aLevel2Keys;
CiStorage & _storage;
BOOL _fReadOnly;
ULONG * _pcKeys; // array of 2 ulong counts
BYTE * _pbCurrent; // current end of the file
XPtr<PMmStream> _stream;
CMmStreamBuf _streamBuf;
#if (CIDBG == 1)
CKeyBuf _keyLast; // Last key retrieved from directory
BitOffset _bitOffLastAdded; // Bit offset of the last key added
#endif // CIDBG == 1
};