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

126 lines
3.5 KiB
C++

//+------------------------------------------------------------------
//
// Copyright (C) 1991-1997 Microsoft Corporation.
//
// File: nottran.cxx
//
// Contents: Transaction object for notifications
//
// Classes: CNotificationTransaction
//
// History: 24-Feb-97 SitaramR Created
//
//-------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "notxact.hxx"
#include "resman.hxx"
//+---------------------------------------------------------------------------
//
// Member: CNotificationTransaction::CNotificationTransaction
//
// Synopsis: Constructor
//
// History: 24-Feb-97 SitaramR Created
//
// Notes: We initialize the array with a fairly size because we don't
// want a grow to fail due to low memory during the changelog
// transaction.
//
//----------------------------------------------------------------------------
CNotificationTransaction::CNotificationTransaction( CResManager *pResManager,
CIndexNotificationTable *pNotifTable )
: _pResManager( pResManager ),
_pNotifTable( pNotifTable ),
_aCommittedWids(256),
_aAbortedWidsToRemove(100)
{
}
//+-------------------------------------------------------------------------
//
// Method: CNotificationTransactoin::~CNotificationTransaction
//
// Synopsis: Destructor
//
// History: 24-Feb-1997 SitaramR Created
//
//--------------------------------------------------------------------------
CNotificationTransaction::~CNotificationTransaction()
{
if ( GetStatus() == CTransaction::XActCommit )
{
//
// Commit the transaction which means commit the wids in the
// comitted and remove the wids in the aborted list.
//
//
// Commit outside resman lock to prevent a deadlock with the
// lock in the notification table.
//
if ( _pNotifTable )
_pNotifTable->CommitWids( _aCommittedWids );
CLock lock( _pResManager->GetMutex() );
for ( unsigned i=0; i<_aAbortedWidsToRemove.Count(); i++ )
{
_pResManager->LokRemoveAbortedWid( _aAbortedWidsToRemove.Get(i)._wid,
_aAbortedWidsToRemove.Get(i)._usn );
}
}
}
//+-------------------------------------------------------------------------
//
// Method: CNotificationTransaction::AddCommittedWid
//
// Synopsis: Adds a wid to the commited list
//
// Arguments: [wid] -- WORKID
//
// History: 24-Feb-1997 SitaramR Created
//
//--------------------------------------------------------------------------
void CNotificationTransaction::AddCommittedWid( WORKID wid )
{
Win4Assert( wid != widInvalid );
_aCommittedWids.Add( wid, _aCommittedWids.Count() );
}
//+-------------------------------------------------------------------------
//
// Method: CNotificationTransaction::RemoveAbortedWid
//
// Synopsis: Adds a wid to the aborted-wids-to-remove list
//
// Arguments: [wid] -- WORKID
// [usn] -- USN
//
// History: 24-Feb-1997 SitaramR Created
//
//--------------------------------------------------------------------------
void CNotificationTransaction::RemoveAbortedWid( WORKID wid, USN usn )
{
Win4Assert( wid != widInvalid );
Win4Assert( usn > 0 );
CAbortedWidEntry widEntry( wid, usn );
_aAbortedWidsToRemove.Add( widEntry, _aAbortedWidsToRemove.Count() );
}