Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

198 lines
6.1 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: cibackup.cxx
//
// Contents: Content Index index migration
//
// Classes:
//
// History: 3-17-97 srikants Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <pstore.hxx>
#include <pidxtbl.hxx>
#include "cibackup.hxx"
#include "resman.hxx"
#include "indsnap.hxx"
#include "partn.hxx"
#include "fresh.hxx"
//+---------------------------------------------------------------------------
//
// Member: CBackupCiWorkItem::CBackupCiWorkItem
//
// Synopsis: Constructor of the backup save work item.
//
// Arguments: [storage] - Destination storage object.
// [fFullSave] - Indicating if a full save is needed.
// [progressTracker] - Progress tracking object.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
CBackupCiWorkItem::CBackupCiWorkItem( PStorage & storage,
BOOL fFullSave,
PSaveProgressTracker & progressTracker )
: _status(STATUS_UNSUCCESSFUL),
_storage(storage),
_fFull(fFullSave),
_progressTracker(progressTracker),
_fDoingFull(FALSE),
_backupState(eNotStarted)
{
_evtDone.Reset();
}
//+---------------------------------------------------------------------------
//
// Member: CBackupCiPersData::CBackupCiPersData
//
// Synopsis: An object that backups the relevant CI persistent data.
//
// Arguments: [workItem] - The workitem having details of the save operation.
// [resman] - Resman reference.
// [partn] - The partition that must be saved.
//
// History: 3-18-97 srikants Created
//
// Notes: We are assuming that changelog need not be saved. This is
// certainly true for the Incremental Index Shipping feature of
// Normandy.
//
// We are also assuming that for an incremental save, the
// destination has the same master index id as this. This
// assumption allows us to save the index table and the
// persistent freshlog without any transformation. If the
// destination misses even one "full" save in a sequence,
// a full save MUST be done.
//
// These limitations can be removed when KyleP does the complete
// implementation of incremental indexing.
//
//----------------------------------------------------------------------------
CBackupCiPersData::CBackupCiPersData(
CBackupCiWorkItem & workItem,
CResManager & resman,
CPartition & partn )
: _workItem( workItem ),
_pIndSnap( 0 ),
_resman( resman ),
_partn(partn),
_indexTable( resman.GetIndexTable() ),
_fresh( resman.GetFresh() )
{
}
//+---------------------------------------------------------------------------
//
// Member: CBackupCiPersData::~CBackupCiPersData
//
// Synopsis: Destroys the saved index snap shot.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
CBackupCiPersData::~CBackupCiPersData()
{
delete _pIndSnap;
}
//+---------------------------------------------------------------------------
//
// Member: CBackupCiPersData::LokGrabResources
//
// Synopsis: Grabs the persistent indexes that must be backed up.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
void CBackupCiPersData::LokGrabResources()
{
//
// First Create a new Index SnapShot depending upon the
// type of backup.
//
Win4Assert( 0 == _pIndSnap );
_pIndSnap = new CIndexSnapshot( _resman );
_pIndSnap->LokInitForBackup( _partn, _workItem.IsFullSave() );
}
//+---------------------------------------------------------------------------
//
// Member: CBackupCiPersData::BackupIndexes
//
// Synopsis: Backs up the relevant persistent indexes.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
void CBackupCiPersData::BackupIndexes()
{
//
// For each index in the snapshot, create a backup copy.
//
unsigned cInd;
CIndex ** apIndexes = _pIndSnap->LokGetIndexes( cInd );
Win4Assert( cInd <= 1 );
for ( unsigned i = 0; i < cInd; i++ )
{
Win4Assert( apIndexes[i]->IsPersistent() );
PStorage::EDefaultStrmType strmType = PStorage::eNonSparseIndex;
WORKID wid = _workItem.GetStorage().CreateObjectId( apIndexes[i]->GetId(),
strmType );
apIndexes[i]->MakeBackupCopy( _workItem.GetStorage(),
wid,
_workItem.GetSaveProgressTracker() );
}
}
//+---------------------------------------------------------------------------
//
// Member: CBackupCiPersData::LokBackupMetaInfo
//
// Synopsis: Backs up the persistent fresh log and the index table.
// Also collects the workids in the fresh log to indicate the
// changed workid.
//
// Arguments: [aWids] - On output, will have the modified list of workids.
//
// History: 3-18-97 srikants Created
//
//----------------------------------------------------------------------------
void CBackupCiPersData::LokBackupMetaInfo()
{
_fresh.LokMakeFreshLogBackup( _workItem.GetStorage(),
_workItem.GetSaveProgressTracker(),
_workItem.GetWorkidsIf() );
//
// Create a backup of the Index Table.
//
_indexTable.LokMakeBackupCopy( _workItem.GetStorage(),
_workItem.IsFullSave(),
_workItem.GetSaveProgressTracker() );
}