170 lines
5.5 KiB
C++
170 lines
5.5 KiB
C++
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft WMIOLE DB Provider
|
||
|
//
|
||
|
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// IIndexDef.CPP IIndexDefinition interface implementation
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "headers.h"
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Creates a index on a property of a class
|
||
|
//
|
||
|
// Returns one of the following values:
|
||
|
// S_OK Method Succeeded
|
||
|
// E_FAIL Generic Provider specific failure
|
||
|
// DB_S_ERRORSOCCURED creating index was successful with some errors
|
||
|
// DB_E_ERRORSOCCURRED Could not create index
|
||
|
// E_INVALIDARG One or more arguments was invalid
|
||
|
// OTHER Other HRESULTs returned by called functions
|
||
|
// DB_E_NOTABLE The table specified is not present
|
||
|
// DB_SEC_E_PERMISSIONDENIED User does not have permission to create index
|
||
|
//
|
||
|
// Note: pIndexID - Should be pointing to the columnname for which the index need to be added
|
||
|
// ppIndexID - will be pointing to the Index qualifier. ie. <ColumnName>/"Index"
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CImplIIndexDefinition::CreateIndex(DBID * pTableID,
|
||
|
DBID * pIndexID,
|
||
|
DBORDINAL cIndexColumnDescs,
|
||
|
const DBINDEXCOLUMNDESC rgIndexColumnDescs[],
|
||
|
ULONG cPropertySets,
|
||
|
DBPROPSET rgPropertySets[],
|
||
|
DBID ** ppIndexID)
|
||
|
|
||
|
{
|
||
|
HRESULT hr = E_FAIL;
|
||
|
|
||
|
CSetStructuredExceptionHandler seh;
|
||
|
|
||
|
TRY_BLOCK;
|
||
|
|
||
|
// Serialize the obect
|
||
|
CAutoBlock cab(m_pObj->GetCriticalSection());
|
||
|
LONG lSize = -1;
|
||
|
|
||
|
// Clear Error information
|
||
|
g_pCError->ClearErrorInfo();
|
||
|
|
||
|
//===================================================================================
|
||
|
// Check the connection is valid
|
||
|
//===================================================================================
|
||
|
if ( m_pObj->m_pCDataSource->m_pWbemWrap->ValidConnection() ){
|
||
|
|
||
|
if( pIndexID->eKind != DBKIND_NAME || 0 == wcslen(pIndexID->uName.pwszName) ||
|
||
|
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.AddIndex(pIndexID)) && ppIndexID != NULL)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
// Allocate memory for DBID
|
||
|
(*ppIndexID) = (DBID *)g_pIMalloc->Alloc(sizeof(DBID));
|
||
|
}
|
||
|
catch(...)
|
||
|
{
|
||
|
if(*ppIndexID)
|
||
|
{
|
||
|
g_pIMalloc->Free(*ppIndexID);
|
||
|
(*ppIndexID) = NULL;
|
||
|
}
|
||
|
throw;
|
||
|
}
|
||
|
|
||
|
if(*ppIndexID == NULL)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
(*ppIndexID)->eKind = DBKIND_NAME;
|
||
|
// Allocate memory for then tablename
|
||
|
lSize = sizeof(WCHAR) *(wcslen(pIndexID->uName.pwszName) + \
|
||
|
wcslen(strIndex) + \
|
||
|
wcslen(SEPARATOR) + 1);
|
||
|
|
||
|
// Allocate memory for qualifer name which gives the indexID
|
||
|
(*ppIndexID)->uName.pwszName = (WCHAR *)g_pIMalloc->Alloc(lSize);
|
||
|
wcscpy((*ppIndexID)->uName.pwszName,pIndexID->uName.pwszName);
|
||
|
wcscat((*ppIndexID)->uName.pwszName,SEPARATOR);
|
||
|
wcscat((*ppIndexID)->uName.pwszName,strIndex);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IIndexDefinition);
|
||
|
|
||
|
CATCH_BLOCK_HRESULT(hr,L"IIndexDefinition::CreateIndex");
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Creates a index on a property of a class
|
||
|
//
|
||
|
// Returns one of the following values:
|
||
|
// S_OK Method Succeeded
|
||
|
// E_FAIL Generic Provider specific failure
|
||
|
// DB_S_ERRORSOCCURED creating index was successful with some errors
|
||
|
// DB_E_ERRORSOCCURRED Could not create index
|
||
|
// E_INVALIDARG One or more arguments was invalid
|
||
|
// DB_E_NOINDEX index not present
|
||
|
// DB_E_NOTABLE The table specified is not present
|
||
|
// DB_SEC_E_PERMISSIONDENIED User does not have permission to create index
|
||
|
//
|
||
|
// pIndexID - will be pointing to the index qualifier ie.<columnName>/"Index"
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CImplIIndexDefinition::DropIndex( DBID * pTableID, DBID * pIndexID)
|
||
|
{
|
||
|
HRESULT hr = E_FAIL;
|
||
|
LONG lSize = -1;
|
||
|
|
||
|
CSetStructuredExceptionHandler seh;
|
||
|
|
||
|
TRY_BLOCK;
|
||
|
|
||
|
// Serialize the obect
|
||
|
CAutoBlock cab(m_pObj->GetCriticalSection());
|
||
|
//===================================================================================
|
||
|
// Check the connection is valid
|
||
|
//===================================================================================
|
||
|
// Clear Error information
|
||
|
g_pCError->ClearErrorInfo();
|
||
|
|
||
|
if ( m_pObj->m_pCDataSource->m_pWbemWrap->ValidConnection() ){
|
||
|
|
||
|
if( pIndexID->eKind != DBKIND_NAME || 0 == wcslen(pIndexID->uName.pwszName) ||
|
||
|
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)))
|
||
|
{
|
||
|
hr = Map.DropIndex(pIndexID);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IIndexDefinition);
|
||
|
|
||
|
CATCH_BLOCK_HRESULT(hr,L"IIndexDefinition::CreateIndex");
|
||
|
return hr;
|
||
|
}
|