330 lines
11 KiB
C++
330 lines
11 KiB
C++
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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;
|
|
}
|
|
|