/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef _MSDASQL_H_
#define _MSDASQL_H_

#undef MSDASQLDECLSPEC
#define MSDASQLDECLSPEC __declspec(selectany)

#ifdef DBINITCONSTANTS
extern const MSDASQLDECLSPEC GUID IID_ISQLRequestDiagFields = { 0x228972f0,0xb5ff,0x11d0,{ 0x8a,0x80,0x0,0xc0,0x4f,0xd6,0x11,0xcd } };
extern const MSDASQLDECLSPEC GUID IID_ISQLGetDiagField = { 0x228972f1,0xb5ff,0x11d0,{ 0x8a,0x80,0x0,0xc0,0x4f,0xd6,0x11,0xcd } };
extern const MSDASQLDECLSPEC GUID IID_IRowsetChangeExtInfo = {0x0C733A8FL,0x2A1C,0x11CE,{0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D}};
extern const MSDASQLDECLSPEC GUID CLSID_MSDASQL = {0xC8B522CBL,0x5CF3,0x11CE,{0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D}};
extern const MSDASQLDECLSPEC GUID CLSID_MSDASQL_ENUMERATOR = {0xC8B522CDL,0x5CF3,0x11CE,{0xAD,0xE5,0x00,0xAA,0x00,0x44,0x77,0x3D}};
#else
extern const GUID IID_ISQLRequestDiagFields;
extern const GUID IID_ISQLGetDiagField;
extern const GUID IID_IRowsetChangeExtInfo;
extern const GUID CLSID_MSDASQL;
extern const GUID CLSID_MSDASQL_ENUMERATOR;
#endif

#ifdef DBINITCONSTANTS
extern const MSDASQLDECLSPEC GUID DBPROPSET_PROVIDERDATASOURCEINFO = {0x497c60e0,0x7123,0x11cf,{0xb1,0x71,0x0,0xaa,0x0,0x57,0x59,0x9e}};
extern const MSDASQLDECLSPEC GUID DBPROPSET_PROVIDERROWSET = {0x497c60e1,0x7123,0x11cf,{0xb1,0x71,0x0,0xaa,0x0,0x57,0x59,0x9e}};
extern const MSDASQLDECLSPEC GUID DBPROPSET_PROVIDERDBINIT = {0x497c60e2,0x7123,0x11cf,{0xb1,0x71,0x0,0xaa,0x0,0x57,0x59,0x9e}};
extern const MSDASQLDECLSPEC GUID DBPROPSET_PROVIDERSTMTATTR = {0x497c60e3,0x7123,0x11cf,{0xb1,0x71,0x0,0xaa,0x0,0x57,0x59,0x9e}};
extern const MSDASQLDECLSPEC GUID DBPROPSET_PROVIDERCONNATTR = {0x497c60e4,0x7123,0x11cf,{0xb1,0x71,0x0,0xaa,0x0,0x57,0x59,0x9e}};
#else
extern const GUID DBPROPSET_PROVIDERDATASOURCEINFO;
extern const GUID DBPROPSET_PROVIDERROWSET;
extern const GUID DBPROPSET_PROVIDERDBINIT;
extern const GUID DBPROPSET_PROVIDERSTMTATTR;
extern const GUID DBPROPSET_PROVIDERCONNATTR;
#endif

#define KAGPROP_QUERYBASEDUPDATES 2
#define KAGPROP_MARSHALLABLE 3
#define KAGPROP_POSITIONONNEWROW 4
#define KAGPROP_IRowsetChangeExtInfo 5
#define KAGPROP_CURSOR 6
#define KAGPROP_CONCURRENCY 7
#define KAGPROP_BLOBSONFOCURSOR 8
#define KAGPROP_INCLUDENONEXACT 9
#define KAGPROP_FORCESSFIREHOSEMODE 10
#define KAGPROP_FORCENOPARAMETERREBIND 11
#define KAGPROP_FORCENOPREPARE 12
#define KAGPROP_FORCENOREEXECUTE 13

