windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/itabledef.cpp

330 lines
11 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
//
// ITableDef.cpp - ITableDefination interface implementation
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Create a new table and return a pointer to an empty rowset
//
// HRESULT
// S_OK - Success
// DB_S_ERRORSOCCURRED - General failure
// E_INVALIDARG - one of the arguments is invalid
// DB_E_NOTABLE - the table defined ( the parent class referred is not present)
// DB_E_BADCOLUMNID - the column id is bad
// DB_SEC_E_PERMISSIONDENIED - does not have permission to create the table
// E_NOINTERFACE - does not implement that is asked for
// DB_E_BADTABLEID - The tableID is bad
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CImpITableDefinition::CreateTable( IUnknown __RPC_FAR *pUnkOuter,
DBID __RPC_FAR *pTableID,
DBORDINAL cColumnDescs,
const DBCOLUMNDESC __RPC_FAR rgColumnDescs[ ],
REFIID riid, ULONG cPropertySets,
DBPROPSET __RPC_FAR rgPropertySets[ ],
DBID __RPC_FAR *__RPC_FAR *ppTableID,
IUnknown __RPC_FAR *__RPC_FAR *ppRowset) // OUT
{
HRESULT hr = E_FAIL;
CRowset* pRowset = NULL;
WCHAR *pwcsTableName = NULL;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
//===================================================================
// Initialize incoming parameters
//===================================================================
if(ppRowset != NULL)
{
*ppRowset = NULL;
}
//==========================
// Seriliaze the object
//==========================
CAutoBlock cab(m_pObj->GetCriticalSection());
//==========================
// Clear Error information
//==========================
g_pCError->ClearErrorInfo();
if(pTableID->uName.pwszName == NULL)
{
hr = DB_E_BADTABLEID;
}
else
if(wcslen(pTableID->uName.pwszName) == 0 || pTableID->eKind != DBKIND_NAME)
{
hr = DB_E_BADTABLEID;
}
else
//===================================================================================
// Check the connection is valid
//===================================================================================
if ( m_pObj->m_pCDataSource->m_pWbemWrap->ValidConnection() ){
//===============================================================
// construct a new CWmiOleDBMap class
//===============================================================
CWmiOleDBMap Map;
if(SUCCEEDED(hr = Map.FInit(NO_QUALIFIERS,(LPWSTR)pTableID->uName.pwszName,m_pObj->m_pCDataSource->m_pWbemWrap)))
{
hr = Map.CreateTable(cColumnDescs, rgColumnDescs, cPropertySets, rgPropertySets);
if ( SUCCEEDED(hr) && ppRowset != NULL)
{
pwcsTableName = Map.GetClassName();
try
{
//===========================================================
// Now, return the rowset
//===========================================================
pRowset = new CRowset(pUnkOuter,m_pObj);
}
catch(...)
{
SAFE_DELETE_PTR(pRowset);
throw;
}
if ( pRowset ){
//=======================================================
//Set session of this rowset
//=======================================================
// m_pObj->m_fRowsetCreated = TRUE;
if ( SUCCEEDED(hr) ){
//=======================================================
// Store the newly created table in pRowset & get ptr
//=======================================================
hr = pRowset->InitRowset(cPropertySets, rgPropertySets,(LPWSTR)pwcsTableName);
if( SUCCEEDED(hr)){
hr = pRowset->QueryInterface(IID_IRowset, (void**)ppRowset);
}
}
}
}
}
if ( !SUCCEEDED(hr) && ppRowset != NULL) {
SAFE_DELETE_PTR(pRowset);
*ppRowset = NULL;
}
if(ppTableID != NULL && SUCCEEDED( hr))
{
//====================================
// Allocate memory for DBID
//====================================
*ppTableID = (DBID *)g_pIMalloc->Alloc(sizeof(DBID));
(*ppTableID)->eKind = DBKIND_NAME;
//====================================
// Allocate memory for then tablename
//====================================
(*ppTableID)->uName.pwszName = (WCHAR *)g_pIMalloc->Alloc(sizeof(WCHAR) *(wcslen(pwcsTableName) + 1));
wcscpy((*ppTableID)->uName.pwszName,Map.GetClassName());
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITableDefinition);
CATCH_BLOCK_HRESULT(hr,L"ITableDefinition::CreateTable");
return hr;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// DropTable
// S_OK - Success
// DB_S_ERRORSOCCURRED - General failure
// E_INVALIDARG - one of the arguments is invalid
// DB_E_NOTABLE - the table defined in invalid
// DB_SEC_E_PERMISSIONDENIED - does not have permission to drop the table
//////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CImpITableDefinition::DropTable( DBID __RPC_FAR *pTableID) // IN
{
HRESULT hr = E_FAIL;
CBSTR strClassName;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
CAutoBlock cab(m_pObj->GetCriticalSection());
//====================================
// Clear Error information
//====================================
g_pCError->ClearErrorInfo();
//===================================================================================
// Check the connection is valid
//===================================================================================
if ( m_pObj->m_pCDataSource->m_pWbemWrap->ValidConnection() ){
if(pTableID->uName.pwszName == NULL)
{
hr = DB_E_BADTABLEID;
}
else
if ( wcslen(pTableID->uName.pwszName) == 0 || pTableID->eKind != DBKIND_NAME){
hr = DB_E_BADTABLEID;
}
else{
strClassName.SetStr(pTableID->uName.pwszName);
//=========================================================================
// Call this function of the connection wrapper class to delete the class
//=========================================================================
hr = m_pObj->m_pCDataSource->m_pWbemWrap->DeleteClass((BSTR)strClassName);
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITableDefinition);
CATCH_BLOCK_HRESULT(hr,L"ITableDefinition::DropTable");
return hr;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//A method of ITableDefinition interface to add a column to a table
// Return Values :
// S_OK - Success
// DB_S_ERRORSOCCURRED - General failure
// E_INVALIDARG - one of the arguments is invalid
// DB_E_NOTABLE - the table defined in invalid
// DB_E_BADCOLUMNID - the column id is bad
// DB_SEC_E_PERMISSIONDENIED - does not have permission to add a column
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CImpITableDefinition::AddColumn( DBID __RPC_FAR *pTableID, // IN
DBCOLUMNDESC __RPC_FAR *pColumnDesc, //IN|OUT
DBID __RPC_FAR *__RPC_FAR *ppColumnID)
{
HRESULT hr = E_FAIL;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
CAutoBlock cab(m_pObj->GetCriticalSection());
//===============================
// Clear Error information
//===============================
g_pCError->ClearErrorInfo();
//===================================================================================
// Check the connection is valid
//===================================================================================
if ( m_pObj->m_pCDataSource->m_pWbemWrap->ValidConnection() ){
if(pTableID->uName.pwszName == NULL)
{
hr = DB_E_BADTABLEID;
}
else
if( NULL == pColumnDesc ||
pTableID->eKind != DBKIND_NAME || 0 == wcslen(pTableID->uName.pwszName))
{
hr = E_INVALIDARG;
}
else
{
CWmiOleDBMap Map;
if(SUCCEEDED(hr =Map.FInit(NO_QUALIFIERS,pTableID->uName.pwszName,m_pObj->m_pCDataSource->m_pWbemWrap)))
{
if(S_OK == (hr = Map.AddColumn(pColumnDesc, ppColumnID)) && ppColumnID != NULL )
{
//=====================================
// Allocate memory for DBID
//=====================================
*ppColumnID = (DBID *)g_pIMalloc->Alloc(sizeof(DBID));
(*ppColumnID)->eKind = DBKIND_NAME;
//=====================================
// Allocate memory for then tablename
//=====================================
(*ppColumnID)->uName.pwszName = (WCHAR *)g_pIMalloc->Alloc(sizeof(WCHAR) *(wcslen(pColumnDesc->dbcid.uName.pwszName) + 1));
wcscpy((*ppColumnID)->uName.pwszName,pColumnDesc->dbcid.uName.pwszName);
}
}
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITableDefinition);
CATCH_BLOCK_HRESULT(hr,L"ITableDefinition::AddColumn");
return hr;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//A method of ITableDefinition interface to drop a column
// Return Values :
// S_OK - Success
// DB_S_ERRORSOCCURRED - General failure
// E_INVALIDARG - one of the arguments is invalid
// DB_E_NOTABLE - the table defined in invalid
// DB_E_BADCOLUMNID - the column id is bad or not exists
// DB_SEC_E_PERMISSIONDENIED - does not have permission to drop the column
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE CImpITableDefinition::DropColumn(
DBID __RPC_FAR *pTableID, // IN Name of WBEM Class
DBID __RPC_FAR *pColumnID) // IN Name of WBEM Property
{
HRESULT hr = E_FAIL;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
CAutoBlock cab(m_pObj->GetCriticalSection());
//=====================================
// Clear Error information
//=====================================
g_pCError->ClearErrorInfo();
//===================================================================================
// Check the connection is valid
//===================================================================================
if ( m_pObj->m_pCDataSource->m_pWbemWrap->ValidConnection() ){
if(pTableID->uName.pwszName == NULL)
{
hr = DB_E_BADTABLEID;
}
else
if( pTableID->eKind != DBKIND_NAME || 0 == wcslen(pTableID->uName.pwszName) ||
pColumnID->eKind != DBKIND_NAME || 0 == wcslen(pColumnID->uName.pwszName))
{
hr = E_INVALIDARG;
}
else
{
CWmiOleDBMap Map;
if(SUCCEEDED(hr = Map.FInit(NO_QUALIFIERS,(LPWSTR)pTableID->uName.pwszName,m_pObj->m_pCDataSource->m_pWbemWrap)))
{
hr = Map.DropColumn(pColumnID);
}
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITableDefinition);
CATCH_BLOCK_HRESULT(hr,L"ITableDefinition::DropColumn");
return hr;
}