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

136 lines
3.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation, 1991 - 1998
//
// File: dellog.hxx
//
// Contents: Deletion logs for usns
//
// History: 28-Jul-97 SitaramR Created
//
//----------------------------------------------------------------------------
#pragma once
#include <dynstrm.hxx>
#include "usnlist.hxx"
//+-------------------------------------------------------------------------
//
// Class: CDelLogEntry
//
// Purpose: Entry in deletion log list
//
// History: 28-Jul-97 SitaramR Created
//
//--------------------------------------------------------------------------
class CDelLogEntry : public CDoubleLink
{
public:
CDelLogEntry( FILEID fileId, WORKID wid, USN usn )
: _fileId(fileId),
_wid(wid),
_usn(usn)
{
}
FILEID FileId() { return _fileId; }
WORKID WorkId() { return _wid; }
USN Usn() { return _usn; }
private:
FILEID _fileId;
WORKID _wid;
USN _usn;
};
typedef class TDoubleList<CDelLogEntry> CDelLogEntryList;
typedef class TFwdListIter<CDelLogEntry, CDelLogEntryList> CDelLogEntryListIter;
//+-------------------------------------------------------------------------
//
// Class: CFakeVolIdMap
//
// Purpose: Maps volume ids to fake volume ids in the range
// 0..RTL_MAX_DRIVE_LETTERS-1
//
// History: 28-Jul-97 SitaramR Created
//
//--------------------------------------------------------------------------
const VOLUMEID VolumeIdBase = L'a'; // For mapping 'a' to 'z' volume ids
const COUNT_ALPHABETS = 26; // # letters in alphabet
const COUNT_SPECIAL_CHARS = RTL_MAX_DRIVE_LETTERS - 26; // Count of non 'a' to 'z' drives
class CFakeVolIdMap
{
public:
CFakeVolIdMap();
ULONG VolIdToFakeVolId( VOLUMEID volumeId );
VOLUMEID FakeVolIdToVolId( ULONG fakeVolId );
private:
VOLUMEID _aVolIdSpecial[COUNT_SPECIAL_CHARS]; // Mapping for non 'a' to 'z' drives
};
class CFileIdMap;
class CiCat;
class CiStorage;
//+-------------------------------------------------------------------------
//
// Class: CDeletionLog
//
// Purpose: Deletion log for keeping track of usn deletions until they
// are no longer needed.
//
// History: 28-Jul-97 SitaramR Created
//
//--------------------------------------------------------------------------
class CDeletionLog
{
public:
CDeletionLog( CFileIdMap& fileIdMap, CiCat& cicat );
void FastInit( CiStorage * pStorage, ULONG version );
void ReInit( ULONG version );
void Flush();
void MarkForDeletion( VOLUMEID volumeId,
FILEID fileId,
WORKID wid,
USN usn );
void ProcessChangesFlush( CUsnFlushInfoList & usnFlushInfoList );
private:
ULONG GetSize();
void FatalCorruption( ULONG cbRead, ULONG cbToRead );
CiCat& _cicat; // Ci catalog
CFileIdMap & _fileIdMap; // File id map
CFakeVolIdMap _fakeVolIdMap; // Real vol id to fake vol id map
CDelLogEntryList _aDelLogEntryList[RTL_MAX_DRIVE_LETTERS]; // List of marked deletions
XPtr<CDynStream> _xPersStream; // Persistent linearized deletion log
CMutexSem _mutex; // Lock to serialize scan(flush) and usn threads
};