windows-nt/Source/XPSP1/NT/inetsrv/query/icommand/metqspec.cxx
2020-09-26 16:20:57 +08:00

242 lines
7.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: StdQSpec.cxx
//
// Contents: ICommand for file-based queries
//
// Classes: CMetadataQuerySpec
//
// History: 30 Jun 1995 AlanW Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "metqspec.hxx"
//+-------------------------------------------------------------------------
//
// Member: CMetadataQuerySpec::CMetadataQuerySpec, public
//
// Synopsis: Constructor of a CMetadataQuerySpec
//
// Arguments: [pOuterUnk] - Outer unknown
// [ppMyUnk] - OUT: filled in with pointer to non-delegated
// IUnknown on return
// [eType] - Class of metadata to return
// [pCat] - Content index catalog
// [pMachine]
//
// History: 08-Feb-96 KyleP Added support for virtual paths
//
//--------------------------------------------------------------------------
CMetadataQuerySpec::CMetadataQuerySpec (
IUnknown * pOuterUnk,
IUnknown ** ppMyUnk,
CiMetaData eType,
WCHAR const * pCat,
WCHAR const * pMachine )
: CRootQuerySpec(pOuterUnk, ppMyUnk),
_eType( eType ),
_pCat(0),
_pMachine(0)
{
//
// Make a copy of the catalog string for ICommand::Clone
//
unsigned len = wcslen( pCat ) + 1;
_pCat = new WCHAR[len];
RtlCopyMemory( _pCat, pCat, len * sizeof(WCHAR) );
//
// Make a copy of the machine string for ICommand::Clone
//
if ( 0 != pMachine )
{
len = wcslen( pMachine ) + 1;
_pMachine = new WCHAR[len];
RtlCopyMemory( _pMachine, pMachine, len * sizeof(WCHAR) );
}
END_CONSTRUCTION( CMetadataQuerySpec );
}
//+-------------------------------------------------------------------------
//
// Member: CMetadataQuerySpec::~CMetadataQuerySpec, private
//
// Synopsis: Destructor of a CMetadataQuerySpec
//
//--------------------------------------------------------------------------
CMetadataQuerySpec::~CMetadataQuerySpec()
{
delete [] _pCat;
delete [] _pMachine;
}
//+-------------------------------------------------------------------------
//
// Member: CMetadataQuerySpec::QueryInternalQuery, protected
//
// Synopsis: Instantiates internal query, using current parameters.
//
// Returns: Pointer to internal query object.
//
// History: 03-Mar-1997 KyleP Created
//
//--------------------------------------------------------------------------
PIInternalQuery * CMetadataQuerySpec::QueryInternalQuery()
{
//
// get a pointer to the IInternalQuery interface
//
PIInternalQuery * pQuery = 0;
SCODE sc = EvalMetadataQuery( &pQuery, _eType, _pCat, _pMachine );
if ( FAILED( sc ) )
THROW( CException( sc ) );
return pQuery;
}
//+---------------------------------------------------------------------------
//
// Member: MakeMetadataICommand
//
// Synopsis: Evaluate the metadata query
//
// Arguments: [ppQuery] -- Returns the IUnknown for the command
// [eType] -- Type of metadata (vroot, proot, etc)
// [wcsCat] -- Catalog
// [wcsMachine] -- Machine name for meta query
// [pOuterUnk] -- (optional) outer unknown pointer
//
// Returns SCODE result
//
// History: 15-Apr-96 SitaramR Created header
// 29-May-97 EmilyB Added aggregation support, so now
// returns IUnknown ptr and caller
// must now call QI to get ICommand ptr
//
//----------------------------------------------------------------------------
SCODE MakeMetadataICommand(
IUnknown ** ppQuery,
CiMetaData eType,
WCHAR const * wcsCat,
WCHAR const * wcsMachine,
IUnknown * pOuterUnk )
{
//
// Check for invalid parameters
//
if ( 0 == wcsCat ||
0 == ppQuery ||
( eType != CiVirtualRoots &&
eType != CiPhysicalRoots &&
eType != CiProperties ) )
{
return E_INVALIDARG;
}
*ppQuery = 0;
CMetadataQuerySpec * pQuery = 0;
SCODE sc = S_OK;
TRANSLATE_EXCEPTIONS;
TRY
{
pQuery = new CMetadataQuerySpec( pOuterUnk, ppQuery, eType,
wcsCat,
wcsMachine );
}
CATCH( CException, e )
{
Win4Assert(0 == pQuery);
sc = e.GetErrorCode();
}
END_CATCH
UNTRANSLATE_EXCEPTIONS;
return sc;
} //MakeMetadataICommand
//+---------------------------------------------------------------------------
//
// Method: CMetadataQuerySpec::GetProperties, public
//
// Synopsis: Get rowset properties
//
// Arguments: [cPropertySetIDs] - number of desired property set IDs or 0
// [rgPropertySetIDs] - array of desired property set IDs or NULL
// [pcPropertySets] - number of property sets returned
// [prgPropertySets] - array of returned property sets
//
// Returns: SCODE - result code indicating error return status. One of
// S_OK, DB_S_ERRORSOCCURRED or DB_E_ERRORSOCCURRED. Any
// other errors are thrown.
//
// History: 12-Mayr-97 dlee Created
//
//----------------------------------------------------------------------------
SCODE STDMETHODCALLTYPE CMetadataQuerySpec::GetProperties(
ULONG const cPropertySetIDs,
DBPROPIDSET const rgPropertySetIDs[],
ULONG * pcPropertySets,
DBPROPSET ** prgPropertySets)
{
_DBErrorObj.ClearErrorInfo();
SCODE scParent = CRootQuerySpec::GetProperties( cPropertySetIDs,
rgPropertySetIDs,
pcPropertySets,
prgPropertySets );
if ( S_OK != scParent )
_DBErrorObj.PostHResult( scParent, IID_ICommandProperties );
return scParent;
} //GetProperties
//+---------------------------------------------------------------------------
//
// Method: CMetadataQuerySpec::SetProperties, public
//
// Synopsis: Set rowset scope properties
//
// Arguments: [cPropertySets] - number of property sets
// [rgPropertySets] - array of property sets
//
// Returns: SCODE - result code indicating error return status. One of
// S_OK, DB_S_ERRORSOCCURRED or DB_E_ERRORSOCCURRED. Any
// other errors are thrown.
//
// History: 12-Mayr-97 dlee Created
//
//----------------------------------------------------------------------------
SCODE STDMETHODCALLTYPE CMetadataQuerySpec::SetProperties(
ULONG cPropertySets,
DBPROPSET rgPropertySets[] )
{
_DBErrorObj.ClearErrorInfo();
SCODE scParent = CRootQuerySpec::SetProperties( cPropertySets,
rgPropertySets );
if ( S_OK != scParent )
_DBErrorObj.PostHResult( scParent, IID_ICommandProperties );
return scParent;
} //SetProperties