2025-11-28 00:35:46 +09:00

2115 lines
82 KiB
C

//--------------------------------------------------------------------
// Microsoft OLE DB Test
//
// Copyright 1995-2000 Microsoft Corporation.
//
// @doc
//
// @module MiscFunc Header Module | Header file for Miscellaneous Private Library Functions
//
// @comm
// Special Notes...: (OPTIONAL NOTES FOR SPECIAL CIRCUMSTANCES)
//
// <nl><nl>
// Revision History:<nl>
//
// [00] MM-DD-YY EMAIL_NAME ACTION PERFORMED... <nl>
// [01] 10-05-95 Microsoft Created <nl>
// [02] 10-26-95 Microsoft Added comments and WSTR2DBTYPE function <nl>
// [02] 12-01-96 Microsoft Updated for release <nl>
//
// @head3 MISCFUNC Elements|
//
//---------------------------------------------------------------------------
#ifndef _MISCFUNC_H_
#define _MISCFUNC_H_
#include "modstandard.hpp" // Needed for CThisTestModule
#include "ctable.hpp" // Needed for CompareData
#include "CModInfo.hpp" // Needed for CModInfo
#include <stdlib.h> // Needed for Compare SafeArrays
#include <math.h> // Needed for pow function
#include <time.h> // Needed for time function
//-----------------------------------------------------------------------------
// ENUM
//-----------------------------------------------------------------------------
// @enum ECOMPARE_FREE | Used for compare data routine
enum ECOMPARE_FREE{
COMPARE_FREE, // @emem compare data and free the memory refereced by the consumer's buffer
COMPARE_ONLY, // @emem compare data only. Do not attempt to free memory
FREE_ONLY // @emem free memory only. Do not attemp to compare data
};
// @enum ECOMPARE_LEVEL | Used for compare data routine
enum ECOMPARE_LEVEL{
COMPARE_ALL, // @emem compare data for all columns and binding parts. even if an error is encountered
COMPARE_UNTIL_ERROR // @emem stop comparing and exit after first failure occurs
};
// @enum STATEMENTKIND |
enum STATEMENTKIND
{
eSELECT,
eINSERT,
eDELETE,
eUPDATE,
eInsertERROR,
eSelectERROR,
eSQL,
eNOCOMMAND
};
// @enum EPREPARE |
enum EPREPARE
{
PREPARE,
IMPLICITPREPARE,
UNPREPARE,
BOTH,
NEITHER
};
// INTERFACEMAP
typedef struct _INTERFACEMAP
{
EINTERFACE eInterface;
const IID* pIID;
WCHAR* pwszName;
BOOL fMandatory;
DWORD dwConfLevel;
DBPROPID dwPropertyID;
} INTERFACEMAP;
//-----------------------------------------------------------------------------
// Prototypes
//-----------------------------------------------------------------------------
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc ModuleCreateDBSession|
// Takes information in pThisTestModule and uses it to
// create a data source object on the provider,
// do initialization if required, and retrieve an
// IDBCreateCommand pointer. The IDBCreateCommand pointer
// is stored in pThisTestModule->m_pIUnknown to be
// used later by the test case.
//
//---------------------------------------------------------------------------
BOOL ModuleCreateDBSession(
CThisTestModule * pThisTestModule //@parm [IN] Pointer to module object
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc ModuleReleaseDBSession|
// Releases the DB Session's IDBCreateCommand interface
// retrieved in ModuleCreateDBSession.
//
//---------------------------------------------------------------------------
BOOL ModuleReleaseDBSession(
CThisTestModule * pThisTestModule //@parm [IN] Pointer to module object
);
//--------------------------------------------------------------------
// @func BOOL|
// MiscFunc GetInterfaceArray
// Returns an array of interface IIDs and associated info for a particular object
//
//--------------------------------------------------------------------
BOOL GetInterfaceArray
(
EINTERFACE eInterface,
ULONG* pcInterfaces,
INTERFACEMAP** prgInterfaces
);
BOOL IsIIDThisType
(
REFIID riid,
EINTERFACE eInterface
);
//--------------------------------------------------------------------
// @func BOOL|
// MiscFunc DBGUIDtoEINTERFACE
// Converts known DBGUID types to corresponding EINTERFACE.
//
//--------------------------------------------------------------------
EINTERFACE DBGUIDtoEINTERFACE
(
REFGUID rguid
);
//--------------------------------------------------------------------
// @func BOOL|
// MiscFunc IsConfLevel|
// Checks if the Conformance Level of the provider is >= to the "required"
// conformance level.
//
// @rdesc Success or Failure
// @flag TRUE | Required
// @flag FALSE | Not Required
//--------------------------------------------------------------------
BOOL IsConfLevel(DWORD dwProvLevel, DWORD dwReqLevel);
//--------------------------------------------------------------------
// @func BOOL|
// MiscFunc IsReqProperty|
// Checks if the Property is required for the
// conformance level of the provider.
//
//--------------------------------------------------------------------
BOOL IsReqProperty
(
DBPROPID dwPropertyID,
GUID guidPropertySet
);
//--------------------------------------------------------------------
// @func BOOL|
// MiscFunc IsReqInterface|
// Checks if the interface is required on the given object for the
// conformance level of the provider.
//
//--------------------------------------------------------------------
BOOL IsReqInterface
(
EINTERFACE eInterface,
REFIID riid
);
//--------------------------------------------------------------------
// @func BOOL|
// MiscFunc IsValidInterface|
// Checks if the interface is valid on the given object.
//
//--------------------------------------------------------------------
BOOL IsValidInterface
(
EINTERFACE eInterface,
REFIID riid
);
//Determines wiether a property is usable in the Tests.
//The property is required (for the level) or were not using Strict
inline BOOL IsUsableProperty(DBPROPID dwPropertyID, GUID guidPropertySet);
//Determines wiether an Interface property is usable in the Tests.
//The Interface is required (for the level) or were not using Strict
inline BOOL IsUsableInterface(EINTERFACE eInterface, REFIID riid);
//--------------------------------------------------------------------
// @func BOOL|
// Miscfunc VerifyInterface
//
//--------------------------------------------------------------------
BOOL VerifyInterface
(
IUnknown* pIUnkIn, // [IN] Existing interface to QI on
REFIID riid, // [IN] Interface ID to be returned
EINTERFACE eInterface = UNKNOWN_INTERFACE, // [IN] interface Type of pIUnkIn
IUnknown** ppIUnkOut = NULL // [OUT] Interface returned
);
BOOL VerifyEqualInterface(IUnknown* pInterface1, IUnknown* pInterface2);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc IsProviderReadOnly|
// Check whether the provider is read only.
//
//---------------------------------------------------------------------------
BOOL IsProviderReadOnly(
IUnknown * pSessionIUnknown //@parm [IN] Pointer to object
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc GetProviderName|
// Return the Providers string Name.
//
//---------------------------------------------------------------------------
WCHAR* GetProviderName(
IUnknown * pSessionIUnknown //@parm [IN] Pointer to object
);
/////////////////////////////////////////////////////////////////////////////
// HRESULT ConvertToMBCS
//
/////////////////////////////////////////////////////////////////////////////
HRESULT ConvertToMBCS(LPCWSTR pwsz, CHAR* psz, int cStrLen, UINT CodePage = CP_ACP);
CHAR* ConvertToMBCS(LPCWSTR pwsz, UINT CodePage = CP_ACP);
/////////////////////////////////////////////////////////////////////////////
// HRESULT ConvertToWCHAR
//
/////////////////////////////////////////////////////////////////////////////
HRESULT ConvertToWCHAR(LPCSTR psz, WCHAR* pwsz, int cStrLen);
WCHAR* ConvertToWCHAR(LPCSTR psz);
/////////////////////////////////////////////////////////////////////////////
// WCHAR* wcsDuplicate
//
/////////////////////////////////////////////////////////////////////////////
WCHAR* wcsDuplicate(LPCWSTR pwsz);
/////////////////////////////////////////////////////////////////////////////
// String Manipulations
//
/////////////////////////////////////////////////////////////////////////////
WCHAR* FindCharacter(WCHAR* pwszStart, WCHAR* pwszEnd, WCHAR wChar);
WCHAR* FindSubString(WCHAR* pwszBuffer, WCHAR* pwszKeyword, BOOL fCaseSensitive = FALSE);
WCHAR* SkipWhiteSpace(WCHAR* pwszStart, WCHAR* pwszEnd = NULL, WCHAR* pwszWhiteSpace = L" ");
HRESULT ReplaceString(WCHAR* pwszBuffer, WCHAR* pwszTokens, WCHAR* pwszReplace);
/////////////////////////////////////////////////////////////////////////////
// Storage Object routines
//
/////////////////////////////////////////////////////////////////////////////
// 64bit TODO - Change the ULONGs to DBLENGTH after the stream interfaces are modified for 64 bit.
HRESULT StorageRead(REFIID riid, IUnknown* pIUnknown, void* pBuffer, ULONG cBytes, ULONG* pcBytesRead = NULL, ULONG ulOffset = 0);
HRESULT StorageWrite(REFIID riid, IUnknown* pIUnknown, void* pBuffer, ULONG cBytes, ULONG* pcBytesWrote = NULL, ULONG ulOffset = 0);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareData|
// The function compares the data in the user's buffer with the data at the backend
// table. The data is retrieved from the rowset by an accessor. The status, length and value
// bindings for each column are checked as specified in the accessor.
//
// This routine only checks data retrieved by DBBINDIO_READWRITE and DBBINDIO_READCOLUMNSBYREF
// accessors. DBBINDIO_READBYREF accessor is not supported by Kagera and we are testing it.
//
// @rdesc Comparision results
// @flag TRUE | Data is the same as the backend.
// @flag FALSE | Data is not the same as the backend.
//
//---------------------------------------------------------------------------
BOOL CompareData
(
DBORDINAL cColumns, //@parm [in] the count of rgColumnsOrd
DB_LORDINAL* rgColumnsOrd, //@parm [in] the array of column ordinals in the backend table.
// The column ordinals in the backend table is
// not the same as ordinals in the rowset.
DBCOUNTITEM cRow, //@parm[in] the row number of the data at the backend table
void* pData, //@parm[in] the pointer to the buffer which contains the data
// to be compared with
DBCOUNTITEM cBinding, //@parm[in] the count of the rgBinding
DBBINDING* rgBinding, //@parm[in] the binding information of the accessor which
// retrieved the data
CSchema* pSchema, //@parm[in] The pointer to CTable object from which the
// the rowset was created.
IMalloc* pIMalloc, //@parm [in] the IMalloc pointer used to free memory.
// can not be NULL.
EVALUE eValue = PRIMARY, //@parmopt [in] whether use PRIMARY or SECONDARY to make a data
//
ECOMPARE_FREE eCompareFree = COMPARE_FREE, //@parmopt[in]
//COMPARE_FREE
//compare data and free the memory refereced
//by the consumer's buffer
//COMPARE_ONLY
//compare data only. Do not attempt to free memory
//FREE_ONLY
//free memory only. Do not attemp to compare data
// (default = COMPARE_FREE)
ECOMPARE_LEVEL eCompareLevel = COMPARE_ALL, //@paramopt [in] Whether or not to stop when
//first error is encountered. Default = COMPARE_ALL, meaning
//comparison continues even after an error occurs
BOOL bCompareValue = TRUE // @paramopt [in] flag to tell whether or not to compare Value when
// status is null. Default is TRUE (i.e. Compare Value when Status is
// null. when bCompareValue == FALSE then value field is not compared.
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareBuffer|
// The function compares the data in two buffers based on the binding
// structure. It assumes the two buffers share the same binding structure.
// When fSetData is TRUE, pSetData should points to a buffer that is used
// for setdata/setnewdata. The status of the buffer should only be
// DBCOLUMNSTATUS_OK or DBCOLUMNSTATUS_NULL.
//
// @rdesc Comparision results
// @flag TRUE | Data in the two buffers is the same.
// @flag FALSE | Data in the two buffers is not the same..
//
//---------------------------------------------------------------------------
BOOL CompareBuffer
(
void* pGetData, //@parm[in]: the pointer to one buffer.
void* pSetData, //@parm[in]: the pointer to the second buffer
// This should be the buffer to
// set the data with
DBCOUNTITEM cBinding, //@parm[in]: the count of rgBinding
DBBINDING* rgBinding, //@parm[in]: the binding structure of the buffer
IMalloc* pIMalloc, //@parm[in]: IMalloc pointer for free memory
BOOL fSetData = FALSE, //@parm[in]: pSetData is used for set data.
BOOL fReadColumnsByRef = FALSE,
//@parm[in]: TRUE if the columns are binded by an accessor
// of type DBBINDIO_READCOLUMNSBYREF
ECOMPARE_FREE eCompareFree = COMPARE_FREE,
//@parm[in]:
//COMPARE_FREE
//compare data and free the memory refereced
//by the consumer's buffer
//COMPARE_ONLY
//compare data only. Do not attempt to free memory
//FREE_ONLY
//free memory only. Do not attemp to compare data
BOOL fAllowUnavailable = FALSE,
//@parm[in]: TRUE if DBSTATUS_S_UNAVAILABLE is a valid value in GetData
// e.g. GetData after a SetData or an InsertRow with DBSTATUS_S_DEFAULT
// default value FALSE
DBCOUNTITEM cSetBindings = 0,
DBBINDING* rgSetBindings = NULL,
BOOL fStrictVarType = FALSE // VT must match exactly, otherwise we will attempt to convert if mismatch
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareSafeArray|
// Compare two SafeArrays. Free memory pointed by pBackEndData if required.
//
// @rdesc TRUE if data is the same as the backend. FALSE otherwise.
//
//---------------------------------------------------------------------------
BOOL CompareSafeArray(
SAFEARRAY *pConsumerData, //@parm [in] the pointer to a safearray in the consumer's buffer
SAFEARRAY *pBackEndData, //@parm [in] the pointer to a safeaarry at the backend
DBTYPE dwType, //@parm [in] the expected DBType of the data in the safearray.
// It will be checked against the base vt type of
// the safearray. If dwType==INVALID_DBTYPE, the
// SafeArray's base type will not be checked. It
// can not be ORed with any type modifers.
IMalloc *pIMalloc, //@parm [in] pointer to IMalloc. Can be NULL if
// fFreeMemory is FALSE.
BOOL fFreeMemory=TRUE //parmopt [in] whether to free the memory pointed
// by pBackEndData (Default = TRUE)
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareVector|
// Compare two vectors. Free memory pointed by pBackEndData if required.
//
// @rdesc TRUE if data is the same as the backend. FALSE otherwise.
//
//---------------------------------------------------------------------------
BOOL CompareVector(
DBVECTOR *pConsumerData, //@parm [in] the pointer to the vector in consumer's buffer
DBVECTOR *pBackEndData, //@parm [in] the pointer to the vector at the backend
DBTYPE dwType, //@parm [in] the DBType indicator of the data. It can
// not be ORed with any DBType modifiers.
DBLENGTH ulSize, //@parm [in] the size of one element in the vector.
// Only valid for DBTYPE_BYTES
BYTE bPrecision, //@parm [in] the precision
// Only valid for DBTYPE_DBNUMERIC or DBTYPE_DECIMAL
BYTE bScale, //@parm [in] the scale
// Only valid for DBTYPE_DBNUMERIC or DBTYPE_DECIMAL
BOOL fFreeMemory=TRUE//@parmopt [in] whether to free the memory pointed
// by pBackEndData (default = TRUE)
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareDBTypeData|
// Compare two data of any DBTYPE.
// Free memory pointed by pBackEndData if requested.
//
// @rdesc TRUE if data is the same as the backend. FALSE otherwise.
//
//---------------------------------------------------------------------------
BOOL CompareDBTypeData(
void *pConsumerData, //@parm [in] the pointer to consumer data
void *pBackEndData, //@parm [in] the pointer to data at the backend
DBTYPE dwType, //@parm [in] the DBType of the data. It can not be ORed with
// any DBType modifers.
DBLENGTH ulBackEndSize, //@parm [in] the size of the data, only valid for DBTYPE_BYTES
//or DBTYPE_VARNUMERIC
BYTE bPrecision, //@parm [in] the precision
// Only valid for DBTYPE_DBNUMERIC or DBTYPE_DECIMAL
BYTE bScale, //@parm [in] the scale
// Only valid for DBTYPE_DBNUMERIC or DBTYPE_DECIMAL
IMalloc *pIMalloc, //@parm [in] the pointer tp IMalloc for freeing memory.
// pIMalloc can not NULL if fFreeMemory is FALSE.
BOOL fFreeMemory=TRUE, //@parmopt [in] whether to free the memory pointed
// by pBackEndData. (default = TRUE)
DBTYPE wBackEndType=DBTYPE_EMPTY, //@parm [in]: data type of the backend, default DBTYPE_EMPTY.
DBLENGTH cbConsumerSize=0, //@parm [in]: the size of data pointed to by pConsumerData, only
//valid for DBTYPE_VARNUMERIC
BOOL fApproxVarTypes = FALSE
);
//---------------------------------------------------------------------------
// @func: BOOL|
// MiscFunc CompareDateTime|
// Compare two date time structs. Does not attempt to free memory
// The DBType can be either DBTYPE_DATESTRUCT, DBTYPE_TIMESTRUCT, or
// DBTYPE_TIMESTAMPSTRUCT
//
// @rdesc: TRUE if data is the same as the backend. FALSE otherwise.
//
//---------------------------------------------------------------------------
BOOL CompareDateTime(
void *pConsumerData, //@parm [in] Pointer to the date time struct in the consumer's buffer.
void *pBackEndData, //@parm [in] Pointer to the date time struct at the backend.
DBTYPE dwType //@parm [in] the type indicator
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareVariant|
// Compare two variants. Does not attempt to free memory
//
// @rdesc TRUE if data is the same as the backend. FALSE otherwise.
//
//---------------------------------------------------------------------------
BOOL CompareVariant
(
VARIANT *pVariantOrg, //@parm [in] Pointer to the variant in the consumer's buffer.
VARIANT *pVariantCpy, //@parm [in] Pointer to the variant at the backend.
BOOL fCaseSensitive = TRUE,
BOOL fApproxTypes = FALSE
);
//---------------------------------------------------------------------------
// @func BOOL|
// Checks if the type of variant is a string type, date type,
// or num type.
//---------------------------------------------------------------------------
BOOL IsStringType(DBTYPE dbType);
BOOL IsDateTimeType(DBTYPE dbType);
BOOL IsNumType(DBTYPE dbType);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CompareDBID|
// Compares to DBIDs, TRUE indicates that they are the same
//
//---------------------------------------------------------------------------
BOOL CompareDBID(
const DBID& x, //@parm [IN] First DBID to compare
const DBID& y, //@parm [IN] Second DBID to compare
IUnknown *pIUnknown = NULL //@parm [IN] DSO interface
);
//---------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CreateUniqueDBID|
//
//---------------------------------------------------------------------------
HRESULT CreateUniqueDBID(
DBID* pDBID, //@parm [IN] Pointer to storage for new DBID
BOOL fInitialize = FALSE
);
HRESULT VariantToString(VARIANT* pVariant, WCHAR* pwsz, ULONG ulMaxSize, BOOL fDispVarBool = TRUE);
HRESULT StringToVariant(WCHAR* pwsz, VARTYPE vt, VARIANT* pVariant);
HRESULT SafeArrayToString(SAFEARRAY* pSafeArray, DBTYPE wType, WCHAR* pwsz, DBLENGTH ulMaxSize);
HRESULT StringToSafeArray(WCHAR* pwsz, DBTYPE wType, SAFEARRAY** ppSafeArray);
HRESULT StringToVector(WCHAR* pwszBuffer, DBTYPE wType, DBVECTOR* pVector);
HRESULT VectorToString(DBVECTOR* pVector, DBTYPE wType, WCHAR* pwszBuffer, DBLENGTH ulMaxSize);
//---------------------------------------------------------------------------
// @func void *|
// MiscFunc WSTR2DBTYPE|
// Converts a DB_WSTR to any other DB_TYPE
// @rdesc Pointer to converted data, of type dbDestType. Caller
// must free this memory using IMalloc::Free.
//
//---------------------------------------------------------------------------
VARIANT* DBTYPE2VARIANT(
void* pvSource, //@parm [IN] Value to be converted, must NOT be null
DBTYPE wType //@parm [IN] DBTYPE of Value
);
//---------------------------------------------------------------------------
// @func void *|
// MiscFunc WSTR2DBTYPE|
// Converts a DB_WSTR to any other DB_TYPE
// @rdesc Obsolete, using USHORT for the returned count of bytes is not
// adequate. Newer tests used should the other overloaded func
//
//---------------------------------------------------------------------------
void* WSTR2DBTYPE(
WCHAR * wszSource, //@parm [IN] String to be converted, must NOT be null
DBTYPE dbDestType, //@parm [IN] DBTYPE to convert to
USHORT * pcb, //@parm [OUT] Pointer to USHORT to store count
// of bytes. This is ignored unless
// dbDestType == DBTYPE_BYTES or DBTYPE_VARNUMERIC
BOOL fLaxConvert = FALSE //@param [IN] optional Whether to use strict error checking. DEFAULT = FALSE
);
//---------------------------------------------------------------------------
// @func void *|
// MiscFunc WSTR2DBTYPE_EX|
// Converts a DB_WSTR to any other DB_TYPE
// @rdesc Pointer to converted data, of type dbDestType. Caller
// must free this memory using IMalloc::Free.
//
//---------------------------------------------------------------------------
void* WSTR2DBTYPE_EX(
WCHAR * wszSource, //@parm [IN] String to be converted, must NOT be null
DBTYPE dbDestType, //@parm [IN] DBTYPE to convert to
ULONG_PTR * pcb, //@parm [OUT] Pointer to USHORT to store count
// of bytes. This is ignored unless
// dbDestType == DBTYPE_BYTES or DBTYPE_VARNUMERIC
BOOL fLaxConvert = FALSE //@param [IN] optional Whether to use strict error checking. DEFAULT = FALSE
);
//---------------------------------------------------------------------------
// @func LONG|
// MiscFunc GetDBTypeSize|
// Return the length of a DBTYPE. It returns 0 for any data type ORed with
//
// DBTYPE_RESERVED, DBTYPE_ARRAY, DBTYPE_VECTOR. It returns 0 for DBTYPE_EMPTY,
// DBTYPE_NULL, and any variable length data types. It returns INVALID_DBTYPE_SIZE
// for invalid input. If the data is ORed with DBTYPE_BYREF, the bit flag is ignored
//
//---------------------------------------------------------------------------
LONG GetDBTypeSize(
DBTYPE dwDBType //@parm [in] The DBType to compute
);
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc CleanUpVector|
// Clean up any memory allocated for the vector.
//
//-----------------------------------------------------------------------------
void CleanUpVector(
DBVECTOR *pConsumerData, //@parm [in] the pointer to the vector
DBTYPE dwType //@parm [in] the dwType of the element in the vector
// It can only ORed with DBTYPE_VECTOR
);
//-----------------------------------------------------------------------------
// @func DBTYPE|
// MiscFunc VARTYPE2DBTYPE|
// Return the equivalent DBTYPE for a valid base VARTYPE of a SafeArray.
// The base type of a safearry is restricted to a subset of the variant type.
// Neither the VT_RESERVED and VT_BYREF flags can be set.
// VT_EMPTY and VT_NULL are not valid.
//
//-----------------------------------------------------------------------------
DBTYPE VARTYPE2DBTYPE(
VARTYPE vt //@parm [in] The vt tag of the safearray
);
//-----------------------------------------------------------------------------
// @func HRESULT|
// MiscFunc CountRowsOnRowset|
// Counts rows on rowset.
//
//-----------------------------------------------------------------------------
HRESULT CountRowsOnRowset(
IRowset* pIRowset, //@parm [in] Rowset object
DBCOUNTITEM* pcRows //@parm [out] Count of rows
);
//-----------------------------------------------------------------------------
// @func HRESULT|
// MiscFunc GetAccessorAndBindings|
// Creates an Accessor and bindings. The DBTYPE returned by
// IColumnsInfo for the command/rowset is used for each column's binding.
// NOTE: The user may create an accessor with a flag of PARAMETER_DATA,
// but the bindings will be based on column information rather than
// parameter information. The user should use GetParameterAccessorAndBindings
// to generate a valid accessor for PARAMETER_DATA (one in which the coercions
// in the bindings will be valid for the specified parameter number).
//
//-----------------------------------------------------------------------------
HRESULT GetAccessorAndBindings(
IUnknown * pIUnkObject, // @parm [IN] Rowset, Command, or RowObject to create bindings for
DBACCESSORFLAGS dwAccessorFlags, // @parm [IN] Properties of the Accessor
HACCESSOR * phAccessor=NULL, // @parmopt [OUT] Accessor created
DBBINDING ** prgDBBINDING=NULL, // @parmopt [OUT] Array of DBBINDINGS
DBCOUNTITEM * cBindings=NULL, // @parmopt [OUT] Count of bindings
DBLENGTH * cbRowSize=NULL, // @parmopt [OUT] Length of a row, DATA
DBPART dwPart = DBPART_VALUE | // @parmopt [IN] Types of binding to do (Value,
DBPART_STATUS | // Status, and/or Length)
DBPART_LENGTH,
DWORD dwColsToBind = ALL_COLS_BOUND,// @parmopt [IN] Which columns will be used in the bindings
ECOLUMNORDER eBindingOrder = FORWARD, // @parmopt [IN] Order to bind columns in accessor
ECOLS_BY_REF eColsByRef = NO_COLS_BY_REF,// @parmopt [IN] Which column types to bind by reference
DBCOLUMNINFO ** prgDBCOLUMNINFO = NULL, // @parmopt [OUT] Array of DBCOLUMNINFO
DBORDINAL * cCols = NULL, // @parmopt [OUT] Count of Columns, also count of ColInfo elements
WCHAR ** ppStringsBuffer = NULL, // @parmopt [OUT] ppStringsBuffer
DBTYPE dwModifier = DBTYPE_EMPTY, // @parmopt [IN] Modifier to be OR'd with every binding's type.
// Note, this modifying is in addition to that specified by eColsByRef.
// No OR'ing is done if dwModifier is DBTYPE_EMPTY, except that specified
// by eColsByRef
DBORDINAL cColsToBind = 0, // @parmopt [IN] Used only if dwColsToBind = USE_COLS_TO_BIND_ARRAY
// specifies the number of elements in rgColsToBind array
DB_LORDINAL * rgColsToBind = NULL, // @parmopt [IN] Used only if dwColsToBind = USE_COLS_TO_BIND_ARRAY
// Specifies array of column ordinals to be bound.
DB_UPARAMS * rgColOrdering = NULL, // @parmopt [IN] Corresponds to what numbering the client wants to
// follow. Such as bind col2,col4,col6 but because of param data,
// want the ordering to be 1,3,5. This array would have the 1,3,5.
ECOLS_MEM_PROV_OWNED
eColsMemProvOwned = NO_COLS_OWNED_BY_PROV, //@paramopt [IN] Which columns' memory is to be owned by the provider
DBPARAMIO eParamIO = DBPARAMIO_NOTPARAM, //@paramopt [IN] Parameter type to specify for eParmIO
BLOBTYPE dwBlobType = NO_BLOB_COLS, //@paramopt [IN] How to bind the blob colums
DBBINDSTATUS** prgStatus = NULL // @parmopt [OUT] Array of DBBINDSTATUS
);
//-----------------------------------------------------------------------------
// @func HRESULT|
// MiscFunc FreeAccessorBindings |
// Frees the memory assoicated with rgBindings
//
//-----------------------------------------------------------------------------
HRESULT FreeAccessorBindings(
DBCOUNTITEM cBindings, // @parmopt [IN] Count of bindings
DBBINDING* rgDBBINDING // @parmopt [IN] Array of DBBINDINGS
);
//----------------------------------------------------------------------
// MiscFunc VerifyPropertyInfo |
// Verify PropertyInfo and Display any error status
//
// @mfunc BOOL|
//
//----------------------------------------------------------------------
BOOL VerifyPropertyInfo(HRESULT hrReturned, ULONG cPropInfoSets, DBPROPINFOSET* rgPropInfoSets, OLECHAR* pDescBuffer, BOOL fAlwaysTrace = FALSE);
//----------------------------------------------------------------------
// MiscFunc VerifyProperties |
// Verify Properties and Display any error status
//
// @mfunc BOOL|
//
//----------------------------------------------------------------------
BOOL VerifyProperties(HRESULT hrReturned, ULONG cPropSets, DBPROPSET* rgPropSets, BOOL fOpenRowset = TRUE, BOOL fAlwaysTrace = FALSE);
//----------------------------------------------------------------------
// MiscFunc VerifyPropertiesInError |
// Verify Properties and Display any error status
//
// @mfunc BOOL|
//
//----------------------------------------------------------------------
BOOL VerifyPropertiesInError(HRESULT hrReturned, IUnknown* pIUnknown);
//----------------------------------------------------------------------
// MiscFunc VerifyBindings |
// Verify Bindings and Display any error binding status
//
// @mfunc BOOL|
//
//----------------------------------------------------------------------
BOOL VerifyBindings(HRESULT hrReturned, DBCOUNTITEM cBindings, DBBINDING* rgBindings, void* pData);
//----------------------------------------------------------------------
// MiscFunc VerifyColAccess |
// Verify DBCOLUMNACCESS structures and Display any error binding status
//
// @mfunc BOOL|
//
//----------------------------------------------------------------------
BOOL VerifyColAccess(HRESULT hrReturned, DBORDINAL cColAccess, DBCOLUMNACCESS* rgColAccess);
//-----------------------------------------------------------------------------
// @func HRESULT|
// MiscFunc FreeColAccess |
// Frees the memory assoicated with rgColAccess
//
//-----------------------------------------------------------------------------
HRESULT FreeColAccess(
DBORDINAL cColAccess, // @parmopt [IN] Count of ColAccess
DBCOLUMNACCESS* rgColAccess, // @parmopt [IN] Array of ColAccess
BOOL fFreeOuter = TRUE // @parmopt [IN] Whether or not to free rgColAccess
);
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc PrintRowset|
// Prints rowset as strings
//
//-----------------------------------------------------------------------------
void PrintRowset(
IRowset * pIRowset // @parm Rowset to print
);
//-----------------------------------------------------------------------------
// @func HRESULT|
// MiscFunc GetStringAccessorAndBindings|
// Bind all columns as strings
//
//-----------------------------------------------------------------------------
HRESULT GetStringAccessorAndBindings(
IUnknown * pIUnkObject, // @parm [IN] Rowset, Command, or RowObject to create bindings for
DBCOLUMNINFO * rgDBCOLUMNINFO, // @parm [IN] Array of Column info
DBORDINAL cDBCOLUMNINFO, // @parm [IN] Count of Column info
HACCESSOR * phAccessorOut, // @parm [OUT] Accessor created
DBBINDING ** prgDBBINDINGOut, // @parm [OUT] Array of DBBINDINGS
DBCOUNTITEM * pcBindingsOut, // @parm [OUT] Count of bindings
DBLENGTH * pcbRowSizeOut // @parm [OUT] Length of a row, DATA
);
BOOL FindColInfo(IUnknown* pIUnknown, DBID* pColumnID, DBORDINAL iOrdinal = 0, DBCOLUMNINFO* pColInfo = NULL, WCHAR** ppStringBuffer = NULL);
//-----------------------------------------------------------------------------
// @func HRESULT|
// MiscFunc FillInputBindings|
// Fill in data buffer with values that can be read by the hAccessor on input
//
//-----------------------------------------------------------------------------
HRESULT FillInputBindings(
CSchema* pSchema, // @parm [IN] Table object on which to do call MakeData
DBACCESSORFLAGS dwAccessorFlags, // @parm [IN] Flags for accessor. If its a PARAMETERDATA accessor,
// the rgColOrds contains the ordinals to be passed to MakeData
// to generate the data for each parameter, with each element
// corresponding to a parameter (ie, element 0 correpsonds to parameter 1 and so on).
// If its a ROWDATA or a ROWDATA | PARAMETERDATA accessor, rgColOrds
// is simply the array of all columns IN THE ROWSET, and the bindings
// are used to determine which columns are bound and thus which ordinals
// are passed to MakeData to generate the correct values. Note the
// PARAMETERDATA only accessor scenario will require the user to build
// an array with only the columns that pertain to each parameter, and in the
// correct order, whereas the ROWDATA accessor scenario will require the
// user to pass an array with all columns, regardless of which ones are bound.
DBCOUNTITEM cBindings, // @parm [IN] Number of bindings
DBBINDING * rgBindings, // @parm [IN] Bindings of hAccessor
BYTE ** ppData, // @parm [IN/OUT] Data buffer to be filled. User must free
// *ppData unless they pass a non null *ppData when calling, which
// is large enough to hold a row of data.
DBCOUNTITEM ulRowNum, // @parm [IN] Row number to create data with
DBORDINAL cColOrds, // @parm [IN] Count of elements in rgColOrds
DB_LORDINAL * rgColOrds, // @parm [IN] For PARAMETERDATA accessors, each element in the array
// specifies the iNumber of a column to be bound. This iNumber should
// be the same as that returned by IColumnsInfo.
// This iNumber is always ordered the same as the column list in the command
// specification, thus the user can use the command specification col list
// order to determine the appropriate iNumber.
// For ROWDATA accessors, the array must contain the table ordinals for
// all cols in the rowset, regardless of which ones are bound. The bindings
// will be used to determine which ones are bound and thus what ordinals are
// passed to MakeData.
EVALUE eValue = PRIMARY, // @parmopt [IN] Type of data to create
IUnknown* pIUnkObject = NULL, // Pointer to object
DWORD dwColsToBind = UPDATEABLE_COLS_BOUND // @parmopt [IN] Which columns will be used in the bindings
);
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc ReleaseInputBindingsMemory|
// Function to be called to clean up any out of line memory allocated
// by FillInputBindings.
//
//-----------------------------------------------------------------------------
HRESULT ReleaseInputBindingsMemory(
DBCOUNTITEM cBindings, // @parm [IN] Number of bindings
DBBINDING * rgBindings, // @parm [IN] Bindings of hAccessor
BYTE * pData, // @parm [IN] Input Data buffer
BOOL fFreeData = FALSE // @parmopt [IN] Whether or not to free pData
);
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc GetModInfo|
// This function returns a CModInfo object pointer
//
//-----------------------------------------------------------------------------
CModInfo* GetModInfo();
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc GetRootTable|
// This function returns a CTable object pointer
//
//-----------------------------------------------------------------------------
CTable* GetRootTable();
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc CreateModInfo|
// This function Creates a ModInfo object
//
//-----------------------------------------------------------------------------
BOOL CreateModInfo(CThisTestModule* pCThisTestModule);
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc GetInitInfo|
// This function Release a ModInfo object
//
//-----------------------------------------------------------------------------
BOOL ReleaseModInfo(CThisTestModule* pCThisTestModule);
//-----------------------------------------------------------------------------
// @func void|
// MiscFunc GetInitProps|
// This function parses the wszInitString (obtained from the LTM) to find
// the necessary init options, and builds the correct arrays needed
// to pass to IDBInitialize::Initialize(). User must call delete rather
// than IMalloc->Free on *prgOptionIDs and prgOptionVals, as well as ClearVariant
// on all members of the *prgOptionVals array.
//
//-----------------------------------------------------------------------------
BOOL GetInitProps
(
ULONG* pcPropSets, //@parm [IN/OUT]: Pointer to memory to hold count of DBPROPSET structs.
DBPROPSET** prgPropSets //@parm [IN/OUT]: Pointer to memory to hold an array of DBPROPSET
// this routine allocates and populates.
// *NOTE:* User must call FreeProperties
);
//-----------------------------------------------------------------------------
// @func LPWSTR|
// MiscFunc BSTR2WSTR|
//
// Returns the WCHAR string contained in the BSTR, but with a NULL terminator.
// If error occurs, NULL is returned. Caller is responsible
// for freeing the returned string, but if fFreeBstr is set, the function
// calls SysFreeString on the input bstr.
// If the input bstr is NULL, the string returned is "NULL!"
//
//-----------------------------------------------------------------------------
LPWSTR BSTR2WSTR(
BSTR bstr, //@parm [IN] BSTR to convert to WSTR
BOOL fFreeBstr = FALSE //@parmopt [IN] Flag indicating if the input bstr
//is freed by this function.
);
//--------------------------------------------------------------------
// @func BOOL | SupportedProperty
//
// This function should return TRUE if the fuction succeeded and
// the property is supported by the Provider.
//
//--------------------------------------------------------------------
BOOL SupportedProperty(DBPROPID PropertyID, GUID guidPropertySet, IUnknown* pIUnknown,EINTERFACE eCoType=DATASOURCE_INTERFACE);
//--------------------------------------------------------------------
// @func BOOL | SettableProperty
//
// This function should return TRUE if the fuction succeeded and
// the property is settable by the Provider.
//
//--------------------------------------------------------------------
BOOL SettableProperty(DBPROPID PropertyID, GUID guidPropertySet, IUnknown* pIUnknown,EINTERFACE eCoType=DATASOURCE_INTERFACE);
//--------------------------------------------------------------------
// @func BOOL | GetPropInfoFlags
//
// This function should return the DBPROPFLAGS of the Property.
//
//--------------------------------------------------------------------
DBPROPFLAGS GetPropInfoFlags(DBPROPID PropertyID, GUID guidPropertySet, IUnknown* pIUnknown,EINTERFACE eCoType=DATASOURCE_INTERFACE);
//--------------------------------------------------------------------
// @func BOOL | GetPropInfo
//
// This function should return the DBPROPINFO of the requested Property.
//
//--------------------------------------------------------------------
DBPROPINFO* GetPropInfo(DBPROPID PropertyID, GUID guidPropertySet, IUnknown* pIUnknown,EINTERFACE eCoType=DATASOURCE_INTERFACE);
//--------------------------------------------------------------------
// @func BOOL | GetProperty
//
// This function should return TRUE if the fuction succeeded and
// the boolean value of a property.
//
//--------------------------------------------------------------------
BOOL GetProperty(
DBPROPID PropertyID,
GUID guidPropertySet,
IUnknown* pIUnknown,
VARIANT_BOOL bValue = VARIANT_TRUE
);
//--------------------------------------------------------------------
// @func BOOL | GetProperty
//
// This function should return TRUE if the fuction succeeded and
// any value type of a property.
//
//--------------------------------------------------------------------
BOOL GetProperty(
DBPROPID PropertyID,
GUID guidPropertySet,
IUnknown* pIUnknown,
VARIANT_BOOL* pbValue
);
//--------------------------------------------------------------------
// @func BOOL | GetProperty
//
// This function should return TRUE if the fuction succeeded and
// any value type of a property.
//
//--------------------------------------------------------------------
BOOL GetProperty(
DBPROPID PropertyID,
GUID guidPropertySet,
IUnknown* pIUnknown,
ULONG_PTR* pulValue
);
//--------------------------------------------------------------------
// @func BOOL | GetProperty
//
// This function should return TRUE if the fuction succeeded and
// any value type of a property.
//
//--------------------------------------------------------------------
BOOL GetProperty(
DBPROPID PropertyID,
GUID guidPropertySet,
IUnknown* pIUnknown,
WCHAR** ppValue
);
//--------------------------------------------------------------------
// @func BOOL | GetProperty
//
// This function should return TRUE if the fuction succeeded and
// any value type of a property.
//
//--------------------------------------------------------------------
BOOL GetProperty(
DBPROPID PropertyID,
GUID guidPropertySet,
IUnknown* pIUnknown,
VARIANT* pVariant
);
//--------------------------------------------------------------------
// @func BOOL | GetProperty
//
// This function should return TRUE if the fuction succeeded and
// any value type of a property.
//
//--------------------------------------------------------------------
BOOL GetProperty
(
DBPROPID PropertyID,
GUID guidPropertySet,
IUnknown* pIUnknown,
DBPROP* pProp
);
//--------------------------------------------------------------------
// @func VOID | FreeProperties
//
// This function should return TRUE if the fuction succeeded and
// free all the memory in a DBPROPSET structure.
//
//--------------------------------------------------------------------
BOOL FreeProperties(
ULONG* pcPropSets,
DBPROPSET** prgPropSets
);
//--------------------------------------------------------------------
// @func VOID | FreeProperties
//
// This function should return TRUE if the fuction succeeded and
// free all the memory in a DBPROPINFOSET structure.
//
//--------------------------------------------------------------------
BOOL FreeProperties(
ULONG* pcPropInfoSets,
DBPROPINFOSET** prgPropInfoSets,
OLECHAR** pDescBuffer = NULL
);
//--------------------------------------------------------------------
// @func VOID | FreeProperties
//
// This function should return TRUE if the fuction succeeded and
// free all the memory in a DBPROPIDSET structure.
//
//--------------------------------------------------------------------
BOOL FreeProperties(
ULONG* pcPropIDSets,
DBPROPIDSET** prgPropIDSets
);
//--------------------------------------------------------------------
// @func void |
// Miscfunc DuplicatePropertySets |
// The function duplicates the memory allocated for an array of property sets
//
// Returns BOOL.
//
//--------------------------------------------------------------------
BOOL DuplicatePropertySets
(
ULONG cPropSets, // [IN]the number of elements in the array
DBPROPSET* rgPropSets, // [IN] pointer to the array
ULONG* pcPropSets, // [OUT] pointer to the output size
DBPROPSET** prgPropSets // [OUT] pointer to the output array
);
//Set Helpers
HRESULT CreateVariant(VARIANT* pVariant, DBTYPE wType, void* pv);
HRESULT SetProperty(DBPROPID PropertyID, GUID guidPropertySet, ULONG* pcPropSets, DBPROPSET** prgPropSets, DBTYPE wType, ULONG_PTR ulValue, DBPROPOPTIONS dwOptions = DBPROPOPTIONS_REQUIRED, const DBID& colid = DB_NULLID);
HRESULT SetProperty(DBPROPID PropertyID, GUID guidPropertySet, ULONG* pcPropSets, DBPROPSET** prgPropSets, DBTYPE wType, void* pv, DBPROPOPTIONS dwOptions = DBPROPOPTIONS_REQUIRED, const DBID& colid = DB_NULLID);
HRESULT CompactProperties(ULONG* pcPropSets, DBPROPSET** prgPropSets, DBTYPE wType);
//-----------------------------------------------------------------------------
// @func BOOL|
// MiscFunc CheckRowsetProperty |
// This function should return TRUE if the property in gPropertySet is
// currently supported on the object. Currently for command and rowset
// objects only. It is user error to pass something other than
// a command or rowset interface pointer and iid.
//
//-----------------------------------------------------------------------------
BOOL CheckProperty(
IMalloc * pIMalloc, // @parm [IN] malloc ptr to free memory
EINTERFACE eInterface, // @parm [IN] indicates object to set property on
IUnknown * pIObject, // @parm [IN] Rowset ptr or Command ptr
DBPROPID prop, // @parm [IN] Property
DBPROPSTATUS * stat // @parm [IN/OUT] Property Status
);
//-----------------------------------------------------------------------------
// @func HRESULT |
// MiscFunc SetRowsetProperty |
// Set Property, returns result of either ICommand::QI for
// ICommandProperty or ICommandProperties::SetProperties.
// Does all the work of build correct property structures.
// Just tell it what property set and property.
//
//-----------------------------------------------------------------------------
HRESULT SetRowsetProperty(
IUnknown* pIUnknown, // @parm [IN] Command ptr
GUID gPropertySet, // @parm [IN] Property Set
DBPROPID dbPropertyID, // @parm [IN] Property
BOOL fSetFlag = TRUE, // @parm [IN] SET or UNSET
enum DBPROPOPTIONSENUM dwOptions=DBPROPOPTIONS_REQUIRED, // @parm [IN] Option
BOOL fLogFailure = FALSE // @parm [IN] Send failure msg to log
);
//-----------------------------------------------------------------------------
// @func HRESULT |
// MiscFunc SetRowsetProperty |
// Set Property, returns result of either ICommand::QI for
// ICommandProperty or ICommandProperties::SetProperties.
// Does all the work of build correct property structures.
// Just tell it what property set and property.
//
//-----------------------------------------------------------------------------
HRESULT SetRowsetProperty(
IUnknown* pIUnknown, // @parm [IN] Command ptr
GUID gPropertySet, // @parm [IN] Property Set
DBPROPID dbPropertyID, // @parm [IN] Property
LONG_PTR dwPropValue, // @parm [IN] Property value
enum DBPROPOPTIONSENUM dwOptions=DBPROPOPTIONS_REQUIRED, // @parm [IN] Option
BOOL fLogFailure = FALSE // @parm [IN] Send failure msg to log
);
//-----------------------------------------------------------------------------
// @func HRESULT |
// MiscFunc PropertyStatus |
// Print Property Status, returns FALSE is status is not OK
//
//-----------------------------------------------------------------------------
BOOL PropertyStatus(
DBPROPSTATUS dbPropStatus // @parm [IN] Property Status
);
//-----------------------------------------------------------------------------
// @func BOOL |
// MiscFunc RowsetBindingStatus |
// Print Binding Status, returns FALSE is status is not OK
//
//-----------------------------------------------------------------------------
BOOL RowsetBindingStatus(
DBSTATUS dbStatus // @parm [IN] Binding Status
);
//-----------------------------------------------------------------------------
// @func HRESULT |
// MiscFunc SetCommandText |
// Set Command Text, returns result of ICommand::QI for ICommandText or
// ICommandText::SetCommandText or CTable::SOMEFUNCTION. Command text can
// be set a couple of ways: 1) request any StmtKd or 2) pass StmtKd as eSQL
// and pass in your own text in sqlStmt.
//
//-----------------------------------------------------------------------------
HRESULT SetCommandText(
IMalloc * pIMalloc, //@parm [IN] Malloc ptr to free statement
ICommand * pICommand, //@parm [IN] Command ptr
CTable * pTable, //@parm [IN] CTable ptr to use CreateSqlStmt function
WCHAR * pTableName2, //@parm [IN] 2nd CTable ptr if EQUERY requires 2 tables
STATEMENTKIND StmtKd, //@parm [IN] Kind of Statement
EQUERY sqlStmt, //@parm [IN] EQUERY from Private Library
WCHAR * pStmt, //@parm [IN] Text of statement if StmtKd == eSQL
DBORDINAL * pcColumns=NULL, //@parm [IN/OUT] Count of columns.
DB_LORDINAL ** prgColumns=NULL,//@parm [IN/OUT] Array of column numbers
CTable * pTable2 = NULL, //@parm [IN] Second table object, if needed
WCHAR** ppCmdText = NULL //@parm [OUT] Cmd Text set.
);
//-----------------------------------------------------------------------------
// @func HRESULT |
// MiscFunc PrepareCommand |
// PrepareCommand, returns result of either ICommand::QI for ICommandPrepare
// or for ICommand::methods (Prepare or/and Unprepare
//
//-----------------------------------------------------------------------------
HRESULT PrepareCommand(
ICommand * pICommand, // @parm [IN] Command ptr
EPREPARE ePrepare, // @parm [IN] Prepare, Unprepare, or Both
ULONG cExpectedRuns // @parm [IN] Passed to Unprepare only
);
//-----------------------------------------------------------------------------
// @func BOOL |
// MiscFunc IsFixedLength |
// Returns TRUE is type is fixed length
//
//-----------------------------------------------------------------------------
BOOL IsFixedLength(
DBTYPE wType // @parm [IN] type
);
//-----------------------------------------------------------------------------
// @func BOOL |
// MiscFunc IsNumericType |
// Returns TRUE is type is numeric
//
//-----------------------------------------------------------------------------
BOOL IsNumericType(
DBTYPE wType // @parm [IN] type
);
//-----------------------------------------------------------------------------
// @func BOOL |
// MiscFunc IsScaleType |
// Returns TRUE is type can contain a scale
//
//-----------------------------------------------------------------------------
BOOL IsScaleType(
DBTYPE wType // @parm [IN] type
);
//-----------------------------------------------------------------------------
// @func BYTE |
// MiscFunc bNumericPrecision |
// Returns Precision of the type
//
//-----------------------------------------------------------------------------
BYTE bNumericPrecision(
DBTYPE wType, // @parm [IN] type
CCol & rcol // @parm [IN] CCol ref
);
//-----------------------------------------------------------------------------
// @func BOOL |
// MiscFunc AddCharToVarNumericVal |
// Returns TRUE if successfull.
//
//-----------------------------------------------------------------------------
BOOL AddCharToVarNumericVal(
WCHAR wLetter,
DB_VARNUMERIC * pVarNumeric,
USHORT cbSize
);
//-----------------------------------------------------------------------------
// @func BOOL |
// MiscFunc AddCharToNumericVal |
// Returns TRUE if successfull.
//
//-----------------------------------------------------------------------------
BOOL AddCharToNumericVal(
WCHAR wLetter,
DB_NUMERIC * pnum
);
//--------------------------------------------------------------------
// @func BOOL |
// MiscFunc CompareStrings |
// Returns BOOL.
//
//--------------------------------------------------------------------
BOOL CompareStrings
(
const WCHAR * wszString1, // @parm [IN] Provider string
const WCHAR * wszString2, // @parm [IN] Const Static string
BOOL fPrint = FALSE// @parm [IN] Print the Provider string to the screen
);
//--------------------------------------------------------------------
// @func BOOL | Help function for index server
// setting customer properties in the select list
//
// Returns BOOL.
//
//--------------------------------------------------------------------
BOOL SetIndexServerProperty
(
ICommandText *pICommandText // @parm [IN] Poiter to ICommandText
);
//--------------------------------------------------------------------
// Copied from Extralib, they refer to reference count
//--------------------------------------------------------------------
ULONG GetRefCount(IUnknown* pIUnknown);
ULONG SetRefCount(IUnknown* pIUnknown, LONG iCount);
//////////////////////////////////////////////////////////////////////////////
// Refcount functions
//
//////////////////////////////////////////////////////////////////////////////
BOOL VerifyRefCounts(DBREFCOUNT ulActRefCount, DBREFCOUNT ulExpRefCount);
BOOL VerifyRefCounts(DBCOUNTITEM cRefCounts, DBREFCOUNT* rgActRefCounts, DBREFCOUNT ulExpRefCount);
//--------------------------------------------------------------------
// @func BOOL |
// Miscfunc DefaultObjectTesting |
// The function checks the validity of a interface belonging to an object
// (the interface is accessed thru a ptr). It will check:
// - an interface which doesn't belong to the object that owns the interface
// - mandatory interfaces on the object can be got thru QI
// - can get IUnknown
// - IID_NULL returns in error E_NOINTERFACE
// - QI with a NULL ptr results in E_INVALIDARG
// - reference count works
//
// Returns BOOL.
//
//--------------------------------------------------------------------
BOOL DefaultObjectTesting
(
IUnknown* pIUnkObject, // [IN] Interface (Object) to test
EINTERFACE eInterface = UNKNOWN_INTERFACE, // [IN] Interface Type of pIUnknown
BOOL fInitializedDSO = TRUE // [IN] Flag DSO initialized
);
BOOL DefaultInterfaceTesting
(
IUnknown* pIUnkObject, // [IN] Interface (Object) to test
EINTERFACE eInterface, // [IN] Object Type of pIUnknown
REFIID riid // [IN] Interface to test specifically
);
//--------------------------------------------------------------------
// The following functions perform some basic verification of the
// respective interfaces.
//--------------------------------------------------------------------
BOOL DefTestInterface(IDBInitialize* pIDBI);
BOOL DefTestInterface(IDBProperties* pIDBP);
BOOL DefTestInterface(IDBCreateSession* pIDBCR);
BOOL DefTestInterface(IPersist* pIP);
BOOL DefTestInterface(IOpenRowset* pIOR);
BOOL DefTestInterface(IGetDataSource* pIGDS);
BOOL DefTestInterface(ISessionProperties* pISP);
BOOL DefTestInterface(IDBCreateCommand* pIDBCR);
BOOL DefTestInterface(IDBSchemaRowset* pIDBSR);
BOOL DefTestInterface(IAccessor* pIA);
BOOL DefTestInterface(IColumnsInfo* pICI);
BOOL DefTestInterface(IConvertType* pICT);
BOOL DefTestInterface(IColumnsRowset* pICR);
BOOL DefTestInterface(IRowset* pIR, BOOL fClean = TRUE);
BOOL DefTestInterface(IRowsetInfo* pIRI);
BOOL DefTestInterface(IRow* pIRow);
BOOL DefTestInterface(ISequentialStream* pISS);
//--------------------------------------------------------------------
// @func void |
// Miscfunc ReleaseColumnDesc |
// The function releases the memory allocated for an array of column descriptors
//
// Returns void.
//
//--------------------------------------------------------------------
void ReleaseColumnDesc
(
DBCOLUMNDESC* rgColumnDesc, // pointer to the array
DBORDINAL cColumnDesc, // the number of elements in the array
BOOL fFreeArray = TRUE // whether rgColumnDesc should be freed
);
//--------------------------------------------------------------------
// @func void |
// Miscfunc DuplicateColumnDesc |
// The function duplicates the memory allocated for an array of column descriptors
//
// Returns DBCOLUMNDESC*.
//
//--------------------------------------------------------------------
DBCOLUMNDESC *DuplicateColumnDesc
(
DBCOLUMNDESC* rgColumnDesc, // [IN] pointer to the array
DBORDINAL cColumnDesc, // [IN]the number of elements in the array
DBCOLUMNDESC** prgColumnDesc // [IN/OUT] pointer to the output array
);
//---------------------------------------------------------------------------
// DuplicateDBID
//
// @func HRESULT DuplicateDBID
// Copies y into x. If a problem is encountered, x = GUID_NULL. Client
// is responsible for allocating memory for x before calling this function.
// Client is responsible for releasing memory for x.
//
// This version should actually duplicate the DBID, i.e. copy eKind, building a similar uName.pwszName, etc
//
// @rdesc Comparision results
// @flag NOERROR | Data in the two buffers is the same.
// @flag E_FAIL | Data in the two buffers is not the same..
//
//-------------------------------------------------------------------------------------
HRESULT DuplicateDBID(
const DBID& y, // @parm || [IN] Orginal
DBID* px // @parm || [OUT] Copy of y
);
//---------------------------------------------------------------------------
// ReleaseDBID
//
// @func HRESULT ReleaseDBID
// Releases all the data referred inside the DBID, according to its eKind
// if fDrop == TRUE, the pointer is also released
// @rdesc Comparision results
// @flag NOERROR | Data in the two buffers is the same.
// @flag E_FAIL | Data in the two buffers is not the same..
//
//-------------------------------------------------------------------------------------
void ReleaseDBID(
DBID* pDBID, // @parm || [IN] DBID to be released
BOOL fDrop = TRUE // whether the ptr should be freed
);
//---------------------------------------------------------------------------
// BuildDBID
//
// @func HRESULT BuildDBID
// Builds DBID, according to its elements
//
//-------------------------------------------------------------------------------------
HRESULT BuildDBID(
DBID *pDBID,
WCHAR *pwszName,
GUID *pguid,
ULONG *pulPropID
);
// @cmember Returns the guid that corresponds with the EQUERY. <nl>
BOOL GetSchemaGUID(
EQUERY eQuery, //[IN] Schema query
GUID * pGuid //[OUT] Schema quid
);
//---------------------------------------------------------------------------
// ConvertToWSTR
//
// @func ConvertToWSTR
// Converts the contents of pStringData to Unicode
// Consumer is responsible for freeing memory returned in pwszOut
//
//-------------------------------------------------------------------------------------
void ConvertToWSTR(
void *pStringData, // @parm || [IN] pointer to string data (can be str, bstr, wstr)
DBTYPE wSrcType, // @parm || [IN] type of string data
WCHAR **pwszOut // @parm || [OUT] converted to Unicode (provider is responsible for freeing)
);
//--------------------------------------------------------------------
// DecimalDiv10Rem
//
// @func BOOL DecimalDiv10Rem
// Divides the DECIMAL value indicated by pDecimal by ten
// and returns the result in pDecResult.
// Any remainder is returned in pbRemainder
//
//--------------------------------------------------------------------
BOOL DecimalDiv10Rem(
DECIMAL * pDecimal, // @parm || [IN] pointer to a DECIMAL struct
DECIMAL * pDecResult, // @parm || [OUT] pointer to DECIMAL to return new value
BYTE * pbRemainder // @parm || [OUT] The remainder is returned here.
);
//--------------------------------------------------------------------
// ScaleDecimal
//
// @func BOOL ScaleDecimal
// Scales a Decimal value down to scale indicated by bScale
// Note: this function can only scale a value down
// Returns TRUE if no truncation occurred.
// Returns FALSE if fractional truncation occurred.
//
//--------------------------------------------------------------------
BOOL ScaleDecimal(
DECIMAL * pDec, // @parm || [IN] pointer to a DECIMAL struct
BYTE bScale // @parm || [IN] Indicates requested new scale.
);
//--------------------------------------------------------------------
// CompareDecimal
//
// @func BOOL CompareDecimal
// Compares two DECIMAL values.
// This function performs the necessary scaling and returns TRUE if
// the two DECIMALs are numerically equivalent.
//
//--------------------------------------------------------------------
BOOL CompareDecimal(
DECIMAL *pDec1, // @parm || [IN] pointer to a DECIMAL struct
DECIMAL *pDec2 // @parm || [IN] pointer to a DECIMAL struct
);
//--------------------------------------------------------------------
// NumericDiv10Rem
//
// @func BOOL NumericDiv10Rem
// Divides the DBTYPE_NUMERIC value indicated by pNum by ten
// and returns the result in pNumResult.
// Any remainder is returned in pbRemainder
//
//--------------------------------------------------------------------
BOOL NumericDiv10Rem(
DB_NUMERIC * pNumeric,
DB_NUMERIC * pNumResult,
BYTE * pbRemainder
);
//--------------------------------------------------------------------
// ScaleNumeric
//
// @func BOOL ScaleNumeric
// Scales a Numeric value down to scale indicated by bScale
// Returns TRUE if no truncation occurred.
// Returns FALSE if fractional truncation occurred.
//
//--------------------------------------------------------------------
BOOL ScaleNumeric(DB_NUMERIC *pNum, BYTE bScale);
//--------------------------------------------------------------------
// CompareNumeric
//
// @func BOOL CompareNumeric
// Compares two DBTYPE_NUMERIC values loosely
// This function performs the necessary scaling and returns TRUE if
// the two NUMERICs are numerically equivalent.
// i.e. scale and precision do not have to be equal
//
//--------------------------------------------------------------------
BOOL CompareNumeric(
DB_NUMERIC *pNum1,
DB_NUMERIC *pNum2
);
//--------------------------------------------------------------------
// VarNumericDiv10Rem
//
// @func BOOL VarNumericDiv10Rem
// Divides the DBTYPE_VARNUMERIC value indicated by pNum by ten
// and returns the result in pNumResult.
// Any remainder is returned in pbRemainder
//
//--------------------------------------------------------------------
BOOL VarNumericDiv10Rem(
DB_VARNUMERIC * pVarNumeric,
DB_VARNUMERIC * pVarNumResult,
ULONG cbVarNumericValSize,
BYTE * pbRemainder
);
//--------------------------------------------------------------------
// ScaleVarNumeric
//
// @func BOOL ScaleVarNumeric
// Scales a Numeric value down to scale indicated by bScale
// Returns TRUE if no truncation occurred.
// Returns FALSE if fractional truncation occurred.
//
//--------------------------------------------------------------------
BOOL ScaleVarNumeric(DB_VARNUMERIC *pVarNum, USHORT cbVarNumericValSize, SBYTE sbScale);
//--------------------------------------------------------------------
// CompareVarNumeric
//
// @func BOOL CompareVarNumeric
// Compares two DBTYPE_VARNUMERIC values loosely
// This function performs the necessary scaling and returns TRUE if
// the two NUMERICs are numerically equivalent.
// i.e. scale and precision do not have to be equal
//
//--------------------------------------------------------------------
BOOL CompareVarNumeric(
DB_VARNUMERIC *pVarNum1,
USHORT cbVarNum1,
DB_VARNUMERIC *pVarNum2,
USHORT cbVarNum2
);
//--------------------------------------------------------------------
// @func Print the list of properties and the associated error code
// from the array returned by SetProperties.
//
// @rdesc None
//--------------------------------------------------------------------
void DumpPropertyErrors
(
ULONG cPropSets,
DBPROPSET* rgPropSets,
ULONG* pcErrors = NULL,
ULONG* pcInvalidProperties = NULL
);
//--------------------------------------------------------------------
// CompareWCHARData
//
// @func BOOL CompareWCHARData
// Compares two DBTYPE_WSTR values given the backend type, precision,
// and scale by converting the WSTR values back to the native type
// then comparing as native. This was necessary to avoid string format
// differences between MakeData and the provider's WCHAR result. For
// example: MakeData returns "1992-01-01 10:12:20.0", provider returns
// "1992-01-01 10:12:20.000000000" for DBTYPE_DBTIMESTAMP. These are
// the same but the strings differ.
//
//--------------------------------------------------------------------
BOOL CompareWCHARData(
LPVOID pConsumerData, // @parm [in]: Pointer to WCHAR version of consumer data
LPVOID pBackEndData, // @parm [in]: Pointer to WCHAR version of backend data
DBTYPE wBackEndType, // @parm [in]: the DBType of the backend data, no modifiers
DBLENGTH ulBackEndSize, // @parm [in]: size in bytes of the backend data, as it might contain embedded nulls.
DBLENGTH ulConsumerSize // @parm [in]: size in bytes of the consumer data, as it might contain embedded nulls.
);
//----------------------------------------------------------------------
// FindIntlSetting
//
// @func DWORD FindIntlSetting
// Fetches registry key that enables international data
//
//-----------------------------------------------------------------------
DWORD FindIntlSetting();
////////////////////////////////////////////////////////////////
// BOOL SetDCLibraryVersion(ULONG ulVersion)
//
// Takes a pointer to IDataConvert (from msdadc)
// and sets the version
////////////////////////////////////////////////////////////////
BOOL SetDCLibraryVersion(IUnknown *pIUnknown, ULONG ulVersion);
////////////////////////////////////////////////////////////////
// __int64 PrivLib_wtoi64(pwszbigint)
//
// Converts source string to __int64
////////////////////////////////////////////////////////////////
__int64 PrivLib_wtoi64(const WCHAR *pwszbigint);
//--------------------------------------------------------------------
// MapWCHAR
//
// @mfunc MapWCHAR
// returns the uppercase character
//--------------------------------------------------------------------
WCHAR MapWCHAR
(
WCHAR wch,
DWORD dwMapFlags
);
//--------------------------------------------------------------------
// Maps a string based on user Flags
//
// @mfunc W95LCMapString
//
//--------------------------------------------------------------------
void W95LCMapString
(
WCHAR *pwszSource,
DWORD dwMapFlags
);
//--------------------------------------------------------------------
// GetLocaleUnderscore
//
// @mfunc GetLocalUnderscore
// Returns a character that is the local equivalent to an underscore
//--------------------------------------------------------------------
WCHAR GetLocalUnderscore();
//--------------------------------------------------------------------
// CheckVariant
//
// @func BOOL CheckVariant
// Checks a variant's value depending on its type. Presently checks
// only a few types. Checks can be added for more types.
//
//--------------------------------------------------------------------
BOOL CheckVariant(
VARIANT* pVar
);
// @func Returns Process ID as a string. Used to create table name.
// Client must IMalloc->Free returned string.
WCHAR * GetPid(void);
// @func Returns RandomNumber. Used to create table name.
// Client must IMalloc->Free returned string.
WCHAR * GetRandomNumber(void);
//---------------------------------------------------------------------------
// iswcharMappable
// Returns true if the input unicode character can safely be mapped to
// the active ANSI code page.
//
// @mfunc iswcharMappable
//---------------------------------------------------------------------------
BOOL iswcharMappable(WCHAR wch);
// Initialization code to work with the Conformance provider
BOOL InitializeConfProv(CThisTestModule* pThisTestModule);
// Cleanup table created for Conformance Provider
BOOL ConfProvTerminate();
//--------------------------------------------------------------------
// MakeObjectName
//
// @func WCHAR * MakeObjectName
// Makes an object name of a given maximum size starting with
// pwszModuleName.
//
//--------------------------------------------------------------------
WCHAR * MakeObjectName(WCHAR * pwszModuleName, size_t ulMaxNameLen);
//--------------------------------------------------------------------
// CoCreate
//
// @func HRESULT CoCreate
// Checks for support of CoCreateInstanceEx, then calls CoCreateInstanceEx
// or CoCreateInstance as appropriate
//
//--------------------------------------------------------------------
HRESULT CoCreate
(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter,
DWORD dwClsContext,
REFIID riid,
LPVOID * ppv
);
//--------------------------------------------------------------------
// CoInit
//
// @func HRESULT CoInit
// Calls CoInitializeEx or CoInitialize as appropriate
//
//--------------------------------------------------------------------
HRESULT CoInit(DWORD dwCoInit);
//--------------------------------------------------------------------
// CoCreateInstanceEx
//
// @func WINOLEAPI CoCreateInstanceEx
// Extended version of CoCreateInstance found in ole32.dll when DCOM
// is installed.
//--------------------------------------------------------------------
WINOLEAPI CoCreateInstanceEx(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, ULONG, MULTI_QI *);
//--------------------------------------------------------------------
// CoInitializeEx
//
// @func WINOLEAPI CoInitializeEx
// Extended version of CoInitialize found in ole32.dll when DCOM
// is installed.
//--------------------------------------------------------------------
WINOLEAPI CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
//---------------------------------------------------------------------------
// FetchRowScopedQuery
//
// This function retrieves the row scoped query that is in the ini file or
// that has been specified in the initialization string.
// This must be a query that can be issued to row scoped commands (i.e.
// commands whose parent is a Row object).
// Also, this query must return all the childs rows and can be
// called from any row in the hierarchy.
// This would be equivalent to Monarch SQL's "select * from (DEFAULT_SCOPE)"
//--------------------------------------------------------------------------
WCHAR* FetchRowScopedQuery(EQUERY eQuery);
//--------------------------------------------------------------------
// GetIIDString
//
// @func WCHAR * GetIIDString
// Helper for converting IID into useful string.
//--------------------------------------------------------------------
LPCWSTR GetIIDString(REFIID iid);
//--------------------------------------------------------------------
// CompareID
//
// @func HRESULT CompareID
// Helper for comparing 2 identifiers.
//--------------------------------------------------------------------
HRESULT CompareID(
BOOL *pfResult, //[out] pointer to result
WCHAR *pwszFrontEndID, // [in] first identifier
WCHAR *pwszBackEndID, // [in] second iderntifier
IUnknown *pIUnknown = NULL // [in] pointer to datasource interface
);
//--------------------------------------------------------------------------
//
// GetQuoteLiteralInfo
//--------------------------------------------------------------------------
HRESULT GetQuoteLiteralInfo(
IUnknown *pIUnknown, // [in] initialized DSO interface
WCHAR *pwcsQuotePrefix, // [out] prefix char
WCHAR *pwcsQuoteSuffix // [out] suffix char
);
//--------------------------------------------------------------------------
//
// IScopedOperations_Delete
// wrapper for calling IScopedOperations::Delete and doing basic general checking
//--------------------------------------------------------------------------
HRESULT IScopedOperations_Delete(
IScopedOperations *pIScopedOperations, // [in] interface to use
DBCOUNTITEM cRows, // [in] number of copy ops
WCHAR **rgpwszURLs, // [in] source URLs
DWORD dwDeleteFlags, // [in] copy flags
DBSTATUS *rgdwStatus // [out] filled on output
);
//--------------------------------------------------------------------------
//
// wrapper for calling IScopedOperations::Copy and doing basic general checking
//--------------------------------------------------------------------------
HRESULT IScopedOperations_Copy(
IScopedOperations *pIScopedOperations, // [in] interface to use
DBCOUNTITEM cRows, // [in] number of copy ops
WCHAR **rgpwszSourceURLs, // [in] source URLs
WCHAR **rgpwszDestURLs, // [in] destination URLs
DWORD dwCopyFlags, // [in] copy flags
IAuthenticate *pIAuthenticate, // [in] authentication interface
DBSTATUS *rgdwStatus, // [out] filled on output
WCHAR **rgpwszNewURLs, // [in/out] new URLs
WCHAR **ppStringsBufferURLs // [out] buffer for URL strings
);
//--------------------------------------------------------------------------
//
// wrapper for calling IScopedOperations::Move and doing basic general checking
//--------------------------------------------------------------------------
HRESULT IScopedOperations_Move(
IScopedOperations *pIScopedOperations, // [in] interface to use
DBCOUNTITEM cRows, // [in] number of copy ops
WCHAR **rgpwszSourceURLs, // [in] source URLs
WCHAR **rgpwszDestURLs, // [in] destination URLs
DWORD dwMoveFlags, // [in] operation flags
IAuthenticate *pIAuthenticate, // [in] authentication interface
DBSTATUS *rgdwStatus, // [out] filled on output
WCHAR **rgpwszNewURLs, // [in/out] new URLs
WCHAR **ppStringsBufferURLs // [out] buffer for URL strings
);
//--------------------------------------------------------------------------
//
// wrapper for calling IScopedOperations::OpenRowset and doing basic general checking
//--------------------------------------------------------------------------
HRESULT IScopedOperations_OpenRowset(
IScopedOperations *pIScopedOperations, // [in] interface to use
IUnknown *pUnkOuter, // [in] controlling IUnknown of the rowset
DBID *pTableID, // [in] URL of the row
DBID *pIndexID, // [in] should be ignored
REFIID riid, // [in] interface to be retrieved
ULONG cPropertySets, // [in] number of elements in prop array
DBPROPSET *rgPropertySets, // [in|out] property array
IUnknown **ppRowset // [out] rowset interface
);
//--------------------------------------------------------------------------
//
// wrapper for calling IScopedOperations::Bind and doing basic general checking
//--------------------------------------------------------------------------
HRESULT IScopedOperations_Bind(
IScopedOperations *pIScopedOperations, // [in] interface to use
IUnknown *pUnkOuter, // [in] controlling IUnknown
LPCOLESTR pwszURL, // [in] object to be bound
DBBINDURLFLAG dwBindFlags, // [in] flags to be used for binding
REFGUID rguid, // [in] indicates the type of the object being requested
REFIID riid, // [in] requested interface
IAuthenticate *pAuthenticate, // [in] pointer to IAuthenticate interface to be used
DBIMPLICITSESSION *pImplSession, // [in] implicit session
DBBINDURLSTATUS *pdwBindStatus, // [out] bind status
IUnknown **ppUnk // [out] interface on the bound object
);
//--------------------------------------------------------------------------
//
// Basic checking for operation status
//--------------------------------------------------------------------------
BOOL CheckStatus(
DBSTATUS dbStatus,
DBCOUNTITEM cValidStatus,
DBSTATUS *rgValidStatus
);
//--------------------------------------------------------------------------------
//
// Check whether the return value is a legal one
//--------------------------------------------------------------------------------
BOOL CheckResult(
HRESULT hr,
DBCOUNTITEM cValidRes,
HRESULT *rgValidRes
);
//--------------------------------------------------------------------------------
//
// Release memory associated with a DBCONSTRAINTDESC array
//--------------------------------------------------------------------------------
HRESULT FreeConstraintDesc(
DBORDINAL *pcConstraints, // @parmopt [IN] Count of constraint
DBCONSTRAINTDESC **prgConstraints, // @parmopt [IN] Array of constraint desc
BOOL fFreeOuter = TRUE // @parmopt [IN] Whether or not to free *prgConstraints
);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// String comparisons used for restrictions, etc
// This function compares two international WCHAR strings for equality,
// using a call to CompareStringA (CompareStringW not supported Win95).
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LONG RelCompareString(LPWSTR pwsz1, LPWSTR pwsz2);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// String comparisons used for restrictions, etc
// This function compares two international CHAR strings for equality,
// using a call to CompareStringA (CompareStringW not supported Win95).
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LONG RelCompareString(LPSTR psz1, LPSTR psz2);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Relative compare of two numeric or varnumeric values for LT, GT, EQ
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LONG RelCompareNumeric(BYTE * pVal1,
BYTE sign1,
SBYTE scale1,
USHORT cbVal1,
BYTE * pVal2,
BYTE sign2,
SBYTE scale2,
USHORT cbVal2
);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Relative compare of any two values for LT, GT, EQ
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LONG RelativeCompare(
void *pConsumerData, //@parm [in]: the pointer to consumer data
void *pBackEndData, //@parm [in]: the pointer to data at the backend
DBTYPE wType, //@parm [in]: the DBType of the data. It can not be ORed with any DBType modifers.
USHORT uswBackEndSize, //@parm [in]: the size of the data, only valid for DBTYPE_BYTES or DBTYPE_VARNUMERIC
BYTE bPrecision, //@parm [in]: the precision Only valid for DBTYPE_NUMERIC or DBTYPE_DECIMAL
BYTE bScale, //@parm [in]: the scale Only valid for DBTYPE_NUMERIC or DBTYPE_DECIMAL
ULONG cbConsumerSize //@parm [in]: the size of data pointed to by pConsumerData, only valid for DBTYPE_VARNUMERIC
);
//--------------------------------------------------------------------------------
//
// Check for DBID having valid pwszName
//--------------------------------------------------------------------------------
BOOL DBIDHasName(DBID dbid);
//--------------------------------------------------------------------------------
//
// Maps a OLE DB DBTYPE to a VARIANT value
// The mappings are based on ADO
//--------------------------------------------------------------------------------
HRESULT MapDBTYPE2VARIANT
(
void * pvSource,
DBTYPE wType,
ULONG_PTR cbData,
VARIANT ** ppVariant
);
//--------------------------------------------------------------------------------
//
// Returns TRUE if a DBTYPE maps directly to a VT type
//--------------------------------------------------------------------------------
BOOL IsVariantType
(
DBTYPE wType
);
//--------------------------------------------------------------------------------
//
// Returns the ODBC SQL Type corresponding to a variant type
//--------------------------------------------------------------------------------
WCHAR * VariantTypeToSQLType
(
DBTYPE wType
);
//--------------------------------------------------------------------------------
//
// Returns TRUE if the DBTYPE is compatible with a VARIANT
//--------------------------------------------------------------------------------
BOOL IsVariantCompatible
(
DBTYPE wType,
CCol * pCol = NULL
);
//--------------------------------------------------------------------------------
//
// CModInfo::OpenXMLAsText
//--------------------------------------------------------------------------------
char *OpenXMLAsText(WCHAR *pwszFilename);
//-----------------------------------------------------------------------------
// Helper functions to write provider specific code
//-----------------------------------------------------------------------------
BOOL IsSQLOLEDB();
BOOL IsSQLNCLI();
BOOL IsSQLProvider(); // Checks both SQLOLEDB and SQLNCLI.
BOOL IsMSDASQL();
BOOL IsSqlServer();
////////////////////////////////////////////////////////////////////////////
// EscapeChar
// Escape any char in the document by doubling it
//////////////////////////////////////////////////////////////////////////
HRESULT EscapeChar(WCHAR **ppwszStr, WCHAR chEsc);
//-----------------------------------------------------------------------------
// String constants
//-----------------------------------------------------------------------------
const WCHAR wszInitializeFailed[] = L"IDBInitialize::Initialize failed\n"; //@const
const WCHAR wszMemoryAllocationError[] = L"Error allocating memory\n";//@const
const WCHAR wszInvalidStatusBinding[] = L"Invalid status returned for column ";//@const
const WCHAR wszForColumn[] = L" returned for column ";//@const
const WCHAR wszMaxLengthGreaterThanLength[] = L"MaxLength of consumer's buffer is large enough. No truncation should have occured at column ";//@const
const WCHAR wszLengthZeroForNULL[] = L"Length for NULL data should be zero at column ";//@const
const WCHAR wszCanNotConvertData[] = L"Can not convert data for column ";//@const
const WCHAR wszCanNotMakeData[] = L"Can not make data for column ";//@const
const WCHAR wszLengthInconsist[] = L"The length for data is incorrect for column ";
const WCHAR wszReservedUsed[] = L"DBTYPE_RESERVED is used for DBTYPE for column ";
const WCHAR wszTableNotNULL[] = L"Data is not NULL at the backend for column ";
const WCHAR wszTableNULL[] = L"Data is NULL at the backend but the status binding does not indicate for column ";
const WCHAR wszTypeModifierExclusive[] = L"More than one type modifier is used for column ";
const WCHAR wszInvalidDBTYPE[] = L"Invalid DBType in the binding structure for column ";
const WCHAR wszInvalidValueBinding[] = L"Invalid value returned for column ";
const WCHAR wszPointerNotNULL[] = L"The pointer should be NULL through ReadByColumns accessors for NULL data for column ";
const WCHAR wszBindStatusForNULL[] = L"Has to bind status for NULL value for column ";
const WCHAR wszColumnNotUpdatable[] = L"Not updatable for column ";
const WCHAR wszAtBinding[] = L" at binding structure ";
const WCHAR wszInvalidStatus[] = L"Invalid status value ";
const WCHAR wszSafeArrayNotEqual[] = L"The safe arrays are not equal.\n";
const WCHAR wszVectorNotEqual[] = L"The vectors are not equal.\n";
const WCHAR wszStatusNotEqual[]=L"Status bindings is not equal at column: ";
const WCHAR wszLengthNotEqual[]=L"Length binding is not equal at column: ";
const WCHAR wszValueNotEqual[]=L"Value binding is not equal at column: ";
const WCHAR wszStatusOKOrNULL[]=L"Status for SetData buffer is not OK or NULL at column: ";
const WCHAR wszPropQIBad[]=L"QI for ICommandPrepare failed";
const WCHAR wszPrepGood[]=L"Command prepared successfully";
const WCHAR wszUnprepGood[]=L"Command unprepared successfully";
const WCHAR wszDefaultError[]=L"Default return";
const WCHAR wszInsertERROR[]=L"Insert into ";
const WCHAR wszSelectERROR[]=L"Select from ";
//-----------------------------------------------------------------------------
// Constants Defines
//-----------------------------------------------------------------------------
#define DATA_SIZE 2002
#define INVALID_DBTYPE_SIZE -1
#define INVALID_DBTYPE (DBTYPE_ARRAY | DBTYPE_BYREF)
#ifndef MAXNUMERICLEN
#define MAXNUMERICLEN 16
#endif
#endif // _MISCFUNC_H_