196 lines
5.9 KiB
C++
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;
|
|
}
|
|
|
|
|