///////////////////////////////////////////////////////////////////////////////////////// // // Microsoft WMIOLE DB Provider // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved. // // IRowsetInfo interface implementation // ///////////////////////////////////////////////////////////////////////////////////////// #include "headers.h" ///////////////////////////////////////////////////////////////////////////////////////// // // Returns an interface pointer to the rowset to which the bookmark applies // // HRESULT // E_INVALIDARG ppReferencedRowset was NULL // DB_E_BADORDINAL iOrdinal was greater than number of columns in rowset // DB_E_NOTAREFERENCECOLUMN This rowset does not support bookmarks // ///////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CImpIRowsetInfo::GetReferencedRowset ( DBORDINAL iOrdinal, //IN Bookmark Column REFIID riid, // IN ID of the interface pointer to return IUnknown ** ppReferencedRowset // OUT IRowset Interface Pointer ) { HRESULT hr = DB_E_BADROWHANDLE; CSetStructuredExceptionHandler seh; TRY_BLOCK; if( ppReferencedRowset ) *ppReferencedRowset = NULL; // Seriliaze the object CAutoBlock cab(ROWSET->GetCriticalSection()); // Clear Error information g_pCError->ClearErrorInfo(); if(m_pObj->IsZoombie()) { hr = E_UNEXPECTED; } else //======================================================================== // Check Arguments //======================================================================== if( ppReferencedRowset == NULL ){ hr = E_INVALIDARG; } else{ if(iOrdinal == 0 && (m_pObj->m_ulProps & BOOKMARKPROP)) hr = this->QueryInterface(riid,(void **)ppReferencedRowset); else { //======================================================================== // The oridinal was greater than the number of columns that we have. //======================================================================== if ( ( iOrdinal == 0 ) || ( iOrdinal > m_pObj->m_cTotalCols ) ){ hr = DB_E_BADORDINAL; } else{ hr = m_pObj->GetChildRowset(iOrdinal,riid,ppReferencedRowset); //==================================================================== // Since we don't support bookmarks, this will alway return an error //==================================================================== // hr = DB_E_NOTAREFERENCECOLUMN; } } } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRowsetInfo); CATCH_BLOCK_HRESULT(hr,L"IRowsetInfo::GetReferencedRowset"); return hr; } ///////////////////////////////////////////////////////////////////////////////////////// // // Returns current settings of all properties supported by the rowset // // HRESULT // S_OK The method succeeded // E_INVALIDARG pcProperties or prgProperties was NULL // E_OUTOFMEMORY Out of memory // ///////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CImpIRowsetInfo::GetProperties ( const ULONG cPropertySets, //IN # of property sets const DBPROPIDSET rgPropertySets[], //IN Array of DBPROPIDSET ULONG* pcProperties, //OUT count of properties returned DBPROPSET** prgProperties //OUT property information returned ) { assert( m_pObj ); assert( m_pObj->m_pUtilProp ); HRESULT hr = S_OK; 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 { //=============================================================== // Check Arguments //=============================================================== hr = m_pObj->m_pUtilProp->GetPropertiesArgChk(PROPSET_ROWSET, cPropertySets, rgPropertySets, pcProperties, prgProperties); if ( SUCCEEDED(hr) ){ //=============================================================== // just pass this call on to the utility object that manages our // properties //=============================================================== hr = m_pObj->m_pUtilProp->GetProperties( PROPSET_ROWSET, cPropertySets, rgPropertySets, pcProperties, prgProperties ); } } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRowsetInfo); CATCH_BLOCK_HRESULT(hr,L"IRowsetInfo::GetProperties"); return hr; } ///////////////////////////////////////////////////////////////////////////////////////// // // Returns the interface pointer of the object that created the rowset // // HRESULT // S_OK Method Succeeded // E_INVALIDARG Invalid parameters were specified // ///////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CImpIRowsetInfo::GetSpecification ( REFIID riid, IUnknown **ppSpecification ) { HRESULT hr = S_OK; 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 ( ppSpecification == NULL ){ hr = E_INVALIDARG ; } else{ // we do not have an interface pointer on the object that created this rowset, yet. *ppSpecification = NULL; if(m_pObj->m_pParentCmd) { hr = m_pObj->m_pParentCmd->GetOuterUnknown()->QueryInterface (riid,(void**)ppSpecification); } else if ( m_pObj->m_pCreator ){ assert(m_pObj->m_pCreator->GetOuterUnknown()); hr = m_pObj->m_pCreator->GetOuterUnknown()->QueryInterface (riid,(void**)ppSpecification); } } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRowsetInfo); CATCH_BLOCK_HRESULT(hr,L"IRowsetInfo::GetSpecification"); return hr; }