|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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; }
|