127 lines
3.5 KiB
C++
127 lines
3.5 KiB
C++
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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;
|
|
}
|
|
|