/////////////////////////////////////////////////////////////////////////// // // Microsoft WMIOLE DB Provider // // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved. // // IROW.CPP IRow interface implementation // /////////////////////////////////////////////////////////////////////////// #include "headers.h" ////////////////////////////////////////////////////////////////////////////////////// // Get the column values ////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CImpIRow::GetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]) { HRESULT hr = E_FAIL; CSetStructuredExceptionHandler seh; TRY_BLOCK; // Seriliaze the object CAutoBlock cab(ROWSET->GetCriticalSection()); // Clear Error information g_pCError->ClearErrorInfo(); if( cColumns > 0) { // if there are columns to be retrieved and // if the the output DBCOLUMNACCESS pointer is NULL if( cColumns > 0 && rgColumns == NULL) { hr = E_INVALIDARG; } else { // Get the columns and data for the required columns hr = m_pObj->GetColumns(cColumns,rgColumns); } } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRow); CATCH_BLOCK_HRESULT(hr,L"IRow::GetColumns"); return hr; } ////////////////////////////////////////////////////////////////////////////////////// // Get the source rowset if any ////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CImpIRow::GetSourceRowset(REFIID riid,IUnknown ** ppRowset,HROW *phRow) { HRESULT hr = E_FAIL; CSetStructuredExceptionHandler seh; TRY_BLOCK; // Seriliaze the object CAutoBlock cab(ROWSET->GetCriticalSection()); // Clear Error information g_pCError->ClearErrorInfo(); // If there is any source rowset then query for the required interface if(m_pObj->m_pSourcesRowset != NULL) { hr = m_pObj->m_pSourcesRowset->QueryInterface(riid , (void **)ppRowset); if(phRow != NULL && hr == S_OK) { *phRow = m_pObj->m_hRow; } } else { hr = DB_E_NOSOURCEOBJECT; } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRow); CATCH_BLOCK_HRESULT(hr,L"IRow::GetSourceRowset"); return hr; } ////////////////////////////////////////////////////////////////////////////////////// // Open a row identified by the column ////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CImpIRow::Open( IUnknown * pUnkOuter, DBID * pColumnID, REFGUID rguidColumnType, DWORD dwFlags, REFIID riid, IUnknown ** ppUnk) { HRESULT hr = E_FAIL; DBORDINAL iCol = 0; BOOL bIsChildRowset = TRUE; VARIANT varValue; CSetStructuredExceptionHandler seh; TRY_BLOCK; VariantInit(&varValue); // Seriliaze the object CAutoBlock cab(ROWSET->GetCriticalSection()); // Clear Error information g_pCError->ClearErrorInfo(); if( pUnkOuter != NULL && riid != IID_IUnknown) { hr = DB_E_NOAGGREGATION; } else if(!(pColumnID->eKind == DBKIND_NAME) || (pColumnID->eKind == DBKIND_NAME && pColumnID->uName.pwszName == NULL)) { hr = DB_E_BADCOLUMNID; } // This function is implemented only to give the child rowset and if // consumer asks for any other type of object then return error else // NTRaid:135384 if(rguidColumnType != DBGUID_ROWSET && rguidColumnType != DBGUID_ROW && rguidColumnType != GUID_NULL) { hr = E_INVALIDARG; } else { iCol = m_pObj->m_pRowColumns->GetColOrdinal(pColumnID->uName.pwszName); LONG lColumnType = m_pObj->m_pRowColumns->ColumnType(iCol); LONG lColumnFlag = m_pObj->m_pRowColumns->ColumnFlags(iCol); if(lColumnType == DBTYPE_IUNKNOWN) { hr = m_pObj->GetIUnknownColumnValue(iCol,riid,ppUnk,pColumnID->uName.pwszName); } else // The column unavailable for the row as the class qualifier belongs to a parent rowset if(m_pObj->m_pSourcesRowset != NULL && S_OK == (hr =m_pObj->m_pCreator->GetDataSrcProperty(DBPROP_WMIOLEDB_QUALIFIERS,varValue))) if( (varValue.lVal & CLASS_QUALIFIERS) && m_pObj->m_bClassChanged && iCol == 1 && m_pObj->m_pRowColumns->ColumnType(iCol) == DBTYPE_HCHAPTER) { hr = DB_E_NOTFOUND; } else if((DB_LORDINAL)iCol < 0) { hr = DB_E_BADCOLUMNID; } else { hr = S_OK; switch(lColumnType) { // if the type is HCHAPTER then column can be only rowset case DBTYPE_HCHAPTER : if(lColumnFlag != DBCOLUMNFLAGS_ISCOLLECTION && m_pObj->m_pSourcesRowset == NULL) { hr = DB_E_BADCOLUMNID; } else if(rguidColumnType != DBGUID_ROWSET) { hr = DB_E_OBJECTMISMATCH; } break; // column is a BSTR with the flag DBCOLUMNFLAGS_ISROWURL then the requested object // has to be ROW object case DBTYPE_BSTR : if(!(lColumnFlag & DBCOLUMNFLAGS_ISROWURL)) { hr = DB_E_BADCOLUMNID; } else if(rguidColumnType != DBGUID_ROW) { hr = DB_E_OBJECTMISMATCH; } else { bIsChildRowset = FALSE; } break; }; // Open the column if everything is ok if(SUCCEEDED(hr)) { assert(dwFlags == 0); hr = m_pObj->OpenChild(pUnkOuter,pColumnID->uName.pwszName ,riid,ppUnk,bIsChildRowset); } } } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IRow); CATCH_BLOCK_HRESULT(hr,L"IRow::Open"); return hr; }