#define KAGPROP_ACCESSIBLEPROCEDURES 2
#define KAGPROP_ACCESSIBLETABLES 3
#define KAGPROP_ODBCSQLOPTIEF 4
#define KAGPROP_OJCAPABILITY 5
#define KAGPROP_PROCEDURES 6
#define KAGPROP_DRIVERNAME 7
#define KAGPROP_DRIVERVER 8
#define KAGPROP_DRIVERODBCVER 9
#define KAGPROP_LIKEESCAPECLAUSE 10
#define KAGPROP_SPECIALCHARACTERS 11
#define KAGPROP_MAXCOLUMNSINGROUPBY 12
#define KAGPROP_MAXCOLUMNSININDEX 13
#define KAGPROP_MAXCOLUMNSINORDERBY 14
#define KAGPROP_MAXCOLUMNSINSELECT 15
#define KAGPROP_MAXCOLUMNSINTABLE 16
#define KAGPROP_NUMERICFUNCTIONS 17
#define KAGPROP_ODBCSQLCONFORMANCE 18
#define KAGPROP_OUTERJOINS 19
#define KAGPROP_STRINGFUNCTIONS 20
#define KAGPROP_SYSTEMFUNCTIONS 21
#define KAGPROP_TIMEDATEFUNCTIONS 22
#define KAGPROP_FILEUSAGE 23
#define KAGPROP_ACTIVESTATEMENTS 24

#define KAGPROP_AUTH_TRUSTEDCONNECTION 2
#define KAGPROP_AUTH_SERVERINTEGRATED 3

#define KAGPROPVAL_CONCUR_ROWVER 0x00000001
#define KAGPROPVAL_CONCUR_VALUES 0x00000002
#define KAGPROPVAL_CONCUR_LOCK 0x00000004
#define KAGPROPVAL_CONCUR_READ_ONLY 0x00000008

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 440
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __rstcei_h__
#define __rstcei_h__

#ifndef __IRowsetChangeExtInfo_FWD_DEFINED__
#define __IRowsetChangeExtInfo_FWD_DEFINED__
typedef interface IRowsetChangeExtInfo IRowsetChangeExtInfo;
#endif

#include "oledb.h"

#ifdef __cplusplus
extern "C" {
#endif

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

#ifndef __IRowsetChangeExtInfo_INTERFACE_DEFINED__
#define __IRowsetChangeExtInfo_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IRowsetChangeExtInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IRowsetChangeExtInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetOriginalRow(HCHAPTER hReserved,HROW hRow,HROW *phRowOriginal) = 0;
    virtual HRESULT WINAPI GetPendingColumns(HCHAPTER hReserved,HROW hRow,ULONG cColumnOrdinals,const ULONG rgiOrdinals[],DBPENDINGSTATUS rgColumnStatus[]) = 0;
  };
#else
  typedef struct IRowsetChangeExtInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IRowsetChangeExtInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IRowsetChangeExtInfo *This);
      ULONG (WINAPI *Release)(IRowsetChangeExtInfo *This);
      HRESULT (WINAPI *GetOriginalRow)(IRowsetChangeExtInfo *This,HCHAPTER hReserved,HROW hRow,HROW *phRowOriginal);
      HRESULT (WINAPI *GetPendingColumns)(IRowsetChangeExtInfo *This,HCHAPTER hReserved,HROW hRow,ULONG cColumnOrdinals,const ULONG rgiOrdinals[],DBPENDINGSTATUS rgColumnStatus[]);
    END_INTERFACE
  } IRowsetChangeExtInfoVtbl;
  interface IRowsetChangeExtInfo {
    CONST_VTBL struct IRowsetChangeExtInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IRowsetChangeExtInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRowsetChangeExtInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRowsetChangeExtInfo_Release(This) (This)->lpVtbl->Release(This)
#define IRowsetChangeExtInfo_GetOriginalRow(This,hReserved,hRow,phRowOriginal) (This)->lpVtbl->GetOriginalRow(This,hReserved,hRow,phRowOriginal)
#define IRowsetChangeExtInfo_GetPendingColumns(This,hReserved,hRow,cColumnOrdinals,rgiOrdinals,rgColumnStatus) (This)->lpVtbl->GetPendingColumns(This,hReserved,hRow,cColumnOrdinals,rgiOrdinals,rgColumnStatus)
#endif
#endif
  HRESULT WINAPI IRowsetChangeExtInfo_GetOriginalRow_Proxy(IRowsetChangeExtInfo *This,HCHAPTER hReserved,HROW hRow,HROW *phRowOriginal);
  void __RPC_STUB IRowsetChangeExtInfo_GetOriginalRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IRowsetChangeExtInfo_GetPendingColumns_Proxy(IRowsetChangeExtInfo *This,HCHAPTER hReserved,HROW hRow,ULONG cColumnOrdinals,const ULONG rgiOrdinals[],DBPENDINGSTATUS rgColumnStatus[]);
  void __RPC_STUB IRowsetChangeExtInfo_GetPendingColumns_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifdef __cplusplus
}
#endif
#endif

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 440
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __kagdiag_h__
#define __kagdiag_h__

