windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/utlparam.h
2020-09-26 16:20:57 +08:00

212 lines
7.1 KiB
C++

////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMI OLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// Parameter handling Routines
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef _UTLPARAM_H_
#define _UTLPARAM_H_
#define PARAM_MARKER L'?'
class CCommand;
const BYTE PARAMINFO_CONVERT_IUNKNOWN = 0x01;
const DWORD CUTLPARAM_DEFAULT_PARAMS = 0x00000001;
////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Parameter information struct.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
struct PARAMINFO
{
LPWSTR pwszParamName; //parameter name
DBPARAMFLAGS dwFlags; //parameter flags
DBLENGTH cbColLength; //max length of param as represented
DBLENGTH cbValueMax; //max length of the param as represented by the OLE DB type
DBLENGTH ulParamSize; //max length of the param as defined for ICommandWithParameters::GetParameterInfo
DBSTATUS dwStatus; //status flags
DBTYPE wOLEDBType; //corresponding OLE DB type
LONG CIMType;
BYTE * pbData;
LONG Flavor;
DBORDINAL iOrdinal;
PARAMINFO() { this->Init(); }
~PARAMINFO() { delete pwszParamName; }
void Init() { pwszParamName = NULL; dwFlags = 0; cbColLength = 0;cbValueMax = 0; dwStatus = 0;wOLEDBType = 0; pbData = NULL; }
};
typedef PARAMINFO *PPARAMINFO;
struct WMIBINDINFO
{
DBBINDING* pBinding; // Original binding data
PARAMINFO* pParamInfo; // Parameter information
WMIBINDINFO* pNextBindInfo; // Next binding for the output parameter
WORD wFlags; // Flags
WORD iBatchedRPC; // Index to which batched RPC this param was used
};
typedef WMIBINDINFO *PWMIBINDINFO;
// Get binding
inline DBBINDING* GetBinding(PWMIBINDINFO pBindInfo)
{
if (pBindInfo->wFlags & DBPARAMIO_INPUT){
for (; pBindInfo; pBindInfo = pBindInfo->pNextBindInfo){
if (pBindInfo->pBinding->eParamIO & DBPARAMIO_INPUT){
break;
}
assert(pBindInfo);
}
}
return pBindInfo->pBinding;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Utility class for parameter and binding information
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CUtlParam
{
private:
ULONG m_cRef; // reference count
DBPARAMS m_dbparams; // parameters
ULONG_PTR m_cbRowSize; // # of bytes allocated for a single set of params
CImpIAccessor* m_pIAccessor; // accessor interface
ULONG m_cParams; // # of parameters in the command
WMIBINDINFO* m_prgBindInfo; //@cmember binding information
PPARAMINFO* m_rgpParamInfo; // parm info derived from bind info
ULONG m_cParamInfo; // # of param info structs derived
// from the bind info
DWORD m_dwStatus; // status information
public:
CUtlParam();
~CUtlParam();
// Increments the Reference count
STDMETHODIMP_(ULONG) AddRef(void);
// Decrements the Reference count
STDMETHODIMP_(ULONG) Release(void);
// Get the number parameters in the command
ULONG CParams() const { return m_cParams; }
// Get the number parameter sets
ULONG CParamSets() const { return (ULONG)m_dbparams.cParamSets; }
// Are there any default parameters?
BOOL FHaveDefaultParams() const
{
return (m_dwStatus & CUTLPARAM_DEFAULT_PARAMS) != 0;
}
//==================================================================================
// Builds the binding information needed to execute a command with parameters
//==================================================================================
STDMETHODIMP BuildBindInfo( CCommand *pcmd, DBPARAMS *pParams, const IID* piid );
//==================================================================================
// Builds the parameter information for the command from the binding information.
//==================================================================================
STDMETHODIMP BuildParamInfo( CCommand *pcmd, // IN | Command Structure
const IID* piid // IN | Interface that invoked this method
);
// Get the parameter information for a parameter
inline PARAMINFO* GetParamInfo(ULONG iParam) const
{
return NULL;
}
// Set the status data for a parameter
inline void SetStatus(DBBINDING *pBind, DBSTATUS dbstatus)
{
if (pBind->dwPart & DBPART_STATUS)
{
BYTE *pbData;
ULONG iParamSet;
for ( pbData = (BYTE*)m_dbparams.pData, iParamSet = 0;
iParamSet < m_dbparams.cParamSets;
pbData += m_cbRowSize, iParamSet++ )
{
*(DBSTATUS *)(pbData + pBind->obStatus) = dbstatus;
}
}
}
// Bind a parameter to its data
void BindParamData( ULONG iParamSet, ULONG iParam, DBBINDING* pBinding,BYTE** ppbValue, DWORD** ppdwLength,
DWORD* pdwLength,DBSTATUS** ppdwStatus, DBSTATUS* pdwStatus, DBTYPE* pdbtype );
// Bind the pointers to parameter data
inline void BindParamPtrs
(
ULONG iParamSet, // IN | parameter set ordinal
ULONG iParam, // IN | parameter ordinal
DBBINDING* pBinding, // IN | Binding information
BYTE** ppbValue, // OUT | pointer to the param value
DWORD** ppdwLength, // OUT | pointer to the length of param value
DBSTATUS** ppdwStatus // OUT | pointer to the status for the param
)
{
assert(iParamSet && iParamSet <= m_dbparams.cParamSets);
assert(iParam && iParam <= m_cParams);
assert(pBinding);
assert(pBinding->iOrdinal == iParam);
assert(ppbValue);
assert(ppdwLength);
assert(ppdwStatus);
BYTE* pbData = (BYTE*)m_dbparams.pData + (iParamSet-1)*m_cbRowSize;
*ppbValue = (pBinding->dwPart & DBPART_VALUE)
? pbData + pBinding->obValue : NULL;
*ppdwStatus = (pBinding->dwPart & DBPART_STATUS)
? (DBSTATUS*)(pbData + pBinding->obStatus) : NULL;
*ppdwLength = (pBinding->dwPart & DBPART_LENGTH)
? (DWORD*)(pbData + pBinding->obLength) : NULL;
}
// Bind a parameter to its data
inline BOOL FIsDefaultParam
(
ULONG iParamSet, // IN | parameter set ordinal
ULONG iParam, // IN | parameter ordinal
DBBINDING* pBinding // IN | Binding information
)
{
assert(iParamSet && iParamSet <= m_dbparams.cParamSets);
assert(iParam && iParam <= m_cParams);
assert(pBinding);
assert(pBinding->iOrdinal == iParam);
if (pBinding->dwPart & DBPART_STATUS)
{
BYTE* pbData = (BYTE*)m_dbparams.pData + (iParamSet-1)*m_cbRowSize;
assert(!IsBadReadPtr(pbData+pBinding->obStatus,sizeof(DBSTATUS)));
if (DBSTATUS_S_DEFAULT == *((DBSTATUS*)(pbData + pBinding->obStatus)))
return TRUE;
}
return FALSE;
}
// Get the length of the bound data
ULONG GetBindLength
(
DBBINDING *pBinding, // IN | Binding information
DWORD* pdwLength, // IN | bound length
BYTE *pbData // IN | Pointer to param data
);
// Set bind status for parameters to DBSTATUS_E_UNAVAILABLE
void SetParamsUnavailable(ULONG iParamSetFailed, ULONG iParamFailed,BOOL fBackOut);
};
typedef CUtlParam *PCUTLPARAM;
#endif // UTLPARAM