/**
 * 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 _SQLOLEDB_H_
#define _SQLOLEDB_H_

#include <oledb.h>

#ifdef DBINITCONSTANTS
extern const GUID CLSID_SQLOLEDB = {0xc7ff16cL,0x38e3,0x11d0,{0x97,0xab,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID CLSID_SQLOLEDB_ERROR = {0xc0932c62L,0x38e5,0x11d0,{0x97,0xab,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID CLSID_SQLOLEDB_ENUMERATOR = {0xdfa22b8eL,0xe68d,0x11d0,{0x97,0xe4,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
#else
extern const GUID CLSID_SQLOLEDB;
extern const GUID CLSID_SQLOLEDB_ERROR;
extern const GUID CLSID_SQLOLEDB_ENUMERATOR;
#endif

#ifdef DBINITCONSTANTS
extern const GUID IID_ISQLServerErrorInfo = {0x5cf4ca12,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID IID_IRowsetFastLoad = {0x5cf4ca13,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID IID_IUMSInitialize = {0x5cf4ca14,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};

extern const GUID IID_ISchemaLock = {0x4c2389fb,0x2511,0x11d4,{0xb2,0x58,0x0,0xc0,0x4f,0x79,0x71,0xce}};

extern const GUID DBGUID_MSSQLXML = {0x5d531cb2L,0xe6ed,0x11d2,{0xb2,0x52,0x00,0xc0,0x4f,0x68,0x1b,0x71}};
extern const GUID DBGUID_XPATH = {0xec2a4293L,0xe898,0x11d2,{0xb1,0xb7,0x00,0xc0,0x4f,0x68,0x0c,0x56}};

extern const IID IID_ICommandStream = {0x0c733abfL,0x2a1c,0x11ce,{0xad,0xe5,0x00,0xaa,0x00,0x44,0x77,0x3d}};
extern const IID IID_ISQLXMLHelper = {0xd22a7678L,0xf860,0x40cd,{0xa5,0x67,0x15,0x63,0xde,0xb4,0x6d,0x49}};
#else
extern const GUID IID_ISQLServerErrorInfo;
extern const GUID IID_IRowsetFastLoad;
extern const GUID IID_IUMSInitialize;
extern const GUID IID_ISchemaLock;

extern const GUID DBGUID_MSSQLXML;
extern const GUID DBGUID_XPATH;
extern const IID IID_ISQLXMLHelper;
#endif

#ifdef DBINITCONSTANTS
extern const GUID DBSCHEMA_LINKEDSERVERS = {0x9093caf4,0x2eac,0x11d1,{0x98,0x9,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
#else
extern const GUID DBSCHEMA_LINKEDSERVERS;
#endif

#define CRESTRICTIONS_DBSCHEMA_LINKEDSERVERS 1

#ifdef DBINITCONSTANTS
extern const GUID DBPROPSET_SQLSERVERDATASOURCE = {0x28efaee4,0x2d2c,0x11d1,{0x98,0x7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID DBPROPSET_SQLSERVERDATASOURCEINFO = {0xdf10cb94,0x35f6,0x11d2,{0x9c,0x54,0x0,0xc0,0x4f,0x79,0x71,0xd3}};
extern const GUID DBPROPSET_SQLSERVERDBINIT = {0x5cf4ca10,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID DBPROPSET_SQLSERVERROWSET = {0x5cf4ca11,0xef21,0x11d0,{0x97,0xe7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID DBPROPSET_SQLSERVERSESSION = {0x28efaee5,0x2d2c,0x11d1,{0x98,0x7,0x0,0xc0,0x4f,0xc2,0xad,0x98}};
extern const GUID DBPROPSET_SQLSERVERCOLUMN = {0x3b63fb5e,0x3fbb,0x11d3,{0x9f,0x29,0x0,0xc0,0x4f,0x8e,0xe9,0xdc}};
extern const GUID DBPROPSET_SQLSERVERSTREAM = {0x9f79c073,0x8a6d,0x4bca,{0xa8,0xa8,0xc9,0xb7,0x9a,0x9b,0x96,0x2d}};
#else
extern const GUID DBPROPSET_SQLSERVERDATASOURCE;
extern const GUID DBPROPSET_SQLSERVERDATASOURCEINFO;
extern const GUID DBPROPSET_SQLSERVERDBINIT;
extern const GUID DBPROPSET_SQLSERVERROWSET;
extern const GUID DBPROPSET_SQLSERVERSESSION;
extern const GUID DBPROPSET_SQLSERVERCOLUMN;
extern const GUID DBPROPSET_SQLSERVERSTREAM;
#endif

#ifdef DBINITCONSTANTS
extern const DBID DBCOLUMN_SS_COMPFLAGS = {{0x627bd890,0xed54,0x11d2,{0xb9,0x94,0x0,0xc0,0x4f,0x8c,0xa8,0x2c}},DBKIND_GUID_PROPID,(LPOLESTR)100};
extern const DBID DBCOLUMN_SS_SORTID = {{0x627bd890,0xed54,0x11d2,{0xb9,0x94,0x0,0xc0,0x4f,0x8c,0xa8,0x2c}},DBKIND_GUID_PROPID,(LPOLESTR)101};
extern const DBID DBCOLUMN_BASETABLEINSTANCE = {{0x627bd890,0xed54,0x11d2,{0xb9,0x94,0x0,0xc0,0x4f,0x8c,0xa8,0x2c}},DBKIND_GUID_PROPID,(LPOLESTR)102};
extern const DBID DBCOLUMN_SS_TDSCOLLATION = {{0x627bd890,0xed54,0x11d2,{0xb9,0x94,0x0,0xc0,0x4f,0x8c,0xa8,0x2c}},DBKIND_GUID_PROPID,(LPOLESTR)103};
#else
extern const DBID DBCOLUMN_SS_COMPFLAGS;
extern const DBID DBCOLUMN_SS_SORTID;
extern const DBID DBCOLUMN_BASETABLEINSTANCE;
extern const DBID DBCOLUMN_SS_TDSCOLLATION;
#endif

#if (OLEDBVER==0x0210)
#define DBPROP_INIT_GENERALTIMEOUT 0x11cL
#endif

#define SSPROP_ENABLEFASTLOAD 2

#define SSPROP_UNICODELCID 2
#define SSPROP_UNICODECOMPARISONSTYLE 3
#define SSPROP_COLUMNLEVELCOLLATION 4
#define SSPROP_CHARACTERSET 5
#define SSPROP_SORTORDER 6
#define SSPROP_CURRENTCOLLATION 7

#define SSPROP_INIT_CURRENTLANGUAGE 4
#define SSPROP_INIT_NETWORKADDRESS 5
#define SSPROP_INIT_NETWORKLIBRARY 6
#define SSPROP_INIT_USEPROCFORPREP 7
#define SSPROP_INIT_AUTOTRANSLATE 8
#define SSPROP_INIT_PACKETSIZE 9
#define SSPROP_INIT_APPNAME 10
#define SSPROP_INIT_WSID 11
#define SSPROP_INIT_FILENAME 12
#define SSPROP_INIT_ENCRYPT 13
#define SSPROP_AUTH_REPL_SERVER_NAME 14
#define SSPROP_INIT_TAGCOLUMNCOLLATION 15

#define SSPROPVAL_USEPROCFORPREP_OFF 0
#define SSPROPVAL_USEPROCFORPREP_ON 1
#define SSPROPVAL_USEPROCFORPREP_ON_DROP 2

#define SSPROP_QUOTEDCATALOGNAMES 2
#define SSPROP_ALLOWNATIVEVARIANT 3
#define SSPROP_SQLXMLXPROGID 4

#define SSPROP_MAXBLOBLENGTH 8
#define SSPROP_FASTLOADOPTIONS 9
#define SSPROP_FASTLOADKEEPNULLS 10
#define SSPROP_FASTLOADKEEPIDENTITY 11
#define SSPROP_CURSORAUTOFETCH 12
#define SSPROP_DEFERPREPARE 13
#define SSPROP_IRowsetFastLoad 14

#define SSPROP_COL_COLLATIONNAME 14

#define SSPROP_STREAM_MAPPINGSCHEMA 15
#define SSPROP_STREAM_XSL 16
#define SSPROP_STREAM_BASEPATH 17
#define SSPROP_STREAM_COMMANDTYPE 18
#define SSPROP_STREAM_XMLROOT 19
#define SSPROP_STREAM_FLAGS 20
#define SSPROP_STREAM_CONTENTTYPE 23

#define STREAM_FLAGS_DISALLOW_URL 0x00000001
#define STREAM_FLAGS_DISALLOW_ABSOLUTE_PATH 0x00000002
#define STREAM_FLAGS_DISALLOW_QUERY 0x00000004
#define STREAM_FLAGS_DONTCACHEMAPPINGSCHEMA 0x00000008
#define STREAM_FLAGS_DONTCACHETEMPLATE 0x00000010
#define STREAM_FLAGS_DONTCACHEXSL 0x00000020
#define STREAM_FLAGS_DISALLOW_UPDATEGRAMS 0x00000040
#define STREAM_FLAGS_RESERVED 0xffff0000

#define SSPROPVAL_COMMANDTYPE_REGULAR 21
#define SSPROPVAL_COMMANDTYPE_BULKLOAD 22

#define V_SS_VT(X) ((X)->vt)
#define V_SS_UNION(X,Y) ((X)->Y)

#define V_SS_UI1(X) V_SS_UNION(X,bTinyIntVal)
#define V_SS_I2(X) V_SS_UNION(X,sShortIntVal)
#define V_SS_I4(X) V_SS_UNION(X,lIntVal)
#define V_SS_I8(X) V_SS_UNION(X,llBigIntVal)

#define V_SS_R4(X) V_SS_UNION(X,fltRealVal)
#define V_SS_R8(X) V_SS_UNION(X,dblFloatVal)
#define V_SS_UI4(X) V_SS_UNION(X,ulVal)

#define V_SS_MONEY(X) V_SS_UNION(X,cyMoneyVal)
#define V_SS_SMALLMONEY(X) V_SS_UNION(X,cyMoneyVal)

#define V_SS_WSTRING(X) V_SS_UNION(X,NCharVal)
#define V_SS_WVARSTRING(X) V_SS_UNION(X,NCharVal)

#define V_SS_STRING(X) V_SS_UNION(X,CharVal)
#define V_SS_VARSTRING(X) V_SS_UNION(X,CharVal)

#define V_SS_BIT(X) V_SS_UNION(X,fBitVal)
#define V_SS_GUID(X) V_SS_UNION(X,rgbGuidVal)

#define V_SS_NUMERIC(X) V_SS_UNION(X,numNumericVal)
#define V_SS_DECIMAL(X) V_SS_UNION(X,numNumericVal)

#define V_SS_BINARY(X) V_SS_UNION(X,BinaryVal)
#define V_SS_VARBINARY(X) V_SS_UNION(X,BinaryVal)

#define V_SS_DATETIME(X) V_SS_UNION(X,tsDateTimeVal)
#define V_SS_SMALLDATETIME(X) V_SS_UNION(X,tsDateTimeVal)

#define V_SS_UNKNOWN(X) V_SS_UNION(X,UnknownType)

#define V_SS_IMAGE(X) V_SS_UNION(X,ImageVal)
#define V_SS_TEXT(X) V_SS_UNION(X,TextVal)
#define V_SS_NTEXT(X) V_SS_UNION(X,NTextVal)

#define DBTYPE_SQLVARIANT 144

enum SQLVARENUM {
  VT_SS_EMPTY = DBTYPE_EMPTY,VT_SS_NULL = DBTYPE_NULL,VT_SS_UI1 = DBTYPE_UI1,VT_SS_I2 = DBTYPE_I2,VT_SS_I4 = DBTYPE_I4,VT_SS_I8 = DBTYPE_I8,
  VT_SS_R4 = DBTYPE_R4,VT_SS_R8 = DBTYPE_R8,VT_SS_MONEY = DBTYPE_CY,VT_SS_SMALLMONEY = 200,VT_SS_WSTRING = 201,VT_SS_WVARSTRING = 202,
  VT_SS_STRING =203,VT_SS_VARSTRING =204,VT_SS_BIT =DBTYPE_BOOL,VT_SS_GUID =DBTYPE_GUID,VT_SS_NUMERIC =DBTYPE_NUMERIC,VT_SS_DECIMAL =205,
  VT_SS_DATETIME = DBTYPE_DBTIMESTAMP,VT_SS_SMALLDATETIME =206,VT_SS_BINARY =207,VT_SS_VARBINARY =208,VT_SS_UNKNOWN = 209
};

typedef unsigned short SSVARTYPE;

struct SSVARIANT {
  SSVARTYPE vt;
  DWORD dwReserved1;
  DWORD dwReserved2;
  union {
    BYTE bTinyIntVal;
    SHORT sShortIntVal;
    LONG lIntVal;
    LONGLONG llBigIntVal;
    FLOAT fltRealVal;
    DOUBLE dblFloatVal;
    CY cyMoneyVal;
    struct _NCharVal {
      SHORT sActualLength;
      SHORT sMaxLength;
      WCHAR *pwchNCharVal;
      BYTE rgbReserved[5];
      DWORD dwReserved;
      WCHAR *pwchReserved;
    } NCharVal;
    struct _CharVal {
      SHORT sActualLength;
      SHORT sMaxLength;
      CHAR *pchCharVal;
      BYTE rgbReserved[5];
      DWORD dwReserved;
      WCHAR *pwchReserved;
    } CharVal;
    VARIANT_BOOL fBitVal;
    BYTE rgbGuidVal [16];
    DB_NUMERIC numNumericVal;
    struct _BinaryVal {
      SHORT sActualLength;
      SHORT sMaxLength;
      BYTE *prgbBinaryVal;
      DWORD dwReserved;
    } BinaryVal;
    DBTIMESTAMP tsDateTimeVal;
    struct _UnknownType {
      DWORD dwActualLength;
      BYTE rgMetadata [16];
      BYTE *pUnknownData;
    } UnknownType;
    struct _BLOBType {
      DBOBJECT dbobj;
      IUnknown *pUnk;
    } BLOBType;
  };
};

#if defined(__cplusplus) && !defined(CINTERFACE)
struct IUMSInitialize : public IUnknown {
public:
  virtual HRESULT WINAPI Initialize (VOID *pUMS) = 0;
};

struct IUMS {
public:
  virtual VOID WINAPI SqlUmsSuspend (ULONG ticks) = 0;
  virtual VOID WINAPI SqlUmsYield (ULONG ticks) = 0;
  virtual VOID WINAPI SqlUmsSwitchPremptive () = 0;
  virtual VOID WINAPI SqlUmsSwitchNonPremptive() = 0;
  virtual WINBOOL WINAPI SqlUmsFIsPremptive() = 0;
};
#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 __sqloledb_h__
#define __sqloledb_h__

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __ISQLServerErrorInfo_FWD_DEFINED__
#define __ISQLServerErrorInfo_FWD_DEFINED__
  typedef struct ISQLServerErrorInfo ISQLServerErrorInfo;
#endif

#ifndef __IRowsetFastLoad_FWD_DEFINED__
#define __IRowsetFastLoad_FWD_DEFINED__
  typedef struct IRowsetFastLoad IRowsetFastLoad;
#endif

#ifndef __ISchemaLock_FWD_DEFINED__
#define __ISchemaLock_FWD_DEFINED__
  typedef struct ISchemaLock ISchemaLock;
#endif

#include "unknwn.h"

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

  typedef struct tagSSErrorInfo {
    LPOLESTR pwszMessage;
    LPOLESTR pwszServer;
    LPOLESTR pwszProcedure;
    LONG lNative;
    BYTE bState;
    BYTE bClass;
    WORD wLineNumber;
  } SSERRORINFO;

  extern RPC_IF_HANDLE __MIDL_itf_sqloledb_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_sqloledb_0000_v0_0_s_ifspec;
#ifndef __ISQLServerErrorInfo_INTERFACE_DEFINED__
#define __ISQLServerErrorInfo_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISQLServerErrorInfo;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISQLServerErrorInfo : public IUnknown {
  public:
    virtual HRESULT WINAPI GetErrorInfo(SSERRORINFO **ppErrorInfo,OLECHAR **ppStringsBuffer) = 0;
  };
#else
  typedef struct ISQLServerErrorInfoVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISQLServerErrorInfo *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISQLServerErrorInfo *This);
      ULONG (WINAPI *Release)(ISQLServerErrorInfo *This);
      HRESULT (WINAPI *GetErrorInfo)(ISQLServerErrorInfo *This,SSERRORINFO **ppErrorInfo,OLECHAR **ppStringsBuffer);
    END_INTERFACE
  } ISQLServerErrorInfoVtbl;
  struct ISQLServerErrorInfo {
    CONST_VTBL struct ISQLServerErrorInfoVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISQLServerErrorInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISQLServerErrorInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISQLServerErrorInfo_Release(This) (This)->lpVtbl->Release(This)
#define ISQLServerErrorInfo_GetErrorInfo(This,ppErrorInfo,ppStringsBuffer) (This)->lpVtbl->GetErrorInfo(This,ppErrorInfo,ppStringsBuffer)
#endif
#endif
  HRESULT WINAPI ISQLServerErrorInfo_GetErrorInfo_Proxy(ISQLServerErrorInfo *This,SSERRORINFO **ppErrorInfo,OLECHAR **ppStringsBuffer);
  void __RPC_STUB ISQLServerErrorInfo_GetErrorInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifdef _WIN64
  typedef ULONG_PTR HACCESSOR;
#else
  typedef ULONG HACCESSOR;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_sqloledb_0006_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_sqloledb_0006_v0_0_s_ifspec;
#ifndef __IRowsetFastLoad_INTERFACE_DEFINED__
#define __IRowsetFastLoad_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IRowsetFastLoad;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IRowsetFastLoad : public IUnknown {
  public:
    virtual HRESULT WINAPI InsertRow(HACCESSOR hAccessor,void *pData) = 0;
    virtual HRESULT WINAPI Commit(WINBOOL fDone) = 0;
  };
#else
  typedef struct IRowsetFastLoadVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IRowsetFastLoad *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IRowsetFastLoad *This);
      ULONG (WINAPI *Release)(IRowsetFastLoad *This);
      HRESULT (WINAPI *InsertRow)(IRowsetFastLoad *This,HACCESSOR hAccessor,void *pData);
      HRESULT (WINAPI *Commit)(IRowsetFastLoad *This,WINBOOL fDone);
    END_INTERFACE
  } IRowsetFastLoadVtbl;
  struct IRowsetFastLoad {
    CONST_VTBL struct IRowsetFastLoadVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define IRowsetFastLoad_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IRowsetFastLoad_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IRowsetFastLoad_Release(This) (This)->lpVtbl->Release(This)
#define IRowsetFastLoad_InsertRow(This,hAccessor,pData) (This)->lpVtbl->InsertRow(This,hAccessor,pData)
#define IRowsetFastLoad_Commit(This,fDone) (This)->lpVtbl->Commit(This,fDone)
#endif
#endif
  HRESULT WINAPI IRowsetFastLoad_InsertRow_Proxy(IRowsetFastLoad *This,HACCESSOR hAccessor,void *pData);
  void __RPC_STUB IRowsetFastLoad_InsertRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IRowsetFastLoad_Commit_Proxy(IRowsetFastLoad *This,WINBOOL fDone);
  void __RPC_STUB IRowsetFastLoad_Commit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  typedef DWORD LOCKMODE;

  enum LOCKMODEENUM {
    LOCKMODE_INVALID = 0,LOCKMODE_EXCLUSIVE = LOCKMODE_INVALID + 1,LOCKMODE_SHARED = LOCKMODE_EXCLUSIVE + 1
  };

  extern RPC_IF_HANDLE __MIDL_itf_sqloledb_0007_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_sqloledb_0007_v0_0_s_ifspec;
#ifndef __ISchemaLock_INTERFACE_DEFINED__
#define __ISchemaLock_INTERFACE_DEFINED__
  EXTERN_C const IID IID_ISchemaLock;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct ISchemaLock : public IUnknown {
  public:
    virtual HRESULT WINAPI GetSchemaLock(DBID *pTableID,LOCKMODE lmMode,HANDLE *phLockHandle,ULONGLONG *pTableVersion) = 0;
    virtual HRESULT WINAPI ReleaseSchemaLock(HANDLE hLockHandle) = 0;
  };
#else
  typedef struct ISchemaLockVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(ISchemaLock *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(ISchemaLock *This);
      ULONG (WINAPI *Release)(ISchemaLock *This);
      HRESULT (WINAPI *GetSchemaLock)(ISchemaLock *This,DBID *pTableID,LOCKMODE lmMode,HANDLE *phLockHandle,ULONGLONG *pTableVersion);
      HRESULT (WINAPI *ReleaseSchemaLock)(ISchemaLock *This,HANDLE hLockHandle);
    END_INTERFACE
  } ISchemaLockVtbl;
  struct ISchemaLock {
    CONST_VTBL struct ISchemaLockVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#define ISchemaLock_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaLock_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaLock_Release(This) (This)->lpVtbl->Release(This)
#define ISchemaLock_GetSchemaLock(This,pTableID,lmMode,phLockHandle,pTableVersion) (This)->lpVtbl->GetSchemaLock(This,pTableID,lmMode,phLockHandle,pTableVersion)
#define ISchemaLock_ReleaseSchemaLock(This,hLockHandle) (This)->lpVtbl->ReleaseSchemaLock(This,hLockHandle)
#endif
#endif
  HRESULT WINAPI ISchemaLock_GetSchemaLock_Proxy(ISchemaLock *This,DBID *pTableID,LOCKMODE lmMode,HANDLE *phLockHandle,ULONGLONG *pTableVersion);
  void __RPC_STUB ISchemaLock_GetSchemaLock_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI ISchemaLock_ReleaseSchemaLock_Proxy(ISchemaLock *This,HANDLE hLockHandle);
  void __RPC_STUB ISchemaLock_ReleaseSchemaLock_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifdef __cplusplus
}
#endif
#endif
#endif
