mirror of https://github.com/tongzx/nt5src
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.
3059 lines
121 KiB
3059 lines
121 KiB
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft WMI OLE DB Provider
|
|
//
|
|
// (C) Copyright 1999-2000 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// Schema.cpp - Schema related class implementation
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#include "headers.h"
|
|
#include "schema.h"
|
|
#include "enumerat.h"
|
|
|
|
extern const WCHAR szWQL[] = L"WQL";
|
|
extern const WCHAR szWQL2[] = L"WQL2";
|
|
|
|
|
|
#define TABLENAMEMAX 255
|
|
//Bug No: NTRaid 126631
|
|
// 06/13/00
|
|
#define NUMBER_OF_SCHEMAS 8
|
|
enum guiddata
|
|
{
|
|
data1_DBSCHEMA_CATALOGS = 0xc8b52211,
|
|
data1_DBSCHEMA_PROVIDER_TYPES = 0xc8b5222c,
|
|
data1_DBSCHEMA_COLUMNS = 0xc8b52214,
|
|
data1_DBSCHEMA_TABLES = 0xc8b52229,
|
|
data1_DBSCHEMA_PRIMARY_KEYS = 0xc8b522c5,
|
|
data1_DBSCHEMA_TABLES_INFO = 0xc8b522e0,
|
|
data1_DBSCHEMA_PROCEDURES = 0xc8b52224,
|
|
data1_DBSCHEMA_PROCEDURE_PARAMETERS = 0xc8b522b8,
|
|
};
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CIMTypeInfo g_ProviderTypeDetails[] = {
|
|
{ L"CIM_EMPTY", 0, 0, 0},
|
|
{ L"CIM_SINT8", DBTYPE_I1, sizeof(BYTE), 0},
|
|
{ L"CIM_UINT8", DBTYPE_UI1, sizeof(BYTE), 1},
|
|
{ L"CIM_SINT16", DBTYPE_I2, sizeof(short), 0},
|
|
{ L"CIM_UINT16", DBTYPE_UI2, sizeof(short), 1},
|
|
{ L"CIM_SINT32", DBTYPE_I4, sizeof(long), 0},
|
|
{ L"CIM_UINT32", DBTYPE_UI4, sizeof(long), 1},
|
|
{ L"CIM_SINT64", DBTYPE_I8, sizeof(__int64), 0},
|
|
{ L"CIM_UINT64", DBTYPE_UI8, sizeof(__int64), 1},
|
|
{ L"CIM_REAL32", DBTYPE_R4, sizeof(long), 0},
|
|
{ L"CIM_REAL64", DBTYPE_R8, sizeof(__int64), 0},
|
|
{ L"CIM_BOOLEAN", DBTYPE_BOOL, sizeof(short), 0},
|
|
{ L"CIM_STRING", DBTYPE_BSTR, ~0, 0},
|
|
{ L"CIM_DATETIME", DBTYPE_DBTIMESTAMP, sizeof(DBTIMESTAMP),0},
|
|
// { L"CIM_REFERENCE", 0, 0, 0},
|
|
{ L"CIM_CHAR16", DBTYPE_UI2, sizeof(short), 1}
|
|
// { L"CIM_OBJECT", DBTYPE_IUNKNOWN, sizeof(BSTR), 0},
|
|
// { L"CIM_FLAG_ARRAY",0, 0, 0}
|
|
};
|
|
|
|
SchemaRowsetDefinition g_SourcesRowsetColumns[] = { {L"SOURCES_NAME", CIM_STRING},
|
|
{L"SOURCES_PARSENAME", CIM_STRING},
|
|
{L"SOURCES_DESCRIPTION",CIM_STRING},
|
|
{L"SOURCES_TYPE", CIM_UINT16},
|
|
{L"SOURCES_ISPARENT", CIM_BOOLEAN}};
|
|
|
|
|
|
SchemaRowsetDefinition g_ProviderTypes[] = { {L"TYPE_NAME", CIM_STRING},
|
|
{L"DATA_TYPE", CIM_UINT16},
|
|
{L"COLUMN_SIZE", CIM_UINT32},
|
|
{L"LITERAL_PREFIX", CIM_STRING},
|
|
{L"LITERAL_SUFFIX", CIM_STRING},
|
|
{L"CREATE_PARAMS", CIM_STRING},
|
|
{L"IS_NULLABLE", CIM_BOOLEAN},
|
|
{L"CASE_SENSITIVE", CIM_BOOLEAN},
|
|
{L"SEARCHABLE" , CIM_UINT32},
|
|
{L"UNSIGNED_ATTRIBUTE",CIM_BOOLEAN},
|
|
{L"FIXED_PREC_SCALE", CIM_BOOLEAN},
|
|
{L"AUTO_UNIQUE_VALUE", CIM_BOOLEAN},
|
|
{L"LOCAL_TYPE_NAME", CIM_STRING},
|
|
{L"MINIMUM_SCALE", CIM_SINT16},
|
|
{L"MAXIMUM_SCALE", CIM_SINT16},
|
|
{L"GUID", DBTYPE_GUID},
|
|
{L"TYPELIB", CIM_STRING},
|
|
{L"VERSION", CIM_STRING},
|
|
{L"IS_LONG", CIM_BOOLEAN},
|
|
{L"BEST_MATCH", CIM_BOOLEAN},
|
|
{L"IS_FIXEDLENGTH", CIM_BOOLEAN} };
|
|
|
|
SchemaRowsetDefinition g_CatalogRowsetColumns[] = {{L"CATALOG_NAME", CIM_STRING},
|
|
{L"SOURCES_DESCRIPTION", CIM_STRING} };
|
|
|
|
SchemaRowsetDefinition g_Tables[] = { {L"TABLE_CATALOG", CIM_STRING},
|
|
{L"TABLE_SCHEMA", CIM_STRING},
|
|
{L"TABLE_NAME", CIM_STRING},
|
|
{L"TABLE_TYPE", CIM_STRING},
|
|
{L"TABLE_GUID", DBTYPE_GUID},
|
|
{L"DESCRIPTION", CIM_STRING},
|
|
{L"TABLE_PROPID", CIM_UINT32},
|
|
{L"DATE_CREATED", DBTYPE_DATE},
|
|
{L"DATE_MODIFIED", DBTYPE_DATE}};
|
|
|
|
|
|
SchemaRowsetDefinition g_TablesInfo[] = { {L"TABLE_CATALOG", CIM_STRING},
|
|
{L"TABLE_SCHEMA", CIM_STRING},
|
|
{L"TABLE_NAME", CIM_STRING},
|
|
{L"TABLE_TYPE", CIM_STRING},
|
|
{L"TABLE_GUID", DBTYPE_GUID},
|
|
{L"BOOKMARKS", CIM_BOOLEAN},
|
|
{L"BOOKMARK_TYPE", CIM_UINT32},
|
|
{L"BOOKMARK_DATATYPE", CIM_UINT16},
|
|
{L"BOOKMARK_MAXIMUM_LENGTH",CIM_UINT32},
|
|
{L"BOOKMARK_INFORMATION", CIM_UINT32},
|
|
{L"TABLE_VERSION", CIM_SINT64},
|
|
{L"CARDINALITY", CIM_UINT64},
|
|
{L"DESCRIPTION", CIM_STRING},
|
|
{L"TABLE_PROPID", CIM_UINT32}};
|
|
|
|
|
|
SchemaRowsetDefinition g_ColumnsRowsetColumns[] = { {L"TABLE_CATALOG", CIM_STRING},
|
|
{L"TABLE_SCHEMA", CIM_STRING},
|
|
{L"TABLE_NAME", CIM_STRING},
|
|
{L"COLUMN_NAME", CIM_STRING},
|
|
{L"COLUMN_GUID", DBTYPE_GUID},
|
|
{L"COLUMN_PROPID", CIM_UINT32},
|
|
{L"COLUMN_POSITION", CIM_UINT32},
|
|
{L"COLUMN_HASDEFAULT", CIM_BOOLEAN},
|
|
{L"COLUMN_DEFAULT", CIM_STRING},
|
|
{L"COLUMN_FLAGS", CIM_UINT32},
|
|
{L"IS_NULLABLE", CIM_BOOLEAN},
|
|
{L"DATA_TYPE", CIM_UINT16},
|
|
{L"TYPE_GUID", DBTYPE_GUID},
|
|
{L"CHARACTER_MAXIMUM_LENGTH", CIM_UINT32},
|
|
{L"CHARACTER_OCTET_LENGTH", CIM_UINT32},
|
|
{L"NUMERIC_PRECISION", CIM_UINT16},
|
|
{L"NUMERIC_SCALE", CIM_SINT16},
|
|
{L"DATETIME_PRECISION", CIM_UINT32},
|
|
{L"CHARACTER_SET_CATALOG", CIM_STRING},
|
|
{L"CHARACTER_SET_SCHEMA", CIM_STRING},
|
|
{L"CHARACTER_SET_NAME", CIM_STRING},
|
|
{L"COLLATION_CATALOG", CIM_STRING},
|
|
{L"COLLATION_SCHEMA", CIM_STRING},
|
|
{L"COLLATION_NAME", CIM_STRING},
|
|
{L"DOMAIN_CATALOG", CIM_STRING},
|
|
{L"DOMAIN_SCHEMA", CIM_STRING},
|
|
{L"DOMAIN_NAME", CIM_STRING},
|
|
{L"DESCRIPTION", CIM_STRING}};
|
|
|
|
|
|
SchemaRowsetDefinition g_PrimaryKeysColumns[] = { {L"TABLE_CATALOG", CIM_STRING},
|
|
{L"TABLE_SCHEMA", CIM_STRING},
|
|
{L"TABLE_NAME", CIM_STRING},
|
|
{L"COLUMN_NAME", CIM_STRING},
|
|
{L"COLUMN_GUID", DBTYPE_GUID},
|
|
{L"COLUMN_PROPID", CIM_UINT32},
|
|
{L"ORDINAL", CIM_UINT32},
|
|
{L"PK_NAME", CIM_STRING}};
|
|
|
|
SchemaRowsetDefinition g_Procedures[] = {{L"PROCEDURE_CATALOG", CIM_STRING},
|
|
{L"PROCEDURE_SCHEMA", CIM_STRING},
|
|
{L"PROCEDURE_NAME", CIM_STRING},
|
|
{L"PROCEDURE_TYPE", CIM_SINT16},
|
|
{L"PROCEDURE_DEFINITION", CIM_STRING},
|
|
{L"DESCRIPTION", CIM_STRING},
|
|
{L"DATE_CREATED", DBTYPE_DATE},
|
|
{L"DATE_MODIFIED", DBTYPE_DATE}};
|
|
|
|
|
|
SchemaRowsetDefinition g_ProcedureParameters[] = {{L"PROCEDURE_CATALOG", CIM_STRING},
|
|
{L"PROCEDURE_SCHEMA", CIM_STRING},
|
|
{L"PROCEDURE_NAME", CIM_STRING},
|
|
{L"PARAMETER_NAME", CIM_STRING},
|
|
{L"ORDINAL_POSITION", CIM_UINT16},
|
|
{L"PARAMETER_TYPE", CIM_UINT16},
|
|
{L"PARAMETER_HASDEFAULT", CIM_BOOLEAN},
|
|
{L"PARAMETER_DEFAULT", CIM_STRING},
|
|
{L"IS_NULLABLE", CIM_BOOLEAN},
|
|
{L"DATATYPE", CIM_UINT16},
|
|
{L"CHARACTER_MAXIMUM_LENGTH",CIM_UINT32},
|
|
{L"CHARACTER_OCTECT_LENGTH", CIM_UINT32},
|
|
{L"NUMERIC_PRECISION", CIM_UINT16},
|
|
{L"NUMERIC_SCALE", CIM_SINT16},
|
|
{L"DESCRIPTION", CIM_STRING},
|
|
{L"TYPE_NAME", CIM_STRING},
|
|
{L"LOCAL_TYPE_NAME", CIM_STRING}};
|
|
|
|
SchemaRowsetDefinition g_ProcedureColumns[] = {{L"PROCEDURE_CATALOG", CIM_STRING},
|
|
{L"PROCEDURE_SCHEMA", CIM_STRING},
|
|
{L"PROCEDURE_NAME", CIM_STRING},
|
|
{L"COLUMN_NAME", CIM_STRING},
|
|
{L"COLUMN_GUID", DBTYPE_GUID},
|
|
{L"COLUMN_PROPID", CIM_UINT32},
|
|
{L"ROWSET_NUMBER", CIM_UINT32},
|
|
{L"ORDINAL_POSITION", CIM_UINT32},
|
|
{L"IS_NULLABLE", CIM_BOOLEAN},
|
|
{L"DATA_TYPE", CIM_UINT16},
|
|
{L"TYPE_GUID", DBTYPE_GUID},
|
|
{L"CHARACTER_MAXIMUM_LENGTH", CIM_UINT32},
|
|
{L"CHARACTER_OCTECT_LENGTH", CIM_UINT32},
|
|
{L"NUMERIC_PRECISION", CIM_UINT16},
|
|
{L"NUMERIC_SCALE", CIM_SINT16},
|
|
{L"DESCRIPTION", CIM_STRING}};
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//**********************************************************************************************************
|
|
//
|
|
// CLASS: CSCHEMA
|
|
//
|
|
//**********************************************************************************************************
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CSchema::CSchema(LPUNKNOWN pUnkOuter, int nTableId,PCDBSESSION pObj) :
|
|
CRowset(pUnkOuter,pObj)
|
|
{
|
|
m_nTableId = nTableId;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CSchema::~CSchema()
|
|
{
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Sets the rowset property corresponding to the requested interface if the requested interface is available
|
|
// on a read-only rowset.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CSchema::SetReadOnlyProperty( CUtilProp* pRowsetProps,REFIID riid )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (riid == IID_IRowsetChange || riid == IID_IRowsetUpdate || riid == IID_IRowsetResynch)
|
|
hr = (E_NOINTERFACE);
|
|
|
|
return hr;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Initialize a schema rowset
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CSchema::FInit( ULONG cPropertySets, DBPROPSET rgPropertySets[],
|
|
REFIID riid, IUnknown *pUnkOuter,
|
|
IUnknown **ppIRowset, WCHAR * wcsSpecificTable )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HRESULT hrProp = S_OK;
|
|
DWORD dwStatus = 0;
|
|
PWSTR pwszBuff = NULL;
|
|
LONG cCursorRows = 0;
|
|
WCHAR strTableName[TABLENAMEMAX];
|
|
|
|
memset(strTableName,0,TABLENAMEMAX * sizeof(WCHAR));
|
|
|
|
if( SUCCEEDED(hr =GetTableName(strTableName)))
|
|
{
|
|
//==========================================================================
|
|
// Set the Rowset Properties
|
|
//==========================================================================
|
|
hr = InitRowset(m_nTableId, cPropertySets,rgPropertySets,strTableName,0,wcsSpecificTable);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
|
|
//==========================================================================
|
|
// If the consumer asks for IID_IUnknown, IID_IAccessor,
|
|
// IID_IColumnsInfo, or IID_IRowsetInfo, we do not need to
|
|
//==========================================================================
|
|
if ( riid != IID_IRowset && riid != IID_IColumnsInfo && riid != IID_IAccessor && riid != IID_IRowsetInfo
|
|
&& riid != IID_IUnknown && riid != IID_IMultipleResults ){
|
|
hr = SetReadOnlyProperty(m_pUtilProp,riid);
|
|
}
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
//==========================================================================
|
|
// Execute the schema command to produce the rowset.
|
|
//==========================================================================
|
|
|
|
if (SUCCEEDED(hr)){
|
|
|
|
if (hr == DB_E_ERRORSOCCURRED && cPropertySets > 0){
|
|
m_pUtilProp->SetPropertiesArgChk(cPropertySets, rgPropertySets);
|
|
}
|
|
}
|
|
|
|
|
|
if (DB_S_ERRORSOCCURRED == hr){
|
|
|
|
hrProp = DB_S_ERRORSOCCURRED;
|
|
if (cPropertySets > 0)
|
|
{
|
|
m_pUtilProp->SetPropertiesArgChk(cPropertySets, rgPropertySets);
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
// Get the requested interfaceS
|
|
//==========================================================================
|
|
hr = QueryInterface(riid, (LPVOID*)ppIRowset);
|
|
|
|
} // if (Succeeded(hr))
|
|
|
|
} // If(succeeded(hr) after initializing the rowset
|
|
|
|
} // if a valid tablename
|
|
|
|
|
|
hr = (hr == S_OK) ? hrProp : hr;
|
|
hr = hr != S_OK ? g_pCError->PostHResult(hr, &IID_IDBSchemaRowset) : hr;
|
|
return hr;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CSchema::GetTableName(WCHAR *pTableName)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(pTableName != NULL)
|
|
{
|
|
switch(m_nTableId)
|
|
{
|
|
case PROCEDURES_ROWSET:
|
|
wcscpy(pTableName,PROCEDURES);
|
|
break;
|
|
|
|
case PROCEDURE_PARAMETERS_ROWSET:
|
|
wcscpy(pTableName,PROCEDURE_PARAMETERS);
|
|
break;
|
|
|
|
case SOURCES_ROWSET:
|
|
wcscpy(pTableName,NAMESPACE);
|
|
break;
|
|
|
|
case PROVIDER_TYPES_ROWSET:
|
|
wcscpy(pTableName,PROVIDER_TYPES);
|
|
break;
|
|
|
|
case CATALOGS_ROWSET:
|
|
wcscpy(pTableName,CATALOGS);
|
|
break;
|
|
|
|
case COLUMNS_ROWSET:
|
|
wcscpy(pTableName,COLUMNS);
|
|
break;
|
|
|
|
case TABLES_ROWSET:
|
|
wcscpy(pTableName,TABLES);
|
|
break;
|
|
|
|
case PRIMARY_KEYS_ROWSET:
|
|
wcscpy(pTableName,PRIMARY_KEYS);
|
|
break;
|
|
|
|
case TABLES_INFO_ROWSET:
|
|
wcscpy(pTableName,TABLESINFO);
|
|
break;
|
|
|
|
default:
|
|
hr = E_FAIL;
|
|
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
return hr;
|
|
|
|
}
|
|
/*
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Increments a reference count for the object.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP_(ULONG) CImpIDBSchemaRowset::AddRef(void)
|
|
{
|
|
DEBUGCODE(InterlockedIncrement((long*)&m_cRef));
|
|
return m_pCDBSession->AddRef();
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Decrement the object's reference count and deletes the object when the new reference count is zero.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP_(ULONG) CImpIDBSchemaRowset::Release(void)
|
|
{
|
|
DEBUGCODE(InterlockedDecrement((long*)&m_cRef));
|
|
return m_pCDBSession->Release();
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Returns a pointer to a specified interface. Callers use QueryInterface to determine which interfaces the
|
|
// called object supports.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CImpIDBSchemaRowset::QueryInterface( REFIID riid, LPVOID * ppv )
|
|
{
|
|
return m_pCDBSession->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
*/
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//**********************************************************************************************************
|
|
//
|
|
// CLASS CImpIDBSchemaRowset
|
|
//
|
|
//**********************************************************************************************************
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Instantiate a rowset with schema information.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CImpIDBSchemaRowset::GetRowset( IUnknown *pUnkOuter, REFGUID rguidSchema, ULONG cRestrictions,
|
|
const VARIANT rgRestrictions[], REFIID riid,ULONG cProperties,
|
|
DBPROPSET rgProperties[], IUnknown **ppIRowset )
|
|
{
|
|
HRESULT hr;
|
|
CSchema *pCSchema = NULL;
|
|
WCHAR * wcsSpecificTable = NULL;
|
|
|
|
//========================================================
|
|
// Serialize access to this object.
|
|
//========================================================
|
|
|
|
CAutoBlock cab(m_pCDBSession->GetCriticalSection());
|
|
|
|
|
|
CError::ClearErrorInfo();
|
|
|
|
//========================================================
|
|
// Assign in case of error.
|
|
//========================================================
|
|
if (ppIRowset)
|
|
{
|
|
*ppIRowset = NULL;
|
|
}
|
|
//========================================================
|
|
// Check per spec.
|
|
//========================================================
|
|
if (ppIRowset == NULL || (cRestrictions && rgRestrictions == NULL) || (cProperties && rgProperties == NULL) )
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//========================================================
|
|
// The outer object must explicitly ask for IUnknown
|
|
//========================================================
|
|
if (pUnkOuter != NULL && riid != IID_IUnknown)
|
|
{
|
|
g_pCError->PostHResult((DB_E_NOAGGREGATION), &IID_IDBSchemaRowset);
|
|
}
|
|
else{
|
|
//========================================================
|
|
// Assume that all the pre-defined OLEDB guids differ
|
|
// only by the first DWORD, Data1. We have to make a
|
|
// table of constants, since the compiler can't
|
|
// have non-constants in case statements.
|
|
//========================================================
|
|
|
|
switch ( rguidSchema.Data1 )
|
|
{
|
|
|
|
//===================================================
|
|
// methods - the list of methods for a table
|
|
//===================================================
|
|
case data1_DBSCHEMA_PROCEDURES:
|
|
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_PROCEDURES)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//====================================================================
|
|
// The specific table name is located in the 3rd restriction
|
|
//====================================================================
|
|
if( cRestrictions > 1 && rgRestrictions[1].vt != VT_EMPTY)
|
|
{
|
|
wcsSpecificTable = V_BSTR(&rgRestrictions[1]);
|
|
}
|
|
pCSchema = new CSchema_Procedures(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
//===================================================
|
|
// methods - the list of parameters for a method
|
|
//===================================================
|
|
case data1_DBSCHEMA_PROCEDURE_PARAMETERS:
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_PROCEDURE_PARAMETERS)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//====================================================================
|
|
// The specific table name is located in the 3rd restriction
|
|
//====================================================================
|
|
if( cRestrictions > 1 && rgRestrictions[1].vt != VT_EMPTY)
|
|
{
|
|
wcsSpecificTable = V_BSTR(&rgRestrictions[1]);
|
|
}
|
|
pCSchema = new CSchema_Procedure_Parameters(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
//===================================================
|
|
// catalogs
|
|
//===================================================
|
|
case data1_DBSCHEMA_CATALOGS:
|
|
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_CATALOGS)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
pCSchema = new CSchema_Catalogs(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
//===================================================
|
|
// provider types
|
|
//===================================================
|
|
case data1_DBSCHEMA_PROVIDER_TYPES:
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_PROVIDER_TYPES){
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else{
|
|
pCSchema = new CSchema_Provider_Types(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
//===================================================
|
|
// columns
|
|
//===================================================
|
|
case data1_DBSCHEMA_COLUMNS:
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_COLUMNS)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//====================================================================
|
|
// The specific table name is located in the 3rd restriction
|
|
//====================================================================
|
|
if( cRestrictions > 2 && rgRestrictions[2].vt != VT_EMPTY)
|
|
{
|
|
wcsSpecificTable = V_BSTR(&rgRestrictions[2]);
|
|
}
|
|
pCSchema = new CSchema_Columns(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
|
|
//===================================================
|
|
// tables
|
|
//===================================================
|
|
case data1_DBSCHEMA_TABLES:
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_TABLES)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//====================================================================
|
|
// The specific table name is located in the 3rd restriction
|
|
//====================================================================
|
|
if( cRestrictions > 2 && rgRestrictions[2].vt != VT_EMPTY)
|
|
{
|
|
wcsSpecificTable = V_BSTR(&rgRestrictions[2]);
|
|
}
|
|
pCSchema = new CSchema_Tables(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
//===================================================
|
|
// primary keys
|
|
//===================================================
|
|
case data1_DBSCHEMA_PRIMARY_KEYS:
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_TABLES_INFO)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//====================================================================
|
|
// The specific table name is located in the 2nd restriction
|
|
//====================================================================
|
|
if( cRestrictions > 1 && rgRestrictions[1].vt != VT_EMPTY)
|
|
{
|
|
wcsSpecificTable = V_BSTR(&rgRestrictions[1]);
|
|
}
|
|
pCSchema = new CSchema_Primary_Keys(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
//===================================================
|
|
// tables info
|
|
//===================================================
|
|
case data1_DBSCHEMA_TABLES_INFO:
|
|
if (cRestrictions > CRESTRICTIONS_DBSCHEMA_TABLES_INFO)
|
|
{
|
|
g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
}
|
|
else
|
|
{
|
|
//====================================================================
|
|
// The specific table name is located in the 3rd restriction
|
|
//====================================================================
|
|
if( cRestrictions > 2 && rgRestrictions[2].vt != VT_EMPTY)
|
|
{
|
|
wcsSpecificTable = V_BSTR(&rgRestrictions[2]);
|
|
}
|
|
pCSchema = new CSchema_Tables_Info(pUnkOuter,m_pCDBSession);
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
//===================================================
|
|
// check for provider-specific schema rowsets
|
|
//===================================================
|
|
return g_pCError->PostHResult(E_INVALIDARG, &IID_IDBSchemaRowset);
|
|
break;
|
|
}
|
|
//===================================================
|
|
// At this point, pCSchema contains the uninitialized
|
|
// object, derived from CSchema
|
|
//===================================================
|
|
if (!pCSchema)
|
|
{
|
|
g_pCError->PostHResult((E_OUTOFMEMORY), &IID_IDBSchemaRowset);
|
|
}
|
|
}
|
|
}
|
|
//===================================================
|
|
// Initialize. Creates the rowset.
|
|
//===================================================
|
|
if( pCSchema )
|
|
{
|
|
hr = pCSchema->FInit(cProperties, rgProperties, riid, pUnkOuter, ppIRowset,wcsSpecificTable);
|
|
if( S_OK == hr )
|
|
{
|
|
(*ppIRowset)->AddRef();
|
|
}
|
|
|
|
//===================================================
|
|
// Release our reference.
|
|
//===================================================
|
|
pCSchema->Release();
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Return an array of guids for supported schemas.
|
|
//
|
|
//Bug No: NTRaid 126631
|
|
// 06/13/00
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CImpIDBSchemaRowset::GetSchemas( ULONG *pcSchemas, GUID **ppSchemas, ULONG **prgRestrictionSupport )
|
|
{
|
|
GUID *pSchemas;
|
|
ULONG *pRestrictionSupport;
|
|
ULONG cSchemas;
|
|
|
|
//===================================================
|
|
// Serialize access to this object.
|
|
//===================================================
|
|
// m_pCDBSession->GetCriticalSection();
|
|
|
|
g_pCError->ClearErrorInfo();
|
|
|
|
if (pcSchemas)
|
|
*pcSchemas = 0;
|
|
if (ppSchemas)
|
|
*ppSchemas = NULL;
|
|
if (prgRestrictionSupport)
|
|
*prgRestrictionSupport = NULL;
|
|
|
|
//===================================================
|
|
// Check per spec.
|
|
//===================================================
|
|
if (pcSchemas == NULL || ppSchemas == NULL || prgRestrictionSupport == NULL)
|
|
{
|
|
return g_pCError->PostHResult((E_INVALIDARG), &IID_IDBSchemaRowset);
|
|
}
|
|
|
|
cSchemas = NUMBER_OF_SCHEMAS;
|
|
pSchemas = (GUID*) g_pIMalloc->Alloc(sizeof(GUID) * cSchemas);
|
|
if (NULL == pSchemas)
|
|
{
|
|
return g_pCError->PostHResult((E_OUTOFMEMORY),&IID_IDBSchemaRowset);
|
|
}
|
|
pRestrictionSupport = (ULONG*)g_pIMalloc->Alloc(sizeof(ULONG) * cSchemas);
|
|
|
|
if (NULL == pRestrictionSupport)
|
|
{
|
|
g_pIMalloc->Free(pSchemas);
|
|
return g_pCError->PostHResult((E_OUTOFMEMORY),&IID_IDBSchemaRowset);
|
|
}
|
|
|
|
*ppSchemas = pSchemas;
|
|
*pSchemas++ = DBSCHEMA_CATALOGS;
|
|
*pSchemas++ = DBSCHEMA_PROVIDER_TYPES;
|
|
*pSchemas++ = DBSCHEMA_COLUMNS;
|
|
*pSchemas++ = DBSCHEMA_TABLES;
|
|
*pSchemas++ = DBSCHEMA_PRIMARY_KEYS;
|
|
*pSchemas++ = DBSCHEMA_TABLES_INFO;
|
|
*pSchemas++ = DBSCHEMA_PROCEDURES;
|
|
*pSchemas++ = DBSCHEMA_PROCEDURE_PARAMETERS;
|
|
|
|
|
|
if( prgRestrictionSupport != NULL)
|
|
{
|
|
*prgRestrictionSupport = pRestrictionSupport;
|
|
*pRestrictionSupport++ = eSup_CATALOGS;
|
|
*pRestrictionSupport++ = eSup_PROVIDER_TYPES;
|
|
*pRestrictionSupport++ = eSup_COLUMNS;
|
|
*pRestrictionSupport++ = eSup_TABLES;
|
|
*pRestrictionSupport++ = eSup_PRIMARY_KEYS;
|
|
*pRestrictionSupport++ = eSup_TABLES_INFO;
|
|
*pRestrictionSupport++ = eSup_PROCEDURES;
|
|
*pRestrictionSupport++ = eSup_PROCEDURE_PARAMETERS;
|
|
}
|
|
|
|
//===================================================
|
|
// Set the number of schemas we have recorded.
|
|
//===================================================
|
|
*pcSchemas = cSchemas;
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//***********************************************************************************************************
|
|
//
|
|
// Class Schema definition
|
|
//
|
|
//***********************************************************************************************************
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaClassDefinitionWrapper::CWbemSchemaClassDefinitionWrapper(CWbemClassParameters * p) :
|
|
CWbemClassDefinitionWrapper(p)
|
|
{
|
|
m_nSchemaClassIndex = 0;
|
|
m_nMaxColumns = 0;
|
|
m_bSchema = TRUE;
|
|
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaClassDefinitionWrapper::~CWbemSchemaClassDefinitionWrapper()
|
|
{
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaClassDefinitionWrapper::ValidClass( )
|
|
{
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaClassDefinitionWrapper::TotalPropertiesInClass(ULONG & ulPropCount, ULONG & ulSysPropCount )
|
|
{
|
|
ulPropCount = m_nMaxColumns;
|
|
ulSysPropCount = 0;
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaClassDefinitionWrapper::BeginPropertyEnumeration()
|
|
{
|
|
m_nSchemaClassIndex = 0;
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaClassDefinitionWrapper::EndPropertyEnumeration()
|
|
{
|
|
m_nSchemaClassIndex = 0;
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// return failed, because we don't support the property qualifier enumeration
|
|
HRESULT CWbemSchemaClassDefinitionWrapper::BeginPropertyQualifierEnumeration(BSTR strPropName)
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//************************************************************************************************
|
|
//
|
|
// Deal with a Schema class instance
|
|
//
|
|
//************************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaClassInstanceWrapper::CWbemSchemaClassInstanceWrapper( CWbemClassParameters * p ): CWbemClassInstanceWrapper(p)
|
|
{
|
|
m_uCurrentIndex = 0;
|
|
m_nMaxColumns = 0;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaClassInstanceWrapper::~CWbemSchemaClassInstanceWrapper( )
|
|
{
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaClassInstanceWrapper::GetClassProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr;
|
|
|
|
BSTR bProp;
|
|
bProp = Wmioledb_SysAllocString(wcsProperty);
|
|
hr = GetProperty(bProp,v,pType,plFlavor);
|
|
SysFreeString(bProp);
|
|
return hr;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void CWbemSchemaClassInstanceWrapper::AddToKeyList(WCHAR *& pwcsKeyList, WCHAR * wcsKey )
|
|
{
|
|
WCHAR * pTmp = NULL;
|
|
|
|
if( !pwcsKeyList ){
|
|
pwcsKeyList = new WCHAR[wcslen(wcsKey) + 1];
|
|
wcscpy(pwcsKeyList,wcsKey);
|
|
}
|
|
else{
|
|
pTmp = new WCHAR[wcslen(pwcsKeyList) + wcslen(wcsKey) + 10];
|
|
swprintf(pTmp,L"%s,%s",pwcsKeyList,wcsKey);
|
|
SAFE_DELETE_PTR(pwcsKeyList);
|
|
pwcsKeyList = pTmp;
|
|
}
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//***********************************************************************************************************
|
|
// Class Schema Instance List
|
|
//***********************************************************************************************************
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaInstanceList::CWbemSchemaInstanceList(CWbemClassParameters * p) : CWbemInstanceList(p)
|
|
{
|
|
m_ulMaxRow = 0;
|
|
m_fGotThemAll = FALSE;
|
|
m_pSpecificClass = NULL;
|
|
m_pwcsSpecificClass = NULL;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaInstanceList::CWbemSchemaInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemInstanceList(p)
|
|
{
|
|
m_pSpecificClass = NULL;
|
|
m_ulMaxRow = 0;
|
|
m_fGotThemAll = FALSE;
|
|
m_pwcsSpecificClass = pSpecific;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaInstanceList::~CWbemSchemaInstanceList()
|
|
{
|
|
ResetTheSpecificClass();
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaInstanceList::ResetTheSpecificClass()
|
|
{
|
|
m_fGotThemAll = FALSE;
|
|
SAFE_RELEASE_PTR(m_pSpecificClass);
|
|
return S_OK;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaInstanceList::GetTheSpecificClass()
|
|
{
|
|
HRESULT hr = WBEM_S_NO_MORE_DATA;
|
|
if( !m_fGotThemAll )
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->GetObject(m_pwcsSpecificClass, 0, NULL, &m_pSpecificClass, NULL);
|
|
m_fGotThemAll = TRUE;
|
|
}
|
|
return hr;
|
|
}
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Sources schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaSourcesClassDefinitionWrapper::CWbemSchemaSourcesClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_SourcesRowsetColumns)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaSourcesClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
//===============================================================================
|
|
// Get the column name and data type
|
|
//===============================================================================
|
|
*pType = g_SourcesRowsetColumns[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_SourcesRowsetColumns[m_nSchemaClassIndex].wcsColumnName);
|
|
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaSourcesInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
int i = 0;
|
|
|
|
//=============================================================
|
|
// SOURCES_NAME
|
|
//=============================================================
|
|
|
|
if( _wcsicmp(pProperty,g_SourcesRowsetColumns[0].wcsColumnName) == 0 )
|
|
{
|
|
hr = GetClassProperty(L"Name",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// SOURCES_PARSENAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_SourcesRowsetColumns[1].wcsColumnName) == 0 )
|
|
{
|
|
hr = GetClassProperty(L"__PATH",v,pType,plFlavor);
|
|
}
|
|
else
|
|
{
|
|
//=============================================================
|
|
// Initialize the common stuff for these last column types
|
|
//=============================================================
|
|
*plFlavor = 0;
|
|
|
|
//=============================================================
|
|
// SOURCES_DESCRIPTION
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_SourcesRowsetColumns[2].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(L"N/A");
|
|
}
|
|
//=============================================================
|
|
// SOURCES_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_SourcesRowsetColumns[3].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT16;
|
|
((CVARIANT*)v)->SetShort(DBSOURCETYPE_DATASOURCE);
|
|
}
|
|
//=============================================================
|
|
// SOURCES_ISPARENT
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_SourcesRowsetColumns[4].wcsColumnName) == 0 ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)v)->SetBool(VARIANT_FALSE);
|
|
}
|
|
else{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaSourcesInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->ExecQuery(CBSTR((WCHAR *)szWQL),CBSTR(L"select * from __Namespace"), WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Provider Types schema rowset
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//********************************************************************************************
|
|
CWbemSchemaProviderTypesClassDefinitionWrapper::CWbemSchemaProviderTypesClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_ProviderTypes)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
//===============================================================================
|
|
// Get the column name and data type
|
|
//===============================================================================
|
|
*pType = g_ProviderTypes[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_ProviderTypes[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesInstanceWrapper::ResetInstanceFromKey(CBSTR Key)
|
|
{
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesInstanceWrapper::RefreshInstance()
|
|
{
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
WCHAR * CWbemSchemaProviderTypesInstanceWrapper::GetClassName()
|
|
{
|
|
return L"PROVIDER_TYPES";
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * vVar,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)vVar)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
ULONG_PTR i = GetPos();
|
|
|
|
//=============================================================
|
|
// TYPE_NAME
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_ProviderTypes[0].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)vVar)->SetStr(g_ProviderTypeDetails[i].wcsTypeName);
|
|
}
|
|
//=============================================================
|
|
// DATA_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[1].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT16;
|
|
((CVARIANT*)vVar)->SetShort(g_ProviderTypeDetails[i].DataType);
|
|
}
|
|
//=============================================================
|
|
// COLUMN_SIZE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[2].wcsColumnName) == 0 ){
|
|
*pType = CIM_SINT32;
|
|
((CVARIANT*)vVar)->SetLONG(g_ProviderTypeDetails[i].ColumnSize);
|
|
}
|
|
//=============================================================
|
|
// LITERAL_PREFIX, LITERAL_SUFFIX, CREATE_PARAMS
|
|
//=============================================================
|
|
else if(( _wcsicmp(pProperty,g_ProviderTypes[3].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[4].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[5].wcsColumnName) == 0 ) ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)vVar)->SetStr(L"");
|
|
}
|
|
//=============================================================
|
|
// IS_NULLABLE,CASE_SENSITIVE
|
|
//=============================================================
|
|
else if(( _wcsicmp(pProperty,g_ProviderTypes[6].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[7].wcsColumnName) == 0 ) ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(VARIANT_FALSE);
|
|
}
|
|
//=============================================================
|
|
// SEARCHABLE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[8].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
((CVARIANT*)vVar)->SetLONG(0);
|
|
}
|
|
//=============================================================
|
|
// UNSIGNED_ATTRIBUTE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[9].wcsColumnName) == 0 ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetShort((short)g_ProviderTypeDetails[i].UnsignedAttribute);
|
|
}
|
|
//=============================================================
|
|
// FIXED_PREC_SCALE, AUTO_UNIQUE_VALUE
|
|
//=============================================================
|
|
else if(( _wcsicmp(pProperty,g_ProviderTypes[10].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[11].wcsColumnName) == 0 ) ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(VARIANT_FALSE);
|
|
}
|
|
//=============================================================
|
|
// LOCAL_TYPE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[12].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)vVar)->SetStr(L"");
|
|
}
|
|
//=============================================================
|
|
// MINIMUM_SCALE, MAXIMUM_SCALE
|
|
//=============================================================
|
|
else if(( _wcsicmp(pProperty,g_ProviderTypes[13].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[14].wcsColumnName) == 0 )){
|
|
*pType = CIM_SINT16;
|
|
((CVARIANT*)vVar)->SetShort(0);
|
|
}
|
|
//=============================================================
|
|
// GUID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[15].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_GUID;
|
|
((CVARIANT*)vVar)->Clear();
|
|
}
|
|
//=============================================================
|
|
// TYPELIB
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[16].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)vVar)->SetStr(L"");
|
|
}
|
|
//=============================================================
|
|
// VERSION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProviderTypes[17].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)vVar)->SetStr(L"");
|
|
}
|
|
//=============================================================
|
|
// IS_LONG for CIM_STRING which will be BSTR
|
|
//=============================================================
|
|
else if( ( _wcsicmp(pProperty,g_ProviderTypes[18].wcsColumnName) == 0 ) &&
|
|
g_ProviderTypeDetails[i].DataType == DBTYPE_BSTR)
|
|
{
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(TRUE);
|
|
}
|
|
//=============================================================
|
|
// IS_FIXEDLENGTH for CIM_STRING be FALSE
|
|
//=============================================================
|
|
else if( ( _wcsicmp(pProperty,g_ProviderTypes[20].wcsColumnName) == 0 ) &&
|
|
g_ProviderTypeDetails[i].DataType == DBTYPE_BSTR)
|
|
{
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(FALSE);
|
|
}
|
|
//=============================================================
|
|
// IS_FIXEDLENGTH for all types apart from CIM_STRING TRUE
|
|
//=============================================================
|
|
else if( ( _wcsicmp(pProperty,g_ProviderTypes[20].wcsColumnName) == 0 ) &&
|
|
g_ProviderTypeDetails[i].DataType != DBTYPE_BSTR )
|
|
{
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(TRUE);
|
|
}
|
|
//=============================================================
|
|
// IS_LONG, BEST_MATCH
|
|
//=============================================================
|
|
else if(( _wcsicmp(pProperty,g_ProviderTypes[18].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[19].wcsColumnName) == 0 ) ) {
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(FALSE);
|
|
}
|
|
/* //=============================================================
|
|
// IS_LONG, BEST_MATCH, IS_FIXEDLENGTH
|
|
//=============================================================
|
|
else if(( _wcsicmp(pProperty,g_ProviderTypes[18].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[19].wcsColumnName) == 0 ) ||
|
|
( _wcsicmp(pProperty,g_ProviderTypes[20].wcsColumnName) == 0 )) {
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)vVar)->SetBool(VARIANT_FALSE);
|
|
}
|
|
*/
|
|
//=============================================================
|
|
// INVALID_ARG
|
|
//=============================================================
|
|
else{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesInstanceWrapper::GetKey(CBSTR & Key)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
Key.SetStr(g_ProviderTypeDetails[GetPos()].wcsTypeName);
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum ){
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
m_ulMaxRow = sizeof(g_ProviderTypeDetails)/sizeof(CIMTypeInfo);
|
|
hr = S_OK; // hardcoded rowset
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProviderTypesInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if( m_lCurrentPos < m_ulMaxRow )
|
|
{
|
|
*pInst = new CWbemSchemaProviderTypesInstanceWrapper(m_pParms);
|
|
// NTRaid:136533
|
|
// 07/05/00
|
|
if(*pInst)
|
|
{
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
AddInstance(*pInst);
|
|
(*pInst)->GetKey(Key);
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Catalogs schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaCatalogsClassDefinitionWrapper::CWbemSchemaCatalogsClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
m_nMaxColumns = sizeof(g_CatalogRowsetColumns)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaCatalogsClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_CatalogRowsetColumns[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_CatalogRowsetColumns[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaCatalogsInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
//=============================================================
|
|
// CATALOG_NAME
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_CatalogRowsetColumns[0].wcsColumnName) == 0 ){
|
|
hr = m_pClass->Get(CBSTR(L"Name"),0,(VARIANT *)v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// SOURCES_DESCRIPTION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_CatalogRowsetColumns[1].wcsColumnName) == 0 ){
|
|
|
|
*plFlavor = 0;
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(L"N/A");
|
|
}
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaCatalogsInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->ExecQuery(CBSTR((WCHAR *)szWQL),CBSTR(L"select * from __Namespace"), WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the COlumns schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaColumnsClassDefinitionWrapper::CWbemSchemaColumnsClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_ColumnsRowsetColumns)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaColumnsClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_ColumnsRowsetColumns[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_ColumnsRowsetColumns[m_nSchemaClassIndex].wcsColumnName);
|
|
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaColumnsInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
//=============================================================
|
|
// TABLE_CATALOG
|
|
//=============================================================
|
|
if( wcscmp(pProperty,g_ColumnsRowsetColumns[0].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pConnection->GetNamespace());
|
|
}
|
|
//=============================================================
|
|
// TABLE_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[1].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// TABLE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[2].wcsColumnName) == 0 ){
|
|
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pwcsParentClassName);
|
|
}
|
|
//=============================================================
|
|
// COLUMN_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[3].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
((CVARIANT*)v)->SetStr(pCol->pwszName);
|
|
}
|
|
//=============================================================
|
|
// COLUMN_GUID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[4].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_GUID;
|
|
}
|
|
//=============================================================
|
|
// COLUMN_PROPID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[5].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// ORDINAL_POSITION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[6].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
((CVARIANT*)v)->SetLONG((LONG)pCol->iOrdinal);
|
|
}
|
|
//=============================================================
|
|
// COLUMN_HASDEFAULT
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[7].wcsColumnName) == 0 ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)v)->SetBool(VARIANT_FALSE);
|
|
}
|
|
//=============================================================
|
|
// COLUMN_DEFAULT
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[8].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// COLUMN_FLAGS
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[9].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
((CVARIANT*)v)->SetLONG(pCol->dwFlags);
|
|
}
|
|
//=============================================================
|
|
// IS_NULLABLE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[10].wcsColumnName) == 0 ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)v)->SetBool(VARIANT_TRUE);
|
|
}
|
|
//=============================================================
|
|
// DATA_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[11].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT16;
|
|
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
((CVARIANT*)v)->SetLONG(pCol->wType);
|
|
}
|
|
//=============================================================
|
|
// TYPE_GUID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[12].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_GUID;
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_MAXIMUM_LENGTH
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[13].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_OCTET_LENGTH
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[14].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// NUMERIC_PRECISION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[15].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT16;
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
((CVARIANT*)v)->SetShort(pCol->bPrecision);
|
|
}
|
|
//=============================================================
|
|
// NUMERIC_SCALE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[16].wcsColumnName) == 0 ){
|
|
*pType = CIM_SINT16;
|
|
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
((CVARIANT*)v)->SetShort(pCol->bScale);
|
|
}
|
|
//=============================================================
|
|
// DATETIME_PRECISION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[17].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_SET_CATALOG
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[18].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_SET_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[19].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_SET_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[20].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// COLLATION_CATALOG
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[21].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// COLLATION_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[22].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// COLLATION_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[23].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// DOMAIN_CATALOG
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[24].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// DOMAIN_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[25].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// DOMAIN_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[26].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// DESCRIPTION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ColumnsRowsetColumns[27].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaColumnsInstanceWrapper::GetKey(CBSTR & Key)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
if( m_pColumns )
|
|
{
|
|
//============================================================
|
|
// the key is the combo of the table name and column name
|
|
//============================================================
|
|
DBCOLUMNINFO * pCol = m_pColumns->GetColInfo(m_uCurrentIndex);
|
|
if( pCol )
|
|
{
|
|
|
|
WCHAR * p = new WCHAR [wcslen(pCol->pwszName) + wcslen(m_pParms->m_pwcsParentClassName) + 4 ];
|
|
if( p )
|
|
{
|
|
swprintf(p, L"%s:%s", m_pParms->m_pwcsParentClassName,pCol->pwszName);
|
|
Key.SetStr(p);
|
|
delete p;
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaColumnsInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
//============================================================
|
|
// If we are working with just one class, then get the one
|
|
// class, otherwise enumerate all
|
|
//============================================================
|
|
if( m_pwcsSpecificClass)
|
|
{
|
|
hr = ResetTheSpecificClass();
|
|
}
|
|
else
|
|
{
|
|
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->CreateClassEnum(NULL, WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaColumnsInstanceList::GetColumnInformation(CWbemClassInstanceWrapper * p )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
DBCOUNTITEM cTotalCols, cCols, cNestedCols;
|
|
|
|
FreeColumns();
|
|
|
|
CWmiOleDBMap Map;
|
|
if(SUCCEEDED(hr = Map.FInit(m_pParms->m_dwFlags,p->GetClassName(),m_pParms->m_pConnection)))
|
|
{
|
|
hr = Map.GetColumnCount(cTotalCols,cCols,cNestedCols);
|
|
if( S_OK == hr ){
|
|
if( S_OK == (hr = m_Columns.AllocColumnNameList(cTotalCols))){
|
|
|
|
//===============================================================================
|
|
// Allocate the DBCOLUMNINFO structs to match the number of columns
|
|
//===============================================================================
|
|
if( S_OK == (hr = m_Columns.AllocColumnInfoList(cTotalCols))){
|
|
|
|
hr = Map.GetColumnInfoForParentColumns(&m_Columns);
|
|
if( hr == S_OK ){
|
|
//==============================================================
|
|
// Increment past the bookmark column
|
|
//==============================================================
|
|
m_lColumnIndex = 1;
|
|
((CWbemSchemaColumnsInstanceWrapper*)p)->SetColumnsPtr(&m_Columns);
|
|
((CWbemSchemaColumnsInstanceWrapper*)p)->SetIndex(m_lColumnIndex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaColumnsInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
long ulTotal;
|
|
|
|
ulTotal = (LONG)m_Columns.GetTotalNumberOfColumns();
|
|
m_lColumnIndex++;
|
|
|
|
if( m_lColumnIndex >= ulTotal )
|
|
{
|
|
//================================================================
|
|
// If we are working with a specific class, then use it, other
|
|
// wise, enumerate the next one
|
|
//================================================================
|
|
if( !m_pwcsSpecificClass)
|
|
{
|
|
hr = CWbemInstanceList::NextInstance(Key,pInst);
|
|
if( S_OK == hr )
|
|
{
|
|
CVARIANT v;
|
|
CIMTYPE Type;
|
|
LONG lFlavor;
|
|
if( S_OK == (hr = ((CWbemSchemaColumnsInstanceWrapper*)*pInst)->GetClassProperty(L"__CLASS",&v,&Type,&lFlavor)))
|
|
{
|
|
// Now, save it in Parameters for the generated ones
|
|
m_pParms->SetParentClassName(v.GetStr());
|
|
|
|
hr = GetColumnInformation(*pInst);
|
|
if( S_OK == hr )
|
|
{
|
|
//==========================================
|
|
// We don't want to display the bookmark
|
|
// column.
|
|
//==========================================
|
|
ulTotal = (LONG)m_Columns.GetTotalNumberOfColumns();
|
|
|
|
if( m_lColumnIndex == ulTotal )
|
|
{
|
|
hr = NextInstance(Key,pInst);
|
|
}
|
|
}
|
|
hr = ((CWbemSchemaColumnsInstanceWrapper*)*pInst)->GetKey(Key);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = GetTheSpecificClass();
|
|
if( S_OK == hr )
|
|
{
|
|
*pInst = (CWbemSchemaClassInstanceWrapper *) new CWbemSchemaColumnsInstanceWrapper(m_pParms);
|
|
if( *pInst )
|
|
{
|
|
((CWbemSchemaColumnsInstanceWrapper*)*pInst)->SetClass(m_pSpecificClass);
|
|
|
|
CVARIANT v;
|
|
CIMTYPE Type;
|
|
LONG lFlavor;
|
|
|
|
if( S_OK == (hr = ((CWbemSchemaColumnsInstanceWrapper*)*pInst)->GetClassProperty(L"__CLASS",&v,&Type,&lFlavor)))
|
|
{
|
|
|
|
m_pParms->SetParentClassName(v.GetStr());
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
hr = GetColumnInformation(*pInst);
|
|
ulTotal = (LONG)m_Columns.GetTotalNumberOfColumns();
|
|
//===================================================================
|
|
// This class does't have any columns
|
|
//===================================================================
|
|
if( m_lColumnIndex == ulTotal )
|
|
{
|
|
hr = WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
if( S_OK == hr)
|
|
{
|
|
hr = ((CWbemSchemaColumnsInstanceWrapper*)*pInst)->GetKey(Key);
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
((CWbemSchemaColumnsInstanceWrapper*)*pInst)->SetColumnsPtr(&m_Columns);
|
|
((CWbemSchemaColumnsInstanceWrapper*)*pInst)->SetIndex(m_lColumnIndex);
|
|
AddInstance(*pInst);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*pInst = (CWbemSchemaClassInstanceWrapper *) new CWbemSchemaColumnsInstanceWrapper(m_pParms);
|
|
if( *pInst )
|
|
{
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
((CWbemSchemaColumnsInstanceWrapper*)*pInst)->SetColumnsPtr(&m_Columns);
|
|
((CWbemSchemaColumnsInstanceWrapper*)*pInst)->SetIndex(m_lColumnIndex);
|
|
(*pInst)->GetKey(Key);
|
|
AddInstance(*pInst);
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Tables schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaTablesClassDefinitionWrapper::CWbemSchemaTablesClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_Tables)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_Tables[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_Tables[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
//=============================================================
|
|
// TABLE_CATALOG
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_Tables[0].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pConnection->GetNamespace());
|
|
}
|
|
//=============================================================
|
|
// TABLE_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[1].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// TABLE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[2].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
hr = GetClassProperty(L"__CLASS",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// TABLE_TYPE
|
|
// This is either "TABLE" or "SYSTEM TABLE"
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[3].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
CVARIANT Var;
|
|
hr = GetClassProperty(L"__CLASS",&Var,pType,plFlavor);
|
|
if( S_OK == hr ){
|
|
WCHAR * p = NULL;
|
|
p = Var.GetStr();
|
|
// NTRaid:136462 & 136466
|
|
// 07/05/00
|
|
if(p != NULL || VT_BSTR != Var.GetType())
|
|
{
|
|
if( wcsncmp( p, L"__",2) == 0 ){
|
|
((CVARIANT*)v)->SetStr(L"SYSTEM TABLE");
|
|
}
|
|
else{
|
|
((CVARIANT*)v)->SetStr(L"TABLE");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
}
|
|
//=============================================================
|
|
// TABLE_GUID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[4].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_GUID;
|
|
}
|
|
//=============================================================
|
|
// TABLE_DESCRIPTION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[5].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
hr = GetClassQualifier(L"Description",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// TABLE_PROPID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[6].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// DATE_CREATED, DATE_MODIFIED
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Tables[7].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_DATE;
|
|
}
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !m_pwcsSpecificClass )
|
|
{
|
|
return CWbemInstanceList::NextInstance(Key,pInst);
|
|
}
|
|
|
|
hr = GetTheSpecificClass();
|
|
if( S_OK == hr )
|
|
{
|
|
*pInst = (CWbemSchemaTablesInstanceWrapper *) new CWbemSchemaTablesInstanceWrapper(m_pParms);
|
|
// NTRaid:136526 , 136530
|
|
// 07/05/00
|
|
if(*pInst)
|
|
{
|
|
(*pInst)->SetClass(m_pSpecificClass);
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
AddInstance(*pInst);
|
|
(*pInst)->GetKey(Key);
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
|
|
if( m_pwcsSpecificClass)
|
|
{
|
|
hr = ResetTheSpecificClass();
|
|
}
|
|
else
|
|
{
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->CreateClassEnum(NULL, WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Primary Keys schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaPrimaryKeysClassDefinitionWrapper::CWbemSchemaPrimaryKeysClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_PrimaryKeysColumns)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CWbemSchemaPrimaryKeysClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_PrimaryKeysColumns[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_PrimaryKeysColumns[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaPrimaryKeysInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
//=============================================================
|
|
// TABLE_CATALOG
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_PrimaryKeysColumns[0].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pConnection->GetNamespace());
|
|
}
|
|
//=============================================================
|
|
// TABLE_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[1].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// TABLE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[2].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
hr = GetClassProperty(L"__CLASS",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// COLUMN_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[3].wcsColumnName) == 0 ){
|
|
|
|
*pType = CIM_STRING;
|
|
|
|
LONG lFlavor = 0, lType = 0;
|
|
CBSTR bstrPropQual(L"key");
|
|
WCHAR * pList = NULL;
|
|
|
|
if( S_OK == (hr = BeginPropertyEnumeration())){
|
|
|
|
CBSTR bstrProperty;
|
|
CVARIANT vValue;
|
|
|
|
while( S_OK == (hr = GetNextProperty((BSTR*)&bstrProperty,(VARIANT *)&vValue, &lType, &lFlavor))){
|
|
CVARIANT vKey;
|
|
|
|
hr = CWbemClassWrapper::GetPropertyQualifier(bstrProperty,bstrPropQual,(VARIANT *)&vKey,&lType,&lFlavor);
|
|
if( S_OK == hr ){
|
|
//===========================================================
|
|
// Ok, we found a key, so start adding it. There could be
|
|
// multiple keys, so we still
|
|
//===========================================================
|
|
AddToKeyList(pList,(WCHAR *)bstrProperty);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( WBEM_S_NO_MORE_DATA == hr ){
|
|
hr = S_OK;
|
|
}
|
|
((CVARIANT*)v)->SetStr(pList);
|
|
SAFE_DELETE_PTR(pList);
|
|
|
|
EndPropertyEnumeration();
|
|
}
|
|
//=============================================================
|
|
// COLUMN_GUID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[4].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_GUID;
|
|
}
|
|
//=============================================================
|
|
// COLUMN_PROPID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[5].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// ORDINAL
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[6].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// PK_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_PrimaryKeysColumns[7].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaPrimaryKeysInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !m_pwcsSpecificClass )
|
|
{
|
|
return CWbemInstanceList::NextInstance(Key,pInst);
|
|
}
|
|
|
|
hr = GetTheSpecificClass();
|
|
if( S_OK == hr )
|
|
{
|
|
*pInst = (CWbemSchemaPrimaryKeysInstanceWrapper *) new CWbemSchemaPrimaryKeysInstanceWrapper(m_pParms);
|
|
// NTRaid:136519 , 136522
|
|
// 07/05/00
|
|
if(*pInst)
|
|
{
|
|
(*pInst)->SetClass(m_pSpecificClass);
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
AddInstance(*pInst);
|
|
(*pInst)->GetKey(Key);
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaPrimaryKeysInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
|
|
if( m_pwcsSpecificClass)
|
|
{
|
|
hr = ResetTheSpecificClass();
|
|
}
|
|
else
|
|
{
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->CreateClassEnum(NULL, WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Tables Info schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaTablesInfoClassDefinitionWrapper::CWbemSchemaTablesInfoClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_TablesInfo)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInfoClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_TablesInfo[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_TablesInfo[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInfoInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
|
|
//=============================================================
|
|
// TABLE_CATALOG
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_TablesInfo[0].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pConnection->GetNamespace());
|
|
}
|
|
//=============================================================
|
|
// TABLE_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[1].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// TABLE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[2].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
hr = GetClassProperty(L"__CLASS",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// TABLE_TYPE
|
|
// This is either "TABLE" or "SYSTEM TABLE"
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[3].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
CVARIANT Var;
|
|
hr = GetClassProperty(L"__CLASS",&Var,pType,plFlavor);
|
|
// NT Raid 136462
|
|
// 07/12/00
|
|
if( S_OK == hr ){
|
|
WCHAR * p = Var.GetStr();
|
|
if (p != NULL){
|
|
if( wcsncmp( p, L"__",2) == 0 ){
|
|
((CVARIANT*)v)->SetStr(L"SYSTEM TABLE");
|
|
}
|
|
else{
|
|
((CVARIANT*)v)->SetStr(L"TABLE");
|
|
}
|
|
}
|
|
else{
|
|
hr = E_UNEXPECTED;
|
|
}
|
|
}
|
|
}
|
|
//=============================================================
|
|
// TABLE_GUID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[4].wcsColumnName) == 0 ){
|
|
*pType = DBTYPE_GUID;
|
|
}
|
|
//=============================================================
|
|
// BOOKMARKS
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[5].wcsColumnName) == 0 ){
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)v)->SetBool(TRUE);
|
|
}
|
|
//=============================================================
|
|
// BOOKMARK_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[6].wcsColumnName) == 0 ){
|
|
*pType = CIM_SINT32;
|
|
((CVARIANT*)v)->SetLONG(DBPROPVAL_BMK_NUMERIC);
|
|
}
|
|
//=============================================================
|
|
// BOOKMARK_DATATYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[7].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT16;
|
|
((CVARIANT*)v)->SetShort(DBTYPE_UI4);
|
|
|
|
}
|
|
//=============================================================
|
|
// BOOKMARK_MAXIMUM_LENGTH
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[8].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT32;
|
|
((CVARIANT*)v)->SetLONG(sizeof(ULONG));
|
|
}
|
|
//=============================================================
|
|
// BOOKMARK_INFORMATION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[9].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
//=============================================================
|
|
// BOOKMARK_TABLE_VERSION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[10].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// CARDINALITY
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[11].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// DESCRIPTION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[12].wcsColumnName) == 0 ){
|
|
*pType = CIM_STRING;
|
|
hr = GetClassQualifier(L"Description",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// TABLE_PROPID
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_TablesInfo[13].wcsColumnName) == 0 ){
|
|
*pType = CIM_UINT32;
|
|
}
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInfoInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( !m_pwcsSpecificClass )
|
|
{
|
|
return CWbemInstanceList::NextInstance(Key,pInst);
|
|
}
|
|
|
|
hr = GetTheSpecificClass();
|
|
if( S_OK == hr )
|
|
{
|
|
*pInst = (CWbemSchemaTablesInfoInstanceWrapper *) new CWbemSchemaTablesInfoInstanceWrapper(m_pParms);
|
|
// NTRaid:136512 , 136514
|
|
// 07/05/00
|
|
if(*pInst)
|
|
{
|
|
(*pInst)->SetClass(m_pSpecificClass);
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
AddInstance(*pInst);
|
|
(*pInst)->GetKey(Key);
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaTablesInfoInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
if( m_pwcsSpecificClass)
|
|
{
|
|
hr = ResetTheSpecificClass();
|
|
}
|
|
else
|
|
{
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->CreateClassEnum(NULL, WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
}
|
|
m_lCurrentPos = 0;
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Procedures schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaProceduresClassDefinitionWrapper::CWbemSchemaProceduresClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_Procedures)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_Procedures[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_Procedures[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresInstanceWrapper::GetKey(CBSTR & Key)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===========================================================
|
|
// The key is going to the be the class name.method name
|
|
//===========================================================
|
|
CVARIANT v;
|
|
CIMTYPE Type;
|
|
LONG lFlavor;
|
|
|
|
hr = GetClassProperty(L"__CLASS",&v,&Type,&lFlavor);
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
WCHAR * p = new WCHAR [wcslen(v.GetStr()) + wcslen(m_bstrCurrentMethodName) + 4 ];
|
|
if( p )
|
|
{
|
|
swprintf(p, L"%s:%s", v.GetStr(),m_bstrCurrentMethodName);
|
|
Key.SetStr(p);
|
|
delete p;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
//=============================================================
|
|
// PROCEDURE_CATALOG
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_Procedures[0].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pConnection->GetNamespace());
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[1].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
hr = GetClassProperty(L"__CLASS",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[2].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_bstrCurrentMethodName);
|
|
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[3].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_SINT16;
|
|
//=========================================================
|
|
//
|
|
// If there is an output class, then the type is
|
|
// DB_PT_FUNCTION
|
|
// If there is not an output class, then the type is
|
|
// DB_PT_PROCEDURE
|
|
//=========================================================
|
|
if( m_pOutClass )
|
|
{
|
|
((CVARIANT*)v)->SetShort(DB_PT_FUNCTION);
|
|
}
|
|
else
|
|
{
|
|
((CVARIANT*)v)->SetShort(DB_PT_PROCEDURE);
|
|
}
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_DEFINITION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[4].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_DESCRIPTION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[5].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// DATE_CREATED
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[6].wcsColumnName) == 0 )
|
|
{
|
|
*pType = DBTYPE_DATE;
|
|
|
|
}
|
|
//=============================================================
|
|
// DATE_MODIFIED
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_Procedures[7].wcsColumnName) == 0 )
|
|
{
|
|
*pType = DBTYPE_DATE;
|
|
}
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void CWbemSchemaProceduresInstanceList::ResetMethodPtrs()
|
|
{
|
|
m_bstrCurrentMethodName.Clear();
|
|
SAFE_RELEASE_PTR(m_pCurrentMethodInClass);
|
|
SAFE_RELEASE_PTR(m_pCurrentMethodOutClass);
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresInstanceList::Reset()
|
|
{
|
|
HRESULT hr = E_UNEXPECTED;
|
|
if( m_pwcsSpecificClass)
|
|
{
|
|
hr = ResetTheSpecificClass();
|
|
}
|
|
else
|
|
{
|
|
LONG lFlags = WBEM_FLAG_SHALLOW | WBEM_FLAG_FORWARD_ONLY;
|
|
|
|
//============================================================
|
|
// Send off the query for "Select Name from __Namespace
|
|
//============================================================
|
|
if( m_ppEnum )
|
|
{
|
|
hr = m_ppEnum->Reset();
|
|
ReleaseAllInstances();
|
|
}
|
|
else
|
|
{
|
|
hr = (m_pParms->GetServicesPtr())->CreateClassEnum(NULL, WBEM_FLAG_FORWARD_ONLY,m_pParms->m_pConnection->GetContext(),&m_ppEnum);
|
|
}
|
|
}
|
|
m_lCurrentPos = 0;
|
|
m_fContinueWithSameClass = FALSE;
|
|
SAFE_RELEASE_PTR(m_pCurrentMethodClass);
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresInstanceList::GetTheNextClassThatHasMethods()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//==================================================================
|
|
// Does the existing class have methods in it?
|
|
//==================================================================
|
|
while( S_OK == hr )
|
|
{
|
|
//==============================================================
|
|
// It does, then set all the current info and return so we
|
|
// can process the columns
|
|
//==============================================================
|
|
unsigned long u = 0L;
|
|
|
|
if( !m_fContinueWithSameClass )
|
|
{
|
|
if( !m_pwcsSpecificClass )
|
|
{
|
|
SAFE_RELEASE_PTR(m_pCurrentMethodClass);
|
|
hr = m_ppEnum->Next(0,1,&m_pCurrentMethodClass,&u);
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
hr = m_pCurrentMethodClass->BeginMethodEnumeration(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
ResetMethodPtrs();
|
|
|
|
hr = m_pCurrentMethodClass->NextMethod(0,(BSTR*)&m_bstrCurrentMethodName,&m_pCurrentMethodInClass,&m_pCurrentMethodOutClass);
|
|
if( hr == S_OK )
|
|
{
|
|
m_fContinueWithSameClass = TRUE;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if( hr == WBEM_S_NO_MORE_DATA )
|
|
{
|
|
if( !m_pwcsSpecificClass )
|
|
{
|
|
hr = S_OK; // continue on to the next one
|
|
}
|
|
// otherwise,we know there isn't another one.
|
|
}
|
|
m_pCurrentMethodClass->EndEnumeration();
|
|
m_fContinueWithSameClass = FALSE;
|
|
}
|
|
//==============================================================
|
|
// It doesn't, so, keep looping through the classes until we
|
|
// find another class that has methods, or we are done with all
|
|
// the classes
|
|
//==============================================================
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresInstanceList::GetSpecificNextInstance()
|
|
{
|
|
HRESULT hr = GetTheSpecificClass();
|
|
if( S_OK == hr )
|
|
{
|
|
m_pCurrentMethodClass = m_pSpecificClass;
|
|
m_pSpecificClass = NULL; // will be released with the m_pCurrentMethodClass
|
|
ResetMethodPtrs();
|
|
m_fContinueWithSameClass = TRUE;
|
|
hr = m_pCurrentMethodClass->BeginMethodEnumeration(0);
|
|
}
|
|
//==================================================================
|
|
// We know there are no more classes, but there might be more
|
|
// methods, so go on to process the rest of the methods
|
|
//==================================================================
|
|
if( hr == WBEM_S_NO_MORE_DATA )
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( m_pwcsSpecificClass )
|
|
{
|
|
hr = GetSpecificNextInstance();
|
|
}
|
|
if( S_OK == hr )
|
|
{
|
|
hr = GetTheNextClassThatHasMethods();
|
|
if( S_OK == hr)
|
|
{
|
|
*pInst = new CWbemSchemaProceduresInstanceWrapper(m_pParms);
|
|
// NTRaid:136455
|
|
// 07/05/00
|
|
if(*pInst)
|
|
{
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
((CWbemSchemaProceduresInstanceWrapper*)(*pInst))->SetMethodName((LPWSTR)m_bstrCurrentMethodName);
|
|
((CWbemSchemaProceduresInstanceWrapper*)(*pInst))->SetInputClass(m_pCurrentMethodInClass);
|
|
((CWbemSchemaProceduresInstanceWrapper*)(*pInst))->SetOutputClass(m_pCurrentMethodOutClass);
|
|
(*pInst)->SetClass(m_pCurrentMethodClass);
|
|
AddInstance(*pInst);
|
|
(*pInst)->GetKey(Key);
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Classes for the Procedure Parameters schema rowset
|
|
//
|
|
//********************************************************************************************
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
CWbemSchemaProceduresParametersClassDefinitionWrapper::CWbemSchemaProceduresParametersClassDefinitionWrapper(CWbemClassParameters * p) : CWbemSchemaClassDefinitionWrapper(p)
|
|
{
|
|
|
|
m_nMaxColumns = sizeof(g_ProcedureParameters)/sizeof(SchemaRowsetDefinition);
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersClassDefinitionWrapper::GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===============================================================================
|
|
// See if we got all of the column info
|
|
//===============================================================================
|
|
if( m_nSchemaClassIndex == m_nMaxColumns )
|
|
{
|
|
return WBEM_S_NO_MORE_DATA;
|
|
}
|
|
|
|
*pType = g_ProcedureParameters[m_nSchemaClassIndex].Type;
|
|
*pProperty = Wmioledb_SysAllocString(g_ProcedureParameters[m_nSchemaClassIndex].wcsColumnName);
|
|
m_nSchemaClassIndex++;
|
|
|
|
return hr;
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersInstanceWrapper::GetKey(CBSTR & Key)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===========================================================
|
|
// The key is going to the be the class name.method name
|
|
//===========================================================
|
|
CVARIANT v;
|
|
CIMTYPE Type;
|
|
LONG lFlavor;
|
|
|
|
hr = GetClassProperty(L"__CLASS",&v,&Type,&lFlavor);
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
WCHAR * p = new WCHAR [wcslen(v.GetStr()) + wcslen(m_bstrCurrentMethodName) + wcslen(m_bstrPropertyName)+ 4 ];
|
|
if( p )
|
|
{
|
|
swprintf(p, L"%s:%s:%s", v.GetStr(),m_bstrCurrentMethodName,m_bstrPropertyName);
|
|
Key.SetStr(p);
|
|
delete p;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersInstanceWrapper::GetPropertyQualifier(WCHAR * wcsQualifier,VARIANT * v)
|
|
{
|
|
LONG lType;
|
|
long lFlavor;
|
|
HRESULT hr = S_OK;
|
|
|
|
IWbemClassObject * pTmp = m_pClass;
|
|
|
|
if( m_pInClass )
|
|
{
|
|
m_pClass = m_pInClass;
|
|
}
|
|
else
|
|
{
|
|
m_pClass = m_pOutClass;
|
|
}
|
|
|
|
hr = CWbemClassWrapper::GetPropertyQualifier(m_bstrPropertyName,CBSTR(wcsQualifier),v,&lType,&lFlavor);
|
|
|
|
m_pClass = pTmp;
|
|
|
|
return hr;
|
|
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersInstanceWrapper::GetSchemaProperty( WCHAR * pProperty, VARIANT * v,CIMTYPE * pType , LONG * plFlavor)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
((CVARIANT*)v)->Clear();
|
|
*plFlavor = 0;
|
|
|
|
//=============================================================
|
|
// PROCEDURE_CATALOG
|
|
//=============================================================
|
|
if( _wcsicmp(pProperty,g_ProcedureParameters[0].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_pParms->m_pConnection->GetNamespace());
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_SCHEMA
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[1].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
hr = GetClassProperty(L"__CLASS",v,pType,plFlavor);
|
|
}
|
|
//=============================================================
|
|
// PROCEDURE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[2].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_bstrCurrentMethodName);
|
|
}
|
|
//=============================================================
|
|
// PARAMETER_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[3].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
((CVARIANT*)v)->SetStr(m_bstrPropertyName);
|
|
}
|
|
//=============================================================
|
|
// ORDINAL_POSITION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[4].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT16;
|
|
((CVARIANT*)v)->SetShort(m_nOrdinal);
|
|
}
|
|
//=============================================================
|
|
// PARAMETER_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[5].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT16;
|
|
CVARIANT vIn, vOut;
|
|
|
|
GetPropertyQualifier(L"IN",vIn);
|
|
GetPropertyQualifier(L"OUT",vOut);
|
|
|
|
if( vIn.GetType() != VT_EMPTY && vOut.GetType() != VT_EMPTY )
|
|
{
|
|
if( vIn.GetBool() == TRUE && vOut.GetBool() == TRUE )
|
|
{
|
|
((CVARIANT*)v)->SetShort(DBPARAMTYPE_INPUTOUTPUT);
|
|
}
|
|
}
|
|
else if( vOut.GetType() != VT_EMPTY && vOut.GetBool() == TRUE )
|
|
{
|
|
((CVARIANT*)v)->SetShort(DBPARAMTYPE_OUTPUT);
|
|
}
|
|
else if( vIn.GetType() != VT_EMPTY && vIn.GetBool() == TRUE )
|
|
{
|
|
((CVARIANT*)v)->SetShort(DBPARAMTYPE_INPUT);
|
|
}
|
|
}
|
|
//=============================================================
|
|
// PARAMETER_HASDEFAULT
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[6].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_BOOLEAN;
|
|
|
|
CVARIANT vVar;
|
|
|
|
hr = GetPropertyQualifier(CBSTR(L"Optional"),(VARIANT *)&vVar);
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
((CVARIANT*)v)->SetBool(vVar.GetBool());
|
|
}
|
|
}
|
|
//=============================================================
|
|
// PARAMETER_DEFAULT
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[7].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// IS_NULLABLE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[8].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_BOOLEAN;
|
|
((CVARIANT*)v)->SetBool(VARIANT_TRUE);
|
|
}
|
|
//=============================================================
|
|
// DATA_TYPE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[9].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT16;
|
|
CDataMap Map;
|
|
WORD wType;
|
|
DBLENGTH dwLength;
|
|
DWORD dwFlags;
|
|
|
|
hr = Map.MapCIMTypeToOLEDBType(m_vProperty.GetType(),wType,dwLength,dwFlags);
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
((CVARIANT*)v)->SetShort(wType);
|
|
}
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_MAXIMUM_LENGTH
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[10].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT32;
|
|
if( m_vProperty.GetType() == CIM_STRING )
|
|
{
|
|
((CVARIANT*)v)->SetLONG(~0);
|
|
}
|
|
}
|
|
//=============================================================
|
|
// CHARACTER_OCTET_LENGTH
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[11].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT32;
|
|
if( m_vProperty.GetType() == CIM_STRING )
|
|
{
|
|
((CVARIANT*)v)->SetLONG(~0);
|
|
}
|
|
}
|
|
//=============================================================
|
|
// NUMERIC_PRECISION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[12].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_UINT16;
|
|
}
|
|
//=============================================================
|
|
// NUMERIC_SCALE
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[13].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_SINT16;
|
|
}
|
|
//=============================================================
|
|
// DESCRIPTION
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[14].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
}
|
|
//=============================================================
|
|
// TYPE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[15].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
CVARIANT vVar;
|
|
|
|
hr = GetPropertyQualifier(CBSTR(L"CIMTYPE"),(VARIANT *)&vVar);
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
((CVARIANT*)v)->SetStr(vVar.GetStr());
|
|
}
|
|
}
|
|
//=============================================================
|
|
// LOCAL_TYPE_NAME
|
|
//=============================================================
|
|
else if( _wcsicmp(pProperty,g_ProcedureParameters[16].wcsColumnName) == 0 )
|
|
{
|
|
*pType = CIM_STRING;
|
|
}
|
|
|
|
|
|
return MapWbemErrorToOLEDBError(hr);
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersInstanceList::GetTheNextParameter()
|
|
{
|
|
HRESULT hr = WBEM_S_NO_MORE_DATA;
|
|
//===================================================================
|
|
// Get the properties of the class
|
|
//===================================================================
|
|
CIMTYPE Type = 0;
|
|
LONG Flavor = 0;
|
|
|
|
m_bstrPropertyName.Clear();
|
|
m_vProperty.Clear();
|
|
|
|
if( m_pCurrentMethodInClass )
|
|
{
|
|
hr = m_pCurrentMethodInClass->Next(0,(BSTR*)&m_bstrPropertyName,&m_vProperty,&Type,&Flavor);
|
|
}
|
|
|
|
if( hr == WBEM_S_NO_MORE_DATA )
|
|
{
|
|
SAFE_RELEASE_PTR(m_pCurrentMethodInClass );
|
|
if( m_pCurrentMethodOutClass )
|
|
{
|
|
hr = m_pCurrentMethodOutClass->Next(0,(BSTR*)&m_bstrPropertyName,&m_vProperty,&Type,&Flavor);
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersInstanceList::GetTheNextClassThatHasParameters()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
//===================================================================================
|
|
// If we aren't working on the same class, then get the next class that has a method
|
|
//===================================================================================
|
|
m_nOrdinal = 0;
|
|
|
|
while(hr == S_OK)
|
|
{
|
|
hr = GetTheNextClassThatHasMethods();
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
//===========================================================================
|
|
// Process the input parameters first
|
|
//===========================================================================
|
|
if( m_pCurrentMethodInClass )
|
|
{
|
|
hr = m_pCurrentMethodInClass->BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY);
|
|
}
|
|
else if( m_pCurrentMethodOutClass )
|
|
{
|
|
hr = m_pCurrentMethodOutClass->BeginEnumeration(WBEM_FLAG_NONSYSTEM_ONLY);
|
|
}
|
|
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
hr = GetTheNextParameter();
|
|
if( SUCCEEDED(hr))
|
|
{
|
|
m_fStillWorkingOnTheSameClass = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CWbemSchemaProceduresParametersInstanceList::NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if( m_pwcsSpecificClass )
|
|
{
|
|
hr = GetSpecificNextInstance();
|
|
m_fStillWorkingOnTheSameClass = TRUE; // We want to pick up the parameters
|
|
}
|
|
if( S_OK == hr )
|
|
{
|
|
if( !m_fStillWorkingOnTheSameClass )
|
|
{
|
|
hr = GetTheNextClassThatHasParameters();
|
|
}
|
|
else
|
|
{
|
|
hr = GetTheNextParameter();
|
|
if( S_OK != hr )
|
|
{
|
|
hr = GetTheNextClassThatHasParameters();
|
|
}
|
|
}
|
|
}
|
|
|
|
if( S_OK == hr)
|
|
{
|
|
*pInst = new CWbemSchemaProceduresParametersInstanceWrapper(m_pParms);
|
|
// NTRaid:136459
|
|
// 07/05/00
|
|
if(*pInst)
|
|
{
|
|
(*pInst)->SetPos(++m_lCurrentPos);
|
|
((CWbemSchemaProceduresParametersInstanceWrapper*)(*pInst))->SetMethodName((LPWSTR)m_bstrCurrentMethodName);
|
|
((CWbemSchemaProceduresParametersInstanceWrapper*)(*pInst))->SetPropertyName((LPWSTR)m_bstrPropertyName);
|
|
((CWbemSchemaProceduresParametersInstanceWrapper*)(*pInst))->SetProperty(m_vProperty);
|
|
((CWbemSchemaProceduresParametersInstanceWrapper*)(*pInst))->SetOrdinal(++m_nOrdinal);
|
|
((CWbemSchemaProceduresInstanceWrapper*)(*pInst))->SetInputClass(m_pCurrentMethodInClass);
|
|
((CWbemSchemaProceduresInstanceWrapper*)(*pInst))->SetOutputClass(m_pCurrentMethodOutClass);
|
|
|
|
(*pInst)->SetClass(m_pCurrentMethodClass);
|
|
AddInstance(*pInst);
|
|
((CWbemSchemaProceduresInstanceWrapper*)(*pInst))->GetKey(Key);
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|