///////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//  SQLOBJ.H
//
//	Defines the SQL Wrapper object
//
//	Copyright (c) Microsoft Corporation	1998
//
//  protect us from the DLL's not being present and to allow us to run.
//  got to be a simplier solution.
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef _SQLOBJ_HEADER_
#define _SQLOBJ_HEADER_

#include <odbcinst.h>
#include <sqlext.h>

#ifdef __cplusplus
extern "C" {
#endif


typedef BOOL       (INSTAPI * SQ_CONFIGDATASOURCE) (HWND,WORD,LPCTSTR, LPCTSTR);
typedef SQLRETURN  (SQL_API * SQ_SETPOS)           (SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLUSMALLINT);
typedef SQLRETURN  (SQL_API * SQ_EXTENDEDFETCH)    (SQLHSTMT,SQLUSMALLINT,SQLINTEGER,SQLUINTEGER *,SQLUSMALLINT *);
typedef SQLRETURN  (SQL_API * SQ_FREESTMT)         (SQLHSTMT,SQLUSMALLINT);
typedef SQLRETURN  (SQL_API * SQ_EXECDIRECT)       (SQLHSTMT,SQLCHAR *,SQLINTEGER);
typedef SQLRETURN  (SQL_API * SQ_SETSTMTOPTION)    (SQLHSTMT,SQLUSMALLINT,SQLUINTEGER);
typedef SQLRETURN  (SQL_API * SQ_BINDCOL)          (SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER *);
typedef SQLRETURN  (SQL_API * SQ_ERROR)            (SQLHENV,SQLHDBC,SQLHSTMT,SQLCHAR *,SQLINTEGER *,SQLCHAR *,SQLSMALLINT,SQLSMALLINT *);
typedef SQLRETURN  (SQL_API * SQ_ALLOCSTMT)        (SQLHDBC,SQLHSTMT *);
typedef SQLRETURN  (SQL_API * SQ_FREECONNECT)      (SQLHDBC);
typedef SQLRETURN  (SQL_API * SQ_FREEENV)          (SQLHENV);
typedef SQLRETURN  (SQL_API * SQ_DISCONNECT)       (SQLHDBC);
typedef SQLRETURN  (SQL_API * SQ_CONNECT)          (SQLHDBC,SQLCHAR *,SQLSMALLINT,SQLCHAR *,SQLSMALLINT,SQLCHAR *,SQLSMALLINT);
typedef SQLRETURN  (SQL_API * SQ_ALLOCCONNECT)     (SQLHENV,SQLHDBC *);
typedef SQLRETURN  (SQL_API * SQ_ALLOCENV)         (SQLHENV *);
typedef SQLRETURN  (SQL_API * SQ_SETCONNECTOPTION) (SQLHDBC,SQLUSMALLINT,SQLUINTEGER);
typedef SQLRETURN  (SQL_API * SQ_TRANSACT)         (SQLHENV,SQLHDBC,SQLUSMALLINT);
typedef SQLRETURN  (SQL_API * SQ_FETCH)            (SQLHSTMT);
typedef SQLRETURN  (SQL_API * SQ_STATISTICS)       (SQLHSTMT,SQLCHAR *,SQLSMALLINT,SQLCHAR *,SQLSMALLINT,SQLCHAR *,SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT);
typedef SQLRETURN  (SQL_API * SQ_DESCRIBECOL)      (SQLHSTMT,SQLSMALLINT,SQLCHAR *,SQLSMALLINT,SQLSMALLINT *,SQLSMALLINT *,SQLUINTEGER *,SQLSMALLINT *,SQLSMALLINT *);

class SQL
{
    public:

        SQL(); 
        ~SQL();
        
        BOOL               Initialize(void);

        BOOL       INSTAPI ConfigDataSource(HWND hwndParent, WORD fRequest,LPCTSTR lpszDriver, LPCTSTR lpszAttributes);
        SQLRETURN  SQL_API SetPos( SQLHSTMT hstmt, SQLUSMALLINT irow, SQLUSMALLINT fOption, SQLUSMALLINT fLock);
        SQLRETURN  SQL_API ExtendedFetch( SQLHSTMT hstmt, SQLUSMALLINT fFetchType, SQLINTEGER irow, SQLUINTEGER *pcrow, SQLUSMALLINT *rgfRowStatus);
        SQLRETURN  SQL_API FreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option);
        SQLRETURN  SQL_API ExecDirect(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength);
        SQLRETURN  SQL_API SetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLUINTEGER Value);
        SQLRETURN  SQL_API BindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLINTEGER BufferLength, SQLINTEGER *StrLen_or_Ind);
        SQLRETURN  SQL_API Error(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength);
        SQLRETURN  SQL_API AllocStmt(SQLHDBC ConnectionHandle, SQLHSTMT *StatementHandle);
        SQLRETURN  SQL_API FreeConnect(SQLHDBC ConnectionHandle);
        SQLRETURN  SQL_API FreeEnv(SQLHENV EnvironmentHandle);
        SQLRETURN  SQL_API Disconnect(SQLHDBC ConnectionHandle);
        SQLRETURN  SQL_API Connect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, SQLSMALLINT NameLength1, SQLCHAR *UserName, SQLSMALLINT NameLength2, SQLCHAR *Authentication, SQLSMALLINT NameLength3);
        SQLRETURN  SQL_API AllocConnect(SQLHENV EnvironmentHandle, SQLHDBC *ConnectionHandle);
        SQLRETURN  SQL_API AllocEnv(SQLHENV *EnvironmentHandle);
        SQLRETURN  SQL_API SetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLUINTEGER Value);
        SQLRETURN  SQL_API Transact(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLUSMALLINT CompletionType);
        SQLRETURN  SQL_API Fetch(SQLHSTMT StatementHandle);
        SQLRETURN  SQL_API Statistics(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Unique, SQLUSMALLINT Reserved);
        SQLRETURN  SQL_API DescribeCol(SQLHSTMT StatementHandle, SQLSMALLINT ColumnNumber, SQLCHAR * ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT * NameLengthPtr, SQLSMALLINT * DataTypePtr, SQLUINTEGER * ColumnSizePtr, SQLSMALLINT * DecimalDigitsPtr, SQLSMALLINT * NullablePtr);

    private:
        HMODULE                 m_hODBC;
        HMODULE                 m_hODBCCP;

        SQ_CONFIGDATASOURCE    m_pfnConfigDataSource;
        SQ_SETPOS              m_pfnSetPos;
        SQ_EXTENDEDFETCH       m_pfnExtendedFetch;
        SQ_FREESTMT            m_pfnFreeStmt;
        SQ_EXECDIRECT          m_pfnExecDirect;
        SQ_SETSTMTOPTION       m_pfnSetStmtOption;
        SQ_BINDCOL             m_pfnBindCol;
        SQ_ERROR               m_pfnError;
        SQ_ALLOCSTMT           m_pfnAllocStmt;
        SQ_FREECONNECT         m_pfnFreeConnect;
        SQ_FREEENV             m_pfnFreeEnv;
        SQ_DISCONNECT          m_pfnDisconnect;
        SQ_CONNECT             m_pfnConnect;
        SQ_ALLOCCONNECT        m_pfnAllocConnect;
        SQ_ALLOCENV            m_pfnAllocEnv;
        SQ_SETCONNECTOPTION    m_pfnSetConnectOption;
        SQ_TRANSACT            m_pfnTransact;
        SQ_FETCH               m_pfnFetch;
        SQ_STATISTICS          m_pfnStatistics;
        SQ_DESCRIBECOL         m_pfnDescribeCol;
};

#ifdef __cplusplus
};
#endif

#endif  //_SQLOBJ_HEADER_