windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/irowiden.cpp

127 lines
3.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
///////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// IRowsetIdentity interface implementation
//
///////////////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
///////////////////////////////////////////////////////////////////////////////////////////
//
// Compares two row handles to see if they refer to the same row instance.
//
// HRESULT
// S_FALSE Method Succeeded but did not refer to the same row
// S_OK Method Succeeded
// DB_E_BADROWHANDLE Invalid row handle given
// OTHER Other HRESULTs returned by called functions
//
///////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIRowsetIdentity::IsSameRow ( HROW hThisRow, //IN The handle of an active row
HROW hThatRow //IN The handle of an active row
)
{
HRESULT hr = S_OK;
BSTR strKeyThisRow = NULL,strKeyThatRow = NULL;
DWORD dwStatusThisRow = 0 , dwStatusThatRow = 0;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Seriliaze the object
CAutoBlock cab(ROWSET->GetCriticalSection());
// Clear Error information
g_pCError->ClearErrorInfo();
if(m_pObj->IsZoombie())
{
hr = E_UNEXPECTED;
}
else
if (!m_pObj->BitArrayInitialized()){
//=================================================================================
// This is the case when the method was called even before the rowset got fully
// intialized, hence no rows could have been fetched yet, therefore there do not
// exist valid row handles, and all row handles provided must be invalid.
//=================================================================================
hr = DB_E_BADROWHANDLE;
}
else
{
//=================================================================================
// Check validity of input handles
//=================================================================================
// NTBuild : 138810
// 07/18/00
if(TRUE == m_pObj->IsRowExists(hThisRow) && TRUE == m_pObj->IsRowExists(hThatRow))
{
//NTRaid:138810
// 07/18/00
/// Get the status of the row and check
// if it is deleted
dwStatusThisRow = m_pObj->GetRowStatus(hThisRow);
dwStatusThatRow = m_pObj->GetRowStatus(hThatRow);
if( DBROWSTATUS_S_OK != dwStatusThisRow || DBROWSTATUS_S_OK != dwStatusThatRow)
{
hr = DB_E_ERRORSOCCURRED;
if( DBROWSTATUS_E_DELETED == dwStatusThisRow || DBROWSTATUS_E_DELETED == dwStatusThatRow)
{
hr = DB_E_DELETEDROW;
}
}
else
if(hThisRow == hThatRow)
{
hr = S_OK;
}
else
{
m_pObj->GetInstanceKey(hThisRow,&strKeyThisRow);
m_pObj->GetInstanceKey(hThatRow,&strKeyThatRow);
// NTRaid:111813
// 06/07/00
if(!strKeyThisRow || !strKeyThatRow)
{
hr = S_FALSE;
}
else
// If the key of both the instances are same then
// both the rows are referring to the same row
if( wbem_wcsicmp(strKeyThisRow,strKeyThisRow) == 0)
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
SysFreeString(strKeyThisRow);
SysFreeString(strKeyThatRow);
}
}
else
{
hr = DB_E_BADROWHANDLE;
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRowsetIdentity);
CATCH_BLOCK_HRESULT(hr,L"IRowsetIdentity::IsSameRow");
return hr;
}