#include "windows.h"
#include "sql.h"

#ifdef __cplusplus
extern "C" {                               // Assume C declarations for C++
#endif	// __cplusplus

#ifndef ODBCVER
#define ODBCVER 0x0351					   // Assume ODBC 3.51
#endif

#ifndef WINVER
#define  WINVER  0x0400                     // Assume Windows 4.0
#endif

// Constants ---------------------------------------------------------------
// SQLConfigDataSource request flags
#define  ODBC_ADD_DSN     1               // Add data source
#define  ODBC_CONFIG_DSN  2               // Configure (edit) data source
#define  ODBC_REMOVE_DSN  3               // Remove data source

#if (ODBCVER >= 0x0250)
#define  ODBC_ADD_SYS_DSN 4				  // add a system DSN
#define  ODBC_CONFIG_SYS_DSN	5		  // Configure a system DSN
#define  ODBC_REMOVE_SYS_DSN	6		  // remove a system DSN
#if (ODBCVER >= 0x0300)
#define	 ODBC_REMOVE_DEFAULT_DSN	7		// remove the default DSN
#endif  /* ODBCVER >= 0x0300 */

// install request flags
#define	 ODBC_INSTALL_INQUIRY	1		
#define  ODBC_INSTALL_COMPLETE	2

// config driver flags
#define  ODBC_INSTALL_DRIVER	1
#define  ODBC_REMOVE_DRIVER		2
#define  ODBC_CONFIG_DRIVER		3
#define  ODBC_CONFIG_DRIVER_MAX 100
#endif

// SQLGetConfigMode and SQLSetConfigMode flags
#if (ODBCVER >= 0x0300)
#define ODBC_BOTH_DSN		0
#define ODBC_USER_DSN		1
#define ODBC_SYSTEM_DSN		2
#endif  /* ODBCVER >= 0x0300 */

// SQLInstallerError code
#if (ODBCVER >= 0x0300)
#define ODBC_ERROR_GENERAL_ERR                   1
#define ODBC_ERROR_INVALID_BUFF_LEN              2
#define ODBC_ERROR_INVALID_HWND                  3
#define ODBC_ERROR_INVALID_STR                   4
#define ODBC_ERROR_INVALID_REQUEST_TYPE          5
#define ODBC_ERROR_COMPONENT_NOT_FOUND           6
#define ODBC_ERROR_INVALID_NAME                  7
#define ODBC_ERROR_INVALID_KEYWORD_VALUE         8
#define ODBC_ERROR_INVALID_DSN                   9
#define ODBC_ERROR_INVALID_INF                  10
#define ODBC_ERROR_REQUEST_FAILED               11
#define ODBC_ERROR_INVALID_PATH                 12
#define ODBC_ERROR_LOAD_LIB_FAILED              13
#define ODBC_ERROR_INVALID_PARAM_SEQUENCE       14
#define ODBC_ERROR_INVALID_LOG_FILE             15
#define ODBC_ERROR_USER_CANCELED                16
#define ODBC_ERROR_USAGE_UPDATE_FAILED          17
#define ODBC_ERROR_CREATE_DSN_FAILED            18
#define ODBC_ERROR_WRITING_SYSINFO_FAILED       19
#define ODBC_ERROR_REMOVE_DSN_FAILED            20
#define ODBC_ERROR_OUT_OF_MEM                   21
#define ODBC_ERROR_OUTPUT_STRING_TRUNCATED      22
#endif /* ODBCVER >= 0x0300 */

#ifndef EXPORT
#define EXPORT 
#endif

#ifndef RC_INVOKED
// Prototypes --------------------------------------------------------------
#define INSTAPI __stdcall

// High level APIs

BOOL
INSTAPI
SQLInstallODBC (
    HWND hwndParent,
    LPCSTR lpszInfFile,
	LPCSTR lpszSrcPath,
	LPCSTR lpszDrivers
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLManageDataSources (
    HWND hwndParent
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLCreateDataSource (
    HWND hwndParent,
    LPCSTR lpszDSN
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLGetTranslator (
    HWND hwnd,
	LPSTR lpszName,
	WORD cbNameMax,
	WORD *pcbNameOut,
	LPSTR lpszPath,
	WORD cbPathMax,
	WORD *pcbPathOut,
	DWORD *pvOption
    )

{
    return FALSE;
}

// Low level APIs

BOOL
INSTAPI
SQLInstallDriver (
    LPCSTR lpszInfFile,
    LPCSTR lpszDriver,
    LPSTR lpszPath,
    WORD cbPathMax,
    WORD *pcbPathOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallDriverManager (
    LPSTR lpszPath,
    WORD cbPathMax,
    WORD *pcbPathOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLGetInstalledDrivers (
    LPSTR lpszBuf,
    WORD cbBufMax,
    WORD *pcbBufOut
    )

{

    return FALSE;
}

BOOL
INSTAPI
SQLGetAvailableDrivers (
    LPCSTR lpszInfFile,
    LPSTR lpszBuf,
    WORD cbBufMax,
    WORD *pcbBufOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLConfigDataSource (
    HWND hwndParent,
    WORD fRequest,
    LPCSTR lpszDriver,
    LPCSTR lpszAttributes
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLRemoveDefaultDataSource (
    void
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLWriteDSNToIni (
    LPCSTR lpszDSN,
    LPCSTR lpszDriver
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLRemoveDSNFromIni (
    LPCSTR lpszDSN
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLValidDSN (
    LPCSTR lpszDSN
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLWritePrivateProfileString (
    LPCSTR lpszSection,
	LPCSTR lpszEntry,
	LPCSTR lpszString,
	LPCSTR lpszFilename
    )

{
    return FALSE;
}

int
INSTAPI
SQLGetPrivateProfileString (
    LPCSTR lpszSection,
	LPCSTR lpszEntry,
	LPCSTR lpszDefault,
	LPSTR lpszRetBuffer,
	int cbRetBuffer,
	LPCSTR lpszFilename
    )

{

    return 0;
}

#if (ODBCVER >= 0x0250)

BOOL
INSTAPI
SQLRemoveDriverManager (
    LPDWORD lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallTranslator (
    LPCSTR lpszInfFile,
	LPCSTR lpszTranslator,
	LPCSTR lpszPathIn,
	LPSTR lpszPathOut,
	WORD cbPathOutMax,
	WORD *pcbPathOut,
	WORD fRequest,
	LPDWORD	lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLRemoveTranslator (
    LPCSTR lpszTranslator, 
	LPDWORD lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLRemoveDriver (
    LPCSTR lpszDriver, 
	BOOL fRemoveDSN, 
	LPDWORD lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLConfigDriver (
    HWND hwndParent, 
	WORD fRequest, 
	LPCSTR lpszDriver,
	LPCSTR lpszArgs,
	LPSTR lpszMsg,
	WORD cbMsgMax,
    WORD *pcbMsgOut
    )

{
    return FALSE;
}

#endif

#if (ODBCVER >=  0x0300)

SQLRETURN
INSTAPI
SQLInstallerError (
    WORD iError,
	DWORD *pfErrorCode,
	LPSTR lpszErrorMsg,
	WORD cbErrorMsgMax,
	WORD *pcbErrorMsg
    )

{
    return 0;
}

SQLRETURN
INSTAPI
SQLPostInstallerError (
    DWORD dwErrorCode,
    LPCSTR lpszErrMsg
    )

{
    return 0;
}

BOOL
INSTAPI
SQLWriteFileDSN (
    LPCSTR lpszFileName,
    LPCSTR lpszAppName,
    LPCSTR lpszKeyName,
    LPCSTR lpszString
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLReadFileDSN (
    LPCSTR lpszFileName,
    LPCSTR lpszAppName,
    LPCSTR lpszKeyName,
    LPSTR lpszString,
    WORD cbString,
    WORD *pcbString
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallDriverEx (
    LPCSTR lpszDriver,
  	LPCSTR lpszPathIn,
  	LPSTR lpszPathOut,
  	WORD cbPathOutMax,
  	WORD *pcbPathOut,
  	WORD fRequest,
  	LPDWORD	lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallTranslatorEx (
    LPCSTR lpszTranslator,
    LPCSTR lpszPathIn,
    LPSTR lpszPathOut,
    WORD cbPathOutMax,
    WORD *pcbPathOut,
    WORD fRequest,
    LPDWORD	lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLGetConfigMode (
    UWORD *pwConfigMode
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLSetConfigMode (
    UWORD wConfigMode
    )

{
    return FALSE;
}

#endif /* ODBCVER >= 0x0300 */

//	Driver specific Setup APIs called by installer

BOOL
INSTAPI
ConfigDSN (
    HWND hwndParent,
   	WORD fRequest,
   	LPCSTR lpszDriver,
   	LPCSTR lpszAttributes
    )

{
    return FALSE;
}

BOOL
INSTAPI
ConfigTranslator (
	HWND hwndParent,
	DWORD *pvOption
    )

{
    return FALSE;
}

#if (ODBCVER >= 0x0250)

BOOL
INSTAPI
ConfigDriver (
    HWND hwndParent, 
    WORD fRequest, 
    LPCSTR lpszDriver,
    LPCSTR lpszArgs, 
    LPSTR lpszMsg, 
    WORD cbMsgMax, 
    WORD *pcbMsgOut
    )

{
    return FALSE;
}

#endif


// UNICODE APIs

// High level APIs

BOOL
INSTAPI
SQLInstallODBCW (
    HWND hwndParent,
    LPCWSTR lpszInfFile,
    LPCWSTR lpszSrcPath,
    LPCWSTR lpszDrivers
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLCreateDataSourceW (
    HWND hwndParent,
    LPCWSTR lpszDSN
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLGetTranslatorW (
    HWND hwnd,
    LPWSTR lpszName,
    WORD cbNameMax,
    WORD *pcbNameOut,
    LPWSTR lpszPath,
    WORD cbPathMax,
    WORD *pcbPathOut,
    DWORD *pvOption
    )

{
    return FALSE;
}

// Low level APIs
// NOTE: The high-level APIs should always be used. These APIs
//       have been left for compatibility.

BOOL
INSTAPI
SQLInstallDriverW (
    LPCWSTR lpszInfFile,
    LPCWSTR lpszDriver,
    LPWSTR lpszPath,
    WORD cbPathMax,
    WORD *pcbPathOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallDriverManagerW (
    LPWSTR lpszPath,
    WORD cbPathMax,
    WORD *pcbPathOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLGetInstalledDriversW (
    LPWSTR lpszBuf,
    WORD cbBufMax,
    WORD *pcbBufOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLGetAvailableDriversW (
    LPCWSTR lpszInfFile,
    LPWSTR lpszBuf,
    WORD cbBufMax,
    WORD *pcbBufOut
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLConfigDataSourceW (
    HWND hwndParent,
    WORD fRequest,
    LPCWSTR lpszDriver,
    LPCWSTR lpszAttributes
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLWriteDSNToIniW (
    LPCWSTR lpszDSN,
    LPCWSTR lpszDriver
    )

{

    return FALSE;
}

BOOL
INSTAPI
SQLRemoveDSNFromIniW (
    LPCWSTR lpszDSN
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLValidDSNW (
    LPCWSTR lpszDSN
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLWritePrivateProfileStringW (
    LPCWSTR lpszSection,
	LPCWSTR lpszEntry,
	LPCWSTR lpszString,
	LPCWSTR lpszFilename
    )

{
    return FALSE;
}

int
INSTAPI
SQLGetPrivateProfileStringW (
    LPCWSTR lpszSection,
	LPCWSTR lpszEntry,
	LPCWSTR lpszDefault,
	LPWSTR lpszRetBuffer,
	int cbRetBuffer,
	LPCWSTR lpszFilename
    )

{
    return 0;
}

#if (ODBCVER >= 0x0250)

BOOL
INSTAPI
SQLInstallTranslatorW (
    LPCWSTR lpszInfFile,
	LPCWSTR lpszTranslator,
	LPCWSTR lpszPathIn,
	LPWSTR lpszPathOut,
	WORD cbPathOutMax,
	WORD *pcbPathOut,
	WORD fRequest,
	LPDWORD	lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLRemoveTranslatorW (
    LPCWSTR lpszTranslator, 
	LPDWORD lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLRemoveDriverW (
    LPCWSTR lpszDriver, 
	BOOL fRemoveDSN, 
	LPDWORD lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLConfigDriverW (
    HWND hwndParent, 
	WORD fRequest, 
	LPCWSTR lpszDriver,
	LPCWSTR lpszArgs,
	LPWSTR lpszMsg,
	WORD cbMsgMax,
    WORD *pcbMsgOut
    )

{
    return FALSE;
}

#endif

#if (ODBCVER >= 0x0300)

SQLRETURN
INSTAPI
SQLInstallerErrorW (
    WORD iError,
	DWORD *pfErrorCode,
	LPWSTR lpszErrorMsg,
	WORD cbErrorMsgMax,
	WORD *pcbErrorMsg
    )

{
    return 0;
}

SQLRETURN
INSTAPI
SQLPostInstallerErrorW (
    DWORD dwErrorCode, 
	LPCWSTR lpszErrorMsg
    )

{
    return 0;
}

BOOL
INSTAPI
SQLWriteFileDSNW (
    LPCWSTR lpszFileName,
    LPCWSTR lpszAppName,
    LPCWSTR lpszKeyName,
    LPCWSTR lpszString
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLReadFileDSNW (
    LPCWSTR lpszFileName,
    LPCWSTR lpszAppName,
    LPCWSTR lpszKeyName,
    LPWSTR lpszString,
    WORD cbString,
    WORD *pcbString
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallDriverExW (
    LPCWSTR lpszDriver,
	LPCWSTR lpszPathIn,
	LPWSTR lpszPathOut,
	WORD cbPathOutMax,
	WORD *pcbPathOut,
	WORD fRequest,
	LPDWORD	lpdwUsageCount
    )

{
    return FALSE;
}

BOOL
INSTAPI
SQLInstallTranslatorExW (
    LPCWSTR lpszTranslator,
	LPCWSTR lpszPathIn,
	LPWSTR lpszPathOut,
	WORD cbPathOutMax,
	WORD *pcbPathOut,
	WORD fRequest,
	LPDWORD	lpdwUsageCount
    )

{
    return FALSE;
}

#endif  /* ODBCVER >= 0x0300 */

//	Driver specific Setup APIs called by installer

BOOL
INSTAPI
ConfigDSNW (
    HWND hwndParent,
	WORD fRequest,
	LPCWSTR	lpszDriver,
	LPCWSTR	lpszAttributes
    )

{
    return FALSE;
}


#if (ODBCVER >= 0x0250)

BOOL
INSTAPI
ConfigDriverW (
    HWND hwndParent, 
	WORD fRequest, 
    LPCWSTR lpszDriver,
	LPCWSTR lpszArgs, 
    LPWSTR lpszMsg, 
    WORD cbMsgMax, 
    WORD *pcbMsgOut
    )

{
    return FALSE;
}

#endif

#ifndef	SQL_NOUNICODEMAP	// define this to disable the mapping
#ifdef 	UNICODE


#define  SQLInstallODBC 				SQLInstallODBCW          
#define  SQLCreateDataSource 			SQLCreateDataSourceW 
#define  SQLGetTranslator 				SQLGetTranslatorW     
#define  SQLInstallDriver				SQLInstallDriverW      
#define  SQLInstallDriverManager		SQLInstallDriverManagerW
#define  SQLGetInstalledDrivers			SQLGetInstalledDriversW
#define  SQLGetAvailableDrivers			SQLGetAvailableDriversW 
#define  SQLConfigDataSource			SQLConfigDataSourceW
#define  SQLWriteDSNToIni				SQLWriteDSNToIniW    
#define  SQLRemoveDSNFromIni			SQLRemoveDSNFromIniW  
#define  SQLValidDSN					SQLValidDSNW           
#define  SQLWritePrivateProfileString	SQLWritePrivateProfileStringW
#define	 SQLGetPrivateProfileString		SQLGetPrivateProfileStringW
#define  SQLInstallTranslator			SQLInstallTranslatorW
#define  SQLRemoveTranslator			SQLRemoveTranslatorW
#define  SQLRemoveDriver				SQLRemoveDriverW
#define  SQLConfigDriver				SQLConfigDriverW
#define	 SQLInstallerError				SQLInstallerErrorW
#define	 SQLPostInstallerError			SQLPostInstallerErrorW
#define  SQLReadFileDSN                 SQLReadFileDSNW
#define  SQLWriteFileDSN                SQLWriteFileDSNW
#define  SQLInstallDriverEx				SQLInstallDriverExW
#define  SQLInstallTranslatorEx			SQLInstallTranslatorExW

#endif // UNICODE
#endif // SQL_NOUNICODEMAP

#endif // RC_INVOKED

#ifdef __cplusplus
}                                    // End of extern "C" {
#endif	// __cplusplus
