windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/rowinfo.cpp
2020-09-26 16:20:57 +08:00

196 lines
5.9 KiB
C++

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