#ifndef __ISQLRequestDiagFields_FWD_DEFINED__
#define __ISQLRequestDiagFields_FWD_DEFINED__
typedef interface ISQLRequestDiagFields ISQLRequestDiagFields;
#endif

#ifndef __ISQLGetDiagField_FWD_DEFINED__
#define __ISQLGetDiagField_FWD_DEFINED__
typedef interface ISQLGetDiagField ISQLGetDiagField;
#endif

#include "unknwn.h"
#include "oaidl.h"

#ifdef __cplusplus
extern "C" {
#endif

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

  enum KAGREQDIAGFLAGSENUM {
    KAGREQDIAGFLAGS_HEADER = 0x1,KAGREQDIAGFLAGS_RECORD = 0x2
  };

  typedef struct tagKAGREQDIAG {
    ULONG ulDiagFlags;
    VARTYPE vt;
    SHORT sDiagField;
  } KAGREQDIAG;

  typedef struct tagKAGGETDIAG {
    ULONG ulSize;
    VARIANTARG vDiagInfo;
    SHORT sDiagField;
  } KAGGETDIAG;

  extern RPC_IF_HANDLE __MIDL_itf_kagdiag_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_kagdiag_0000_v0_0_s_ifspec;

#ifndef __ISQLRequestDiagFields_INTERFACE_DEFINED__
#define __ISQLRequestDiagFields_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISQLRequestDiagFields;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISQLRequestDiagFields : public IUnknown {
  public:
    virtual HRESULT WINAPI RequestDiagFields(ULONG cDiagFields,KAGREQDIAG rgDiagFields[]) = 0;
  };
#else
  typedef struct ISQLRequestDiagFieldsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISQLRequestDiagFields *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISQLRequestDiagFields *This);
      ULONG (WINAPI *Release)(ISQLRequestDiagFields *This);
      HRESULT (WINAPI *RequestDiagFields)(ISQLRequestDiagFields *This,ULONG cDiagFields,KAGREQDIAG rgDiagFields[]);
    END_INTERFACE
  } ISQLRequestDiagFieldsVtbl;
  interface ISQLRequestDiagFields {
    CONST_VTBL struct ISQLRequestDiagFieldsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISQLRequestDiagFields_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISQLRequestDiagFields_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISQLRequestDiagFields_Release(This) (This)->lpVtbl->Release(This)
#define ISQLRequestDiagFields_RequestDiagFields(This,cDiagFields,rgDiagFields) (This)->lpVtbl->RequestDiagFields(This,cDiagFields,rgDiagFields)
#endif
#endif
  HRESULT WINAPI ISQLRequestDiagFields_RequestDiagFields_Proxy(ISQLRequestDiagFields *This,ULONG cDiagFields,KAGREQDIAG rgDiagFields[]);
  void __RPC_STUB ISQLRequestDiagFields_RequestDiagFields_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISQLGetDiagField_INTERFACE_DEFINED__
#define __ISQLGetDiagField_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISQLGetDiagField;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISQLGetDiagField : public IUnknown {
  public:
    virtual HRESULT WINAPI GetDiagField(KAGGETDIAG *pDiagInfo) = 0;
  };
#else
  typedef struct ISQLGetDiagFieldVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISQLGetDiagField *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISQLGetDiagField *This);
      ULONG (WINAPI *Release)(ISQLGetDiagField *This);
      HRESULT (WINAPI *GetDiagField)(ISQLGetDiagField *This,KAGGETDIAG *pDiagInfo);
    END_INTERFACE
  } ISQLGetDiagFieldVtbl;
  interface ISQLGetDiagField {
    CONST_VTBL struct ISQLGetDiagFieldVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISQLGetDiagField_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISQLGetDiagField_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISQLGetDiagField_Release(This) (This)->lpVtbl->Release(This)
#define ISQLGetDiagField_GetDiagField(This,pDiagInfo) (This)->lpVtbl->GetDiagField(This,pDiagInfo)
#endif
#endif
  HRESULT WINAPI ISQLGetDiagField_GetDiagField_Proxy(ISQLGetDiagField *This,KAGGETDIAG *pDiagInfo);
  void __RPC_STUB ISQLGetDiagField_GetDiagField_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  unsigned long __RPC_API VARIANT_UserSize(unsigned long *,unsigned long,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserMarshal(unsigned long *,unsigned char *,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserUnmarshal(unsigned long *,unsigned char *,VARIANT *);
  void __RPC_API VARIANT_UserFree(unsigned long *,VARIANT *);

#ifdef __cplusplus
}
#endif
#endif
#endif
