//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1997. // // File: cibackup.cxx // // Contents: Content Index index migration // // Classes: // // History: 3-17-97 srikants Created // //---------------------------------------------------------------------------- #include #pragma hdrstop #include #include #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() ); }