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

1025 lines
36 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 2000.
//
// File: proputl.cxx
//
// Contents: Utility object for sharing property information between
// the commandobject and the rowset object
//
// Classes: CMRowsetProps : public CUtlProps
// CMDSProps : public CUtlProps
// CMSessProps : public CUtlProps
// CMDSPropInfo : public CUtlPropInfo
//
// History: 10-28-97 danleg Created from monarch utlprop.cpp
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <propglob.hxx>
#include <ntverp.h>
#include <proputl.hxx>
#include <proprst.hxx>
#include "propinfr.h"
#include "proptbl.hxx"
//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
#define __L(x) L ## x
#define _L(x) __L(x) // Lx
#define __Q(x) #x
#define _Q(x) __Q(x) // "x"
#define _LQ(x) _L(_Q(x)) // L"x"
// Returns string of the form L"0"L"0"L"."L"0"L"0" L"." L"0000"
// The version should be of the format ##.##.####.
#define MakeProvVerString(x, y, z) _LQ(0)_LQ(x) L"." _LQ(y) L"." _LQ(z)
static const LPWSTR pwszProviderOLEDBVer = L"02.00";
static const LPWSTR pwszProviderVersion = MakeProvVerString(VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD);
//static const LPWSTR pwszProviderVersion = MakeProvVerString(VER_PRODUCTVERSION_STRING, VER_PRODUCTBUILD);
static const LCID lcidNeutral = MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),SORT_DEFAULT);
static const LPWSTR pwszNeutral = L"NEUTRAL";
static const LCID InvalidLCID = 0xFFFFFFFF;
static const LPWSTR s_wszCATALOG = L"catalog";
static const LPWSTR s_wszIndexServer = L"Indexing Service";
static const LPWSTR s_wszIndexServerVer = L"03.00.0000";
static const LPWSTR s_wszProviderFileName = L"query.dll";
//-----------------------------------------------------------------------------
// Constants and structures for file read/write.
//-----------------------------------------------------------------------------
//
// Note that this must match up with the enum CMDSProps::EID.
// We don't support all the properties listed in the spec.
//
static const UPROPINFO s_rgdbPropInit[] =
{
//PM_(AUTH_CACHE_AUTHINFO), VT_BOOL, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(AUTH_ENCRYPT_PASSWORD), VT_BOOL, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(AUTH_INTEGRATED), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(AUTH_MASK_PASSWORD), VT_BOOL, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(AUTH_PASSWORD), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(AUTH_PERSIST_ENCRYPTED), VT_BOOL, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(AUTH_PERSIST_SENSITIVE_AUTHINFO), VT_BOOL, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(AUTH_USERID), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(INIT_ASYNCH), VT_I4, PF_(DBINIT) | PF_(READ),
//--PM_(INIT_CATALOG), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(INIT_DATASOURCE), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(INIT_HWND), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(INIT_IMPERSONATION_LEVEL), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(INIT_LCID), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(INIT_LOCATION), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(CHANGE),
//PM_(INIT_MODE), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(INIT_OLEDBSERVICES), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
PM_(INIT_PROMPT), VT_I2, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(INIT_PROTECTION_LEVEL), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(INIT_PROVIDERSTRING), VT_BSTR, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
//PM_(INIT_TIMEOUT), VT_I4, PF_(DBINIT) | PF_(READ) | PF_(WRITE),
};
static const UPROPINFO s_rgdbPropDS[] =
{
PM_(CURRENTCATALOG), VT_BSTR, PF_(DATASOURCE) | PF_(READ) | PF_(WRITE),
PM_(RESETDATASOURCE), VT_I4, PF_(DATASOURCE) | PF_(READ) | PF_(WRITE),
};
static const UPROPINFO s_rgdbPropSESS[] =
{
PM_(SESS_AUTOCOMMITISOLEVELS), VT_I4, PF_(SESSION) | PF_(READ),
};
//
// DataSource. Must match with the enumerator in header of CMDSProps
//
static const UPROPINFO s_rgdbPropDSInfo[] =
{
PM_(ACTIVESESSIONS), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(ASYNCTXNABORT), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(ASYNCTXNCOMMIT), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(BYREFACCESSORS), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(CATALOGLOCATION), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(CATALOGTERM), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(CATALOGUSAGE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(COLUMNDEFINITION), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(CONCATNULLBEHAVIOR), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(DATASOURCENAME), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(DATASOURCEREADONLY), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(DBMSNAME), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(DBMSVER), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(DSOTHREADMODEL), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(GROUPBY), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(HETEROGENEOUSTABLES), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(IDENTIFIERCASE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(MAXOPENCHAPTERS), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(MAXINDEXSIZE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(MAXROWSIZE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(MAXROWSIZEINCLUDESBLOB),VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(MAXTABLESINSELECT), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(MULTIPLEPARAMSETS), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(MULTIPLERESULTS), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(MULTIPLESTORAGEOBJECTS), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(MULTITABLEUPDATE), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(NULLCOLLATION), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(OLEOBJECTS), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(ORDERBYCOLUMNSINSELECT), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
PM_(OUTPUTPARAMETERAVAILABILITY), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(PERSISTENTIDTYPE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(PREPAREABORTBEHAVIOR), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(PREPARECOMMITBEHAVIOR),VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(PROCEDURETERM), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(PROVIDERFRIENDLYNAME), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(PROVIDERNAME), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(PROVIDEROLEDBVER), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
PM_(PROVIDERVER), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(QUOTEDIDENTIFIERCASE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(ROWSETCONVERSIONSONCOMMAND), VT_BOOL, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(SCHEMATERM), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(SCHEMAUSAGE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(SQLSUPPORT), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(STRUCTUREDSTORAGE), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(SUBQUERIES), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(SUPPORTEDTXNDDL), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(SUPPORTEDTXNISOLEVELS), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
PM_(SUPPORTEDTXNISORETAIN), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(TABLETERM), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
//NEVER: PM_(USERNAME), VT_BSTR, PF_(DATASOURCEINFO) | PF_(READ),
//--PM_(CONNECTIONSTATUS), VT_I4, PF_(DATASOURCEINFO) | PF_(READ),
//--PM_(SERVERNAME), VT_BSTR PF_(DATASOURCEINFO) | PF_(READ),
};
//
// This is used by CMDSProps, CMDSPropInfo
//
static const UPROPSET s_rgIDXPropertySets[] =
{
&DBPROPSET_DBINIT, NUMELEM(s_rgdbPropInit), s_rgdbPropInit, 0,
&DBPROPSET_DATASOURCEINFO, NUMELEM(s_rgdbPropDSInfo), s_rgdbPropDSInfo, 0,
&DBPROPSET_DATASOURCE, NUMELEM(s_rgdbPropDS), s_rgdbPropDS, 0,
&DBPROPSET_SESSION, NUMELEM(s_rgdbPropSESS), s_rgdbPropSESS, 0,
&DBPROPSET_ROWSET, NUMELEM(s_rgdbPropRowset), s_rgdbPropRowset, 0,
&DBPROPSET_MSIDXS_ROWSET_EXT, NUMELEM(s_rgdbPropMSIDXSExt), s_rgdbPropMSIDXSExt, 0,
&DBPROPSET_QUERY_EXT, NUMELEM(s_rgdbPropQueryExt), s_rgdbPropQueryExt, 0,
};
//
// Note: There is an enum for these offsets in utlprop.h (eid_DBPOPSET_xx).
// This is used by CMDSProps.
//
static const UPROPSET s_rgDSPropSets[] =
{
&DBPROPSET_DBINIT, NUMELEM(s_rgdbPropInit), s_rgdbPropInit, 0,
&DBPROPSET_DATASOURCEINFO, NUMELEM(s_rgdbPropDSInfo), s_rgdbPropDSInfo, 0,
&DBPROPSET_DATASOURCE, NUMELEM(s_rgdbPropDS), s_rgdbPropDS, 0,
};
//
//////////////////////////////////////////////////////////////////
//
// This is used by CMSessProps.
//
static const UPROPSET s_rgSessPropSets[] =
{
&DBPROPSET_SESSION, NUMELEM(s_rgdbPropSESS), s_rgdbPropSESS, 0,
};
// module handle for query.dll
extern HANDLE g_hCurrentDll;
//
// CMDSProps methods
//
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::CMDSProps, public
//
// Synopsis: Constructor
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
CMDSProps::CMDSProps(CImpIParserVerify* pIPVerify)
: CUtlProps(ARGCHK_PROPERTIESINERROR)
{
_xIPVerify.Set(pIPVerify);
_xIPVerify->AddRef();
FInit();
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::ValidateCatalog, public
//
// Synopsis: Validate the catalog values
//
// Returns: S_OK - valid
// S_FALSE - invalid
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSProps::ValidateCatalog
(
VARIANT* pvValue
)
{
SCODE sc = S_OK;
if ( 0 != (V_VT(pvValue) == VT_BSTR) && (V_BSTR(pvValue)) )
{
_xIPVerify->VerifyCatalog( 0, V_BSTR(pvValue) );
}
else
sc = S_FALSE;
return sc;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::ValidateLocale, public
//
// Synopsis: Verifies the validity of the LCID given in *pVariant. Done by
// checking a list of valid LCID's
//
// Returns: S_OK - valid LCID
// S_FALSE - invalid LCID
//
// History: 11-12-97 danleg Created from Monarch
// 01-06-99 danleg Use IsValidLocale to validate LCID
//
//----------------------------------------------------------------------------
SCODE CMDSProps::ValidateLocale(VARIANT *pVariant)
{
BOOL fValidLCID = FALSE;
if ( V_VT(pVariant) != VT_I4 )
return S_FALSE;
fValidLCID = IsValidLocale( V_I4(pVariant), LCID_SUPPORTED );
return fValidLCID ? S_OK : S_FALSE;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::ExposeMinimalSets, public
//
// Synopsis: Minimize the number of propertysets exposed. Done in response
// to IDBInitialize::Uninitialize
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
void CMDSProps::ExposeMinimalSets()
{
// Temporarily trick ourselves into thinking we only have
// the first propset.
SetUPropSetCount(eid_DBPROPSET_DBINIT+1);
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::ExposeMaximalSets, public
//
// Synopsis: Maximize the number of property sets we expose. New ones are
// initialized. Done in response to IDBInitialize::Initialize
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSProps::ExposeMaximalSets
(
)
{
ULONG iPropSet;
SCODE sc = S_OK;
// Expose the non-init propsets.
// They might have values left over, so re-initialize.
SetUPropSetCount(eid_DBPROPSET_NUM);
for (iPropSet=eid_DBPROPSET_DBINIT+1; iPropSet < GetUPropSetCount(); iPropSet++)
{
sc = FillDefaultValues( iPropSet );
if ( FAILED(sc) )
return sc;
}
return S_OK;
};
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::GetDefaultValue, private
//
// Synopsis: Retrieve the initial value for a propid.
// DEVNOTE: Using the index from 0 to (GetCountofAvailPropSets-1)
// and an index of 0 to (GetCountofAvailPropidsInPropset-1)
// within that propertyset, return the correct information.
// NOTE: pVar shoudl be initialized prior to this routine.
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSProps::GetDefaultValue
(
ULONG iCurSet,
DBPROPID dwPropId,
DWORD* pdwOption,
VARIANT* pvValue
)
{
WCHAR* pwszValue;
LPCWSTR pwszCatalog;
Win4Assert( V_VT(pvValue) == VT_EMPTY );
switch( iCurSet )
{
case eid_DBPROPSET_DATASOURCEINFO:
*pdwOption = DBPROPOPTIONS_REQUIRED;
switch( dwPropId )
{
case DBPROP_BYREFACCESSORS:
case DBPROP_MULTIPLEPARAMSETS:
case DBPROP_MULTIPLESTORAGEOBJECTS:
case DBPROP_ORDERBYCOLUMNSINSELECT:
V_VT(pvValue) = VT_BOOL;
V_BOOL(pvValue) = VARIANT_FALSE;
break;
case DBPROP_DATASOURCEREADONLY:
case DBPROP_ROWSETCONVERSIONSONCOMMAND:
V_VT(pvValue) = VT_BOOL;
V_BOOL(pvValue) = VARIANT_TRUE;
break;
case DBPROP_CATALOGLOCATION:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_CL_START;
break;
case DBPROP_CATALOGUSAGE:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_CU_DML_STATEMENTS;
break;
case DBPROP_NULLCOLLATION:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_NC_LOW;
break;
case DBPROP_OUTPUTPARAMETERAVAILABILITY:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_OA_NOTSUPPORTED;
break;
case DBPROP_MULTIPLERESULTS:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_MR_NOTSUPPORTED;
break;
case DBPROP_DSOTHREADMODEL:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_RT_FREETHREAD;
break;
case DBPROP_SQLSUPPORT:
pvValue->vt = VT_I4;
V_I4(pvValue) = DBPROPVAL_SQL_ODBC_MINIMUM;
break;
case DBPROP_MAXTABLESINSELECT:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = 1;
break;
case DBPROP_ACTIVESESSIONS:
case DBPROP_COLUMNDEFINITION:
case DBPROP_HETEROGENEOUSTABLES:
case DBPROP_MAXROWSIZE:
case DBPROP_OLEOBJECTS:
case DBPROP_STRUCTUREDSTORAGE:
case DBPROP_SUBQUERIES:
case DBPROP_SUPPORTEDTXNISORETAIN:
case DBPROP_GROUPBY:
case DBPROP_MAXOPENCHAPTERS:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = 0;
break;
case DBPROP_SUPPORTEDTXNISOLEVELS:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_TI_BROWSE;
break;
case DBPROP_SUPPORTEDTXNDDL:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_TC_NONE;
break;
case DBPROP_PERSISTENTIDTYPE:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_PT_GUID_PROPID;
break;
// The following are static value, so just allocate the bstr buffer
// and return the value
case DBPROP_DBMSNAME:
case DBPROP_DBMSVER:
case DBPROP_PROVIDEROLEDBVER:
case DBPROP_PROVIDERFRIENDLYNAME:
case DBPROP_PROVIDERNAME:
case DBPROP_PROVIDERVER:
case DBPROP_CATALOGTERM:
switch( dwPropId )
{
case DBPROP_CATALOGTERM:
pwszValue = s_wszCATALOG;
break;
case DBPROP_DBMSNAME:
pwszValue = s_wszIndexServer;
break;
case DBPROP_DBMSVER:
pwszValue = s_wszIndexServerVer;
break;
case DBPROP_PROVIDERNAME:
pwszValue = s_wszProviderFileName; // query.dll
break;
case DBPROP_PROVIDERFRIENDLYNAME:
pwszValue = g_wszProviderName; // Microsoft OLE DB Provider for Indexing Service
break;
case DBPROP_PROVIDERVER:
pwszValue = (PWSTR)&(pwszProviderVersion[0]);
break;
case DBPROP_PROVIDEROLEDBVER:
pwszValue = (PWSTR)&(pwszProviderOLEDBVer[0]);
break;
default:
Win4Assert( !"Every inner case value match an outer case value" );
break;
}
V_VT(pvValue) = VT_BSTR;
V_BSTR(pvValue) = SysAllocString(pwszValue);
if ( 0 == V_BSTR(pvValue) )
{
V_VT(pvValue) = VT_EMPTY;
}
break;
default:
//Indicate that value is unknown
VariantClear(pvValue);
break;
}
break;
case eid_DBPROPSET_DATASOURCE:
*pdwOption = DBPROPOPTIONS_OPTIONAL;
switch( dwPropId)
{
case DBPROP_CURRENTCATALOG:
pwszCatalog = GetValString(eid_DBPROPSET_DBINIT,eid_DBPROPVAL_INIT_DATASOURCE);
V_VT(pvValue) = VT_BSTR;
V_BSTR(pvValue) = SysAllocString(pwszCatalog);
break;
case DBPROP_RESETDATASOURCE:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = 0;
break;
default:
Win4Assert(!"A property in DBPROPSET_DATASOURCE was requested that does not have a default");
break;
}
break;
case eid_DBPROPSET_DBINIT:
*pdwOption = DBPROPOPTIONS_OPTIONAL;
switch( dwPropId )
{
case DBPROP_AUTH_INTEGRATED:
V_VT(pvValue) = VT_BSTR;
V_BSTR(pvValue) = 0;
break;
case DBPROP_INIT_DATASOURCE:
HandleCatalog( pvValue );
break;
case DBPROP_INIT_LOCATION:
V_VT(pvValue) = VT_BSTR;
V_BSTR(pvValue) = SysAllocString( DEFAULT_MACHINE );
break;
case DBPROP_INIT_LCID:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = GetUserDefaultLCID();
break;
case DBPROP_INIT_OLEDBSERVICES:
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_OS_ENABLEALL;
break;
/*
case DBPROP_INIT_ASYNCH:
V_VT(pvValue) = VT_I4;
V_BSTR(pvValue) = 0;
break;
case DBPROP_INIT_PROVIDERSTRING:
V_VT(pvValue) = VT_BSTR;
if ( IsMonarch() )
V_BSTR(pvValue) = SysAllocString(L"msidxs");
else
V_BSTR(pvValue) = SysAllocString(L"msidxsnl");
break;
*/
case DBPROP_INIT_PROMPT:
// For this, we have a known value.
// Note that NOPROMPT is safer for server usage.
// (Otherwise a hidden window is presented, and we will appear to hang.)
pvValue->vt = VT_I2;
V_I2(pvValue) = DBPROMPT_NOPROMPT;
break;
case DBPROP_INIT_HWND:
default:
// For these, we don't have a value (empty).
VariantClear(pvValue);
break;
}
break;
default:
// Invalid Property Set
Win4Assert( ! "Invalid property set in GetDefaultValue.");
return E_FAIL;
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::IsValidValue, private
//
// Synopsis: Validate that the variant contains legal values for its
// particular type and for the particular PROPID in this propset.
// DEVNOTE: This routine has to apply to writable properties only.
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSProps::IsValidValue
(
ULONG iCurSet,
DBPROP* pDBProp
)
{
// Check BOOLEAN values
if ( (pDBProp->vValue.vt == VT_BOOL) &&
!((V_BOOL(&(pDBProp->vValue)) == VARIANT_TRUE) ||
(V_BOOL(&(pDBProp->vValue)) == VARIANT_FALSE)) )
return S_FALSE;
switch(iCurSet)
{
case eid_DBPROPSET_DATASOURCEINFO:
default:
return S_FALSE;
case eid_DBPROPSET_DATASOURCE:
switch( pDBProp->dwPropertyID )
{
case DBPROP_CURRENTCATALOG:
return ValidateCatalog(&(pDBProp->vValue));
break;
case DBPROP_RESETDATASOURCE:
if ( VT_I4 != V_VT(&(pDBProp->vValue)) ||
!(DBPROPVAL_RD_RESETALL == V_I4(&(pDBProp->vValue)) ||
0 == V_I4(&(pDBProp->vValue))) )
return S_FALSE;
break;
default:
return S_FALSE;
}
break;
case eid_DBPROPSET_DBINIT:
switch( pDBProp->dwPropertyID )
{
case DBPROP_AUTH_INTEGRATED:
// VariantCopy() translates a NULL BSTR ptr to
// an empty BSTR. Check for both.
if ( VT_BSTR != V_VT(&(pDBProp->vValue)) ||
(0 != V_BSTR(&pDBProp->vValue) &&
L'\0' != V_BSTR(&pDBProp->vValue)[0]) )
return S_FALSE;
break;
case DBPROP_INIT_DATASOURCE:
return ValidateCatalog(&(pDBProp->vValue));
break;
case DBPROP_INIT_PROMPT:
// These are the only values we support (from spec).
if ( pDBProp->vValue.vt != VT_I2
|| ! ( V_I2(&pDBProp->vValue) == DBPROMPT_PROMPT
|| V_I2(&pDBProp->vValue) == DBPROMPT_COMPLETE
|| V_I2(&pDBProp->vValue) == DBPROMPT_COMPLETEREQUIRED
|| V_I2(&pDBProp->vValue) == DBPROMPT_NOPROMPT))
return S_FALSE;
break;
case DBPROP_INIT_LOCATION:
case DBPROP_INIT_HWND:
case DBPROP_INIT_PROVIDERSTRING:
case DBPROP_INIT_OLEDBSERVICES:
break;
case DBPROP_INIT_LCID:
return ValidateLocale(&(pDBProp->vValue));
// We support these, with any value.
break;
default:
// Anything else, we don't support.
// Note that an alternative would be to allow setting
// to EMPTY or to FALSE.
return S_FALSE;
break;
}
break;
}
return S_OK; // Is valid
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::InitAvailUPropSets, private
//
// Synopsis: Provide property set information to the base class
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSProps::InitAvailUPropSets
(
ULONG* pcUPropSet,
UPROPSET** ppUPropSet,
ULONG* pcElemPerSupported
)
{
Win4Assert( pcUPropSet && ppUPropSet );
Win4Assert( NUMELEM(s_rgdbPropInit) == eid_INIT_PROPS_NUM );
Win4Assert( NUMELEM(s_rgdbPropDSInfo) == eid_DSINFO_PROPS_NUM );
Win4Assert( NUMELEM(s_rgdbPropDS) == eid_DS_PROPS_NUM );
*pcUPropSet = NUMELEM(s_rgDSPropSets);
*ppUPropSet = (UPROPSET*)s_rgDSPropSets;
*pcElemPerSupported = DWORDSNEEDEDPERSET;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::InitUPropSetsSupported, private
//
// Synopsis: Build the required supported property bitmask for the property
// set supported by this class.
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSProps::InitUPropSetsSupported
(
DWORD* rgdwSupported
)
{
Win4Assert( rgdwSupported );
// Initialize the bitmask to indicate all properties are supported
RtlFillMemory( rgdwSupported,
DWORDSNEEDEDPERSET * NUMELEM(s_rgDSPropSets) * sizeof(DWORD),
0xFF);
// The following assert is to gaurentee that the PROPSET described
// at index 1 is always DBPROPSET_DATASOURCEINFO.
Win4Assert( *(s_rgIDXPropertySets[1].pPropSet) == DBPROPSET_DATASOURCEINFO );
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSProps::HandleCatalog, private
//
// Synopsis: Retrieve the initial value for the catalog values
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
void CMDSProps::HandleCatalog
(
VARIANT *pvValue
)
{
WCHAR wszCatalog[256] = L"";
ULONG cOut;
_xIPVerify->GetDefaultCatalog( wszCatalog, NUMELEM(wszCatalog), &cOut );
V_VT(pvValue) = VT_BSTR;
V_BSTR(pvValue) = SysAllocString(wszCatalog);
}
//
// CMSessProps methods
//
//+---------------------------------------------------------------------------
//
// Method: CMSessProps::GetDefaultValue, private
//
// Synopsis: Retrieve the initial value for a propid.
// DEVNOTE: Using the index from 0 to (GetCountofAvailPropSets-1)
// and an index of 0 to (GetCountofAvailPropidsInPropset-1)
// within that propertyset, return the correct information.
// NOTE: pVar shoudl be initialized prior to this routine.
//
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// CMSessProps::GetDefaultValue
// @mfunc Retrieve the initial value for the propids.
//
// @devnote Using the index from 0 to (GetCountofAvailPropSets - 1) and a index
// of 0 to (GetCountofAvailPropidsInPropSet - 1) within that property set return
// the correct information. NOTE: pVar should be initialized prior to this
// routine
//
// @rdesc SCODE indicating status
//
SCODE CMSessProps::GetDefaultValue
(
ULONG iCurSet,
DBPROPID dwPropId,
DWORD* pdwOption,
VARIANT* pvValue
)
{
Win4Assert( V_VT(pvValue) == VT_EMPTY );
switch( iCurSet )
{
case eid_DBPROPSET_SESSION:
switch( dwPropId )
{
case DBPROP_SESS_AUTOCOMMITISOLEVELS:
*pdwOption = DBPROPOPTIONS_REQUIRED;
V_VT(pvValue) = VT_I4;
V_I4(pvValue) = DBPROPVAL_TI_BROWSE;
break;
default:
//Indicate that value is unknown
VariantClear(pvValue);
break;
}
break;
default:
// Invalid Property Set
Win4Assert( ! "Invalid property set in GetDefaultValue.");
return E_FAIL;
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMSessProps::IsValidValue, private
//
// Synopsis: Validate that the variant contains legal values for its
// particular type and for the particular PROPID in this propset
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMSessProps::IsValidValue
(
ULONG iCurSet,
DBPROP* pDBProp
)
{
switch(iCurSet)
{
case eid_SESS_AUTOCOMMITISOLEVELS:
switch( pDBProp->dwPropertyID )
{
case DBPROP_SESS_AUTOCOMMITISOLEVELS:
break;
default:
return S_FALSE;
}
break;
default:
return S_FALSE;
}
return S_OK; // Is valid
}
//+---------------------------------------------------------------------------
//
// Method: CMSessProps::InitAvailUPropSets, private
//
// Synopsis: Provide property set information to the base class
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMSessProps::InitAvailUPropSets
(
ULONG* pcUPropSet,
UPROPSET** ppUPropSet,
ULONG* pcElemPerSupported
)
{
Win4Assert( pcUPropSet && ppUPropSet);
Win4Assert( NUMELEM(s_rgdbPropSESS) == eid_SESS_PROPS_NUM );
*pcUPropSet = NUMELEM(s_rgSessPropSets);
*ppUPropSet = (UPROPSET*)s_rgSessPropSets;
*pcElemPerSupported = DWORDSNEEDEDPERSET;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMSessProps::InitUPropSetsSupported, private
//
// Synopsis: Build the required supported property bitmask for the property
// set supported by this class
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMSessProps::InitUPropSetsSupported
(
DWORD* rgdwSupported
)
{
Win4Assert( rgdwSupported );
// Initialize the bitmask to indicate all properties are supported
RtlFillMemory ( rgdwSupported,
DWORDSNEEDEDPERSET * NUMELEM(s_rgSessPropSets) * sizeof(DWORD),
0xFF);
return S_OK;
}
//
// CMDSPropInfo methods
//
//+---------------------------------------------------------------------------
//
// Method: CMDSPropInfo::InitAvailUPropSets, private
//
// Synopsis: Provide property set information to the base class
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSPropInfo::InitAvailUPropSets
(
ULONG* pcUPropSet,
UPROPSET** ppUPropSet,
ULONG* pcElemPerSupported
)
{
Win4Assert( pcUPropSet && ppUPropSet);
// The datasource info properties array should always match the DBPROP enum.
Win4Assert( NUMELEM(s_rgdbPropDSInfo) == eid_DSINFO_PROPS_NUM );
*pcUPropSet = NUMELEM(s_rgIDXPropertySets);
*ppUPropSet = (UPROPSET*)s_rgIDXPropertySets;
*pcElemPerSupported = DWORDSNEEDEDPERSET;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSPropInfo::InitUPropSetsSupported, private
//
// Synopsis: Build the required supported property bitmask for the property
// set supported by this class
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
SCODE CMDSPropInfo::InitUPropSetsSupported
(
DWORD* rgdwSupported
)
{
Win4Assert( rgdwSupported );
// Initialize the bitmask to indicate all properties are supported
RtlFillMemory ( rgdwSupported,
DWORDSNEEDEDPERSET * NUMELEM(s_rgIDXPropertySets) * sizeof(DWORD),
0xFF );
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Method: CMDSPropInfo::LoadDescription, private
//
// Synopsis: Load a property description string into a buffer.
//
// Returns: ULONG - Count of characters returned in the buffer
//
// Notes: Property descriptions are used in ADO programming. They
// should not be localized strings.
//
// History: 11-12-97 danleg Created from Monarch
//
//----------------------------------------------------------------------------
ULONG CMDSPropInfo::LoadDescription
(
LPCWSTR pwszDesc, //@parm IN | Description String
PWSTR pwszBuff, //@parm OUT | Temporary buffer
ULONG cchBuff //@parm IN | Count of characters buffer can hold
)
{
Win4Assert( pwszDesc && pwszBuff && cchBuff );
ULONG cchDesc = wcslen(pwszDesc);
if (cchDesc < cchBuff)
{
wcscpy(pwszBuff, pwszDesc);
}
else
{
pwszBuff[0] = L'\0';
cchDesc = 0;
}
return cchDesc;
}