|
|
//+---------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: ixsso.hxx
//
// Contents: Query SSO class
//
// History: 29 Oct 1996 Alanw Created
//
//----------------------------------------------------------------------------
#pragma once
//-----------------------------------------------------------------------------
// Include Files
//-----------------------------------------------------------------------------
// Query object interface declarations
#include "ixssoifc.h"
#include "ixserror.hxx"
#include <ciintf.h>
#include <tgrow.hxx>
enum EOptimizeFor { eOptNone = 0, eOptPerformance = 1, eOptRecall = 2, eOptHitCount = 4, // eOptPrecision,
};
extern const WCHAR * pwcDefaultDialect;
//
// Private interface definition for use by CixssoUtil.
//
const IID IID_IixssoQueryPrivate = {0x9357bd10,0x2b6f,0x11d0,{0xbf,0xbc,0x00,0x20,0xf8,0x00,0x80,0x24}};
interface DECLSPEC_UUID("9357bd10-2b6f-11d0-bfbc-0020f8008024") IixssoQueryPrivate : public IixssoQueryEx { public: virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AddScopeToQuery( /* [in] */ BSTR pwszScope, /* [optional][in] */ BSTR pwszDepth) = 0; };
class CIXSSOPropertyList : public IColumnMapper { public:
CIXSSOPropertyList(ULONG ulCodePage = CP_ACP); void SetDefaultList(IColumnMapper *pDefaultList);
//
// IUnknown methods.
//
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void ** ppvObj); STDMETHOD_(ULONG, AddRef) (THIS); STDMETHOD_(ULONG, Release) (THIS);
//
// IColumnMapper methods
//
STDMETHOD(GetPropInfoFromName) ( const WCHAR *wcsPropName, DBID * *ppPropId, DBTYPE *pPropType, unsigned int *puiWidth);
STDMETHOD(GetPropInfoFromId) ( const DBID *pPropId, WCHAR * *pwcsName, DBTYPE *pPropType, unsigned int *puiWidth);
STDMETHOD(EnumPropInfo) ( ULONG iEntry, const WCHAR * *pwcsName, DBID * *ppPropId, DBTYPE *pPropType, unsigned int *puiWidth);
STDMETHOD(IsMapUpToDate)();
// local methods
SCODE AddEntry( XPtr<CPropEntry> & xPropEntry, int iLine );
private:
XInterface<IColumnMapper> _xDefaultList; XInterface<CPropertyList> _xOverrideList;
LONG _cRefs; // ref counting
CMutexSem _mtxAdd; // serialize access to AddEntry
ULONG _ulCodePage; // codepage
};
//-----------------------------------------------------------------------------
// CixssoQuery Declaration
//-----------------------------------------------------------------------------
class CixssoQuery : public IixssoQueryPrivate, public ISupportErrorInfo, public IObjectWithSite #if 0
,public IObjectSafety #endif
{ friend class CIxssoQueryCF; friend class CNLssoQueryCF;
public:
// IUnknown methods
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj); STDMETHOD_(ULONG, AddRef)(THIS); STDMETHOD_(ULONG, Release)(THIS);
// IDispatch methods
STDMETHOD(GetTypeInfoCount)(THIS_ UINT * pctinfo);
STDMETHOD(GetTypeInfo)( THIS_ UINT itinfo, LCID lcid, ITypeInfo * * pptinfo);
STDMETHOD(GetIDsOfNames)( THIS_ REFIID riid, OLECHAR * * rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid);
STDMETHOD(Invoke)( THIS_ DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr);
// ISupportErrorInfo method
STDMETHOD(InterfaceSupportsErrorInfo)( THIS_ REFIID riid);
//
// IixssoQuery property get/put methods
//
HRESULT STDMETHODCALLTYPE get_Query( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_Query( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_CiScope( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_CiScope( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_SortBy( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_SortBy( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_GroupBy( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_GroupBy( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_CiFlags( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_CiFlags( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_Columns( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_Columns( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_LocaleID( /* [retval][out] */ LONG *val);
HRESULT STDMETHODCALLTYPE put_LocaleID( /* [in] */ LONG val);
HRESULT STDMETHODCALLTYPE get_CodePage( /* [retval][out] */ LONG *val);
HRESULT STDMETHODCALLTYPE put_CodePage( /* [in] */ LONG val);
HRESULT STDMETHODCALLTYPE get_Catalog( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_Catalog( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_Dialect( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_Dialect( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_OptimizeFor( /* [retval][out] */ BSTR *val);
HRESULT STDMETHODCALLTYPE put_OptimizeFor( /* [in] */ BSTR val);
HRESULT STDMETHODCALLTYPE get_AllowEnumeration( /* [retval][out] */ VARIANT_BOOL *val);
HRESULT STDMETHODCALLTYPE put_AllowEnumeration( /* [in] */ VARIANT_BOOL val);
HRESULT STDMETHODCALLTYPE get_MaxRecords( /* [retval][out] */ LONG *val);
HRESULT STDMETHODCALLTYPE put_MaxRecords( /* [in] */ LONG val);
HRESULT STDMETHODCALLTYPE get_StartHit( /* [retval][out] */ VARIANT * pvar);
HRESULT STDMETHODCALLTYPE put_StartHit( /* [in] */ VARIANT * pvar);
HRESULT STDMETHODCALLTYPE get_ResourceUseFactor( /* [retval][out] */ LONG *val);
HRESULT STDMETHODCALLTYPE put_ResourceUseFactor( /* [in] */ LONG val);
HRESULT STDMETHODCALLTYPE get_QueryTimedOut( /* [retval][out] */ VARIANT_BOOL *val);
HRESULT STDMETHODCALLTYPE get_QueryIncomplete( /* [retval][out] */ VARIANT_BOOL *val);
HRESULT STDMETHODCALLTYPE get_OutOfDate( /* [retval][out] */ VARIANT_BOOL *val);
//
// IixssoQueryEx methods
//
HRESULT STDMETHODCALLTYPE get_FirstRows( /* [retval][out] */ LONG *val);
HRESULT STDMETHODCALLTYPE put_FirstRows( /* [in] */ LONG val);
//
// IixssoQuery methods
//
HRESULT STDMETHODCALLTYPE SetQueryFromURL( /* [in] */ BSTR pwszQuery);
HRESULT STDMETHODCALLTYPE QueryToURL( /* [retval][out] */ BSTR * ppwszQuery);
HRESULT STDMETHODCALLTYPE AddScopeToQuery( /* [in] */ BSTR pwszScope, /* [in] */ BSTR pwszDepth);
HRESULT STDMETHODCALLTYPE DefineColumn( /* [in] */ BSTR pwszColDefinition);
HRESULT STDMETHODCALLTYPE CreateRecordset( /* [in] */ BSTR pwszSequential, /* [retval][out] */ IDispatch **ppDisp);
HRESULT STDMETHODCALLTYPE Reset( void );
//
// ASP standard methods
//
HRESULT STDMETHODCALLTYPE OnStartPage( IUnknown * pUnk );
HRESULT STDMETHODCALLTYPE OnEndPage( void );
#if 0
//
// IObjectSafety methods
//
HRESULT STDMETHODCALLTYPE GetInterfaceSafetyOptions( REFIID riid, DWORD * pdwSupportedOptions, DWORD * pdwEnabledOptions );
HRESULT STDMETHODCALLTYPE SetInterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions );
#endif
//
// IObjectWithSite methods
//
HRESULT STDMETHODCALLTYPE SetSite( IUnknown * pSite );
HRESULT STDMETHODCALLTYPE GetSite( REFIID riid, void ** ppvSite );
private: CixssoQuery( ITypeLib * pitlb, IClassFactory * pIAdoRecordsetCF, BOOL fAdoV1_5, const CLSID & ssoClsid );
~CixssoQuery();
// Local methods
void SetError( SCODE sc, const WCHAR * loc = 0, unsigned eErrClass = 0 ) { _err.SetError( sc, 0, 0, loc, eErrClass, _lcid ); }
void SetError( SCODE sc, const WCHAR * pwszLoc, const WCHAR * pwszDescription ) { _err.SetError( sc, pwszLoc, pwszDescription ); }
void SetErrorWithFile( SCODE sc, ULONG iLine, const WCHAR * pwszFile, const WCHAR * loc = 0, unsigned eErrClass = 0 ) { _err.SetError( sc, iLine, pwszFile, loc, eErrClass, _lcid ); }
void ExecuteQuery( void );
void IsSafeForScripting();
void GetDefaultCatalog( void );
LCID GetLCID() const { return _lcid; }
IColumnMapper * GetColumnMapper( ) { return &_PropertyList; }
DWORD GetQueryStatus( );
BOOL IsAVirtualPath( WCHAR * wcsPath );
BOOL IsSequential( void ) { return _fSequential; }
BOOL IsQueryActive( void ) { return _pIRowset != 0; }
SCODE ParseOptimizeFor( WCHAR const * wcsOptString, DWORD & eChoice );
ULONG ParseCiDepthFlag( BSTR bstrFlags );
ULONG GetDialect();
SCODE SetLocaleString(BSTR str);
// Property get/put helpers
SCODE CopyWstrToBstr( BSTR * pbstr, WCHAR const * pwstr ); SCODE CopyBstrToWstr( BSTR bstr, LPWSTR & pwstr ); SCODE CopyBstrToWstrArray( BSTR bstr, CDynArray<WCHAR> &apstr, unsigned i ); SCODE GetBoolProperty( VARIANT_BOOL * pfVal, BOOL fMemberVal ); SCODE PutBoolProperty( VARIANT_BOOL fInputVal, BOOL & fMemberVal );
SCODE CheckQueryStatusBit( VARIANT_BOOL * pfVal, DWORD dwBit );
ULONG _cRef;
CixssoError _err;
IClassFactory * _pIAdoRecordsetCF; BOOL _fAdoV15;
IRowset * _pIRowset; IRowsetQueryStatus * _pIRowsetQueryStatus;
BOOL _fSequential; // TRUE if query is sequential
// Settable parameters
LCID _lcid; // Locale ID used for this query
ULONG _ulCodepage; // Codepage used for this query
XInterface<IUnknown> _xSite; // site loading the object
WCHAR * _pwszRestriction; // Query
WCHAR * _pwszSort; // SortBy
WCHAR * _pwszGroup; // GroupBy
WCHAR * _pwszColumns; // Columns
WCHAR * _pwszCatalog; // Catalog
WCHAR * _pwszDialect; // Query Dialect
// Scope related parameters
unsigned _cScopes; // number of active scopes
CDynArray<WCHAR> _apwszScope; // CiScope
CDynArrayInPlace<ULONG> _aulDepth; // CiFlags, DEEP/SHALLOW
BOOL _fAllowEnumeration; DWORD _dwOptimizeFlags;
LONG _maxResults; // total number of results
LONG _cFirstRows; LONG _iResourceFactor; // resource use factor
XSafeArray _StartHit; // starting hit(s) in results
ITypeInfo * _ptinfo; // Type info from type lib
// Command creator for this instance
XInterface<ISimpleCommandCreator> _xCmdCreator; // points to cmd creator
CIXSSOPropertyList _PropertyList; // Property list
};
// Global variables.
class CTheGlobalIXSSOVariables; extern CTheGlobalIXSSOVariables * g_pTheGlobalIXSSOVariables;
class CTheGlobalIXSSOVariables { public: CTheGlobalIXSSOVariables();
~CTheGlobalIXSSOVariables() { VariantClear(&_vtAcceptLanguageHeader); }
VARIANT _vtAcceptLanguageHeader;
XInterface<ISimpleCommandCreator> xCmdCreator; XInterface<IColumnMapperCreator> xColumnMapperCreator; };
#define TheGlobalIXSSOVariables (*g_pTheGlobalIXSSOVariables)
#define g_vtAcceptLanguageHeader TheGlobalIXSSOVariables._vtAcceptLanguageHeader
void ParseNumberVectorString( WCHAR * pwszValue, CDynArrayInPlace<LONG> & aNum ); void FormatLongVector( SAFEARRAY * psa, XGrowable<WCHAR> & awchBuf );
|