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

226 lines
7.6 KiB
C++

//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
//
// IDBDataSrcAdmin.cpp - IDBDataSourceAdmin interface implementation
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CImpIDBDataSrcAdmin::CreateDataSource
//
// Creates a new Datasouce : ie creates a namespace
//
// Returns one of the following values:
// S_OK Method Succeeded
// DB_S_ERRORSOCCURRED new datasource was created but one or more properties was not set
// E_FAIL Provider-specific error
// E_INVALIDARG cPropertySets was not zero and rgPropertySets was null pointer
// E_OUTOFMEMORY Out of Memory
// OTHER Other HRESULTs returned by called functions
///////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIDBDataSrcAdmin::CreateDataSource( ULONG cPropertySets,
DBPROPSET rgPropertySets[ ],
IUnknown * pUnkOuter,
REFIID riid,
IUnknown ** ppDBSession)
{
HRESULT hr = S_OK;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Do nothing if no property was specified
if(cPropertySets != 0)
{
// Serialize the object
CAutoBlock cab(DATASOURCE->GetCriticalSection());
g_pCError->ClearErrorInfo();
if (m_pObj->m_fDSOInitialized)
{
hr = DB_E_ALREADYINITIALIZED;
}
else
if( cPropertySets != 0 && rgPropertySets == NULL)
{
hr = E_INVALIDARG;
}
else
if ( ppDBSession && (pUnkOuter) && (riid != IID_IUnknown) )
{
hr = DB_E_NOAGGREGATION;
}
else
{
//===================================================================================
// Check Arguments for use by properties
//===================================================================================
if(SUCCEEDED(hr = m_pObj->m_pUtilProp->SetPropertiesArgChk(cPropertySets, rgPropertySets,m_pObj->m_fDSOInitialized)))
{
//===================================================================================
// just pass this call on to the utility object that manages our properties
//===================================================================================
if(SUCCEEDED(hr = m_pObj->m_pUtilProp->SetProperties(PROPSET_DSO,cPropertySets, rgPropertySets)) &&
SUCCEEDED(hr = m_pObj->InitializeConnectionProperties()) )
{
if(SUCCEEDED(hr = m_pObj->m_pWbemWrap->CreateNameSpace()))
{
m_pObj->m_fDSOInitialized = TRUE;
}
}
}
}
// if session is to be created then
if(SUCCEEDED(hr) && ppDBSession)
{
hr = m_pObj->CreateSession(pUnkOuter,riid,ppDBSession);
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBDataSourceAdmin);
CATCH_BLOCK_HRESULT(hr,L"IDBDataSourceAdmin::CreateDataSource");
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CImpIDBDataSrcAdmin::DestroyDataSource
//
// Deletes a Datasouce : ie deletes a namespace
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL Provider-specific error
// E_INVALIDARG cPropertySets was not zero and rgPropertySets was null pointer
// OTHER Other HRESULTs returned by called functions
///////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIDBDataSrcAdmin::DestroyDataSource( void)
{
HRESULT hr = S_OK;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(DATASOURCE->GetCriticalSection());
g_pCError->ClearErrorInfo();
if (!m_pObj->m_fDSOInitialized ||
(m_pObj->m_fDSOInitialized && m_pObj->m_fDBSessionCreated) )
{
hr = E_UNEXPECTED;
}
else
{
if(SUCCEEDED(hr = m_pObj->m_pWbemWrap->DeleteNameSpace()))
{
m_pObj->m_fDSOInitialized = FALSE;
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBDataSourceAdmin);
CATCH_BLOCK_HRESULT(hr,L"IDBDataSourceAdmin::DestroyDataSource");
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CImpIDBDataSrcAdmin::GetCreationProperties
//
// Gets datasource creation properties
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL Provider-specific error
// DB_S_ERRORSOCCURRED One or more properties specified in were not supported
// E_INVALIDARG cPropertySets was not zero and rgPropertySets was null pointer
// E_OUTOFMEMORY out of memory
// DB_E_ERRORSOCCURRED values were not returned for any properties
// OTHER Other HRESULTs returned by called functions
///////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIDBDataSrcAdmin::GetCreationProperties( ULONG cPropertyIDSets,
const DBPROPIDSET rgPropertyIDSets[],
ULONG * pcPropertyInfoSets,
DBPROPINFOSET ** prgPropertyInfoSets,
OLECHAR ** ppDescBuffer)
{
HRESULT hr = S_OK;
CSetStructuredExceptionHandler seh;
DWORD dwBitMask = PROPSET_DSO;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(DATASOURCE->GetCriticalSection());
g_pCError->ClearErrorInfo();
//=====================================================================================
// just pass this call on to the utility object that manages our properties
//=====================================================================================
hr = m_pObj->m_pUtilProp->GetPropertyInfo(
m_pObj->m_fDSOInitialized,
cPropertyIDSets,
rgPropertyIDSets,
pcPropertyInfoSets,
prgPropertyInfoSets,
ppDescBuffer);
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBDataSourceAdmin);
CATCH_BLOCK_HRESULT(hr,L"IDBDataSourceAdmin::GetCreationProperties");
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CImpIDBDataSrcAdmin::GetCreationProperties
//
// Gets datasource creation properties
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL Provider-specific error
// E_UNEXPECTED Datasource object was not initialized
// DB_S_ERRORSOCCURRED One or more properties specified in were not supported
// E_INVALIDARG cPropertySets was not zero and rgPropertySets was null pointer
// E_OUTOFMEMORY out of memory
// DB_E_ERRORSOCCURRED values were not returned for any properties
// OTHER Other HRESULTs returned by called functions
///////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIDBDataSrcAdmin::ModifyDataSource( ULONG cPropertySets,DBPROPSET rgPropertySets[])
{
HRESULT hr = S_OK;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(DATASOURCE->GetCriticalSection());
g_pCError->ClearErrorInfo();
hr = DB_E_NOTSUPPORTED;
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBDataSourceAdmin);
CATCH_BLOCK_HRESULT(hr,L"IDBDataSourceAdmin::ModifyDataSource");
return hr;
}