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

199 lines
4.6 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: cibackup.hxx
//
// Contents: Content Index index migration
//
// Classes: CBackupCiWorkItem
//
// History: 3-17-97 srikants Created
//
//----------------------------------------------------------------------------
#pragma once
#include <psavtrak.hxx>
#include "indsnap.hxx"
class CResManager;
class PStorage;
class CPartition;
class CFresh;
//+---------------------------------------------------------------------------
//
// Class: CBackupCiWorkItem
//
// Purpose: A work item that backups the Content Index persistent data.
// This work item will be created by the caller and the merge
// thread will process the work item.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
class CBackupCiWorkItem : INHERIT_UNWIND
{
INLINE_UNWIND( CBackupCiWorkItem )
public:
enum EBackupState
{
eNotStarted,
eDoingMerge, // Can enter here only from eNotStarted
eDoingBackup, // Can enter here only from eDoingMerge
eDone // This is a final state.
};
CBackupCiWorkItem( PStorage & storage,
BOOL fFull,
PSaveProgressTracker & progressTracker );
void LokSetStatus( NTSTATUS status )
{
_status = status;
}
NTSTATUS GetStatus() const { return _status; }
void LokSetDone()
{
_backupState= eDone;
_evtDone.Set();
}
void LokSetDoingMerge()
{
if ( _backupState == eNotStarted )
{
_backupState = eDoingMerge;
}
else
{
ciDebugOut(( DEB_WARN, "LokSetDoingMerge() cannot be set\n" ));
}
}
void LokSetDoingBackup()
{
if ( _backupState == eDoingMerge )
{
_backupState = eDoingBackup;
}
else
{
ciDebugOut(( DEB_WARN, "LokSetDoingBackup() cannot be set\n" ));
}
}
BOOL LokIsDone() const
{
return eDone == _backupState;
}
BOOL LokIsDoingMerge() const
{
return eDoingMerge == _backupState;
}
void LokReset()
{
_evtDone.Reset();
}
void WaitForCompletion( DWORD dwWaitTime = INFINITE )
{
_evtDone.Wait( dwWaitTime );
}
PStorage & GetStorage() { return _storage; }
BOOL IsFullSave() const { return _fFull || _fDoingFull; }
PSaveProgressTracker & GetSaveProgressTracker()
{
return _progressTracker;
}
ICiEnumWorkids * AcquireWorkIdEnum()
{
return _xEnumWorkids.Acquire();
}
void SetDoingFullSave() { _fDoingFull = TRUE; }
XInterface<ICiEnumWorkids> & GetWorkidsIf()
{
return _xEnumWorkids;
}
void LokUpdateMergeProgress( ULONG ulNum, ULONG ulDenom )
{
_progressTracker.UpdateMergeProgress( ulNum, ulDenom );
}
private:
NTSTATUS _status; // Status of the operation.
PStorage & _storage; // Destination storage object.
const BOOL _fFull; // Set to TRUE if a full save is needed
PSaveProgressTracker & _progressTracker; // Progress tracker.
CEventSem _evtDone; // Event set when the operation is done.
BOOL _fDoingFull; // Set to TRUE if a full save is being done
XInterface<ICiEnumWorkids> _xEnumWorkids;
EBackupState _backupState;
};
//+---------------------------------------------------------------------------
//
// Class: CBackupCiPersData
//
// Purpose: The object that does the actual work of backing up the
// indexes and relevant data.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
class CBackupCiPersData : INHERIT_UNWIND
{
INLINE_UNWIND( CBackupCiPersData )
public:
CBackupCiPersData( CBackupCiWorkItem & workItem,
CResManager & resman,
CPartition & partn );
~CBackupCiPersData();
void LokGrabResources();
void BackupIndexes();
void LokBackupMetaInfo();
private:
CBackupCiWorkItem & _workItem;
CIndexSnapshot * _pIndSnap;
CResManager & _resman;
CPartition & _partn;
PIndexTable & _indexTable;
CFresh & _fresh;
};