// This is a part of the Active Template Library. // Copyright (C) Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Active Template Library Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Active Template Library product. #ifndef __ATLDB_H__ #define __ATLDB_H__ #pragma once #ifndef _ATL_NO_PRAGMA_WARNINGS #pragma warning (push) #pragma warning(disable: 4702) // unreachable code #pragma warning(disable: 4984) // if constexpr #endif //!_ATL_NO_PRAGMA_WARNINGS // OLE DB Provider Support // Interface Impl Classes // // Data Source Object // // -Mandatory Interfaces: // IDBCreateSession // IDBInitialize // IDBProperties // IPersist // // Session Object // // -Mandatory Interfaces: // IGetDataSource // IOpenRowset // ISessionProperties // // -Optional Interfaces: // IDBCreateCommand // IDBSchemaRowset // // Rowset Object // // -Mandatory Interfaces: // IAccessor // IColumnsInfo // IConvertType // IRowset // IRowsetInfo // // -Optional Interfaces: // IRowsetIdentity // // Command Object // // -Mandatory Interfaces: // ICommand) // IAccessor) // ICommandProperties // ICommandText - derives from ICommand // IColumnsInfo // IConvertType #include #if !defined(_ATL_USE_WINAPI_FAMILY_DESKTOP_APP) #error This file is not compatible with the current WINAPI_FAMILY #endif #include #include #include #include #include #include #include // true_type, false_type, void_t #pragma warning(disable: 4244) #pragma warning(disable: 4984) // if constexpr #include <__atlmfc_core.h> #pragma warning(push) #pragma warning(disable : _ATLMFC_DISABLED_WARNINGS) #pragma pack(push,_ATL_PACKING) namespace ATL { inline DBROWCOUNT AbsVal(_In_ DBROWCOUNT val) { if( val < 0 ) return -val; else return val; } /* Function detection for Fire_OnFieldChange. Signature is: HRESULT Fire_OnFieldChange( _Inout_ IRowset* pRowset, _In_ HROW hRow, _In_ DBORDINAL cColumns, _In_reads_(cColumns) DBORDINAL* rgColumns, _In_ DBREASON eReason, _In_ DBEVENTPHASE ePhase, _In_ BOOL fCantDeny) */ template struct _Has_Fire_OnFieldChange : ::std::false_type {}; template struct _Has_Fire_OnFieldChange().Fire_OnFieldChange( ::std::declval(), HROW{}, DBORDINAL{}, ::std::declval(), DBREASON{}, DBEVENTPHASE{}, BOOL{}))>> : ::std::true_type {}; #define _ATL_IF_EXISTS_FIRE_ON_FIELD_CHANGE if constexpr(_Has_Fire_OnFieldChange::value) /* Function detection for Fire_OnRowChange. Signature is: HRESULT Fire_OnRowChange( _Inout_ IRowset* pRowset, _In_ DBCOUNTITEM cRows, _In_reads_(cRows) const HROW rghRows[], _In_ DBREASON eReason, _In_ DBEVENTPHASE ePhase, _In_ BOOL fCantDeny) */ template struct _Has_Fire_OnRowChange : ::std::false_type {}; template struct _Has_Fire_OnRowChange().Fire_OnRowChange( ::std::declval(), DBCOUNTITEM{}, ::std::declval(), DBREASON{}, DBEVENTPHASE{}, BOOL{}))>> : ::std::true_type {}; #define _ATL_IF_EXISTS_FIRE_ON_ROW_CHANGE if constexpr(_Has_Fire_OnRowChange::value) /* Function detection for Fire_OnRowsetChange. Signature is: HRESULT Fire_OnRowsetChange( _Inout_ IRowset* pRowset, _In_ DBREASON eReason, _In_ DBEVENTPHASE ePhase, _In_ BOOL fCantDeny) */ template struct _Has_Fire_OnRowsetChange : ::std::false_type {}; template struct _Has_Fire_OnRowsetChange().Fire_OnRowsetChange( ::std::declval(), DBREASON{}, DBEVENTPHASE{}, BOOL{})) >> : ::std::true_type {}; #define _ATL_IF_EXISTS_FIRE_ON_ROWSET_CHANGE if constexpr(_Has_Fire_OnRowsetChange::value) /////////////////////////////////////////////////////////////////////////// // Forwards template class CUtlPropInfo; class CColumnIds; /////////////////////////////////////////////////////////////////////////// // Additional Property Flag needed internally const int DBPROPFLAGS_CHANGE = 0x40000000; /////////////////////////////////////////////////////////////////////////// // ATL Provider Property Definitions #define ATLDB_NO_STRING 0x01000011 // Arbitrary value for AtlDumpProperty /////////////////////////////////////////////////////////////////////////// // ATL Provider Property Debugging Support inline void WINAPI AtlDumpPropsetIID( _In_ REFIID iid, _In_ DWORD dwStatus) { USES_CONVERSION_EX; // Handle the most common ones TCHAR szPropertySetName[100]; if(InlineIsEqualGUID(iid, DBPROPSET_DATASOURCEALL)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_DATASOURCEALL -")); } else if(InlineIsEqualGUID(iid, DBPROPSET_DATASOURCEINFOALL)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_DATASOURCEINFOALL -")); } else if(InlineIsEqualGUID(iid, DBPROPSET_ROWSETALL)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_ROWSETALL -")); } else if(InlineIsEqualGUID(iid,DBPROPSET_DBINITALL)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_DBINITALL -")); } else if(InlineIsEqualGUID(iid,DBPROPSET_SESSIONALL)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_SESSIONALL -")); } if(InlineIsEqualGUID(iid, DBPROPSET_DATASOURCE)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_DATASOURCE -")); } else if(InlineIsEqualGUID(iid, DBPROPSET_DATASOURCEINFO)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_DATASOURCEINFO -")); } else if(InlineIsEqualGUID(iid, DBPROPSET_ROWSET)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_ROWSET -")); } else if(InlineIsEqualGUID(iid,DBPROPSET_DBINIT)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_DBINIT -")); } else if(InlineIsEqualGUID(iid,DBPROPSET_SESSION)) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName),_T("DBPROPSET_SESSION -")); } else { LPOLESTR lpszName = NULL; if (SUCCEEDED(StringFromCLSID(iid, &lpszName))) { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName), SAL_Assume_notnull_for_opt_z_(OLE2T_EX(lpszName, _ATL_SAFE_ALLOCA_DEF_THRESHOLD))); } else { Checked::tcscpy_s(szPropertySetName, _countof(szPropertySetName), _T("Unknown DBPROPSET -")); } } if (dwStatus & 0x04 /* GETPROP_ERRORSOCCURRED */) { Checked::tcscat_s(szPropertySetName, _countof(szPropertySetName), _T(" NOT FOUND\n")); } else { Checked::tcscat_s(szPropertySetName, _countof(szPropertySetName), _T(" FOUND\n")); } OutputDebugString(szPropertySetName); } inline void WINAPI AtlDumpProperty( _In_ DWORD dwPropertyID, _In_ DWORD dwStatus) { TCHAR szProperty[100]; TCHAR szStatus[24]; switch(dwStatus) { case DBPROPSTATUS_OK: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("FOUND")); break; case DBPROPSTATUS_NOTSUPPORTED: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("NOT SUPPORTED")); break; case DBPROPSTATUS_BADVALUE: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("BAD VALUE")); break; case DBPROPSTATUS_BADOPTION: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("BAD OPTION")); break; case DBPROPSTATUS_BADCOLUMN: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("BAD COLUMN")); break; case DBPROPSTATUS_NOTALLSETTABLE: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("NOT ALL SETTABLE")); break; case DBPROPSTATUS_NOTSETTABLE: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("NOT SETTABLE")); break; case DBPROPSTATUS_NOTSET: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("NOT SET")); break; case DBPROPSTATUS_CONFLICTING: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("CONFLICTED")); break; case ATLDB_NO_STRING: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("WARNING! NO RESOURCE STRING FOR THIS PROPERTY! ADD IDS_")); break; default: Checked::tcscpy_s(szStatus, _countof(szStatus), _T("INDETERMINATE")); break; } #pragma warning(push) #pragma warning(disable: 6271) _stprintf_s(szProperty, _countof(szProperty), _T("Property 0x%lxL -- %Ts\n"), dwPropertyID, szStatus); #pragma warning(pop) OutputDebugString(szProperty); } /////////////////////////////////////////////////////////////////////////// // Defines for debugging properties #ifdef _ATL_DEBUG_PROVIDER_PROPS #define _ATLDUMPPROPSETIID(iid, dwStatus) AtlDumpPropsetIID(iid, dwStatus) #define _ATLDUMPPROPERTY(dwPropertyID, dwStatus) AtlDumpProperty(dwPropertyID, dwStatus) #else #define _ATLDUMPPROPSETIID(iid, dwStatus) #define _ATLDUMPPROPERTY(dwPropertyID, dwStatus) #endif // _ATL_DEBUG_PROVIDER_PROPS // ------------- STRUCTURE DEFINITIONS ----------------------------------- struct UPROPVAL { DBPROPOPTIONS dwOption; CColumnIds* pCColumnIds; DWORD dwFlags; VARIANT vValue; }; struct UPROPINFO { DBPROPID dwPropId; ULONG ulIDS; VARTYPE VarType; DBPROPFLAGS dwFlags; union { DWORD_PTR dwVal; LPOLESTR szVal; }; DBPROPOPTIONS dwOption; }; struct UPROP { ULONG cPropIds; UPROPINFO** rgpUPropInfo; UPROPVAL* pUPropVal; }; struct PROPCOLID { DBID dbidProperty; // The column id information DBPROPOPTIONS dwOption; VARIANT vValue; }; typedef PROPCOLID* PPROPCOLID; struct UPROPSET { const GUID* pPropSet; ULONG cUPropInfo; UPROPINFO* pUPropInfo; DWORD dwFlags; bool bIsChained; }; struct ATLBINDINGS { DBBINDING* pBindings; DWORD dwRef;//DBREFCOUNT dwRef; DBCOUNTITEM cBindings; DBACCESSORFLAGS dwAccessorFlags; }; struct ATLCOLUMNINFO { LPOLESTR pwszName; ITypeInfo *pTypeInfo; DBORDINAL iOrdinal; DBCOLUMNFLAGS dwFlags; DBLENGTH ulColumnSize; DBTYPE wType; BYTE bPrecision; BYTE bScale; DBID columnid; DBBYTEOFFSET cbOffset; }; // // The following very large sections of defines are to implement auto determination // of Property map constants based on a stringized prop name. There is one set for // Type (VT_), one for Init Value, and one for Property flags. // #define ABORTPRESERVE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define ACTIVESESSIONS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define APPENDONLY_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define ASYNCTXNABORT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define ASYNCTXNCOMMIT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define AUTH_CACHE_AUTHINFO_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_ENCRYPT_PASSWORD_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_INTEGRATED_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_MASK_PASSWORD_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_PASSWORD_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_PERSIST_ENCRYPTED_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_PERSIST_SENSITIVE_AUTHINFO_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define AUTH_USERID_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define BLOCKINGSTORAGEOBJECTS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define BOOKMARKS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define BOOKMARKSKIPPED_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define BOOKMARKTYPE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define BYREFACCESSORS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define CACHEDEFERRED_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define CANFETCHBACKWARDS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define CANHOLDROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define CANSCROLLBACKWARDS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define CATALOGLOCATION_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define CATALOGTERM_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define CATALOGUSAGE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define CHANGEINSERTEDROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_CHANGE ) #define COL_AUTOINCREMENT_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_DEFAULT_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_DESCRIPTION_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_FIXEDLENGTH_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_NULLABLE_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_PRIMARYKEY_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_UNIQUE_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COLUMNDEFINITION_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define COLUMNRESTRICT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define COMMANDTIMEOUT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COMMITPRESERVE_Flags ( DBPROPFLAGS_ROWSET| DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define CONCATNULLBEHAVIOR_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define CURRENTCATALOG_Flags ( DBPROPFLAGS_DATASOURCE | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define DATASOURCENAME_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define DATASOURCEREADONLY_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define DBMSNAME_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define DBMSVER_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define DEFERRED_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define DELAYSTORAGEOBJECTS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define DSOTHREADMODEL_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define GROUPBY_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define HETEROGENEOUSTABLES_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define IAccessor_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IColumnsInfo_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IColumnsRowset_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IConnectionPointContainer_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define IConvertType_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IRowset_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IRowsetChange_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowsetIdentity_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IRowsetIndex_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IRowsetInfo_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IRowsetLocate_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define IRowsetResynch_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IRowsetScroll_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define IRowsetUpdate_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define ISupportErrorInfo_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define ILockBytes_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define ISequentialStream_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IStorage_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IStream_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IDENTIFIERCASE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define IMMOBILEROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_AUTOUPDATE_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_CLUSTERED_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_FILLFACTOR_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_INITIALSIZE_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_NULLCOLLATION_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_NULLS_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_PRIMARYKEY_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_SORTBOOKMARKS_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_TEMPINDEX_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_TYPE_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INDEX_UNIQUE_Flags ( DBPROPFLAGS_INDEX | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_DATASOURCE_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_HWND_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_IMPERSONATION_LEVEL_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_LCID_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_LOCATION_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_MODE_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_PROMPT_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_PROTECTION_LEVEL_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_PROVIDERSTRING_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_TIMEOUT_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define LITERALBOOKMARKS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define LITERALIDENTITY_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MAXINDEXSIZE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MAXOPENROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define MAXPENDINGROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define MAXROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define MAXROWSIZE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MAXROWSIZEINCLUDESBLOB_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MAXTABLESINSELECT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MAYWRITECOLUMN_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define MEMORYUSAGE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define MULTIPLEPARAMSETS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MULTIPLERESULTS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MULTIPLESTORAGEOBJECTS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MULTITABLEUPDATE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define NOTIFICATIONGRANULARITY_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define NOTIFICATIONPHASES_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYCOLUMNSET_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWDELETE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWFIRSTCHANGE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWINSERT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWRESYNCH_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWSETRELEASE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWSETFETCHPOSITIONCHANGE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWUNDOCHANGE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWUNDODELETE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWUNDOINSERT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NOTIFYROWUPDATE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define NULLCOLLATION_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define OLEOBJECTS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define ORDERBYCOLUMNSINSELECT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define ORDEREDBOOKMARKS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define OTHERINSERT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define OTHERUPDATEDELETE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define OUTPUTPARAMETERAVAILABILITY_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define OWNINSERT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define OWNUPDATEDELETE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define PERSISTENTIDTYPE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define PREPAREABORTBEHAVIOR_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define PREPARECOMMITBEHAVIOR_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define PROCEDURETERM_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define PROVIDERNAME_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define PROVIDEROLEDBVER_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define PROVIDERVER_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define QUICKRESTART_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define QUOTEDIDENTIFIERCASE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define REENTRANTEVENTS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define REMOVEDELETED_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define REPORTMULTIPLECHANGES_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_CHANGE ) #define RETURNPENDINGINSERTS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define ROWRESTRICT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define ROWSETCONVERSIONSONCOMMAND_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define ROWTHREADMODEL_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define SCHEMATERM_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SCHEMAUSAGE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SERVERCURSOR_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define SESS_AUTOCOMMITISOLEVELS_Flags ( DBPROPFLAGS_SESSION | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define SQLSUPPORT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define STRONGIDENTITY_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define STRUCTUREDSTORAGE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SUBQUERIES_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SUPPORTEDTXNDDL_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SUPPORTEDTXNISOLEVELS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SUPPORTEDTXNISORETAIN_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define TABLETERM_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define TBL_TEMPTABLE_Flags ( DBPROPFLAGS_TABLE | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define TRANSACTEDOBJECT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define UPDATABILITY_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define USERNAME_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) // 1.5 #define FILTERCOMPAREOPS_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ ) #define FINDCOMPAREOPS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define IChapteredRowset_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IDBAsynchStatus_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowsetFind_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowsetView_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IViewChapter_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IViewFilter_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IViewRowset_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IViewSort_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_ASYNCH_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define MAXOPENCHAPTERS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MAXORSINFILTER_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ ) #define MAXSORTCOLUMNS_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ ) #define ROWSET_ASYNCH_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define SORTONINDEX_Flags ( DBPROPFLAGS_VIEW | DBPROPFLAGS_READ ) // 2.0 #define IMultipleResults_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define DATASOURCE_TYPE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) //MDPROP #define AXES_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define FLATTENING_SUPPORT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_JOINCUBES_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define NAMED_LEVELS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) //#define RANGEROWSET_Flags ( ) #define MDX_SLICER_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) //#define MDX_CUBEQUALIFICATION_Flags ( ) #define MDX_OUTERREFERENCE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_QUERYBYPROPERTY_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_CASESUPPORT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_STRING_COMPOP_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_DESCFLAGS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_SET_FUNCTIONS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_MEMBER_FUNCTIONS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_NUMERIC_FUNCTIONS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_FORMULAS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define AGGREGATECELL_UPDATE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) //#define MDX_AGGREGATECELL_UPDATE_Flags ( ) #define MDX_OBJQUALIFICATION_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define MDX_NONMEASURE_EXPRESSONS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) // DBPROP #define ACCESSORDER_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define BOOKMARKINFO_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define INIT_CATALOG_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define ROW_BULKOPS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) //!!! #define PROVIDERFRIENDLYNAME_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define LOCKMODE_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define MULTIPLECONNECTIONS_Flags ( DBPROPFLAGS_DATASOURCE | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define UNIQUEROWS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define SERVERDATAONINSERT_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) //#define STORAGEFLAGS_Flags ( ) #define CONNECTIONSTATUS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define ALTERCOLUMN_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define COLUMNLCID_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ ) #define RESETDATASOURCE_Flags ( DBPROPFLAGS_DATASOURCE | DBPROPFLAGS_WRITE ) #define INIT_OLEDBSERVICES_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowsetRefresh_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define SERVERNAME_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define IParentRowset_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define HIDDENCOLUMNS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ ) #define PROVIDERMEMORY_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define CLIENTCURSOR_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) // 2.1 #define TRUSTEE_USERNAME_Flags ( DBPROPFLAGS_TRUSTEE | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define TRUSTEE_AUTHENTICATION_Flags ( DBPROPFLAGS_TRUSTEE | DBPROPFLAGS_WRITE ) #define TRUSTEE_NEWAUTHENTICATION_Flags ( DBPROPFLAGS_TRUSTEE | DBPROPFLAGS_WRITE ) #define IRow_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowChange_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowSchemaChange_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IGetRow_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IScopedOperations_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IBindResource_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define ICreateRow_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_BINDFLAGS_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_LOCKOWNER_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define GENERATEURL_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) //#define IDBBinderProperties_Flags ( ) #define IColumnsInfo2_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) //#define IRegisterProvider_Flags ( ) #define IGetSession_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IGetSourceRow_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowsetCurrentIndex_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define OPENROWSETSUPPORT_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define COL_ISLONG_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) // 2.5 #define COL_SEED_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COL_INCREMENT_Flags ( DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define INIT_GENERALTIMEOUT_Flags ( DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define COMSERVICES_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) // 2.6 #define OUTPUTSTREAM_Flags ( DBPROPFLAGS_STREAM | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define OUTPUTENCODING_Flags ( DBPROPFLAGS_STREAM | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define TABLESTATISTICS_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ ) #define SKIPROWCOUNTRESULTS_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define IRowsetBookmark_Flags ( DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE ) #define VISUALMODE_Flags ( DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_WRITE ) #define ABORTPRESERVE_Type VT_BOOL #define ACTIVESESSIONS_Type VT_I4 #define APPENDONLY_Type VT_BOOL #define ASYNCTXNABORT_Type VT_BOOL #define ASYNCTXNCOMMIT_Type VT_BOOL #define AUTH_CACHE_AUTHINFO_Type VT_BOOL #define AUTH_ENCRYPT_PASSWORD_Type VT_BOOL #define AUTH_INTEGRATED_Type VT_BSTR #define AUTH_MASK_PASSWORD_Type VT_BOOL #define AUTH_PASSWORD_Type VT_BSTR #define AUTH_PERSIST_ENCRYPTED_Type VT_BOOL #define AUTH_PERSIST_SENSITIVE_AUTHINFO_Type VT_BOOL #define AUTH_USERID_Type VT_BSTR #define BLOCKINGSTORAGEOBJECTS_Type VT_BOOL #define BOOKMARKS_Type VT_BOOL #define BOOKMARKSKIPPED_Type VT_BOOL #define BOOKMARKTYPE_Type VT_I4 #define BYREFACCESSORS_Type VT_BOOL #define CACHEDEFERRED_Type VT_BOOL #define CANFETCHBACKWARDS_Type VT_BOOL #define CANHOLDROWS_Type VT_BOOL #define CANSCROLLBACKWARDS_Type VT_BOOL #define CATALOGLOCATION_Type VT_I4 #define CATALOGTERM_Type VT_BSTR #define CATALOGUSAGE_Type VT_I4 #define CHANGEINSERTEDROWS_Type VT_BOOL #define COL_AUTOINCREMENT_Type VT_BOOL #define COL_DEFAULT_Type VT_BSTR #define COL_DESCRIPTION_Type VT_BSTR #define COL_FIXEDLENGTH_Type VT_BOOL #define COL_NULLABLE_Type VT_BOOL #define COL_PRIMARYKEY_Type VT_BOOL #define COL_UNIQUE_Type VT_BOOL #define COLUMNDEFINITION_Type VT_I4 #define COLUMNRESTRICT_Type VT_BOOL #define COMMANDTIMEOUT_Type VT_I4 #define COMMITPRESERVE_Type VT_BOOL #define CONCATNULLBEHAVIOR_Type VT_I4 #define CURRENTCATALOG_Type VT_BSTR #define DATASOURCENAME_Type VT_BSTR #define DATASOURCEREADONLY_Type VT_BOOL #define DBMSNAME_Type VT_BSTR #define DBMSVER_Type VT_BSTR #define DEFERRED_Type VT_BOOL #define DELAYSTORAGEOBJECTS_Type VT_BOOL #define DSOTHREADMODEL_Type VT_I4 #define GROUPBY_Type VT_I4 #define HETEROGENEOUSTABLES_Type VT_I4 #define IAccessor_Type VT_BOOL #define IColumnsInfo_Type VT_BOOL #define IColumnsRowset_Type VT_BOOL #define IConnectionPointContainer_Type VT_BOOL #define IConvertType_Type VT_BOOL #define IRowset_Type VT_BOOL #define IRowsetChange_Type VT_BOOL #define IRowsetIdentity_Type VT_BOOL #define IRowsetIndex_Type VT_BOOL #define IRowsetInfo_Type VT_BOOL #define IRowsetLocate_Type VT_BOOL #define IRowsetResynch_Type VT_BOOL #define IRowsetScroll_Type VT_BOOL #define IRowsetUpdate_Type VT_BOOL #define ISupportErrorInfo_Type VT_BOOL #define ILockBytes_Type VT_BOOL #define ISequentialStream_Type VT_BOOL #define IStorage_Type VT_BOOL #define IStream_Type VT_BOOL #define IDENTIFIERCASE_Type VT_I4 #define IMMOBILEROWS_Type VT_BOOL #define INDEX_AUTOUPDATE_Type VT_BOOL #define INDEX_CLUSTERED_Type VT_BOOL #define INDEX_FILLFACTOR_Type VT_I4 #define INDEX_INITIALSIZE_Type VT_I4 #define INDEX_NULLCOLLATION_Type VT_I4 #define INDEX_NULLS_Type VT_I4 #define INDEX_PRIMARYKEY_Type VT_BOOL #define INDEX_SORTBOOKMARKS_Type VT_BOOL #define INDEX_TEMPINDEX_Type VT_BOOL #define INDEX_TYPE_Type VT_I4 #define INDEX_UNIQUE_Type VT_BOOL #define INIT_DATASOURCE_Type VT_BSTR #ifdef _WIN64 #define INIT_HWND_Type VT_I8 #else #define INIT_HWND_Type VT_I4 #endif #define INIT_IMPERSONATION_LEVEL_Type VT_I4 #define INIT_LCID_Type VT_I4 #define INIT_LOCATION_Type VT_BSTR #define INIT_MODE_Type VT_I4 #define INIT_PROMPT_Type VT_I2 #define INIT_PROTECTION_LEVEL_Type VT_I4 #define INIT_PROVIDERSTRING_Type VT_BSTR #define INIT_TIMEOUT_Type VT_I4 #define LITERALBOOKMARKS_Type VT_BOOL #define LITERALIDENTITY_Type VT_BOOL #define MAXINDEXSIZE_Type VT_I4 #define MAXOPENROWS_Type VT_I4 #define MAXPENDINGROWS_Type VT_I4 #define MAXROWS_Type VT_I4 #define MAXROWSIZE_Type VT_I4 #define MAXROWSIZEINCLUDESBLOB_Type VT_BOOL #define MAXTABLESINSELECT_Type VT_I4 #define MAYWRITECOLUMN_Type VT_BOOL #define MEMORYUSAGE_Type VT_I4 #define MULTIPLEPARAMSETS_Type VT_BOOL #define MULTIPLERESULTS_Type VT_I4 #define MULTIPLESTORAGEOBJECTS_Type VT_BOOL #define MULTITABLEUPDATE_Type VT_BOOL #define NOTIFICATIONGRANULARITY_Type VT_I4 #define NOTIFICATIONPHASES_Type VT_I4 #define NOTIFYCOLUMNSET_Type VT_I4 #define NOTIFYROWDELETE_Type VT_I4 #define NOTIFYROWFIRSTCHANGE_Type VT_I4 #define NOTIFYROWINSERT_Type VT_I4 #define NOTIFYROWRESYNCH_Type VT_I4 #define NOTIFYROWSETRELEASE_Type VT_I4 #define NOTIFYROWSETFETCHPOSITIONCHANGE_Type VT_I4 #define NOTIFYROWUNDOCHANGE_Type VT_I4 #define NOTIFYROWUNDODELETE_Type VT_I4 #define NOTIFYROWUNDOINSERT_Type VT_I4 #define NOTIFYROWUPDATE_Type VT_I4 #define NULLCOLLATION_Type VT_I4 #define OLEOBJECTS_Type VT_I4 #define ORDERBYCOLUMNSINSELECT_Type VT_BOOL #define ORDEREDBOOKMARKS_Type VT_BOOL #define OTHERINSERT_Type VT_BOOL #define OTHERUPDATEDELETE_Type VT_BOOL #define OUTPUTPARAMETERAVAILABILITY_Type VT_I4 #define OWNINSERT_Type VT_BOOL #define OWNUPDATEDELETE_Type VT_BOOL #define PERSISTENTIDTYPE_Type VT_I4 #define PREPAREABORTBEHAVIOR_Type VT_I4 #define PREPARECOMMITBEHAVIOR_Type VT_I4 #define PROCEDURETERM_Type VT_BSTR #define PROVIDERNAME_Type VT_BSTR #define PROVIDEROLEDBVER_Type VT_BSTR #define PROVIDERVER_Type VT_BSTR #define QUICKRESTART_Type VT_BOOL #define QUOTEDIDENTIFIERCASE_Type VT_I4 #define REENTRANTEVENTS_Type VT_BOOL #define REMOVEDELETED_Type VT_BOOL #define REPORTMULTIPLECHANGES_Type VT_BOOL #define RETURNPENDINGINSERTS_Type VT_BOOL #define ROWRESTRICT_Type VT_BOOL #define ROWSETCONVERSIONSONCOMMAND_Type VT_BOOL #define ROWTHREADMODEL_Type VT_I4 #define SCHEMATERM_Type VT_BSTR #define SCHEMAUSAGE_Type VT_I4 #define SERVERCURSOR_Type VT_BOOL #define SESS_AUTOCOMMITISOLEVELS_Type VT_I4 #define SQLSUPPORT_Type VT_I4 #define STRONGIDENTITY_Type VT_BOOL #define STRUCTUREDSTORAGE_Type VT_I4 #define SUBQUERIES_Type VT_I4 #define SUPPORTEDTXNDDL_Type VT_I4 #define SUPPORTEDTXNISOLEVELS_Type VT_I4 #define SUPPORTEDTXNISORETAIN_Type VT_I4 #define TABLETERM_Type VT_BSTR #define TBL_TEMPTABLE_Type VT_BOOL #define TRANSACTEDOBJECT_Type VT_BOOL #define UPDATABILITY_Type VT_I4 #define USERNAME_Type VT_BSTR // 1.5 #define FILTERCOMPAREOPS_Type VT_I4 #define FINDCOMPAREOPS_Type VT_I4 #define IChapteredRowset_Type VT_BOOL #define IDBAsynchStatus_Type VT_BOOL #define IRowsetFind_Type VT_BOOL #define IRowsetView_Type VT_BOOL #define IViewChapter_Type VT_BOOL #define IViewFilter_Type VT_BOOL #define IViewRowset_Type VT_BOOL #define IViewSort_Type VT_BOOL #define INIT_ASYNCH_Type VT_I4 #define MAXOPENCHAPTERS_Type VT_I4 #define MAXORSINFILTER_Type VT_I4 #define MAXSORTCOLUMNS_Type VT_I4 #define ROWSET_ASYNCH_Type VT_I4 #define SORTONINDEX_Type VT_BOOL // 2.0 #define IMultipleResults_Flags_Type VT_BOOL #define DATASOURCE_TYPE_Flags_Type VT_I4 //MDPROP #define AXES_Type VT_I4 #define FLATTENING_SUPPORT_Type VT_I4 #define MDX_JOINCUBES_Type VT_I4 #define NAMED_LEVELS_Type VT_I4 //#define RANGEROWSET_Type #define MDX_SLICER_Type VT_I4 //#define MDX_CUBEQUALIFICATION_Type #define MDX_OUTERREFERENCE_Type VT_I4 #define MDX_QUERYBYPROPERTY_Type VT_BOOL #define MDX_CASESUPPORT_Type VT_I4 #define MDX_STRING_COMPOP_Type VT_I4 #define MDX_DESCFLAGS_Type VT_I4 #define MDX_SET_FUNCTIONS_Type VT_I4 #define MDX_MEMBER_FUNCTIONS_Type VT_I4 #define MDX_NUMERIC_FUNCTIONS_Type VT_I4 #define MDX_FORMULAS_Type VT_I4 #define AGGREGATECELL_UPDATE_Type VT_I4 //#define MDX_AGGREGATECELL_UPDATE_Type #define MDX_OBJQUALIFICATION_Type VT_I4 #define MDX_NONMEASURE_EXPRESSONS_Type VT_I4 // DBPROP #define ACCESSORDER_Type VT_I4 #define BOOKMARKINFO_Type VT_I4 #define INIT_CATALOG_Type VT_BSTR #define ROW_BULKOPS_Type VT_I4 #define PROVIDERFRIENDLYNAME_Type VT_BSTR #define LOCKMODE_Type VT_I4 #define MULTIPLECONNECTIONS_Type VT_BOOL #define UNIQUEROWS_Type VT_BOOL #define SERVERDATAONINSERT_Type VT_BOOL //#define STORAGEFLAGS_Type #define CONNECTIONSTATUS_Type VT_I4 #define ALTERCOLUMN_Type VT_I4 #define COLUMNLCID_Type VT_I4 #define RESETDATASOURCE_Type VT_I4 #define INIT_OLEDBSERVICES_Type VT_I4 #define IRowsetRefresh_Type VT_BOOL #define SERVERNAME_Type VT_BSTR #define IParentRowset_Type VT_BOOL #define HIDDENCOLUMNS_Type VT_I4 #define PROVIDERMEMORY_Type VT_BOOL #define CLIENTCURSOR_Type VT_BOOL // 2.1 #define TRUSTEE_USERNAME_Type VT_BSTR #define TRUSTEE_AUTHENTICATION_Type VT_BSTR #define TRUSTEE_NEWAUTHENTICATION_Type VT_BSTR #define IRow_Type VT_BOOL #define IRowChange_Type VT_BOOL #define IRowSchemaChange_Type VT_BOOL #define IGetRow_Type VT_BOOL #define IScopedOperations_Type VT_BOOL #define IBindResource_Type VT_BOOL #define ICreateRow_Type VT_BOOL #define INIT_BINDFLAGS_Type VT_I4 #define INIT_LOCKOWNER_Type VT_BSTR #define GENERATEURL_Type VT_I4 //#define IDBBinderProperties_Type #define IColumnsInfo2_Type VT_BOOL //#define IRegisterProvider_Type #define IGetSession_Type VT_BOOL #define IGetSourceRow_Type VT_BOOL #define IRowsetCurrentIndex_Type VT_BOOL #define OPENROWSETSUPPORT_Type VT_I4 #define COL_ISLONG_Type VT_BOOL // 2.5 //#define COL_SEED_Type VT_VARIANT //!!! //#define COL_INCREMENT_Type VT_VARIANT //!!! #define INIT_GENERALTIMEOUT_Type VT_I4 #define COMSERVICES_Type VT_I4 // 2.6 #define OUTPUTSTREAM_Type VT_UNKNOWN #define OUTPUTENCODING_Type VT_BSTR #define TABLESTATISTICS_Type VT_I4 #define SKIPROWCOUNTRESULTS_Type VT_BOOL #define IRowsetBookmark_Type VT_BOOL #define VISUALMODE_Type VT_I4 #define ABORTPRESERVE_Value ATL_VARIANT_FALSE #define ACTIVESESSIONS_Value 0 #define APPENDONLY_Value ATL_VARIANT_FALSE #define ASYNCTXNABORT_Value ATL_VARIANT_FALSE #define ASYNCTXNCOMMIT_Value ATL_VARIANT_FALSE #define AUTH_CACHE_AUTHINFO_Value ATL_VARIANT_FALSE #define AUTH_ENCRYPT_PASSWORD_Value ATL_VARIANT_FALSE #define AUTH_INTEGRATED_Value OLESTR("") #define AUTH_MASK_PASSWORD_Value ATL_VARIANT_FALSE #define AUTH_PASSWORD_Value OLESTR("") #define AUTH_PERSIST_ENCRYPTED_Value ATL_VARIANT_FALSE #define AUTH_PERSIST_SENSITIVE_AUTHINFO_Value ATL_VARIANT_FALSE #define AUTH_USERID_Value OLESTR("") #define BLOCKINGSTORAGEOBJECTS_Value ATL_VARIANT_FALSE #define BOOKMARKS_Value ATL_VARIANT_FALSE #define BOOKMARKSKIPPED_Value ATL_VARIANT_FALSE #define BOOKMARKTYPE_Value 0 #define BYREFACCESSORS_Value ATL_VARIANT_FALSE #define CACHEDEFERRED_Value ATL_VARIANT_FALSE #define CANFETCHBACKWARDS_Value ATL_VARIANT_TRUE #define CANHOLDROWS_Value ATL_VARIANT_TRUE #define CANSCROLLBACKWARDS_Value ATL_VARIANT_TRUE #define CATALOGLOCATION_Value 0 #define CATALOGTERM_Value OLESTR("") #define CATALOGUSAGE_Value 0 #define CHANGEINSERTEDROWS_Value ATL_VARIANT_FALSE #define COL_AUTOINCREMENT_Value ATL_VARIANT_FALSE #define COL_DEFAULT_Value OLESTR("") #define COL_DESCRIPTION_Value OLESTR("") #define COL_FIXEDLENGTH_Value ATL_VARIANT_FALSE #define COL_NULLABLE_Value ATL_VARIANT_FALSE #define COL_PRIMARYKEY_Value ATL_VARIANT_FALSE #define COL_UNIQUE_Value ATL_VARIANT_FALSE #define COLUMNDEFINITION_Value 0 #define COLUMNRESTRICT_Value ATL_VARIANT_FALSE #define COMMANDTIMEOUT_Value 0 #define COMMITPRESERVE_Value ATL_VARIANT_FALSE #define CONCATNULLBEHAVIOR_Value 0 #define CURRENTCATALOG_Value OLESTR("") #define DATASOURCENAME_Value OLESTR("") #define DATASOURCEREADONLY_Value ATL_VARIANT_TRUE #define DBMSNAME_Value OLESTR("") #define DBMSVER_Value OLESTR("") #define DEFERRED_Value ATL_VARIANT_FALSE #define DELAYSTORAGEOBJECTS_Value ATL_VARIANT_FALSE #define DSOTHREADMODEL_Value DBPROPVAL_RT_APTMTTHREAD #define GROUPBY_Value 0 #define HETEROGENEOUSTABLES_Value 0 #define IAccessor_Value ATL_VARIANT_TRUE #define IColumnsInfo_Value ATL_VARIANT_TRUE #define IColumnsRowset_Value ATL_VARIANT_FALSE #define IConnectionPointContainer_Value ATL_VARIANT_FALSE #define IConvertType_Value ATL_VARIANT_TRUE #define IRowset_Value ATL_VARIANT_TRUE #define IRowsetChange_Value ATL_VARIANT_FALSE #define IRowsetIdentity_Value ATL_VARIANT_TRUE #define IRowsetIndex_Value ATL_VARIANT_FALSE #define IRowsetInfo_Value ATL_VARIANT_TRUE #define IRowsetLocate_Value ATL_VARIANT_FALSE #define IRowsetResynch_Value ATL_VARIANT_FALSE #define IRowsetScroll_Value ATL_VARIANT_FALSE #define IRowsetUpdate_Value ATL_VARIANT_FALSE #define ISupportErrorInfo_Value ATL_VARIANT_FALSE #define ILockBytes_Value ATL_VARIANT_FALSE #define ISequentialStream_Value ATL_VARIANT_FALSE #define IStorage_Value ATL_VARIANT_FALSE #define IStream_Value ATL_VARIANT_FALSE #define IDENTIFIERCASE_Value 0 #define IMMOBILEROWS_Value ATL_VARIANT_FALSE #define INDEX_AUTOUPDATE_Value ATL_VARIANT_FALSE #define INDEX_CLUSTERED_Value ATL_VARIANT_FALSE #define INDEX_FILLFACTOR_Value 0 #define INDEX_INITIALSIZE_Value 0 #define INDEX_NULLCOLLATION_Value 0 #define INDEX_NULLS_Value 0 #define INDEX_PRIMARYKEY_Value ATL_VARIANT_FALSE #define INDEX_SORTBOOKMARKS_Value ATL_VARIANT_FALSE #define INDEX_TEMPINDEX_Value ATL_VARIANT_FALSE #define INDEX_TYPE_Value 0 #define INDEX_UNIQUE_Value ATL_VARIANT_FALSE #define INIT_DATASOURCE_Value OLESTR("") #define INIT_HWND_Value 0 #define INIT_IMPERSONATION_LEVEL_Value 0 #define INIT_LCID_Value 0 #define INIT_LOCATION_Value OLESTR("") #define INIT_MODE_Value DB_MODE_READ #define INIT_PROMPT_Value DBPROMPT_NOPROMPT #define INIT_PROTECTION_LEVEL_Value 0 #define INIT_PROVIDERSTRING_Value OLESTR("") #define INIT_TIMEOUT_Value 0 #define LITERALBOOKMARKS_Value ATL_VARIANT_FALSE #define LITERALIDENTITY_Value ATL_VARIANT_FALSE #define MAXINDEXSIZE_Value 0 #define MAXOPENROWS_Value 0 #define MAXPENDINGROWS_Value 0 #define MAXROWS_Value 0 #define MAXROWSIZE_Value 0 #define MAXROWSIZEINCLUDESBLOB_Value ATL_VARIANT_FALSE #define MAXTABLESINSELECT_Value 0 #define MAYWRITECOLUMN_Value ATL_VARIANT_FALSE #define MEMORYUSAGE_Value 0 #define MULTIPLEPARAMSETS_Value ATL_VARIANT_FALSE #define MULTIPLERESULTS_Value 0 #define MULTIPLESTORAGEOBJECTS_Value ATL_VARIANT_FALSE #define MULTITABLEUPDATE_Value ATL_VARIANT_FALSE #define NOTIFICATIONGRANULARITY_Value DBPROPVAL_NT_SINGLEROW #define NOTIFICATIONPHASES_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER | DBPROPVAL_NP_FAILEDTODO | DBPROPVAL_NP_DIDEVENT #define NOTIFYCOLUMNSET_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWDELETE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWFIRSTCHANGE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWINSERT_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWRESYNCH_Value 0 #define NOTIFYROWSETRELEASE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWSETFETCHPOSITIONCHANGE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWUNDOCHANGE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWUNDODELETE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWUNDOINSERT_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NOTIFYROWUPDATE_Value DBPROPVAL_NP_OKTODO | DBPROPVAL_NP_ABOUTTODO | DBPROPVAL_NP_SYNCHAFTER #define NULLCOLLATION_Value 0 #define OLEOBJECTS_Value 0 #define ORDERBYCOLUMNSINSELECT_Value ATL_VARIANT_FALSE #define ORDEREDBOOKMARKS_Value ATL_VARIANT_FALSE #define OTHERINSERT_Value ATL_VARIANT_FALSE #define OTHERUPDATEDELETE_Value ATL_VARIANT_FALSE #define OUTPUTPARAMETERAVAILABILITY_Value 0 #define OWNINSERT_Value ATL_VARIANT_FALSE #define OWNUPDATEDELETE_Value ATL_VARIANT_FALSE #define PERSISTENTIDTYPE_Value 0 #define PREPAREABORTBEHAVIOR_Value 0 #define PREPARECOMMITBEHAVIOR_Value 0 #define PROCEDURETERM_Value OLESTR("") #define PROVIDERNAME_Value OLESTR("") #define PROVIDEROLEDBVER_Value OLESTR("02.60") #define PROVIDERVER_Value OLESTR("01.00") #define QUICKRESTART_Value ATL_VARIANT_FALSE #define QUOTEDIDENTIFIERCASE_Value 0 #define REENTRANTEVENTS_Value ATL_VARIANT_FALSE #define REMOVEDELETED_Value ATL_VARIANT_FALSE #define REPORTMULTIPLECHANGES_Value ATL_VARIANT_FALSE #define RETURNPENDINGINSERTS_Value ATL_VARIANT_FALSE #define ROWRESTRICT_Value ATL_VARIANT_FALSE #define ROWSETCONVERSIONSONCOMMAND_Value ATL_VARIANT_TRUE #define ROWTHREADMODEL_Value 0 #define SCHEMATERM_Value OLESTR("") #define SCHEMAUSAGE_Value 0 #define SERVERCURSOR_Value ATL_VARIANT_FALSE #define SESS_AUTOCOMMITISOLEVELS_Value 0 #define SQLSUPPORT_Value 0 #define STRONGIDENTITY_Value ATL_VARIANT_FALSE #define STRUCTUREDSTORAGE_Value 0 #define SUBQUERIES_Value 0 #define SUPPORTEDTXNDDL_Value 0 #define SUPPORTEDTXNISOLEVELS_Value 0 #define SUPPORTEDTXNISORETAIN_Value 0 #define TABLETERM_Value OLESTR("") #define TBL_TEMPTABLE_Value ATL_VARIANT_FALSE #define TRANSACTEDOBJECT_Value ATL_VARIANT_FALSE #define UPDATABILITY_Value 0 #define USERNAME_Value OLESTR("") // 1.5 #define FILTERCOMPAREOPS_Value 0 #define FINDCOMPAREOPS_Value 0 #define IChapteredRowset_Value ATL_VARIANT_FALSE #define IDBAsynchStatus_Value ATL_VARIANT_FALSE #define IRowsetFind_Value ATL_VARIANT_FALSE #define IRowsetView_Value ATL_VARIANT_FALSE #define IViewChapter_Value ATL_VARIANT_FALSE #define IViewFilter_Value ATL_VARIANT_FALSE #define IViewRowset_Value ATL_VARIANT_FALSE #define IViewSort_Value ATL_VARIANT_FALSE #define INIT_ASYNCH_Value 0 #define MAXOPENCHAPTERS_Value 0 #define MAXORSINFILTER_Value 0 #define MAXSORTCOLUMNS_Value 0 #define ROWSET_ASYNCH_Value 0 #define SORTONINDEX_Value ATL_VARIANT_FALSE // 2.0 #define IMultipleResults_Value ATL_VARIANT_FALSE #define DATASOURCE_TYPE_Value 0 //MDPROP #define AXES_Value 0 #define FLATTENING_SUPPORT_Value 0 #define MDX_JOINCUBES_Value 0 #define NAMED_LEVELS_Value 0 //#define RANGEROWSET_Value 0 #define MDX_SLICER_Value 0 //#define MDX_CUBEQUALIFICATION_Value #define MDX_OUTERREFERENCE_Value 0 #define MDX_QUERYBYPROPERTY_Value ATL_VARIANT_FALSE #define MDX_CASESUPPORT_Value 0 #define MDX_STRING_COMPOP_Value 0 #define MDX_DESCFLAGS_Value 0 #define MDX_SET_FUNCTIONS_Value 0 #define MDX_MEMBER_FUNCTIONS_Value 0 #define MDX_NUMERIC_FUNCTIONS_Value 0 #define MDX_FORMULAS_Value 0 #define AGGREGATECELL_UPDATE_Value 0 //#define MDX_AGGREGATECELL_UPDATE_Value #define MDX_OBJQUALIFICATION_Value 0 #define MDX_NONMEASURE_EXPRESSONS_Value 0 // DBPROP #define ACCESSORDER_Value 0 #define BOOKMARKINFO_Value 0 #define INIT_CATALOG_Value OLESTR("") #define ROW_BULKOPS_Value 0 #define PROVIDERFRIENDLYNAME_Value OLESTR("") #define LOCKMODE_Value 0 #define MULTIPLECONNECTIONS_Value ATL_VARIANT_FALSE #define UNIQUEROWS_Value ATL_VARIANT_FALSE #define SERVERDATAONINSERT_Value ATL_VARIANT_FALSE //#define STORAGEFLAGS_Value #define CONNECTIONSTATUS_Value 0 #define ALTERCOLUMN_Value 0 #define COLUMNLCID_Value 0 #define RESETDATASOURCE_Value 0 #define INIT_OLEDBSERVICES_Value 0 #define IRowsetRefresh_Value ATL_VARIANT_FALSE #define SERVERNAME_Value OLESTR("") #define IParentRowset_Value ATL_VARIANT_FALSE #define HIDDENCOLUMNS_Value 0 #define PROVIDERMEMORY_Value ATL_VARIANT_FALSE #define CLIENTCURSOR_Value ATL_VARIANT_FALSE // 2.1 #define TRUSTEE_USERNAME_Value OLESTR("") #define TRUSTEE_AUTHENTICATION_Value OLESTR("") #define TRUSTEE_NEWAUTHENTICATION_Value OLESTR("") #define IRow_Value ATL_VARIANT_FALSE #define IRowChange_Value ATL_VARIANT_FALSE #define IRowSchemaChange_Value ATL_VARIANT_FALSE #define IGetRow_Value ATL_VARIANT_FALSE #define IScopedOperations_Value ATL_VARIANT_FALSE #define IBindResource_Value ATL_VARIANT_FALSE #define ICreateRow_Value ATL_VARIANT_FALSE #define INIT_BINDFLAGS_Value 0 #define INIT_LOCKOWNER_Value OLESTR("") #define GENERATEURL_Value 0 //#define IDBBinderProperties_Value #define IColumnsInfo2_Value ATL_VARIANT_FALSE //#define IRegisterProvider_Value #define IGetSession_Value ATL_VARIANT_FALSE #define IGetSourceRow_Value ATL_VARIANT_FALSE #define IRowsetCurrentIndex_Value ATL_VARIANT_FALSE #define OPENROWSETSUPPORT_Value 0 #define COL_ISLONG_Value ATL_VARIANT_FALSE // 2.5 //#define COL_SEED_Value //#define COL_INCREMENT_Value #define INIT_GENERALTIMEOUT_Value 0 #define COMSERVICES_Value 0 // 2.6 #define OUTPUTSTREAM_Value NULL #define OUTPUTENCODING_Value NULL #define TABLESTATISTICS_Value 0 #define SKIPROWCOUNTRESULTS_Value ATL_VARIANT_FALSE #define IRowsetBookmark_Value ATL_VARIANT_FALSE #define VISUALMODE_Value MDPROPVAL_VISUAL_MODE_DEFAULT #define OUT_OF_LINE virtual #define BEGIN_PROPSET_MAP(Class) \ static ATL::UPROPSET* _GetPropSet( \ _Out_opt_ ULONG* pNumPropSets,\ _Out_ ULONG* pcElemPerSupported, \ _Inout_opt_ ATL::UPROPSET* pSet = NULL, \ _Inout_opt_ GUID* pguidSet = NULL) \ { \ typedef Class _PropSetClass; \ USES_ATL_SAFE_ALLOCA;\ ULONG& cElemsMax = *pcElemPerSupported; \ cElemsMax = 0; \ ULONG nCurProp = 0; \ int cRemainder = 0; \ if (pguidSet == NULL) \ pguidSet = (GUID*)&GUID_NULL; #define BEGIN_PROPERTY_SET_EX(guid, flags) \ if (pNumPropSets != NULL) \ { \ ATLASSUME(pSet != NULL); \ pSet[nCurProp].pPropSet = &guid; \ pSet[nCurProp].dwFlags = flags; \ pSet[nCurProp].bIsChained = false; \ } \ static const ATL::UPROPINFO aProperty##guid[] = \ { #define BEGIN_PROPERTY_SET(guid) BEGIN_PROPERTY_SET_EX(guid, 0) //DBPROP_ macros #define PROPERTY_INFO_ENTRY_EX(dwPropID, vt, dwFlags, value, options) DBPROP_##dwPropID, IDS_DBPROP_##dwPropID, vt, dwFlags, (DWORD_PTR)value, (DBPROPOPTIONS)options, #define PROPERTY_INFO_ENTRY_VALUE(dwPropID, value) PROPERTY_INFO_ENTRY_EX(dwPropID, dwPropID##_Type, dwPropID##_Flags, value, 0) #define PROPERTY_INFO_ENTRY_VALUE_FLAGS(dwPropID, value, dwFlags) PROPERTY_INFO_ENTRY_EX(dwPropID, dwPropID##_Type, dwFlags, value, 0) #define PROPERTY_INFO_ENTRY(dwPropID) PROPERTY_INFO_ENTRY_VALUE(dwPropID, dwPropID##_Value) //MDPROP_ macros #define MDPROPERTY_INFO_ENTRY_EX(dwPropID, vt, dwFlags, value, options) MDPROP_##dwPropID, IDS_MDPROP_##dwPropID, vt, dwFlags, (DWORD_PTR)value, (DBPROPOPTIONS)options, #define MDPROPERTY_INFO_ENTRY_VALUE(dwPropID, value) MDPROPERTY_INFO_ENTRY_EX(dwPropID, dwPropID##_Type, dwPropID##_Flags, value, 0) #define MDPROPERTY_INFO_ENTRY_VALUE_FLAGS(dwPropID, value, dwFlags) MDPROPERTY_INFO_ENTRY_EX(dwPropID, dwPropID##_Type, dwFlags, value, 0) #define MDPROPERTY_INFO_ENTRY(dwPropID) MDPROPERTY_INFO_ENTRY_VALUE(dwPropID, dwPropID##_Value) #define END_PROPERTY_SET(guid) \ }; \ if (pNumPropSets != NULL) \ { \ pSet[nCurProp].pUPropInfo = (ATL::UPROPINFO*)aProperty##guid; \ pSet[nCurProp].cUPropInfo = sizeof(aProperty##guid) / sizeof(ATL::UPROPINFO); \ cRemainder = (pSet[nCurProp].cUPropInfo % 32) ? 1 : 0; \ if (cElemsMax < (pSet[nCurProp].cUPropInfo / 32 + cRemainder)) \ { \ cElemsMax = (pSet[nCurProp].cUPropInfo / 32 + cRemainder); \ } \ } \ nCurProp++; #define CHAIN_PROPERTY_SET(ChainClass) \ ULONG cPropSets##ChainClass, cElsSupported##ChainClass; \ int cSets##ChainClass = (int)(DWORD_PTR)ChainClass::_GetPropSet(NULL, &cElsSupported##ChainClass); \ if (pNumPropSets != NULL) \ { \ ATL::UPROPSET* pSetA=(ATL::UPROPSET*)_ATL_SAFE_ALLOCA(::ATL::AtlMultiplyThrow(static_cast(sizeof(ATL::UPROPSET)),cSets##ChainClass),_ATL_SAFE_ALLOCA_DEF_THRESHOLD);\ ATL::UPROPSET* pSetTemp = ChainClass::_GetPropSet(&cPropSets##ChainClass, &cElsSupported##ChainClass, pSetA); \ cElemsMax = (cElemsMax < cElsSupported##ChainClass) ? cElsSupported##ChainClass : cElemsMax; \ ATLENSURE(pSetTemp); \ for (ULONG iSet = nCurProp; iSet < nCurProp+cPropSets##ChainClass; iSet++) \ { \ pSet[iSet].pPropSet = pSetTemp[iSet-nCurProp].pPropSet; \ pSet[iSet].dwFlags = pSetTemp[iSet-nCurProp].dwFlags; \ pSet[iSet].pUPropInfo = pSetTemp[iSet-nCurProp].pUPropInfo; \ pSet[iSet].cUPropInfo = pSetTemp[iSet-nCurProp].cUPropInfo; \ pSet[iSet].bIsChained = true; \ } \ } \ nCurProp += cSets##ChainClass; #define END_PROPSET_MAP() \ if (pNumPropSets != NULL) \ { \ if (IsEqualGUID(*pguidSet, GUID_NULL)) \ { \ *pNumPropSets = nCurProp; \ return pSet; \ } \ else \ { \ *pNumPropSets = 1; \ UINT i = 0; \ for (; i < nCurProp && IsEqualGUID(*(pSet[i].pPropSet), *pguidSet); i++); \ return (i == nCurProp ) ? &pSet[0] : &pSet[i]; \ } \ } \ return (ATL::UPROPSET*)(DWORD_PTR)nCurProp; \ } // For DataSource flags IDBInitialize::m_dwStatus enum DATASOURCE_FLAGS { DSF_MASK_INIT = 0xFFFFF00F, // Mask for stuff lasting over init/uninit. DSF_PERSIST_DIRTY = 0x00000001, // Set if init string changes. DSF_INITIALIZED = 0x00000010, // Have we been initialized. }; #define DBID_USE_GUID_OR_PGUID(e) \ ((1<<(e)) & \ ( 1<> 5) // dw / 32 = dw / (sizeof(DWORD)*8) #define ModDword(dw) (dw & (32-1)) // dw % 32 #define DwordSizeofBits(nBits) (nBits/32+1) // Use in array declarations #define CLEARBITARRAY( rgdwFlags ) memset( rgdwFlags, 0, sizeof(rgdwFlags) ) template BOOL InRange( _In_ const T& val, _In_ const T& valMin, _In_ const T& valMax) { return ( valMin <= val && val <= valMax ); } // Implementation Class class CBitFieldOps { public: void SETBIT( _In_ DWORD rgdwFlags[], _In_ const DWORD dwBit) { rgdwFlags[DivDword(dwBit)] |= 1 << ModDword(dwBit); } void CLEARBIT( _In_ DWORD rgdwFlags[], _In_ const DWORD dwBit) { rgdwFlags[DivDword(dwBit)] &= ~( 1 << ModDword(dwBit) ); } DWORD TESTBIT( _In_ const DWORD rgdwFlags[], _In_ const DWORD dwBit) { //old//Note: Not {0,1}, but from {0...2^32-1}. // Note: Now returns {0,1}. return ( rgdwFlags[DivDword(dwBit)] & ( 1 << ModDword(dwBit) ) ) != 0; } }; // Implementation Class class CDBIDOps { public: static HRESULT CompareDBIDs( _In_opt_ const DBID* pdbid1, _In_opt_ const DBID* pdbid2) { // Array of valid eKind matches, in addition to matching exactly. static const BYTE s_rgbKind[] = { DBKIND_PGUID_NAME, // DBKIND_GUID_NAME DBKIND_PGUID_PROPID, // DBKIND_GUID_PROPID DBKIND_NAME, // DBKIND_NAME DBKIND_GUID_NAME, // DBKIND_PGUID_NAME DBKIND_GUID_PROPID, // DBKIND_PGUID_PROPID DBKIND_PROPID, // DBKIND_PROPID DBKIND_GUID // DBKIND_GUID }; if( !pdbid1 || !pdbid2 ) return S_FALSE; // Assume a match, and discard early if we can. DBKIND tmp1 = 0; DBKIND tmp2 = (DBKIND)(_countof(s_rgbKind) - 1); if (!InRange(pdbid2->eKind, tmp1, tmp2)) { ATLTRACE(atlTraceDBProvider, 0, _T("Column ID out of Range\n")); return E_FAIL; } ATLASSUME(pdbid2->eKind < _countof(s_rgbKind)); if (pdbid1->eKind != pdbid2->eKind && pdbid1->eKind != s_rgbKind[pdbid2->eKind]) { return S_FALSE; } if (DBID_USE_GUID_OR_PGUID(pdbid1->eKind)) { if (!DBID_USE_GUID_OR_PGUID(pdbid2->eKind)) return S_FALSE; // Compare GUIDs. // Note that _GUID_ is equivalent to _PGUID_. if (!InlineIsEqualGUID( DBID_USE_PGUID(pdbid1->eKind) ? *(pdbid1->uGuid.pguid) : pdbid1->uGuid.guid, DBID_USE_PGUID(pdbid2->eKind) ? *(pdbid2->uGuid.pguid) : pdbid2->uGuid.guid )) return S_FALSE; } if (DBID_USE_NAME(pdbid1->eKind)) { if (!DBID_USE_NAME(pdbid2->eKind)) return S_FALSE; // Compare names. // Need to check if 1 is null and the other is not. if ((pdbid1->uName.pwszName == NULL) != (pdbid2->uName.pwszName == NULL)) return S_FALSE; // Since the above check does not rule out both being null, which is // a valid comparison, and wcscmp will GPF if they were, we need // to check for valid pointers if( pdbid1->uName.pwszName && pdbid2->uName.pwszName ) { // Assume null-terminated. // Assume LCID match is OK (note diff with lstrcmp(), CompareString().) if (wcscmp(pdbid1->uName.pwszName, pdbid2->uName.pwszName) != 0) return S_FALSE; } } if (DBID_USE_PROPID(pdbid1->eKind)) { if (!DBID_USE_PROPID(pdbid2->eKind)) return S_FALSE; // Compare PROPID. if (pdbid1->uName.ulPropid != pdbid2->uName.ulPropid) return S_FALSE; } // No reason to discard, so must have matched each field successfully. return S_OK; } static HRESULT IsValidDBID(_In_ const DBID* pdbid1) { ATLASSERT( pdbid1 ); if( pdbid1 && ((pdbid1->eKind == DBKIND_GUID_NAME) || (pdbid1->eKind == DBKIND_GUID_PROPID) || (pdbid1->eKind == DBKIND_NAME) || (pdbid1->eKind == DBKIND_PGUID_NAME) || (pdbid1->eKind == DBKIND_PGUID_PROPID) || (pdbid1->eKind == DBKIND_PROPID) || (pdbid1->eKind == DBKIND_GUID)) ) return S_OK; else return S_FALSE; } static HRESULT CopyDBIDs( _Out_ DBID* pdbidDest, _In_ const DBID* pdbidSrc) { ULONG cwchBuffer; ATLASSERT( pdbidDest && pdbidSrc ); if( !pdbidDest || !pdbidSrc ) return S_FALSE; // Save eKind pdbidDest->eKind = pdbidSrc->eKind; switch( pdbidSrc->eKind ) { case DBKIND_GUID_NAME: pdbidDest->uGuid.guid = pdbidSrc->uGuid.guid; cwchBuffer = ocslen(pdbidSrc->uName.pwszName); cwchBuffer++; pdbidDest->uName.pwszName = (PWSTR)::ATL::AtlCoTaskMemCAlloc(cwchBuffer, static_cast(sizeof(WCHAR))); if( pdbidDest->uName.pwszName ) { Checked::memcpy_s(pdbidDest->uName.pwszName, cwchBuffer * sizeof(WCHAR), pdbidSrc->uName.pwszName, cwchBuffer*sizeof(WCHAR)); } else { return E_OUTOFMEMORY; } break; case DBKIND_GUID_PROPID: pdbidDest->uGuid.guid = pdbidSrc->uGuid.guid; pdbidDest->uName.ulPropid = pdbidSrc->uName.ulPropid; break; case DBKIND_NAME: cwchBuffer = ocslen(pdbidSrc->uName.pwszName); cwchBuffer++; pdbidDest->uName.pwszName = (PWSTR)::ATL::AtlCoTaskMemCAlloc(cwchBuffer, static_cast(sizeof(WCHAR))); if( pdbidDest->uName.pwszName ) { Checked::memcpy_s(pdbidDest->uName.pwszName, cwchBuffer*sizeof(WCHAR), pdbidSrc->uName.pwszName, cwchBuffer*sizeof(WCHAR)); } else { return E_OUTOFMEMORY; } break; case DBKIND_PGUID_NAME: pdbidDest->uGuid.pguid = (GUID*)CoTaskMemAlloc(sizeof(GUID)); if( pdbidDest->uGuid.pguid ) { *(pdbidDest->uGuid.pguid) = *(pdbidSrc->uGuid.pguid); cwchBuffer = ocslen(pdbidSrc->uName.pwszName); cwchBuffer++; pdbidDest->uName.pwszName = (PWSTR)::ATL::AtlCoTaskMemCAlloc(cwchBuffer, static_cast(sizeof(WCHAR))); if( pdbidDest->uName.pwszName ) { Checked::memcpy_s(pdbidDest->uName.pwszName, cwchBuffer*sizeof(WCHAR), pdbidSrc->uName.pwszName, cwchBuffer*sizeof(WCHAR)); break; } else { CoTaskMemFree(pdbidDest->uGuid.pguid); pdbidDest->uGuid.pguid = NULL; } } return E_OUTOFMEMORY; case DBKIND_PGUID_PROPID: pdbidDest->uGuid.pguid = (GUID*)CoTaskMemAlloc(sizeof(GUID)); if( pdbidDest->uGuid.pguid ) *(pdbidDest->uGuid.pguid) = *(pdbidSrc->uGuid.pguid); else return E_OUTOFMEMORY; pdbidDest->uName.ulPropid = pdbidSrc->uName.ulPropid; break; case DBKIND_PROPID: pdbidDest->uName.ulPropid = pdbidSrc->uName.ulPropid; break; case DBKIND_GUID: pdbidDest->uGuid.guid = pdbidSrc->uGuid.guid; break; default: ATLASSERT(L"Unhandled dbid1.ekind"); return S_FALSE; } return S_OK; } static GUID* GetDBIDpGuid(_In_ DBID& dbid) { GUID* pGuid; switch (dbid.eKind) { case DBKIND_PGUID_NAME: case DBKIND_PGUID_PROPID: pGuid = dbid.uGuid.pguid; break; case DBKIND_GUID_NAME: case DBKIND_GUID_PROPID: case DBKIND_GUID: pGuid = &(dbid.uGuid.guid); break; default: pGuid = NULL; } return pGuid; } static ULONG GetPropIDFromDBID(_In_ DBID& dbid) { switch (dbid.eKind) { case DBKIND_GUID_PROPID: case DBKIND_PGUID_PROPID: case DBKIND_PROPID: return dbid.uName.ulPropid; default: return 0; } } static void FreeDBIDs(_In_ DBID* pdbidSrc) { switch( pdbidSrc->eKind ) { case DBKIND_GUID_NAME: CoTaskMemFree(pdbidSrc->uName.pwszName); break; case DBKIND_NAME: CoTaskMemFree(pdbidSrc->uName.pwszName); break; case DBKIND_PGUID_NAME: CoTaskMemFree(pdbidSrc->uGuid.pguid); CoTaskMemFree(pdbidSrc->uName.pwszName); break; case DBKIND_PGUID_PROPID: CoTaskMemFree(pdbidSrc->uGuid.pguid); break; case DBKIND_GUID_PROPID: case DBKIND_PROPID: case DBKIND_GUID: break; default: ATLASSERT(L"Unhandled dbid1.ekind"); break; } } }; class CConvertHelper { public: CConvertHelper() {} HRESULT FinalConstruct() { HRESULT hr = ::CoCreateInstance(CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, __uuidof(IDataConvert), (void**)&m_spConvert); if (FAILED(hr)) return hr; // Check to see if the data conversion routine is 2.0 capable, if so. Initialize // the conversion routine to be 2.0. DCINFO rgInfo[] = {{DCINFOTYPE_VERSION, {VT_UI4, 0, 0, 0, 0x0}}}; CComPtr spIDCInfo; hr = m_spConvert->QueryInterface(&spIDCInfo); if (hr == S_OK) { V_UI4(&rgInfo->vData) = 0x200; // OLEDB Version 02.00 spIDCInfo->SetInfo(1, rgInfo); } return hr; } CComPtr m_spConvert; }; // IDBCreateSessionImpl template class ATL_NO_VTABLE IDBCreateSessionImpl : public IDBCreateSession { public: ATLPREFAST_SUPPRESS(6387) STDMETHOD(CreateSession)( _In_opt_ IUnknown *pUnkOuter, _In_ REFIID riid, _Outptr_ IUnknown **ppDBSession) { ATLTRACE(atlTraceDBProvider, 2, _T("IDBCreateSessionImpl::CreateSession\n")); if (ppDBSession == NULL) return E_INVALIDARG; *ppDBSession = NULL; T* pT = (T*)this; if (!(pT->m_dwStatus & DSF_INITIALIZED)) { ATLTRACE(atlTraceDBProvider, 0, _T("IDBCreateSessionImpl::CreateSession : Error not initialized\n")); *ppDBSession = NULL; return E_UNEXPECTED; } CComPolyObject *pSession; // You can't QI for an interface other than IUnknown when aggregating // and creating the object. You might ask for your own interface, // which would be bad. Note, we return DB_E_NOAGGREGATION instead of // CLASS_E_NOAGGREGATION due to OLE DB constraints. if (pUnkOuter != NULL && !InlineIsEqualUnknown(riid)) return DB_E_NOAGGREGATION; HRESULT hr = CComPolyObject::CreateInstance(pUnkOuter, &pSession); if (SUCCEEDED(hr)) { ATLASSUME(pSession != NULL); CComPtr spCreator; hr = pSession->QueryInterface(__uuidof(IObjectWithSite), (void**)&spCreator); if (SUCCEEDED(hr)) { CComPtr spOuterUnk; hr = pT->QueryInterface(__uuidof(IUnknown), (void**)&spOuterUnk); if (SUCCEEDED(hr)) { hr = spCreator->SetSite(spOuterUnk); if (SUCCEEDED(hr)) { hr = pSession->QueryInterface(riid, (void**)ppDBSession); } } } else { delete pSession; } } return hr; } ATLPREFAST_UNSUPPRESS() }; // IDBInitializeImpl template class ATL_NO_VTABLE IDBInitializeImpl : public IDBInitialize { public: IDBInitializeImpl() { m_dwStatus = 0; m_pCUtlPropInfo = NULL; m_cSessionsOpen = 0; } virtual ~IDBInitializeImpl() { delete m_pCUtlPropInfo; } STDMETHOD(Uninitialize)(void) { ATLTRACE(atlTraceDBProvider, 2, _T("IDBInitializeImpl::Uninitialize\n")); T* pT = (T*)this; typename T::ObjectLock lock(pT); if (pT->m_cSessionsOpen != 0) { ATLTRACE(atlTraceDBProvider, 0, _T("Uninitialized called with Open Sessions\n")); return DB_E_OBJECTOPEN; } delete m_pCUtlPropInfo; m_pCUtlPropInfo = NULL; pT->m_dwStatus |= DSF_PERSIST_DIRTY; pT->m_dwStatus &= DSF_MASK_INIT; // Clear all non-init flags. return S_OK; } DWORD m_dwStatus; CUtlPropInfo* m_pCUtlPropInfo; LONG m_cSessionsOpen; STDMETHOD(Initialize)(void) { ATLTRACE(atlTraceDBProvider, 2, _T("IDBInitializeImpl::Initialize\n")); T *pT = (T*)(this); typename T::ObjectLock lock(pT); HRESULT hr; if (pT->m_dwStatus & DSF_INITIALIZED) { ATLTRACE(atlTraceDBProvider, 0, _T("IDBInitializeImpl::Initialize Error : Already Initialized\n")); return DB_E_ALREADYINITIALIZED; } delete m_pCUtlPropInfo; m_pCUtlPropInfo = NULL; m_pCUtlPropInfo = _ATL_NEW CUtlPropInfo(); if (m_pCUtlPropInfo == NULL) { ATLTRACE(atlTraceDBProvider, 0, _T("IDBInitializeImpl::Initialize Error : OOM\n")); return E_OUTOFMEMORY; } hr = m_pCUtlPropInfo->FInit(); if (hr == S_OK) { pT->m_dwStatus |= DSF_INITIALIZED; } else { delete m_pCUtlPropInfo; m_pCUtlPropInfo = NULL; } return hr; } }; // Implementation Class class CPropColID : public PROPCOLID, public CDBIDOps { public: CPropColID() { VariantInit(&vValue); } ~CPropColID() { FreeDBIDs(&dbidProperty); VariantClear(&vValue); } bool operator==(_In_ const CPropColID& colId) const { return (CompareDBIDs(&dbidProperty, &(colId.dbidProperty)) == S_OK) ? true : false; } }; class CColumnIds : public CDBIDOps, public CAtlArray { public: PPROPCOLID AddNode() { CPropColID colID; _ATLTRY { Add(colID); } _ATLCATCH( e ) { _ATLDELETEEXCEPTION( e ) return NULL; } return &(GetAt(GetCount()-1)); } HRESULT RemoveColumnId(_In_ const DBID* pdbidProp) { for (size_t i = 0; i < GetCount(); i++) { if (CompareDBIDs(pdbidProp, &(GetAt(i).dbidProperty)) == S_OK) { if( i < 0 || i >= GetCount() ) return E_FAIL; RemoveAt(i); return S_OK; } } return E_FAIL; } HRESULT AddColumnId(_In_ DBPROP* pProp) { CPropColID colID; HRESULT hr = CopyDBIDs(&(colID.dbidProperty),&(pProp->colid)); if(FAILED(hr)) return hr; colID.dwOption = pProp->dwOptions; hr = VariantCopy(&(colID.vValue),&(pProp->vValue)); if(FAILED(hr)) return hr; //return (Add(colID)) ? S_OK : E_OUTOFMEMORY; _ATLTRY { Add(colID); } _ATLCATCH( e ) { _ATLDELETEEXCEPTION( e ); return E_OUTOFMEMORY; } return S_OK; } HRESULT AddColumnId(_In_ PPROPCOLID pPropNode) { CPropColID colID; HRESULT hr = CopyDBIDs(&(colID.dbidProperty),&(pPropNode->dbidProperty)); if(FAILED(hr)) return hr; colID.dwOption = pPropNode->dwOption; hr = VariantCopy(&(colID.vValue),&(pPropNode->vValue)); if(FAILED(hr)) return hr; //return (Add(colID)) ? S_OK : E_OUTOFMEMORY; _ATLTRY { Add(colID); } _ATLCATCH( e ) { _ATLDELETEEXCEPTION( e ); return E_OUTOFMEMORY; } return S_OK; } ULONG GetCountOfPropColids() { return (ULONG)GetCount(); } PPROPCOLID FindColumnId(_In_ const DBID* pdbidProp) { for (size_t i = 0; i < GetCount(); i++) { if (CompareDBIDs(pdbidProp, &(GetAt(i).dbidProperty)) == S_OK) return &(GetAt(i)); } return NULL; } HRESULT GetValue( _In_ size_t iColId, _Out_ DWORD* pdwOptions, _Out_ DBID* pColid, _Inout_ VARIANT* pvValue) { ATLENSURE_RETURN(pdwOptions && pColid && pvValue); ATLASSERT(iColId >= 0 && iColId < GetCount()); CPropColID& colId = GetAt(iColId); *pdwOptions = colId.dwOption; HRESULT hr = CopyDBIDs( pColid, &(colId.dbidProperty) ); if(FAILED(hr) || hr == S_FALSE) { return hr; } if(FAILED(hr = VariantCopy(pvValue, &(colId.vValue)))) return hr; return S_OK; } }; const ULONG cchDescBuffSize = 256; const DWORD DBINTERNFLAGS_CHANGED = 0x00000001; // Rules for GetPropertiesArgChk const DWORD ARGCHK_PROPERTIESINERROR = 0x00000001; // Implementation Class template class CUtlPropInfo : public CBitFieldOps, public CDBIDOps { public: enum EnumGetPropInfo { GETPROPINFO_ALLPROPIDS = 0x0001, GETPROPINFO_NOTSUPPORTED = 0x0002, GETPROPINFO_ERRORSOCCURRED = 0x0004, GETPROPINFO_VALIDPROP = 0x0008 }; CUtlPropInfo() { m_cUPropSet = 0; m_pUPropSet = NULL; m_cPropSetDex = 0; m_cElemPerSupported = 0; } ~CUtlPropInfo() { CoTaskMemFree(m_pUPropSet); } //Determine the number of description buffers needed ULONG CalcDescripBuffers( _In_ ULONG cPropInfoSet, _In_reads_(cPropInfoSet) DBPROPINFOSET* pPropInfoSet) { ULONG cBuffers = 0; ATLASSUME(m_pUPropSet); ATLENSURE(cPropInfoSet && pPropInfoSet); for(ULONG ulSet=0; ulSet lock(m_oCriticalSection); HRESULT hr = InitAvailUPropSets(&m_cUPropSet, &m_pUPropSet, &m_cElemPerSupported, pguidSet); if (FAILED(hr)) return hr; ATLASSERT((m_cUPropSet != 0) && (m_cElemPerSupported != 0)); if(!m_cUPropSet || !m_cElemPerSupported) return E_FAIL; ATLTRY(m_rgdwSupported.Allocate(::ATL::AtlMultiplyThrow(m_cUPropSet, m_cElemPerSupported))); if(m_rgdwSupported == NULL) { m_cUPropSet=0; m_cElemPerSupported=0; return E_OUTOFMEMORY; } if(FAILED(hr = InitUPropSetsSupported())) { m_cUPropSet=0; m_cElemPerSupported=0; m_rgdwSupported.Free(); return hr; } if(m_cUPropSet) { ATLTRY(m_rgiPropSetDex.Allocate(m_cUPropSet)) if(m_rgiPropSetDex == NULL) { m_cUPropSet=0; m_cElemPerSupported=0; m_rgdwSupported.Free(); return E_OUTOFMEMORY; } } return S_OK; } HRESULT GetPropertyInfo( _In_ ULONG cPropertySets, _In_reads_(cPropertySets) const DBPROPIDSET rgPropertySets[], _Out_ ULONG* pcPropertyInfoSets, _Outptr_result_buffer_(*pcPropertyInfoSets) DBPROPINFOSET** prgPropertyInfoSets, _Deref_opt_out_z_ WCHAR** ppDescBuffer, _In_ bool bInitialized = true, _In_opt_ const GUID* pGuid = NULL) { CComCritSecLock lock(m_oCriticalSection); HRESULT hr = S_OK; ULONG ul, ulSet, ulNext, ulEnd; ULONG ulOutIndex; ULONG cSets; ULONG cPropInfos; //ULONG ulIndex = 0; ULONG cBuffers = 0; DWORD dwStatus = 0; DBPROPINFO* pPropInfo = NULL; DBPROPINFO* pCurPropInfo = NULL; WCHAR* pDescBuffer = NULL; WCHAR* pDescBufferEnd = NULL; DBPROPINFOSET* pPropInfoSet = NULL; UPROPINFO* pUPropInfo = NULL; WCHAR wszBuff[256]; int cch; CAtlArray rgInitPropsetIndexes; // If the consumer does not restrict the property sets // by specify an array of property sets and a cPropertySets // greater than 0, then we need to make sure we // have some to return if(cPropertySets == 0) { // Determine the number of property sets supported // In this case, it usually the enumerator or data source asking for // DBPROPSET_DBINIT information. if (pGuid != NULL) { // Need to determine if there are any UPROPSET_USERINIT sets here // they should be added to DBINIT. ULONG ulUserInitSets = 0; for (ULONG l=0; l(sizeof(DBPROPINFOSET))); if(pPropInfoSet == NULL) { ATLTRACE(atlTraceDBProvider, 0, _T("Could not allocate DBPROPSET array for GetProperties\n")); hr = E_OUTOFMEMORY; goto EXIT; } memset(pPropInfoSet, 0, cSets * sizeof(DBPROPINFOSET)); ulOutIndex = 0; ULONG ulTempPropsetIndex = 0; ulEnd = cPropertySets == 0 ? cSets : cPropertySets; // Fill in the output array for(ulSet=0; ulSet(sizeof(DBPROPINFO))); if( pPropInfo ) { // Initialize Buffer memset(pPropInfo, 0, cPropInfos * sizeof(DBPROPINFO)); for(ULONG ulProp=0; ulProppwszDescription = pDescBuffer; // Load the string into temp buffer cch = LoadDescription(pUPropInfo[ulProp].ulIDS, wszBuff, (sizeof(wszBuff)/sizeof(*wszBuff))); if( cch ) { // Adjust for '\0' cch++; // Transfer to official buffer if room if (pDescBuffer > pDescBufferEnd) { return E_FAIL; } Checked::memcpy_s(pDescBuffer, (pDescBufferEnd-pDescBuffer)*sizeof(WCHAR), wszBuff, cch * sizeof(WCHAR)); pDescBuffer += cch; } else { if(pDescBuffer > pDescBufferEnd) { return E_FAIL; } Checked::wcscpy_s(pDescBuffer, pDescBufferEnd-pDescBuffer, L"UNKNOWN"); pDescBuffer += (wcslen(L"UNKNOWN") + 1); _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, ATLDB_NO_STRING); } } pCurPropInfo->dwPropertyID = pUPropInfo[ulProp].dwPropId; // Strip out any user defined flags that may be around. Note, // this isn't a full-proof thing because properties change. It // won't work in OLE DB 2.5 if someone does a property like 0x40000 DWORD dwFlags = pUPropInfo[ulProp].dwFlags & 0xfffff; pCurPropInfo->dwFlags = dwFlags; pCurPropInfo->vtType = pUPropInfo[ulProp].VarType; pCurPropInfo->vValues.vt = VT_EMPTY; dwStatus |= GETPROPINFO_VALIDPROP; // Increment to next available buffer ulNext++; _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, pCurPropInfo->dwFlags); } } else { ATLASSUME( m_cPropSetDex == 1 ); ULONG cIterations = ((cPropInfos>cBuffers) && (ppDescBuffer)) ? cBuffers : cPropInfos; for( ULONG ulProp = 0; ulProp < cIterations; ulProp++, ulNext++ ) { pCurPropInfo = &(pPropInfo[ulNext]); // Process Properties based on Restriction array. pCurPropInfo->dwPropertyID = rgPropertySets[ulSet].rgPropertyIDs[ulProp]; if( GetUPropInfoPtr(m_rgiPropSetDex[ul], pCurPropInfo->dwPropertyID, &pUPropInfo) == S_OK ) { // If the ppDescBuffer pointer was not NULL, then // we need supply description of the properties if( ppDescBuffer ) { // Set Buffer pointer pCurPropInfo->pwszDescription = pDescBuffer; // Load the string into temp buffer cch = LoadDescription(pUPropInfo->ulIDS, wszBuff, (sizeof(wszBuff)/sizeof(*wszBuff))); if( cch ) { // Adjust for '\0' cch++; // Transfer to official buffer if room if(pDescBuffer > pDescBufferEnd) return E_FAIL; Checked::memcpy_s(pDescBuffer, (pDescBufferEnd-pDescBuffer)*sizeof(WCHAR), wszBuff, cch * sizeof(WCHAR)); pDescBuffer += cch; } else { if(pDescBuffer > pDescBufferEnd) { return E_FAIL; } Checked::wcscpy_s(pDescBuffer, pDescBufferEnd-pDescBuffer, L"UNKNOWN"); pDescBuffer += (wcslen(L"UNKNOWN") + 1); _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, ATLDB_NO_STRING); } } pCurPropInfo->dwPropertyID = pUPropInfo->dwPropId; // Strip out any user defined flags that may be around. Note, // this isn't a full-proof thing because properties change. It // won't work in OLE DB 2.5 if someone does a property like 0x40000 DWORD dwFlags = pUPropInfo->dwFlags & 0xfffff; pCurPropInfo->dwFlags = dwFlags; pCurPropInfo->vtType = pUPropInfo->VarType; dwStatus |= GETPROPINFO_VALIDPROP; } else { // Not Supported pCurPropInfo->dwFlags = DBPROPFLAGS_NOTSUPPORTED; dwStatus |= GETPROPINFO_ERRORSOCCURRED; } _ATLDUMPPROPERTY(pCurPropInfo->dwPropertyID, pCurPropInfo->dwFlags); } } } } else { hr = E_OUTOFMEMORY; goto EXIT; } NEXT_SET: pPropInfoSet[ulSet].cPropertyInfos = ulNext; pPropInfoSet[ulSet].rgPropertyInfos = pPropInfo; } // Success, set return values *pcPropertyInfoSets = cSets; *prgPropertyInfoSets = pPropInfoSet; // At least one propid was marked as not S_OK if( dwStatus & GETPROPINFO_ERRORSOCCURRED ) { // If at least 1 property was set if( dwStatus & GETPROPINFO_VALIDPROP ) return DB_S_ERRORSOCCURRED; else { // Do not free any of the rgPropertyInfoSets, but // do free the ppDescBuffer if( pDescBuffer ) { ATLASSERT( ppDescBuffer ); CoTaskMemFree(pDescBuffer); *ppDescBuffer = NULL; } return DB_E_ERRORSOCCURRED; } } return S_OK; EXIT: // Check if failure and clean up any allocated memory if( FAILED(hr) && (hr != DB_E_ERRORSOCCURRED) ) { // Free Description Buffer if( pDescBuffer ) { ATLASSERT( ppDescBuffer ); CoTaskMemFree(pDescBuffer); *ppDescBuffer = NULL; } if( pPropInfoSet ) { // Loop through Property Sets for(ulSet=0; ulSet m_rgiPropSetDex;//array of UPropSet Index values ULONG m_cElemPerSupported; //number of DWORDS per UPropSet to indicate supported UPropIds CAutoVectorPtr m_rgdwSupported;//array of DWORDs indicating supported UPropIds enum EnumUPropSetFlags { UPROPSET_HIDDEN = 0x1, UPROPSET_PASSTHROUGH = 0x2, UPROPSET_USERINIT = 0x4 }; HRESULT InitAvailUPropSets( _Out_ ULONG* pcUPropSet, _Outptr_result_buffer_maybenull_(*pcUPropSet) UPROPSET** ppUPropSet, _Out_ ULONG* pcElemPerSupported, _Out_opt_ GUID* pguid) { ATLENSURE_RETURN(pcUPropSet && ppUPropSet); CoTaskMemFree(*ppUPropSet); *ppUPropSet = NULL; int cSets = (int)(ULONG_PTR)T::_GetPropSet(NULL, pcElemPerSupported); UPROPSET* pSet = (UPROPSET*)::ATL::AtlCoTaskMemCAlloc(static_cast(sizeof(UPROPSET)), cSets); if (pSet == NULL) { *pcUPropSet=0; *ppUPropSet=NULL; *pcElemPerSupported=0; return E_OUTOFMEMORY; } *ppUPropSet = T::_GetPropSet(pcUPropSet, pcElemPerSupported, pSet, pguid); return S_OK; } OUT_OF_LINE HRESULT InitUPropSetsSupported() { ULONG cPropSet = 0, cElemsPerSupported = 0; int cSets = (int)(ULONG_PTR)T::_GetPropSet(NULL, &cElemsPerSupported); UPROPSET* pSet = (UPROPSET*)::ATL::AtlCoTaskMemCAlloc(static_cast(sizeof(UPROPSET)), cSets); if (pSet == NULL) return E_OUTOFMEMORY; pSet = T::_GetPropSet(&cPropSet, &cElemsPerSupported, pSet); memset(m_rgdwSupported, 0xFFFF, cPropSet * cElemsPerSupported * sizeof(DWORD)); CoTaskMemFree(pSet); return S_OK; } //Load a localized description int LoadDescription( _In_ ULONG ids, _Out_writes_to_(cchBuff, return + 1) PWSTR pwszBuff, _In_ ULONG cchBuff) { USES_CONVERSION_EX; CTempBuffer tmpBuffer; TCHAR* pszBuf = tmpBuffer.Allocate(cchBuff); if (pszBuf == NULL) return 0; int nTemp = LoadString(_AtlBaseModule.GetResourceInstance(), ids, pszBuf, cchBuff); if (nTemp != 0) { Checked::wcscpy_s(pwszBuff, cchBuff, SAL_Assume_notnull_for_opt_z_(T2W_EX_DEF(pszBuf))); } return nTemp; } }; class ATL_NO_VTABLE CUtlPropsBase : public CBitFieldOps, public CDBIDOps { public: virtual ~CUtlPropsBase() { } CComAutoCriticalSection m_oCriticalSection; // critical section to synchronize access to the class ULONG m_cUPropSet; //count of UPropSet items UPROPSET* m_pUPropSet; //Pointer to UPropset items CAutoVectorPtr< UPROP > m_pUProp; ULONG m_cUPropSetHidden; //Count of Hidden items DWORD m_dwFlags; //Configuration flags ULONG m_cPropSetDex; //count of UPropSet Indexes CAutoVectorPtr< ULONG > m_rgiPropSetDex; //pointer to Array of UPropSet Index values ULONG m_cElemPerSupported;//number of DWORDS per UPropSet to indicate supported UPropIds CAutoVectorPtr< DWORD > m_rgdwSupported; //pointer to array of DWORDs indicating supported UPropIds CAutoVectorPtr< DWORD > m_rgdwPropsInError;//pointer to array of DWORDs indicating if property is in error enum EnumUPropSetFlags { UPROPSET_HIDDEN = 0x1, UPROPSET_PASSTHROUGH = 0x2, UPROPSET_USERINIT = 0x4 }; enum EnumGetProp { GETPROP_ALLPROPIDS = 0x0001, GETPROP_NOTSUPPORTED = 0x0002, GETPROP_ERRORSOCCURRED = 0x0004, GETPROP_VALIDPROP = 0x0008, GETPROP_PROPSINERROR = 0x0010 }; enum EnumSetProp { SETPROP_BADOPTION = 0x0001, SETPROP_NOTSUPPORTED = 0x0002, SETPROP_VALIDPROP = 0x0004, SETPROP_ERRORS = 0x0008, SETPROP_COLUMN_LEVEL = 0x0010, SETPROP_WAS_REQUIRED = 0x0020 }; HRESULT SetPassThrough(_In_ const DBPROPSET* pPropSet) { ATLENSURE_RETURN(pPropSet); DBPROP* pProp = pPropSet->rgProperties; //Default implementation just sets all properties as NOTSUPPORTED for( ULONG ul=0; ulcProperties; ul++, pProp++ ) pProp->dwStatus = DBPROPSTATUS_NOTSUPPORTED; return DB_E_ERRORSOCCURRED; } _Post_satisfies_(return == S_OK || return == S_FALSE) _Success_(return == S_OK) HRESULT GetIndexofPropIdinPropSet( _In_ ULONG iCurSet, _In_ DBPROPID dwPropertyId, _Out_ ULONG* piCurPropId) { ATLENSURE_RETURN(piCurPropId); UPROPINFO* pUPropInfo = m_pUPropSet[iCurSet].pUPropInfo; for(ULONG ul=0; ulvValue; if (var.vt == VT_BOOL) { if (var.boolVal != ATL_VARIANT_TRUE && var.boolVal != ATL_VARIANT_FALSE) return S_FALSE; } return S_OK; } virtual HRESULT OnInterfaceRequested(_In_ REFIID riid) { // This function exists as part of the change in the OLE DB spec. If // a consumer opens an object and requests an optional interface, the // provider should automatically set the property representing that // interface to true. CDBPropSet propset(DBPROPSET_ROWSET); const GUID* ppGuid[1]; ppGuid[0] = &DBPROPSET_ROWSET; if (InlineIsEqualGUID(riid, __uuidof(IRowsetChange))) { if(!propset.AddProperty(DBPROP_IRowsetChange, true)) { return E_FAIL; } } else if (InlineIsEqualGUID(riid, __uuidof(IRowsetUpdate))) { if(!propset.AddProperty(DBPROP_IRowsetUpdate, true)) { return E_FAIL; } } else if (InlineIsEqualGUID(riid, __uuidof(IRowsetLocate))) { if(!propset.AddProperty(DBPROP_IRowsetLocate, true)) { return E_FAIL; } } else if (InlineIsEqualGUID(riid, __uuidof(IConnectionPointContainer))) { if(!propset.AddProperty(DBPROP_IConnectionPointContainer, true)) { return E_FAIL; } } else if (InlineIsEqualGUID(riid, __uuidof(IRowsetScroll))) { if(!propset.AddProperty(DBPROP_IRowsetScroll, true)) { return E_FAIL; } } if (propset.cProperties > 0) return SetProperties(0, 1, &propset, 1, ppGuid); return S_OK; } virtual HRESULT OnPropertyChanged( _In_ ULONG /*iCurSet*/, _In_ DBPROP* /*pDBProp*/) = 0; ATLPREFAST_SUPPRESS(6014) /* prefast noise VSW 498981 */ HRESULT SetProperty( _In_ ULONG iCurSet, _In_ ULONG iCurProp, _Inout_ DBPROP* pDBProp) { HRESULT hr = S_OK; UPROP* pUProp; UPROPVAL* pUPropVal; UPROPINFO* pUPropInfo; ULONG iUProp; ATLENSURE_RETURN( pDBProp ); // Set pointer to correct set pUProp = &(m_pUProp[iCurSet]); ATLENSURE_RETURN( pUProp ); pUPropInfo = &(m_pUPropSet[iCurSet].pUPropInfo[iCurProp]); ATLENSURE_RETURN( pUPropInfo ); // Determine the index within m_pUProp for(iUProp=0; iUPropcPropIds; iUProp++) { if( (pUProp->rgpUPropInfo[iUProp])->dwPropId == pDBProp->dwPropertyID ) break; } if( iUProp >= pUProp->cPropIds ) { ATLASSERT( !"Should have found index of property to set" ); hr = E_FAIL; pDBProp->dwStatus = DBPROPSTATUS_NOTSUPPORTED; goto EXIT; } //Get the UPROPVAL node pointer within that propset. pUPropVal = &(pUProp->pUPropVal[iUProp]); ATLENSURE_RETURN( pUPropVal ); // Handle VT_EMPTY, which indicates to the provider to // reset this property to the providers default if( pDBProp->vValue.vt == VT_EMPTY ) { if( pUPropInfo->dwFlags & DBPROPFLAGS_COLUMNOK ) { // Remove any nodes, because the default applies to // all columns delete pUPropVal->pCColumnIds; pUPropVal->pCColumnIds = NULL; } // Should clear here, since previous values may already // have been cached and need to be replaced. VariantClear(&(pUPropVal->vValue)); pUPropVal->dwFlags &= ~DBINTERNFLAGS_CHANGED; hr = GetDefaultValue(iCurSet, pDBProp->dwPropertyID, &(pUPropVal->dwOption), &(pUPropVal->vValue)); goto EXIT; } // Column Level if( pUPropInfo->dwFlags & DBPROPFLAGS_COLUMNOK ) { // Check to see if it applies to all if( (CompareDBIDs(&(pDBProp->colid), &DB_NULLID) == S_OK) ) { // Remove the Columns Storage object delete pUPropVal->pCColumnIds; pUPropVal->pCColumnIds = NULL; pUPropVal->dwOption = pDBProp->dwOptions; if( FAILED(hr = VariantCopy(&(pUPropVal->vValue), &(pDBProp->vValue))) ) goto EXIT; pUPropVal->dwFlags |= DBINTERNFLAGS_CHANGED; } else // Does not apply to all columns { if( pUPropVal->pCColumnIds == NULL ) { pUPropVal->pCColumnIds = _ATL_NEW CColumnIds; } if( pUPropVal->pCColumnIds ) { if( FAILED(hr = (pUPropVal->pCColumnIds)->AddColumnId(pDBProp)) ) goto EXIT; pUPropVal->dwFlags |= DBINTERNFLAGS_CHANGED; } else { hr = E_OUTOFMEMORY; goto EXIT; } } } else { // Set for non-column level properties pUPropVal->dwOption = pDBProp->dwOptions; // Our provider has no limit on the maximum number of rows // that can have pending changes, therefore the value of the // DBPROP_MAXPENDINGROWS property will always be zero (default), // regardless of what the user attempts to set it to. // In the code below, we modify the property value only if // this is not the DBPROP_MAXPENDINGROWS property. if( pDBProp->dwPropertyID != DBPROP_MAXPENDINGROWS ) { if( FAILED(hr = VariantCopy(&(pUPropVal->vValue), &(pDBProp->vValue))) ) goto EXIT; } if( FAILED(hr = OnPropertyChanged(iCurSet, pDBProp))) goto EXIT; pUPropVal->dwFlags |= DBINTERNFLAGS_CHANGED; } EXIT: if( hr == S_OK ) pDBProp->dwStatus = DBPROPSTATUS_OK; return hr; } ATLPREFAST_UNSUPPRESS() ATLPREFAST_SUPPRESS(6102) HRESULT SetProperties( _In_ const DWORD /*dwStatus*/, _In_ const ULONG cPropertySets, _In_reads_(cPropertySets) const DBPROPSET rgPropertySets[], _In_ const ULONG cSelectProps = 1, _In_reads_(cSelectProps) const GUID* const ppGuid[] = NULL, _In_ bool bIsCreating = false) { DWORD dwState = 0; ULONG ulCurSet, ulCurProp, ulProp; DBPROP* rgDBProp; UPROPINFO* pUPropInfo; CComVariant vDefaultValue; DWORD dwOption; CComCritSecLock lock(m_oCriticalSection); // ppGuid specifies the property sets that the consumer can set based // on the interface that called this function. ATLENSURE_RETURN(ppGuid != NULL); if ((cPropertySets != 0) && (rgPropertySets == NULL)) return E_INVALIDARG; // Process property sets for(ULONG ulSet=0; ulSetdwFlags & DBPROPFLAGS_WRITE) == 0 ) { rgDBProp[ulProp].dwStatus = DBPROPSTATUS_OK; vDefaultValue.Clear(); // VT_EMPTY against a read only property should be a no-op since // the VT_EMPTY means the default. if( V_VT(&rgDBProp[ulProp].vValue) == VT_EMPTY ) { dwState |= SETPROP_VALIDPROP; continue; } if( SUCCEEDED(GetDefaultValue(ulCurSet, rgDBProp[ulProp].dwPropertyID, &dwOption, &(vDefaultValue))) ) { if( V_VT(&rgDBProp[ulProp].vValue) == V_VT(&vDefaultValue) ) { switch( V_VT(&vDefaultValue) ) { case VT_BOOL: if( V_BOOL(&rgDBProp[ulProp].vValue) == V_BOOL(&vDefaultValue) ) { dwState |= SETPROP_VALIDPROP; continue; } break; case VT_I2: if( V_I2(&rgDBProp[ulProp].vValue) == V_I2(&vDefaultValue) ) { dwState |= SETPROP_VALIDPROP; continue; } break; case VT_I4: if( V_I4(&rgDBProp[ulProp].vValue) == V_I4(&vDefaultValue) ) { dwState |= SETPROP_VALIDPROP; continue; } break; case VT_BSTR: if( wcscmp(V_BSTR(&rgDBProp[ulProp].vValue), V_BSTR(&vDefaultValue)) == 0 ) { dwState |= SETPROP_VALIDPROP; continue; } break; } } } dwState |= SETPROP_ERRORS; dwState |= (rgDBProp[ulProp].dwOptions == DBPROPOPTIONS_REQUIRED) ? SETPROP_WAS_REQUIRED : 0; rgDBProp[ulProp].dwStatus = (rgDBProp[ulProp].dwOptions == DBPROPOPTIONS_OPTIONAL) ? DBPROPSTATUS_NOTSET : DBPROPSTATUS_NOTSETTABLE; _ATLDUMPPROPERTY(rgDBProp[ulProp].dwPropertyID, rgDBProp[ulProp].dwStatus); continue; } // Check that the property is being set with the correct VARTYPE if( (rgDBProp[ulProp].vValue.vt != pUPropInfo->VarType) && (rgDBProp[ulProp].vValue.vt != VT_EMPTY) ) { // The SQL Native Client OLE DB provider uses different authentication based on the content of the VARIANT. // If the variant is an empty VT_BSTR, Windows Authentication Mode is used to authorize user access to the SQL Server database // If the variant is VT_EMPTY, SQL Server security is used to authorize user access to the SQL Server database if (rgDBProp[ulProp].dwPropertyID != DBPROP_AUTH_INTEGRATED && (rgDBProp[ulProp].vValue.vt != VT_EMPTY && rgDBProp[ulProp].vValue.vt != VT_BSTR)) { dwState |= SETPROP_ERRORS; dwState |= (rgDBProp[ulProp].dwOptions == DBPROPOPTIONS_REQUIRED) ? SETPROP_WAS_REQUIRED : 0; rgDBProp[ulProp].dwStatus = DBPROPSTATUS_BADVALUE; _ATLDUMPPROPERTY(rgDBProp[ulProp].dwPropertyID, rgDBProp[ulProp].dwStatus); continue; } } // Check that the value is legal if( (rgDBProp[ulProp].vValue.vt != VT_EMPTY) && IsValidValue(ulCurSet, &(rgDBProp[ulProp])) == S_FALSE ) { dwState |= SETPROP_ERRORS; dwState |= (rgDBProp[ulProp].dwOptions == DBPROPOPTIONS_REQUIRED) ? SETPROP_WAS_REQUIRED : 0; rgDBProp[ulProp].dwStatus = DBPROPSTATUS_BADVALUE; _ATLDUMPPROPERTY(rgDBProp[ulProp].dwPropertyID, rgDBProp[ulProp].dwStatus); continue; } // Check for a bad COLID, we only catch bad DBIDs if( pUPropInfo->dwFlags & DBPROPFLAGS_COLUMNOK ) { if( CDBIDOps::IsValidDBID(&(rgDBProp[ulProp].colid)) == S_FALSE ) { dwState |= SETPROP_ERRORS; dwState |= (rgDBProp[ulProp].dwOptions == DBPROPOPTIONS_REQUIRED) ? SETPROP_WAS_REQUIRED : 0; rgDBProp[ulProp].dwStatus = DBPROPSTATUS_BADCOLUMN; _ATLDUMPPROPERTY(rgDBProp[ulProp].dwPropertyID, rgDBProp[ulProp].dwStatus); continue; } dwState |= SETPROP_COLUMN_LEVEL; } if(SetProperty(ulCurSet, ulCurProp, /*pUPropInfo,*/ &(rgDBProp[ulProp])) == S_OK) { dwState |= SETPROP_VALIDPROP; } else { dwState |= SETPROP_ERRORS; dwState |= (rgDBProp[ulProp].dwOptions == DBPROPOPTIONS_REQUIRED) ? SETPROP_WAS_REQUIRED : 0; } _ATLDUMPPROPERTY(rgDBProp[ulProp].dwPropertyID, rgDBProp[ulProp].dwStatus); } } vDefaultValue.Clear(); // At least one propid was marked as not S_OK if( dwState & SETPROP_ERRORS ) { if (!bIsCreating) { return (dwState & SETPROP_VALIDPROP) ? DB_S_ERRORSOCCURRED : DB_E_ERRORSOCCURRED; } else { return (dwState & SETPROP_WAS_REQUIRED) ? DB_E_ERRORSOCCURRED : DB_S_ERRORSOCCURRED; } } return S_OK; } ATLPREFAST_UNSUPPRESS() OUT_OF_LINE HRESULT CopyUPropVal( _In_ ULONG iPropSet, _Inout_ UPROPVAL* rgUPropVal) { HRESULT hr = S_OK; UPROP* pUProp; UPROPVAL* pUPropVal; DBPROP dbProp; ATLENSURE_RETURN(rgUPropVal); ATLASSERT(iPropSet < m_cUPropSet); VariantInit(&dbProp.vValue); pUProp = &(m_pUProp[iPropSet]); for(ULONG ul=0; ulcPropIds; ul++) { pUPropVal = &(pUProp->pUPropVal[ul]); // Transfer dwOptions rgUPropVal[ul].dwOption = pUPropVal->dwOption; // Transfer Flags rgUPropVal[ul].dwFlags = pUPropVal->dwFlags; // Transfer Column Properties if( pUPropVal->pCColumnIds ) { rgUPropVal[ul].pCColumnIds = _ATL_NEW CColumnIds; ATLPREFAST_SUPPRESS(6385) if( rgUPropVal[ul].pCColumnIds ) ATLPREFAST_UNSUPPRESS() { CColumnIds* pColIds = pUPropVal->pCColumnIds; for (size_t i = 0; i < pColIds->GetCount(); i++) { hr = (pUPropVal->pCColumnIds)->GetValue(i, &(dbProp.dwOptions),&(dbProp.colid), &(dbProp.vValue)); if( FAILED(hr) ) goto EXIT; if( FAILED(hr = (rgUPropVal[ul].pCColumnIds)->AddColumnId(&dbProp)) ) goto EXIT; } } else { hr = E_OUTOFMEMORY; goto EXIT; } } else { rgUPropVal[ul].pCColumnIds = NULL; } // Transfer value VariantInit(&(rgUPropVal[ul].vValue)); if( FAILED(hr = VariantCopy(&(rgUPropVal[ul].vValue), &(pUPropVal->vValue))) ) goto EXIT; } EXIT: VariantClear(&(dbProp.vValue)); return hr; } void ClearPropertyInError() { ATLASSUME( m_rgdwPropsInError ); memset(m_rgdwPropsInError, 0, m_cUPropSet * m_cElemPerSupported * sizeof(DWORD)); } void CopyUPropSetsSupported(_Out_ DWORD* rgdwSupported) { Checked::memcpy_s(rgdwSupported, m_cUPropSet * m_cElemPerSupported * sizeof(DWORD), m_rgdwSupported, m_cUPropSet * m_cElemPerSupported * sizeof(DWORD)); } virtual HRESULT InitUPropSetsSupported() = 0; virtual HRESULT GetIndexofPropSet( _In_ const GUID* pPropSet, _Out_ ULONG* pulCurSet) = 0; ULONG GetCountofWritablePropsInPropSet(_In_ ULONG iPropSet) { ULONG cWritable = 0; UPROPINFO* pUPropInfo; ATLENSURE( m_pUPropSet ); ATLASSERT( iPropSet < m_cUPropSet ); pUPropInfo = m_pUPropSet[iPropSet].pUPropInfo; for(ULONG ul=0; ul(sizeof(UPROPSET)), cSets); if (pPropSet == NULL) return E_OUTOFMEMORY; pPropSet = (*pfnGetSet)(&cPropSet, &cElemsPerSupported, pPropSet, (GUID*)&GUID_NULL); memset(m_rgdwSupported, 0xFFFF, cPropSet * cElemsPerSupported * sizeof(DWORD)); CoTaskMemFree(pPropSet); return S_OK; } HRESULT InternalGetDefaultValue( _In_ PGetPropSet pfnGetSet, _In_ ULONG iPropSet, _In_ DBPROPID dwPropId, _Out_ DWORD* pdwOption, _Out_ VARIANT* pVar) { if (pdwOption == NULL || pVar == NULL) return E_INVALIDARG; ULONG cUPropSet = 0, cElemPerSupported =0; int cSets = (int)(DWORD_PTR)(*pfnGetSet)(NULL, &cElemPerSupported, NULL, (GUID*)&GUID_NULL); UPROPSET* pPropSet = (UPROPSET*)::ATL::AtlCoTaskMemCAlloc(static_cast(sizeof(UPROPSET)), cSets); if (pPropSet == NULL) return E_OUTOFMEMORY; pPropSet = (*pfnGetSet)(&cUPropSet, &cElemPerSupported, pPropSet, (GUID*)&GUID_NULL); ATLASSERT(iPropSet < cUPropSet); for (ULONG iProp = 0; iProp < pPropSet[iPropSet].cUPropInfo; iProp++) { UPROPINFO& rInfo = pPropSet[iPropSet].pUPropInfo[iProp]; if (rInfo.dwPropId == dwPropId) { HRESULT hr = S_OK; pVar->vt = rInfo.VarType; *pdwOption = rInfo.dwOption; switch(rInfo.VarType) { case VT_BSTR: pVar->bstrVal = SysAllocString(rInfo.szVal); if (pVar->bstrVal == NULL && rInfo.szVal != NULL) hr = E_OUTOFMEMORY; break; default: pVar->lVal = (DWORD)rInfo.dwVal; break; } CoTaskMemFree(pPropSet); return hr; } } CoTaskMemFree(pPropSet); return E_FAIL; } _Success_(return == S_OK) HRESULT InternalFInit( _In_ PGetPropSet pfnGetSet, _In_opt_ CUtlPropsBase* pCopyMe = NULL) { HRESULT hr; ULONG ulPropId; ULONG cPropIds; ULONG iPropSet; ULONG iNewDex; UPROPINFO* pUPropInfo; // If a pointer is passed in, we should copy that property object if( pCopyMe ) { // Establish some base values m_cUPropSet = pCopyMe->m_cUPropSet; CoTaskMemFree(m_pUPropSet); m_pUPropSet = (UPROPSET*)::ATL::AtlCoTaskMemCAlloc(static_cast(sizeof(UPROPSET)), m_cUPropSet); if (m_pUPropSet == NULL) return E_OUTOFMEMORY; Checked::memcpy_s(m_pUPropSet, sizeof(UPROPSET) * m_cUPropSet, pCopyMe->m_pUPropSet, sizeof(UPROPSET) * m_cUPropSet); m_cElemPerSupported = pCopyMe->m_cElemPerSupported; ATLASSERT( (m_cUPropSet != 0) && (m_cElemPerSupported != 0) ); // Retrieve Supported Bitmask ATLTRY(m_rgdwSupported.Allocate(::ATL::AtlMultiplyThrow(m_cUPropSet, m_cElemPerSupported))); ATLTRY(m_rgdwPropsInError.Allocate(::ATL::AtlMultiplyThrow(m_cUPropSet, m_cElemPerSupported))); if( m_rgdwSupported == NULL|| m_rgdwPropsInError == NULL) { m_rgdwSupported.Free(); m_rgdwPropsInError.Free(); return E_OUTOFMEMORY; } ClearPropertyInError(); pCopyMe->CopyUPropSetsSupported(m_rgdwSupported); } else { int cSets = (int)(DWORD_PTR)(*pfnGetSet)(NULL, &m_cElemPerSupported, NULL, (GUID*)&GUID_NULL); UPROPSET* pSet = (UPROPSET*)::ATL::AtlCoTaskMemCAlloc(static_cast(sizeof(UPROPSET)), cSets); if (pSet == NULL) return E_OUTOFMEMORY; pSet = (*pfnGetSet)(&m_cUPropSet, &m_cElemPerSupported, pSet, (GUID*)&GUID_NULL); CoTaskMemFree(m_pUPropSet); m_pUPropSet = pSet; ATLASSERT( (m_cUPropSet != 0) && (m_cElemPerSupported != 0) ); if( !m_cUPropSet || !m_cElemPerSupported ) return E_FAIL; ATLTRY(m_rgdwSupported.Allocate(::ATL::AtlMultiplyThrow(m_cUPropSet, m_cElemPerSupported))); ATLTRY(m_rgdwPropsInError.Allocate(::ATL::AtlMultiplyThrow(m_cUPropSet, m_cElemPerSupported))); if( m_rgdwSupported == NULL || m_rgdwPropsInError == NULL) { m_rgdwSupported.Free(); m_rgdwPropsInError.Free(); return E_OUTOFMEMORY; } else ClearPropertyInError(); if( FAILED(hr = InitUPropSetsSupported()) ) { m_rgdwSupported.Free(); return hr; } } // Allocate UPROPS structures for the count of Property sets if(m_pUProp.Allocate(m_cUPropSet)) { memset(m_pUProp, 0, m_cUPropSet * sizeof(UPROP)); } else { m_cUPropSet = 0; return E_OUTOFMEMORY; } // With in the UPROPS Structure allocate and initialize the // Property IDs that belong to this property set. for(iPropSet=0; iPropSet 0 ) { CAutoVectorPtr< UPROPINFO* > rgpUPropInfo; CAutoVectorPtr< UPROPVAL > rgUPropVal; rgpUPropInfo.Allocate( cPropIds ); rgUPropVal.Allocate( cPropIds ); if ( (rgpUPropInfo == NULL) || (rgUPropVal == NULL) ) { return E_OUTOFMEMORY; } if( pCopyMe ) { pCopyMe->CopyUPropInfo(iPropSet, rgpUPropInfo); if( FAILED(hr = pCopyMe->CopyUPropVal(iPropSet, rgUPropVal)) ) return hr; } else { // Clear Pointer Array #pragma warning(suppress : 28313) // The C28313 warning associated with the following line is spurious. memset(static_cast(rgpUPropInfo), 0, cPropIds * sizeof(UPROPINFO*)); // Set Pointer to correct property ids with a property set pUPropInfo = m_pUPropSet[iPropSet].pUPropInfo; // Set up the writable property buffers iNewDex = 0; for(ulPropId=0; ulPropId