191 lines
5.8 KiB
C++
191 lines
5.8 KiB
C++
|
//-----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
||
|
//
|
||
|
// File: caccess.hxx
|
||
|
//
|
||
|
// Contents: Microsoft OleDB/OleDS Data Source Object for ADSI
|
||
|
//
|
||
|
// CImpIAccessor object implementing the IAccessor interface.
|
||
|
//
|
||
|
// History: 08-01-96 shanksh Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef _CACCESS_HXX
|
||
|
#define _CACCESS_HXX
|
||
|
|
||
|
// ADSI accessor structure
|
||
|
typedef struct tagADSACCESSOR {
|
||
|
DBACCESSORFLAGS dwFlags; // accessor flags
|
||
|
DBREFCOUNT cRef; // reference count of the accessor
|
||
|
DBLENGTH cbRowSize; // size of the row in the client's buffer
|
||
|
DBORDINAL *rgcol; // array of cols referenced by the accessor
|
||
|
DBCOUNTITEM cBindings; // # of bindings
|
||
|
DBBINDING rgBindings[1];// array of binding structs
|
||
|
} ADSACCESSOR;
|
||
|
|
||
|
typedef ADSACCESSOR *PADSACCESSOR;
|
||
|
|
||
|
//-----------------------------------------------------------------------------------
|
||
|
//
|
||
|
// class CImpIAccessor | Contained IAccessor class
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------------
|
||
|
|
||
|
class CImpIAccessor : INHERIT_TRACKING,
|
||
|
public IAccessor // public | IAccessor
|
||
|
{
|
||
|
// Immediate user objects are friends
|
||
|
friend class CCommandObject;
|
||
|
|
||
|
private:
|
||
|
void *_pObj;
|
||
|
LPUNKNOWN _pUnkOuter;
|
||
|
ULONG _dwStatus; // status dword
|
||
|
LPEXTBUFF _pextbuffer; // array of accessor ptrs
|
||
|
ULONG _dwGetDataTypeBadHandle; // specifies bad handle accessor type
|
||
|
CRITICAL_SECTION _criticalsectionAccessor;// critical section for CreateAccessor calls
|
||
|
IDataConvert *_pIDC;
|
||
|
IMalloc *_pIMalloc;
|
||
|
|
||
|
STDMETHODIMP_(void) DetermineTypes (
|
||
|
DBACCESSORFLAGS dwAccessorFlags,
|
||
|
ULONG *pdwGetDataType,
|
||
|
ULONG *pdwSetDataType
|
||
|
);
|
||
|
|
||
|
STDMETHODIMP_(void) DeleteADsAccessor (
|
||
|
PADSACCESSOR pADsaccessor
|
||
|
);
|
||
|
|
||
|
|
||
|
public:
|
||
|
CImpIAccessor(void *, LPUNKNOWN);
|
||
|
~CImpIAccessor(void);
|
||
|
|
||
|
DECLARE_STD_REFCOUNTING
|
||
|
|
||
|
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) ;
|
||
|
|
||
|
STDMETHODIMP FInit (
|
||
|
void
|
||
|
);
|
||
|
|
||
|
STDMETHODIMP AddRefAccessor(
|
||
|
HACCESSOR hAccessor,
|
||
|
DBREFCOUNT *pcRefCounts
|
||
|
);
|
||
|
|
||
|
STDMETHODIMP CreateAccessor(
|
||
|
DBACCESSORFLAGS dwAccessorFlags,
|
||
|
DBCOUNTITEM cBindings,
|
||
|
const DBBINDING rgBindings[],
|
||
|
DBLENGTH cbRowSize,
|
||
|
HACCESSOR *phAccessor,
|
||
|
DBBINDSTATUS rgStatus[]
|
||
|
);
|
||
|
|
||
|
STDMETHODIMP GetBindings(
|
||
|
HACCESSOR hAccessor,
|
||
|
DBACCESSORFLAGS *pdwAccessorFlags,
|
||
|
DBCOUNTITEM *pcBindings,
|
||
|
DBBINDING **prgBindings
|
||
|
);
|
||
|
|
||
|
STDMETHODIMP ReleaseAccessor(
|
||
|
HACCESSOR hAccessor,
|
||
|
DBREFCOUNT *pcRefCounts
|
||
|
);
|
||
|
|
||
|
// Verifies that a DB type used in a binding is supported.
|
||
|
inline STDMETHODIMP_(BOOL) IsGoodBindingType(
|
||
|
DBTYPE dbtype
|
||
|
)
|
||
|
{
|
||
|
switch ((dbtype & ~(DBTYPE_ARRAY|DBTYPE_BYREF|DBTYPE_VECTOR))) {
|
||
|
case DBTYPE_I1:
|
||
|
case DBTYPE_UI1:
|
||
|
case DBTYPE_I2:
|
||
|
case DBTYPE_UI2:
|
||
|
case DBTYPE_I4:
|
||
|
case DBTYPE_UI4:
|
||
|
case DBTYPE_I8:
|
||
|
case DBTYPE_UI8:
|
||
|
case DBTYPE_R4:
|
||
|
case DBTYPE_R8:
|
||
|
case DBTYPE_CY:
|
||
|
case DBTYPE_GUID:
|
||
|
case DBTYPE_BOOL:
|
||
|
case DBTYPE_VARIANT:
|
||
|
case DBTYPE_DATE:
|
||
|
case DBTYPE_DBDATE:
|
||
|
case DBTYPE_DBTIME:
|
||
|
case DBTYPE_DBTIMESTAMP:
|
||
|
case DBTYPE_BSTR:
|
||
|
case DBTYPE_STR:
|
||
|
case DBTYPE_WSTR:
|
||
|
case DBTYPE_BYTES:
|
||
|
case DBTYPE_NUMERIC:
|
||
|
case DBTYPE_IUNKNOWN:
|
||
|
return TRUE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HRESULT CreateBadAccessor(void);
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
// Accessor status flags (_dwStatus)
|
||
|
//const UDWORD ACCESSORSTAT_UNDERROWSET =0x00000001L;// aggregated under Rowset object
|
||
|
const ULONG ACCESSORSTAT_VALIDATENOW =0x00000002L;// accessors totally validated on
|
||
|
const ULONG ACCESSORSTAT_CANACCESSBLOBS=0x00000004L;// can create accessors for BLOBS
|
||
|
|
||
|
|
||
|
|
||
|
//------ D E F I N E S, M A C R O S A N D I N L I N E F U N C T I O N S -------
|
||
|
|
||
|
// Internal accessor type classifications
|
||
|
|
||
|
// Common types
|
||
|
// Marks an incorrect accessor.
|
||
|
#define ACCESSORTYPE_INERROR 0
|
||
|
|
||
|
// Types used by GetData.
|
||
|
#define GD_ACCESSORTYPE_INERROR ACCESSORTYPE_INERROR
|
||
|
#define GD_ACCESSORTYPE_PARAM_ONLY 1
|
||
|
#define GD_ACCESSORTYPE_READ_BYREF 2
|
||
|
#define GD_ACCESSORTYPE_READ_COLS_BYREF 3
|
||
|
#define GD_ACCESSORTYPE_READ_OPTIMIZED 4
|
||
|
#define GD_ACCESSORTYPE_READ 5
|
||
|
// First good GetData type.
|
||
|
#define GD_ACCESSORTYPE_GOOD GD_ACCESSORTYPE_READ_BYREF
|
||
|
|
||
|
// Types used by SetData.
|
||
|
#define SD_ACCESSORTYPE_INERROR ACCESSORTYPE_INERROR
|
||
|
#define SD_ACCESSORTYPE_PARAM_ONLY 1
|
||
|
#define SD_ACCESSORTYPE_READ_ONLY 2
|
||
|
#define SD_ACCESSORTYPE_READWRITE 3
|
||
|
|
||
|
const ULONG DBACCESSOR_VALID_FLAGS =
|
||
|
(DBACCESSOR_PASSBYREF|DBACCESSOR_ROWDATA|
|
||
|
DBACCESSOR_PARAMETERDATA|DBACCESSOR_OPTIMIZED);
|
||
|
|
||
|
const DBTYPE TYPE_MODIFIERS = (DBTYPE_BYREF | DBTYPE_VECTOR | DBTYPE_ARRAY);
|
||
|
|
||
|
const ULONG INITIAL_NUM_PARAM =256;
|
||
|
|
||
|
// Zero element of the extbuffer of accessors always represents an invalid accessor.
|
||
|
const ULONG_PTR hAccessorBadHandle =0;
|
||
|
|
||
|
// Internal DBACCESSOR flag to mark accessors referencing BLOB columns.
|
||
|
const DBACCESSORFLAGS DBACCESSOR_REFERENCES_BLOB =0x8000;
|
||
|
|
||
|
#endif
|