Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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; }
|