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.
|
|
///////////////////////////////////////////////////////////////////////////////////////////
//
// 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; }
|