184 lines
5.3 KiB
C++
184 lines
5.3 KiB
C++
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft WMIOLE DB Provider
|
|
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// colinfo.cpp | IColumnsInfo interface implementation
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "headers.h"
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IColumnsInfo specific methods
|
|
//
|
|
// Returns the column metadata needed by most consumers.
|
|
//
|
|
// HRESULT
|
|
// S_OK The method succeeded
|
|
// E_OUTOFMEMORY Out of memory
|
|
// E_INVALIDARG pcColumns or prginfo or ppStringsbuffer was NULL
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CImpIColumnsInfo::GetColumnInfo( DBORDINAL* pcColumns, //OUT Number of columns in rowset
|
|
DBCOLUMNINFO** prgInfo, //OUT Array of DBCOLUMNINFO Structures
|
|
OLECHAR** ppStringsBuffer //OUT Storage for all string values
|
|
)
|
|
{
|
|
ULONG icol = 0;
|
|
DBCOLUMNINFO* rgdbcolinfo = NULL;
|
|
WCHAR* pstrBuffer = NULL;
|
|
WCHAR* pstrBufferForColInfo = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
CSetStructuredExceptionHandler seh;
|
|
|
|
TRY_BLOCK;
|
|
|
|
//==============================================
|
|
// Initialize
|
|
//==============================================
|
|
if ( pcColumns ){
|
|
*pcColumns = 0;
|
|
}
|
|
if ( prgInfo ){
|
|
*prgInfo = NULL;
|
|
}
|
|
if ( ppStringsBuffer ){
|
|
*ppStringsBuffer = NULL;
|
|
}
|
|
|
|
// Serialize access to this object.
|
|
CAutoBlock cab(BASEROW->GetCriticalSection());
|
|
g_pCError->ClearErrorInfo();
|
|
//==============================================
|
|
// Usual argument checking
|
|
//==============================================
|
|
if(m_pObj->IsZoombie())
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
if ( pcColumns == NULL || prgInfo == NULL || ppStringsBuffer == NULL ){
|
|
hr = E_INVALIDARG;
|
|
}
|
|
else{
|
|
|
|
hr = BASEROW->GetColumnInfo(pcColumns,prgInfo , ppStringsBuffer);
|
|
}
|
|
|
|
hr = hr == S_OK ? hr : g_pCError->PostHResult(hr,&IID_IColumnsInfo);
|
|
|
|
CATCH_BLOCK_HRESULT(hr,L"IColumnInfo::GetColumnInfo");
|
|
return hr;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Returns an array of ordinals of the columns in a rowset that are identified by the specified column IDs.
|
|
//
|
|
// HRESULT
|
|
// S_OK The method succeeded
|
|
// E_INVALIDARG cColumnIDs was not 0 and rgColumnIDs was NULL,rgColumns was NULL
|
|
// DB_E_COLUMNUNAVAILABLE An element of rgColumnIDs was invalid
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CImpIColumnsInfo::MapColumnIDs ( DBORDINAL cColumnIDs, //IN Number of Column IDs to map
|
|
const DBID rgColumnIDs[], //IN Column IDs to map
|
|
DBORDINAL rgColumns[] //OUT Ordinal values
|
|
)
|
|
{
|
|
ULONG ulError = 0;
|
|
ULONG i = 0;
|
|
HRESULT hr = S_OK;
|
|
|
|
CSetStructuredExceptionHandler seh;
|
|
|
|
TRY_BLOCK;
|
|
|
|
//========================================
|
|
// Serialize access to this object.
|
|
//========================================
|
|
CAutoBlock cab(BASEROW->GetCriticalSection());
|
|
g_pCError->ClearErrorInfo();
|
|
|
|
if(m_pObj->IsZoombie())
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
else
|
|
//==========================================================
|
|
// If cColumnIDs is 0 return
|
|
//==========================================================
|
|
if ( cColumnIDs != 0 ){
|
|
|
|
//======================================================
|
|
// Check arguments
|
|
//======================================================
|
|
if ( rgColumnIDs == NULL ){
|
|
hr = E_INVALIDARG;
|
|
}
|
|
else{
|
|
|
|
if ( rgColumns == NULL ){
|
|
hr = E_INVALIDARG ;
|
|
}
|
|
else{
|
|
|
|
//===============================================
|
|
// Walk the Column ID structs and determine
|
|
// the ordinal value
|
|
//===============================================
|
|
for ( i=0; i < cColumnIDs; i++ ){
|
|
|
|
if ( ( rgColumnIDs[i].eKind == DBKIND_PROPID &&
|
|
rgColumnIDs[i].uName.ulPropid < 1 &&
|
|
rgColumnIDs[i].uName.ulPropid > BASEROW->m_cTotalCols ) ||
|
|
|
|
( rgColumnIDs[i].eKind == DBKIND_NAME &&
|
|
rgColumnIDs[i].uName.pwszName == NULL ) ||
|
|
|
|
( rgColumnIDs[i].eKind == DBKIND_GUID_PROPID ) )
|
|
{
|
|
|
|
/* if ( ( rgColumnIDs[i].uName.ulPropid < 1 ) ||
|
|
( rgColumnIDs[i].uName.ulPropid > BASEROW->m_cTotalCols ) ||
|
|
( rgColumnIDs[i].eKind != DBKIND_GUID_PROPID ) ||
|
|
( rgColumnIDs[i].uGuid.guid != GUID_NULL ) )
|
|
*/
|
|
rgColumns[i] = DB_INVALIDCOLUMN;
|
|
ulError++;
|
|
}
|
|
else
|
|
{
|
|
if(rgColumnIDs[i].eKind == DBKIND_PROPID)
|
|
{
|
|
rgColumns[i] = rgColumnIDs[i].uName.ulPropid;
|
|
}
|
|
else
|
|
{
|
|
rgColumns[i] = BASEROW->GetOrdinalFromColName(rgColumnIDs[i].uName.pwszName);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !ulError ){
|
|
hr = S_OK;
|
|
}
|
|
else if ( ulError < cColumnIDs ){
|
|
hr = DB_S_ERRORSOCCURRED;
|
|
}
|
|
else{
|
|
hr = DB_E_ERRORSOCCURRED;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = hr == S_OK ? hr : g_pCError->PostHResult(hr,&IID_IColumnsInfo);
|
|
|
|
CATCH_BLOCK_HRESULT(hr,L"IColumnInfo::MapColumnIDs");
|
|
return hr;
|
|
}
|