191 lines
4.2 KiB
C
191 lines
4.2 KiB
C
|
//-----------------------------------------------------------------------------
|
||
|
// File: icrsint.h
|
||
|
//
|
||
|
// Copyright: Copyright (c) Microsoft Corporation
|
||
|
//
|
||
|
// Contents: ADO C/C++ Record Binding Definitions
|
||
|
//
|
||
|
// Comments:
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef _ICRSINT_H_
|
||
|
#define _ICRSINT_H_
|
||
|
|
||
|
#include <olectl.h>
|
||
|
#include <stddef.h>
|
||
|
|
||
|
// forwards
|
||
|
class CADORecordBinding;
|
||
|
|
||
|
#define classoffset(base, derived) ((DWORD_PTR)(static_cast<base*>((derived*)8))-8)
|
||
|
|
||
|
enum ADOFieldStatusEnum
|
||
|
{
|
||
|
adFldOK = 0,
|
||
|
adFldBadAccessor = 1,
|
||
|
adFldCantConvertValue = 2,
|
||
|
adFldNull = 3,
|
||
|
adFldTruncated = 4,
|
||
|
adFldSignMismatch = 5,
|
||
|
adFldDataOverFlow = 6,
|
||
|
adFldCantCreate = 7,
|
||
|
adFldUnavailable = 8,
|
||
|
adFldPermissionDenied = 9,
|
||
|
adFldIntegrityViolation = 10,
|
||
|
adFldSchemaViolation = 11,
|
||
|
adFldBadStatus = 12,
|
||
|
adFldDefault = 13
|
||
|
};
|
||
|
|
||
|
typedef struct stADO_BINDING_ENTRY
|
||
|
{
|
||
|
ULONG_PTR ulOrdinal;
|
||
|
WORD wDataType;
|
||
|
BYTE bPrecision;
|
||
|
BYTE bScale;
|
||
|
ULONG_PTR ulSize;
|
||
|
ULONG_PTR ulBufferOffset;
|
||
|
ULONG_PTR ulStatusOffset;
|
||
|
ULONG_PTR ulLengthOffset;
|
||
|
ULONG_PTR ulADORecordBindingOffSet;
|
||
|
BOOL fModify;
|
||
|
} ADO_BINDING_ENTRY;
|
||
|
|
||
|
#define BEGIN_ADO_BINDING(cls) public: \
|
||
|
typedef cls ADORowClass; \
|
||
|
const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { \
|
||
|
static const ADO_BINDING_ENTRY rgADOBindingEntries[] = {
|
||
|
|
||
|
//
|
||
|
// Fixed length non-numeric data
|
||
|
//
|
||
|
#define ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
0, \
|
||
|
0, \
|
||
|
0, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
offsetof(ADORowClass, Status), \
|
||
|
0, \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
#define ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
0, \
|
||
|
0, \
|
||
|
0, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
0, \
|
||
|
0, \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
//
|
||
|
// Numeric data
|
||
|
//
|
||
|
#define ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
Precision, \
|
||
|
Scale, \
|
||
|
0, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
offsetof(ADORowClass, Status), \
|
||
|
0, \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
#define ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
Precision, \
|
||
|
Scale, \
|
||
|
0, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
0, \
|
||
|
0, \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
//
|
||
|
// Variable length data
|
||
|
//
|
||
|
#define ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status, Length, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
0, \
|
||
|
0, \
|
||
|
Size, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
offsetof(ADORowClass, Status), \
|
||
|
offsetof(ADORowClass, Length), \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
#define ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
0, \
|
||
|
0, \
|
||
|
Size, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
offsetof(ADORowClass, Status), \
|
||
|
0, \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
#define ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
0, \
|
||
|
0, \
|
||
|
Size, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
0, \
|
||
|
offsetof(ADORowClass, Length), \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
#define ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify)\
|
||
|
{Ordinal, \
|
||
|
DataType, \
|
||
|
0, \
|
||
|
0, \
|
||
|
Size, \
|
||
|
offsetof(ADORowClass, Buffer), \
|
||
|
0, \
|
||
|
0, \
|
||
|
classoffset(CADORecordBinding, ADORowClass), \
|
||
|
Modify},
|
||
|
|
||
|
#define END_ADO_BINDING() {0, adEmpty, 0, 0, 0, 0, 0, 0, 0, FALSE}};\
|
||
|
return rgADOBindingEntries;}
|
||
|
|
||
|
//
|
||
|
// Interface that the client 'record' class needs to support. The ADO Binding entries
|
||
|
// provide the implementation for this interface.
|
||
|
//
|
||
|
class CADORecordBinding
|
||
|
{
|
||
|
public:
|
||
|
STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) (VOID) PURE;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Interface that allows a client to fetch a record of data into class data members.
|
||
|
//
|
||
|
struct __declspec(uuid("00000544-0000-0010-8000-00aa006d2ea4")) IADORecordBinding;
|
||
|
DECLARE_INTERFACE_(IADORecordBinding, IUnknown)
|
||
|
{
|
||
|
public:
|
||
|
STDMETHOD(BindToRecordset) (CADORecordBinding *pAdoRecordBinding) PURE;
|
||
|
STDMETHOD(AddNew) (CADORecordBinding *pAdoRecordBinding) PURE;
|
||
|
STDMETHOD(Update) (CADORecordBinding *pAdoRecordBinding) PURE;
|
||
|
};
|
||
|
|
||
|
#endif // !_ICRSINT_H_
|