/*
 * This file has been modified from the original isqlext.h to add the
 * missing function prototypes and appropriate #defines. It is designed
 * to be a drop in replacement for isqlext.h from iodbc.
 */

#ifndef _INTRINSIC_SQLEXT_H
#define _INTRINSIC_SQLEXT_H

#include "isql.h"

#define SQL_STILL_EXECUTING				2
#define SQL_NEED_DATA					99

/* extend SQL datatypes */
#define SQL_DATE						9
#define SQL_TIME						10
#define SQL_TIMESTAMP					11
#define SQL_LONGVARCHAR					(-1)
#define SQL_BINARY						(-2)
#define SQL_VARBINARY					(-3)
#define SQL_LONGVARBINARY				(-4)
#define SQL_BIGINT						(-5)
#define SQL_TINYINT						(-6)
#define SQL_BIT							(-7)	/* conflict with SQL3 ??? */
#define SQL_TYPE_DRIVER_START			(-80)

/* C to SQL datatype mapping */
#define SQL_C_DATE						SQL_DATE
#define SQL_C_TIME						SQL_TIME
#define SQL_C_TIMESTAMP					SQL_TIMESTAMP
#define SQL_C_BINARY					SQL_BINARY
#define SQL_C_BIT						SQL_BIT
#define SQL_C_TINYINT					SQL_TINYINT

#define SQL_SIGNED_OFFSET				(-20)
#define SQL_UNSIGNED_OFFSET				(-22)

#define SQL_C_SLONG						(SQL_C_LONG + SQL_SIGNED_OFFSET)
#define SQL_C_SSHORT					(SQL_C_SHORT + SQL_SIGNED_OFFSET)
#define SQL_C_STINYINT					(SQL_TINYINT + SQL_SIGNED_OFFSET)
#define SQL_C_ULONG						(SQL_C_LONG + SQL_UNSIGNED_OFFSET)
#define SQL_C_USHORT					(SQL_C_SHORT + SQL_UNSIGNED_OFFSET)
#define SQL_C_UTINYINT					(SQL_TINYINT + SQL_UNSIGNED_OFFSET)
#define SQL_C_BOOKMARK					SQL_C_ULONG

#if defined(SQL_TYPE_MIN)
#undef	SQL_TYPE_MIN
#define SQL_TYPE_MIN				SQL_BIT
/* Note:If SQL_BIT uses SQL3 value (i.e. 14) then,
 *	SQL_TYPE_MIN need to be defined as SQL_TINYINT
 *	(i.e. -6).
 */
#endif

#define SQL_ALL_TYPES					0

/* SQLDriverConnect flag values */
#define SQL_DRIVER_NOPROMPT				0
#define SQL_DRIVER_COMPLETE				1
#define SQL_DRIVER_PROMPT				2
#define SQL_DRIVER_COMPLETE_REQUIRED	3

/* SQLSetParam extensions */
#define SQL_DEFAULT_PARAM				(-5)
#define SQL_IGNORE						(-6)

/* function number for SQLGetFunctions and _iodbcdm_getproc */
#define SQL_API_SQLALLOCCONNECT			1
#define SQL_API_SQLALLOCENV				2
#define SQL_API_SQLALLOCSTMT			3
#define SQL_API_SQLBINDCOL				4
#define SQL_API_SQLCANCEL				5
#define SQL_API_SQLCOLATTRIBUTES		6
#define SQL_API_SQLCONNECT				7
#define SQL_API_SQLDESCRIBECOL			8
#define SQL_API_SQLDISCONNECT			9
#define SQL_API_SQLERROR				10
#define SQL_API_SQLEXECDIRECT			11
#define SQL_API_SQLEXECUTE				12
#define SQL_API_SQLFETCH				13
#define SQL_API_SQLFREECONNECT			14
#define SQL_API_SQLFREEENV				15
#define SQL_API_SQLFREESTMT				16
#define SQL_API_SQLGETCURSORNAME		17
#define SQL_API_SQLNUMRESULTCOLS		18
#define SQL_API_SQLPREPARE				19
#define SQL_API_SQLROWCOUNT				20
#define SQL_API_SQLSETCURSORNAME		21
#define SQL_API_SQLSETPARAM				22
#define SQL_API_SQLTRANSACT				23

#define SQL_NUM_FUNCTIONS				23

#define SQL_EXT_API_START				40

#define SQL_API_SQLCOLUMNS				40

#define SQL_API_SQLDRIVERCONNECT		41
#define SQL_API_SQLGETCONNECTOPTION		42
#define SQL_API_SQLGETDATA				43
#define SQL_API_SQLGETFUNCTIONS			44
#define SQL_API_SQLGETINFO				45
#define SQL_API_SQLGETSTMTOPTION		46
#define SQL_API_SQLGETTYPEINFO			47
#define SQL_API_SQLPARAMDATA			48
#define SQL_API_SQLPUTDATA				49
#define SQL_API_SQLSETCONNECTOPTION		50
#define SQL_API_SQLSETSTMTOPTION		51
#define SQL_API_SQLSPECIALCOLUMNS		52
#define SQL_API_SQLSTATISTICS			53
#define SQL_API_SQLTABLES				54

#define SQL_API_SQLBROWSECONNECT		55
#define SQL_API_SQLCOLUMNPRIVILEGES		56
#define SQL_API_SQLDATASOURCES			57
#define SQL_API_SQLDESCRIBEPARAM		58
#define SQL_API_SQLEXTENDEDFETCH		59
#define SQL_API_SQLFOREIGNKEYS			60
#define SQL_API_SQLMORERESULTS			61
#define SQL_API_SQLNATIVESQL			62
#define SQL_API_SQLNUMPARAMS			63
#define SQL_API_SQLPARAMOPTIONS			64
#define SQL_API_SQLPRIMARYKEYS			65
#define SQL_API_SQLPROCEDURECOLUMNS		66
#define SQL_API_SQLPROCEDURES			67
#define SQL_API_SQLSETPOS				68
#define SQL_API_SQLSETSCROLLOPTIONS		69
#define SQL_API_SQLTABLEPRIVILEGES		70

#define SQL_API_SQLDRIVERS				71
#define SQL_API_SQLBINDPARAMETER		72
#define SQL_EXT_API_LAST				SQL_API_SQLBINDPARAMETER
#define SQL_NUM_EXTENSIONS				(SQL_EXT_API_LAST - SQL_EXT_API_START + 1)

#define SQL_API_ALL_FUNCTIONS			0

/* SQLGetInfo infor number */
#define SQL_INFO_FIRST					0
#define SQL_DRIVER_HDBC					3
#define SQL_DRIVER_HENV					4
#define SQL_DRIVER_HSTMT				5
#define SQL_DRIVER_NAME					6
#define SQL_ODBC_VER					10
#define SQL_CURSOR_COMMIT_BEHAVIOR		23
#define SQL_CURSOR_ROLLBACK_BEHAVIOR	24
#define SQL_DEFAULT_TXN_ISOLATION		26

#define SQL_TXN_ISOLATION_OPTION		72
#define SQL_NON_NULLABLE_COLUMNS		75

#define SQL_DRIVER_HLIB					76
#define SQL_DRIVER_ODBC_VER				77

#define SQL_QUALIFIER_LOCATION			114

#define SQL_INFO_LAST					SQL_QUALIFIER_LOCATION

#define SQL_INFO_DRIVER_START			1000


/* SQL_TXN_ISOLATION_OPTION masks */
#define SQL_TXN_READ_UNCOMMITTED		0x00000001L
#define SQL_TXN_READ_COMMITTED			0x00000002L
#define SQL_TXN_REPEATABLE_READ			0x00000004L
#define SQL_TXN_SERIALIZABLE			0x00000008L
#define SQL_TXN_VERSIONING				0x00000010L

/* SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR values */

#define SQL_CB_DELETE					0x0000
#define SQL_CB_CLOSE					0x0001
#define SQL_CB_PRESERVE					0x0002

/* options for SQLGetStmtOption/SQLSetStmtOption */
#define SQL_QUERY_TIMEOUT				0
#define SQL_MAX_ROWS					1
#define SQL_NOSCAN						2
#define SQL_MAX_LENGTH					3
#define SQL_ASYNC_ENABLE				4
#define SQL_BIND_TYPE					5
#define SQL_CURSOR_TYPE					6
#define SQL_CONCURRENCY					7
#define SQL_KEYSET_SIZE					8
#define SQL_ROWSET_SIZE					9
#define SQL_SIMULATE_CURSOR				10
#define SQL_RETRIEVE_DATA				11
#define SQL_USE_BOOKMARKS				12
#define SQL_GET_BOOKMARK				13		/* GetStmtOption Only */
#define SQL_ROW_NUMBER					14		/* GetStmtOption Only */
#define SQL_STMT_OPT_MAX				SQL_ROW_NUMBER

#define SQL_STMT_OPT_MIN				SQL_QUERY_TIMEOUT

/*
 * ODBC 3.0 renames the above to SQL_ATTR_ values. At this time I don't
 * know if they have also been renumbered or not, I will assume not.
 */
#define SQL_ATTR_QUERY_TIMEOUT			0
#define SQL_ATTR_MAX_ROWS				1
#define SQL_ATTR_NOSCAN					2
#define SQL_ATTR_MAX_LENGTH				3
#define SQL_ATTR_ASYNC_ENABLE			4
#define SQL_ATTR_BIND_TYPE				5
#define SQL_ATTR_CURSOR_TYPE			6
#define SQL_ATTR_CONCURRENCY			7
#define SQL_ATTR_KEYSET_SIZE			8
#define SQL_ATTR_ROWSET_SIZE			9
#define SQL_ATTR_SIMULATE_CURSOR		10
#define SQL_ATTR_RETRIEVE_DATA			11
#define SQL_ATTR_USE_BOOKMARKS			12
#define SQL_ATTR_GET_BOOKMARK			13		/* GetStmtOption Only */
#define SQL_ATTR_ROW_NUMBER				14		/* GetStmtOption Only */

/* New in ODBC 3.0	*/
#define SQL_ATTR_APP_PARAM_DESC			15
#define SQL_ATTR_APP_ROW_DESC			16
#define SQL_ATTR_CURSOR_SCROLLABLE		17
#define SQL_ATTR_CURSOR_SENSITITY		18
#define SQL_ATTR_ENABLE_AUTO_IPD		19
#define SQL_ATTR_FETCH_BOOKMARK_PTR		20
#define SQL_ATTR_IMP_PARAM_DESC			21
#define SQL_ATTR_IMP_ROW_DESC			22
#define SQL_ATTR_METADATA_ID			23
#define SQL_ATTR_PARAM_BIND_OFFSET_PTR	24
#define SQL_ATTR_PARAM_BIND_TYPE		25
#define SQL_ATTR_PARAM_OPERATION_PTR	26
#define SQL_ATTR_PARAM_STATUS_PTR		27
#define SQL_ATTR_PARAMS_PROCESSED_PTR	28
#define SQL_ATTR_PARAMSET_SIZE			29
#define SQL_ATTR_ROW_ARRAY_SIZE			30
#define SQL_ATTR_ROW_BIND_OFFSET_PTR	31
#define SQL_ATTR_ROW_OPERATION_PTR		32
#define SQL_ATTR_ROW_STATUS_PTR			33
#define SQL_ATTR_ROWS_FETCHED_PTR		34

#define SQL_STMT_ATTR_MIN				SQL_ATTR_QUERY_TIMEOUT
#define SQL_STMT_ATTR_MAX				SQL_ATTR_ROWS_FETCHED_PTR

/* SQL_QUERY_TIMEOUT options */
#define SQL_QUERY_TIMEOUT_DEFAULT		0UL

/* SQL_MAX_ROWS options */
#define SQL_MAX_ROWS_DEFAULT			0UL

/* SQL_MAX_LENGTH options */
#define SQL_MAX_LENGTH_DEFAULT			0UL

/* SQL_CONCURRENCY options */
#define SQL_CONCUR_READ_ONLY			1
#define SQL_CONCUR_LOCK					2
#define SQL_CONCUR_ROWVER				3
#define SQL_CONCUR_VALUES				4

/* options for SQLSetConnectOption/SQLGetConnectOption */
#define SQL_ACCESS_MODE					101
#define SQL_AUTOCOMMIT					102
#define SQL_LOGIN_TIMEOUT				103
#define SQL_OPT_TRACE					104
#define SQL_OPT_TRACEFILE				105
#define SQL_TRANSLATE_DLL				106
#define SQL_TRANSLATE_OPTION			107
#define SQL_TXN_ISOLATION				108
#define SQL_CURRENT_QUALIFIER			109
#define SQL_ODBC_CURSORS				110
#define SQL_QUIET_MODE					111
#define SQL_PACKET_SIZE					112
#define SQL_CONN_OPT_MAX				SQL_PACKET_SIZE
#define SQL_CONNECT_OPT_DRVR_START		1000

#define SQL_CONN_OPT_MIN				SQL_ACCESS_MODE

/* SQL_ACCESS_MODE options */
#define SQL_MODE_READ_WRITE				0UL
#define SQL_MODE_READ_ONLY				1UL
#define SQL_MODE_DEFAULT				SQL_MODE_READ_WRITE

/* SQL_AUTOCOMMIT options */
#define SQL_AUTOCOMMIT_OFF				0UL
#define SQL_AUTOCOMMIT_ON				1UL
#define SQL_AUTOCOMMIT_DEFAULT			SQL_AUTOCOMMIT_ON

/* SQL_LOGIN_TIMEOUT options */
#define SQL_LOGIN_TIMEOUT_DEFAULT		15UL

/* SQL_OPT_TRACE options */
#define SQL_OPT_TRACE_OFF				0UL
#define SQL_OPT_TRACE_ON				1UL
#define SQL_OPT_TRACE_DEFAULT			SQL_OPT_TRACE_OFF
#define SQL_OPT_TRACE_FILE_DEFAULT		"odbc.log"

/* SQL_ODBC_CURSORS options */
#define SQL_CUR_USE_IF_NEEDED			0UL
#define SQL_CUR_USE_ODBC				1UL
#define SQL_CUR_USE_DRIVER				2UL
#define SQL_CUR_DEFAULT					SQL_CUR_USE_DRIVER

/* Column types and scopes in SQLSpecialColumns. */
#define SQL_BEST_ROWID					1
#define SQL_ROWVER						2

#define SQL_SCOPE_CURROW				0
#define SQL_SCOPE_TRANSACTION			1
#define SQL_SCOPE_SESSION				2


/* SQLExtendedFetch flag values */
#define SQL_FETCH_NEXT					1
#define SQL_FETCH_FIRST					2
#define SQL_FETCH_LAST					3
#define SQL_FETCH_PRIOR					4
#define SQL_FETCH_ABSOLUTE				5
#define SQL_FETCH_RELATIVE				6
#define SQL_FETCH_BOOKMARK				8

/* Defines for SQLBindParameter/SQLProcedureColumns */
#define SQL_PARAM_TYPE_UNKNOWN			0
#define SQL_PARAM_INPUT					1
#define SQL_PARAM_INPUT_OUTPUT			2
#define SQL_RESULT_COL					3
#define SQL_PARAM_OUTPUT				4
#define SQL_RETURN_VALUE				5

/* Defines used by Driver Manager for mapping SQLSetParam to SQLBindParameter */
#define SQL_PARAM_TYPE_DEFAULT			SQL_PARAM_INPUT_OUTPUT
#define SQL_SETPARAM_VALUE_MAX			(-1L)

/* SQLStatistics flag values */
#define SQL_INDEX_UNIQUE				0
#define SQL_INDEX_ALL					1

#define SQL_QUICK						0
#define SQL_ENSURE						1

/* SQLSetScrollOption flag values */
#define SQL_SCROLL_FORWARD_ONLY			0L
#define SQL_SCROLL_KEYSET_DRIVEN		(-1L)
#define SQL_SCROLL_DYNAMIC				(-2L)
#define SQL_SCROLL_STATIC				(-3L)

/* Everything below has been added to the original isqlext.h that comes
 * with iodbc.
*/

#define SCHAR	signed char
#define FLOAT	float
#define DOUBLE	double

/* SQL DATA TYPES */
typedef UCHAR SQLCHAR;
typedef SWORD SQLSMALLINT;
typedef UWORD SQLUSMALLINT;
typedef SDWORD SQLINTEGER;
typedef UDWORD SQLUINTEGER;
typedef FLOAT SQLREAL;
typedef DOUBLE SQLDOUBLE;
typedef DOUBLE SQLFLOAT;
typedef SCHAR SQLSCHAR;
typedef UDWORD BOOKMARK;

#ifdef GCC						/* Because I know GCC supports 64 bit ints */

typedef long long int ODBCINT64;
typedef unsigned ODBCINT64 SQLUBIGINT;
typedef ODBCINT64 SQLBIGINT;

#else							/* Used even on platforms with 64 bit ints
								 * but not GCC */

typedef struct
{
	SQLUINTEGER dwLowWord;
	SQLUINTEGER dwHighWord;
} SQLUBIGINT;

typedef struct
{
	SQLUINTEGER dwLowWord;
	SQLINTEGER	dwHighWord;
} SQLBIGINT;
#endif	 /* GCC */

typedef struct tagDATE_STRUCT
{
	SQLSMALLINT year;
	SQLUSMALLINT month;
	SQLUSMALLINT day;
} DATE_STRUCT,

SQL_DATE_STRUCT;

typedef struct tagTIME_STRUCT
{
	SQLUSMALLINT hour;
	SQLUSMALLINT minute;
	SQLUSMALLINT second;
} TIME_STRUCT,

SQL_TIME_STRUCT;

typedef struct tagTIMESTAMP_STRUCT
{
	SQLSMALLINT year;
	SQLUSMALLINT month;
	SQLUSMALLINT day;
	SQLUSMALLINT hour;
	SQLUSMALLINT minute;
	SQLUSMALLINT second;
	SQLUINTEGER fraction;
} TIMESTAMP_STRUCT,

SQL_TIMESTAMP_STRUCT;

/* postodbc doesn't use these but what the heck */
/* Don't know what SQL_MAX_NUMERIC_LEN should be so I can't include this. It's
 * ODBC 3.0 anyway.

typedef struct tagSQL_NUMERIC_STRUCT {
	SQLCHAR		precision;
	SQLSCHAR	scale;
	SQLCHAR		sign;
	SQLCHAR		val[SQL_MAX_NUMERIC_LEN];
} SQL_NUMERIC_STRUCT;

*/

typedef struct tagSQLGUID
{
	DWORD		Data1;
	WORD		Data2;
	WORD		Data3;
	BYTE		Data4[8];
} SQLGUID;

typedef enum
{
	SQL_IS_YEAR = 1,
	SQL_IS_MONTH = 2,
	SQL_IS_DAY = 3,
	SQL_IS_HOUR = 4,
	SQL_IS_MINUTE = 5,
	SQL_IS_SECOND = 6,
	SQL_IS_YEAR_TO_MONTH = 7,
	SQL_IS_DAY_TO_HOUR = 8,
	SQL_IS_DAY_TO_MINUTE = 9,
	SQL_IS_DAY_TO_SECOND = 10,
	SQL_IS_HOUR_TO_MINUTE = 11,
	SQL_IS_HOUR_TO_SECOND = 12,
	SQL_IS_MINUTE_TO_SECOND = 13
} SQLINTERVAL;

typedef struct tagSQL_YEAR_MONTH
{
	SQLUINTEGER year;
	SQLUINTEGER month;
} SQL_YEAR_MONTH_STRUCT;

typedef struct tagSQL_DAY_SECOND
{
	SQLUINTEGER day;
	SQLUINTEGER hour;
	SQLUINTEGER minute;
	SQLUINTEGER second;
	SQLUINTEGER fraction;
} SQL_DAY_SECOND_STRUCT;

typedef struct tagSQL_INTERVAL_STRUCT
{
	SQLINTERVAL interval_type;
	SQLSMALLINT interval_sign;
	union
	{
		SQL_YEAR_MONTH_STRUCT year_month;
		SQL_DAY_SECOND_STRUCT day_second;
	}			intval;
} SQL_INTERVAL_STRUCT;

#define SQL_MAX_OPTION_STRING_LENGTH	256
#define SQL_NUM_EXTENSIONS	(SQL_EXT_API_LAST - SQL_EXT_API_START + 1)

/* defines for SQL datatypes */
/*
#define SQL_TYPE_DATE
#define SQL_TYPE_TIME
#define SQL_TYPE_TIMESTAMP
#define SQL_CODE_DATE
#define SQL_CODE_TIME
#define SQL_CODE_TIMESTAMP
#define SQL_CODE_MONTH
#define SQL_CODE_YEAR
#define SQL_CODE_YEAR_TO_MONTH
#define SQL_CODE_DAY
#define SQL_CODE_HOUR
#define SQL_CODE_MINUTE
#define SQL_CODE_SECOND
#define SQL_CODE_DAY_TO_HOUR
#define SQL_CODE_DAY_TO_MINUTE
#define SQL_CODE_DAY_TO_SECOND
#define SQL_CODE_HOUR_TO_MINUTE
#define SQL_CODE_HOUR_TO_SECOND
#define SQL_CODE_MINUTE_TO_SECOND
*/
#define SQL_INTERVAL_YEAR				(-80)
#define SQL_INTERVAL_MONTH				(-81)
#define SQL_INTERVAL_YEAR_TO_MONTH		(-82)
#define SQL_INTERVAL_DAY				(-83)
#define SQL_INTERVAL_HOUR				(-84)
#define SQL_INTERVAL_MINUTE				(-85)
#define SQL_INTERVAL_SECOND				(-86)
#define SQL_INTERVAL_DAY_TO_HOUR		(-87)
#define SQL_INTERVAL_DAY_TO_MINUTE		(-88)
#define SQL_INTERVAL_DAY_TO_SECOND		(-89)
#define SQL_INTERVAL_HOUR_TO_MINUTE		(-90)
#define SQL_INTERVAL_HOUR_TO_SECOND		(-91)
#define SQL_INTERVAL_MINUTE_TO_SECOND	(-92)

#define SQL_UNICODE						(-95)
#define SQL_UNICODE_VARCHAR				(-96)
#define SQL_UNICODE_LONGVARCHAR			(-97)
#define SQL_UNICODE_CHAR				SQL_UNICODE

/* C to SQL data types */
/*
#define SQL_C_TYPE_DATE					SQL_TYPE_DATE
#define SQL_C_TYPE_TIME					SQL_TYPE_TIME
#define SQL_C_TYPE_TIMESTAMP			SQL_TYPE_TIMESTAMP
#define SQL_C_GUID						SQLGUID
*/
#define SQL_C_INTERVAL_MONTH			SQL_INTERVAL_MONTH
#define SQL_C_INTERVAL_YEAR				SQL_INTERVAL_YEAR
#define SQL_C_INTERVAL_YEAR_TO_MONTH	SQL_INTERVAL_YEAR_TO_MONTH
#define SQL_C_INTERVAL_DAY				SQL_INTERVAL_DAY
#define SQL_C_INTERVAL_HOUR				SQL_INTERVAL_HOUR
#define SQL_C_INTERVAL_MINUTE			SQL_INTERVAL_MINUTE
#define SQL_C_INTERVAL_SECOND			SQL_INTERVAL_SECOND
#define SQL_C_INTERVAL_DAY_TO_HOUR		SQL_INTERVAL_DAY_TO_HOUR
#define SQL_C_INTERVAL_DAY_TO_MINUTE	SQL_INTERVAL_DAY_TO_MINUTE
#define SQL_C_INTERVAL_DAY_TO_SECOND	SQL_INTERVAL_DAY_TO_SECOND
#define SQL_C_INTERVAL_HOUR_TO_MINUTE	SQL_INTERVAL_HOUR_TO_MINUTE
#define SQL_C_INTERVAL_HOUR_TO_SECOND	SQL_INTERVAL_HOUR_TO_SECOND
#define SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_INTERVAL_MINUTE_TO_SECOND
#define SQL_C_NUMERIC					SQL_NUMERIC
#define SQL_C_VARBOOKMARK				SQL_C_BINARY
#define SQL_C_SBIGINT					(SQL_BIGINT + SQL_SIGNED_OFFSET)
#define SQL_C_UBIGINT					(SQL_BIGINT + SQL_UNSIGNED_OFFSET)

#define SQL_TRUE	1UL
#define SQL_FALSE	0UL

/* SQLGetData */
#define SQL_NO_TOTAL					(-4)

/* SQLBindParameter */
#define SQL_LEN_DATA_AT_EXEC_OFFSET		(-100)
#define SQL_LEN_DATA_AT_EXEC(length)	(-length+SQL_LEN_DATA_AT_EXEC_OFFSET)

#define SQL_LEN_BINARY_ATTR_OFFSET		(-100)
#define SQL_LEN_BINARY_ATTR(length)		(-(length)+SQL_LEN_BINARY_ATTR_OFFSET)

/* SQLExtendedFetch - row status */
#define SQL_ROW_SUCCESS					0
#define SQL_ROW_DELETED					1
#define SQL_ROW_UPDATED					2
#define SQL_ROW_NOROW					3
#define SQL_ROW_ADDED					4
#define SQL_ROW_ERROR					5

/* SQLForeignKeys - rule flags */
#define SQL_CASCADE						0
#define SQL_RESTRICT					1
#define SQL_SET_NULL					2
#define SQL_NO_ACTION					3		/* ODBC 3.0 */
#define SQL_SET_DEFAULT					4

/* SQLForeignKeys - Deferrability (ODBC 3.0) */
#define SQL_INITIALLY_DEFERRED			5
#define SQL_INITIALLY_IMMEDIATE			6
#define SQL_NOT_DEFFERABLE				2

/* Constants not in isqlext.h but needed by the driver. I have no idea
* if these correspond correctly with those from Microsoft or not. I don't
* know that it matters as long as the symbolic names are used. I simply
* assigned the numbers in the order they appear in the SQLGetInfo function
* of postodbc.
*/

/*
 *	SQLGetInfo
 */
#define SQL_ACTIVE_CONNECTIONS			0
#define SQL_ACTIVE_STATEMENTS			1
#define SQL_DATA_SOURCE_NAME			2
#define SQL_DRIVER_VER					7
#define SQL_FETCH_DIRECTION				8
#define SQL_ODBC_API_CONFORMANCE		9
#define SQL_ROW_UPDATES					11
#define SQL_ODBC_SAG_CLI_CONFORMANCE	12
#define SQL_SERVER_NAME					13
#define SQL_SEARCH_PATTERN_ESCAPE		14
#define SQL_ODBC_SQL_CONFORMANCE		15
#define SQL_DBMS_NAME					17
#define SQL_DBMS_VER					18
#define SQL_ACCESSIBLE_TABLES			19
#define SQL_ACCESSIBLE_PROCEDURES		20
#define SQL_PROCEDURES					21
#define SQL_CONCAT_NULL_BEHAVIOR		22
#define SQL_DATA_SOURCE_READ_ONLY		25
#define SQL_EXPRESSIONS_IN_ORDERBY		27
#define SQL_IDENTIFIER_CASE				28
#define SQL_IDENTIFIER_QUOTE_CHAR		29
#define SQL_MAX_COLUMN_NAME_LEN			30
#define SQL_MAX_CURSOR_NAME_LEN			31
#define SQL_MAX_OWNER_NAME_LEN			32
#define SQL_MAX_PROCEDURE_NAME_LEN		33
#define SQL_MAX_QUALIFIER_NAME_LEN		34
#define SQL_MAX_TABLE_NAME_LEN			35
#define SQL_MULT_RESULT_SETS			36
#define SQL_MULTIPLE_ACTIVE_TXN			37
#define SQL_OUTER_JOINS					38
#define SQL_OWNER_TERM					39
#define SQL_PROCEDURE_TERM				40
#define SQL_QUALIFIER_NAME_SEPARATOR	41
#define SQL_QUALIFIER_TERM				42
#define SQL_SCROLL_CONCURRENCY			43
#define SQL_SCROLL_OPTIONS				44
#define SQL_TABLE_TERM					45
#define SQL_TXN_CAPABLE					46
#define SQL_USER_NAME					47
#define SQL_CONVERT_FUNCTIONS			48
#define SQL_NUMERIC_FUNCTIONS			49
#define SQL_STRING_FUNCTIONS			50
#define SQL_SYSTEM_FUNCTIONS			51
#define SQL_TIMEDATE_FUNCTIONS			52
#define SQL_CONVERT_BIGINT				53
#define SQL_CONVERT_BINARY				54
#define SQL_CONVERT_BIT					55
#define SQL_CONVERT_CHAR				56
#define SQL_CONVERT_DATE				57
#define SQL_CONVERT_DECIMAL				58
#define SQL_CONVERT_DOUBLE				59
#define SQL_CONVERT_FLOAT				60
#define SQL_CONVERT_INTEGER				61
#define SQL_CONVERT_LONGVARCHAR			62
#define SQL_CONVERT_NUMERIC				63
#define SQL_CONVERT_REAL				64
#define SQL_CONVERT_SMALLINT			65
#define SQL_CONVERT_TIME				66
#define SQL_CONVERT_TIMESTAMP			67
#define SQL_CONVERT_TINYINT				68
#define SQL_CONVERT_VARBINARY			69
#define SQL_CONVERT_VARCHAR				70
#define SQL_CONVERT_LONGVARBINARY		71
#define SQL_ODBC_SQL_OPT_IEF			73
#define SQL_CORRELATION_NAME			74
#define SQL_LOCK_TYPES					78
#define SQL_POS_OPERATIONS				79
#define SQL_POSITIONED_STATEMENTS		80
#define SQL_GETDATA_EXTENSIONS			81
#define SQL_BOOKMARK_PERSISTENCE		82
#define SQL_STATIC_SENSITIVITY			83
#define SQL_FILE_USAGE					84
#define SQL_NULL_COLLATION				85
#define SQL_ALTER_TABLE					86
#define SQL_COLUMN_ALIAS				87
#define SQL_GROUP_BY					88
#define SQL_KEYWORDS					89
#define SQL_ORDER_BY_COLUMNS_IN_SELECT	90
#define SQL_OWNER_USAGE					91
#define SQL_QUALIFIER_USAGE				92
#define SQL_QUOTED_IDENTIFIER_CASE		93
#define SQL_SPECIAL_CHARACTERS			94
#define SQL_SUBQUERIES					95
#define SQL_UNION						96
#define SQL_MAX_COLUMNS_IN_GROUP_BY		97
#define SQL_MAX_COLUMNS_IN_INDEX		98
#define SQL_MAX_COLUMNS_IN_ORDER_BY		99
#define SQL_MAX_COLUMNS_IN_SELECT		100
#define SQL_MAX_COLUMNS_IN_TABLE		101
#define SQL_MAX_INDEX_SIZE				102
#define SQL_MAX_ROW_SIZE_INCLUDES_LONG	103
#define SQL_MAX_ROW_SIZE				104
#define SQL_MAX_STATEMENT_LEN			105
#define SQL_MAX_TABLES_IN_SELECT		106
#define SQL_MAX_USER_NAME_LEN			107
#define SQL_MAX_CHAR_LITERAL_LEN		108
#define SQL_TIMEDATE_ADD_INTERVALS		109
#define SQL_TIMEDATE_DIFF_INTERVALS		110
#define SQL_NEED_LONG_DATA_LEN			111
#define SQL_MAX_BINARY_LITERAL_LEN		112
#define SQL_LIKE_ESCAPE_CLAUSE			113

#define SQL_OJ_CAPABILITIES				65003
/* ODBC 3.0 alias */
#define SQL_MAX_SCHEMA_NAME_LEN			SQL_MAX_OWNER_NAME_LEN

/* Bit Masks describing the behaviour of the GetInfo functions named above */
/*
 * alter table behaviour(4 byte val)
 */
#define SQL_AT_ADD_COLUMN				0x00000001L
#define SQL_AT_DROP_COLUMN				0x00000002L

/*
 * BookMark Persistence, a SQLUINTEGER bitmask(ie 4 bytes)
*/
#define SQL_BP_CLOSE					0x00000001L
#define SQL_BP_DELETE					0x00000002L
#define SQL_BP_DROP						0x00000004L
#define SQL_BP_TRANSACTION				0x00000008L
#define SQL_BP_UPDATE					0x00000010L
#define SQL_BP_OTHER_HSTMT				0x00000020L
#define SQL_BP_SCROLL					0x00000040L

/*
 * Conversion bitmasks for testing which conversions are supported by
 * the driver. An application compares the returned bitmask with these
 * to determine which conversions are supported. The driver ANDS these
 * for the returned bitmask to indicate the supported conversions.(type
 * is SQLUINTEGER, i.e. 4 bytes). Note that these masks are defined in
 * alphabetical order, I have no idea if this maps to MS's SDK.
 */
#define SQL_CVT_CHAR					0x00000001L
#define SQL_CVT_NUMERIC					0x00000002L
#define SQL_CVT_DECIMAL					0x00000004L
#define SQL_CVT_INTEGER					0x00000008L
#define SQL_CVT_SMALLINT				0x00000010L
#define SQL_CVT_FLOAT					0x00000020L
#define SQL_CVT_REAL					0x00000040L
#define SQL_CVT_DOUBLE					0x00000080L
#define SQL_CVT_VARCHAR					0x00000100L
#define SQL_CVT_LONGVARCHAR				0x00000200L
#define SQL_CVT_BINARY					0x00000400L
#define SQL_CVT_VARBINARY				0x00000800L
#define SQL_CVT_BIT						0x00001000L
#define SQL_CVT_TINYINT					0x00002000L
#define SQL_CVT_BIGINT					0x00004000L
#define SQL_CVT_DATE					0x00008000L
#define SQL_CVT_TIME					0x00010000L
#define SQL_CVT_TIMESTAMP				0x00020000L
#define SQL_CVT_LONGVARBINARY			0x00040000L


/*	extras added in ODBC 3.0 */
#define SQL_CVT_INTERVAL_YEAR_MONTH		0x00080000L
#define SQL_CVT_INTERVAL_DAY_TIME		0x00100000L

/*
 *	concat null behaviour(2 byte val)
 */
#define SQL_CB_NULL						0x0000
#define SQL_CB_NON_NULL					0x0001

/*
 *	correlation name
 */
#define SQL_CN_NONE						0x0000
#define SQL_CN_DIFFERENT				0x0001
#define SQL_CN_ANY						0x0002

/*
 * Fetch Direction. A SQLINTEGER bitmask enumerating the supported fetch
 * direction options. This information type has been deprecated in
 * ODBC 3.0.
 */
#define SQL_FD_FETCH_NEXT				0x00000001L
#define SQL_FD_FETCH_FIRST				0x00000002L
#define SQL_FD_FETCH_LAST				0x00000004L
#define SQL_FD_FETCH_PRIOR				0x00000008L
#define SQL_FD_FETCH_ABSOLUTE			0x00000010L
#define SQL_FD_FETCH_RELATIVE			0x00000020L
#define SQL_FD_FETCH_RESUME				0x00000040L
#define SQL_FD_FETCH_BOOKMARK			0x00000080L

/*
 * Conversion bitmasks for testing which function conversions are supported by
 * the driver. An application compares the returned bitmask with these
 * to determine which conversions are supported. The driver ANDS these
 * for the returned bitmask to indicate the supported conversions.(type
 * is SQLUINTEGER, i.e. 4 bytes). Note that these masks are defined in
 * alphabetical order, I have no idea if this maps to MS's SDK.
 */
#define SQL_FN_CVT_CONVERT				0x00000001L
#define SQL_FN_CVT_CAST					0x00000002L

/*
 * File Usage. A SQLUSMALLINT indicating how a singel-tier driver treats
 * files in a data source.
 */
#define SQL_FILE_NOT_SUPPORTED			0x0000
#define SQL_FILE_TABLE					0x0001
#define SQL_FILE_QUALIFIER				0x0002
#define SQL_FILE_CATALOG				SQL_FILE_CATALOG

/*
 * GetData Extensions. A SQLUINTEGER(4 bytes) bitmask enumerating extensions
 * to SQLGetData.
 */
#define SQL_GD_ANY_COLUMN				0x00000001L
#define SQL_GD_ANY_ORDER				0x00000002L
#define SQL_GD_BLOCK					0x00000004L
#define SQL_GD_BOUND					0x00000008L

/*
 * Group By. A SQLUSMALLINT value specifying the relationship between the
 * columns in the GROUP BY clause and the non-aggregated columns in the
 * select list.
*/
#define SQL_GB_NOT_SUPPORTED			0x0000
#define SQL_GB_GROUP_BY_EQUALS_SELECT	0x0001
#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002
#define SQL_GB_NO_RELATION				0x0003

/* added in ODBC 3.0 */
#define SQL_GB_COLLATE					0x0004

/*
 * Identifier Case. A SQLUSMALLINT indicating how identifiers are handled.
 */
#define SQL_IC_UPPER					0x0001
#define SQL_IC_LOWER					0x0002
#define SQL_IC_SENSITIVE				0x0003
#define SQL_IC_MIXED					0x0004

/*
 * Lock types. A SQLINTEGER bitmask enumerating the supported lock types for
 * the fLock argument in SQLSetPos. Depreciated in 3.0.
 */
#define SQL_LCK_NO_CHANGE				0x00000001L
#define SQL_LCK_EXCLUSIVE				0x00000002L
#define SQL_LCK_UNLOCK					0x00000004L

/*
 * Non Nullable Columns. A SQLUSMALLINT value indicating if the data source
 * supports NOT NULL in columns.
 */
#define SQL_NNC_NULL					0x0000
#define SQL_NNC_NON_NULL				0x0001

/*
 * Null Collation. A SQLUSMALLINT value specifying where NULLS are sorted in
 * a result set.
 */
#define SQL_NC_HIGH						0x0001
#define SQL_NC_LOW						0x0003
#define SQL_NC_START					0x0002
#define SQL_NC_END						0x0004

/*
 * Numeric Functions. A SQLUINTEGER bitmask enumerating the scalar numeric
 * functions supported by the driver and associated data source.
 */
#define SQL_FN_NUM_ABS					0x00000001L
#define SQL_FN_NUM_ACOS					0x00000002L
#define SQL_FN_NUM_ASIN					0x00000004L
#define SQL_FN_NUM_ATAN					0x00000008L
#define SQL_FN_NUM_ATAN2				0x00000010L
#define SQL_FN_NUM_CEILING				0x00000020L
#define SQL_FN_NUM_COS					0x00000040L
#define SQL_FN_NUM_COT					0x00000080L
#define SQL_FN_NUM_EXP					0x00000100L
#define SQL_FN_NUM_FLOOR				0x00000200L
#define SQL_FN_NUM_LOG					0x00000400L
#define SQL_FN_NUM_MOD					0x00000800L
#define SQL_FN_NUM_SIGN					0x00001000L
#define SQL_FN_NUM_SIN					0x00002000L
#define SQL_FN_NUM_SQRT					0x00004000L
#define SQL_FN_NUM_TAN					0x00008000L
#define SQL_FN_NUM_PI					0x00010000L
#define SQL_FN_NUM_RAND					0x00020000L

/* Added in ODBC 2.0 */
#define SQL_FN_NUM_DEGREES				0x00040000L
#define SQL_FN_NUM_LOG10				0x00080000L
#define SQL_FN_NUM_POWER				0x00100000L
#define SQL_FN_NUM_RADIANS				0x00200000L
#define SQL_FN_NUM_ROUND				0x00400000L
#define SQL_FN_NUM_TRUNCATE				0x00800000L

/*
 * Outer Join Capabilites. A SQLUINTEGER bitmask enumerating the types of
 * outer joins supported by the driver and data source.
 */
#define SQL_OJ_LEFT						0x00000001L
#define SQL_OJ_RIGHT					0x00000002L
#define SQL_OJ_FULL						0x00000004L
#define SQL_OJ_NESTED					0x00000008L
#define SQL_OJ_NOT_ORDERED				0x00000010L
#define SQL_OJ_INNER					0x00000020L
#define SQL_OJ_ALL_COMPARISON_OPS		0x00000040L

/*
 * ODBC API Conformance. A SQLSMALLINT value indicating a drivers ODBC
 * level conformance. Depreciated in 3.0.
 */
#define SQL_OAC_NONE					0x0000
#define SQL_OAC_LEVEL1					0x0001
#define SQL_OAC_LEVEL2					0x0002

/*
 * ODBC SAG CLI Conformance. A SQLSMALLINT value indicating a drivers
 * SAG CLI conformance.
 */
#define SQL_OSCC_NOT_COMPLIANT			0x0000
#define SQL_OSCC_COMPLIANT				0x0001

/*
 * ODBC SQL Conformance. A SQLSMALLINT value indicating a drivers SQL
 * grammar support. Depreciated in 3.0.
 */
#define SQL_OSC_MINIMUM					0x0000
#define SQL_OSC_CORE					0x0001
#define SQL_OSC_EXTENDED				0x0002

/*
 * Owner Usage. A SQLUINTEGER bitmask.
 */
#define SQL_OU_DML_STATEMENTS			0x00000001L
#define SQL_OU_PROCEDURE_INVOCATION		0x00000002L
#define SQL_OU_TABLE_DEFINITION			0x00000004L
#define SQL_OU_INDEX_DEFINITION			0x00000008L
#define SQL_OU_PRIVILEGE_DEFINITION		0x00000010L

/*
 * Schema Usage. A SQLUINTEGER bitmask enumerating the statements in which
 * schemas can be used. Renamed in ODBC 3.0 from SQL_OWNER_USAGE
 */
#define SQL_SU_DML_STATEMENTS			SQL_OU_DML_STATEMENTS
#define SQL_SU_PROCEDURE_INVOCATION		SQL_OU_PROCEDURE_INVOCATION
#define SQL_SU_TABLE_DEFINITION			SQL_OU_TABLE_DEFINITION
#define SQL_SU_INDEX_DEFINITION			SQL_OU_INDEX_DEFINITION
#define SQL_SU_PRIVILEGE_DEFINITION		SQL_OU_PRIVILEGE_DEFINITION

/*
 * Pos. Operations. A SQLINTEGER bitmask enumerating the supported operations
 * in SQLSetPos. Depreciated in ODBC 3.0.
 */
#define SQL_POS_POSITION				0x00000001L
#define SQL_POS_REFRESH					0x00000002L
#define SQL_POS_UPDATE					0x00000004L
#define SQL_POS_DELETE					0x00000008L
#define SQL_POS_ADD						0x00000010L

/*
 *	SQLSetPos
 */
#define SQL_ENTIRE_ROWSET				0

#define SQL_POSITION					0
#define SQL_REFRESH						1
#define SQL_UPDATE						2
#define SQL_DELETE						3
#define SQL_ADD							4

/*
 * SQLSetPos Lock options
*/
#define SQL_LOCK_NO_CHANGE				0
#define SQL_LOCK_EXCLUSIVE				1
#define SQL_LOCK_UNLOCK					2

#define SQL_POSITION_TO(hstmt,irow)		\
	SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE)
#define SQL_LOCK_RECORD(hstmt,irow,fLock) \
	SQLSetPos(hstmt,irow,SQL_POSITION,fLock)
#define SQL_REFRESH_RECORD(hstmt,irow,fLock) \
	SQLSetPos(hstmt,irow,SQL_REFRESH,fLock)
#define SQL_UPDATE_RECORD(hstmt,irow) \
	SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE)
#define SQL_DELETE_RECORD(hstmt,irow) \
	SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE)
#define SQL_ADD_RECORD(hstmt,irow) \
	SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE)

/*
 * Positioned Statements. A SQLINTEGER bitmask enumerating the supported
 * positioned SQL statements.
 */
#define SQL_PS_POSITIONED_DELETE		0x00000001L
#define SQL_PS_POSITIONED_UPDATE		0x00000002L
#define SQL_PS_SELECT_FOR_UPDATE		0x00000004L

/* Qualifier Location. A SQLUSMALLINT value indicating the position of the
 * catalog in a qualified table name.
 */
#define SQL_QL_START					0x0001
#define SQL_QL_END						0x0002

/*
 * Qualifier Usage. A SQLUINTEGER bitmask.
 */
#define SQL_QU_DML_STATEMENTS			0x00000001L
#define SQL_QU_PROCEDURE_INVOCATION		0x00000002L
#define SQL_QU_TABLE_DEFINITION			0x00000004L
#define SQL_QU_INDEX_DEFINITION			0x00000008L
#define SQL_QU_PRIVILEGE_DEFINITION		0x00000010L

/* The above is renamed in ODBC 3.0 to Catalog Usage. */
#define SQL_CU_DML_STATEMENTS			SQL_QU_DML_STATEMENTS
#define SQL_CU_PROCEDURE_INVOCATION		SQL_QU_PROCEDURE_INVOCATION
#define SQL_CU_TABLE_DEFINITION			SQL_QU_TABLE_DEFINITION
#define SQL_CU_INDEX_DEFINITION			SQL_QU_INDEX_DEFINITION
#define SQL_CU_PRIVILEGE_DEFINITION		SQL_QU_PRIVILEGE_DEFINITION

/* ODBC 3.0 renamed the above to Catalog Location. */
#define SQL_CL_START					SQL_QL_START
#define SQL_CL_END						SQL_QL_END

/*
 * Scroll Concurrency. A SQLINTEGER bitmask enumerating the concurrency
 * control options supported for the cursor. Depreciated in ODBC 3.0.
 */
#define SQL_SCCO_READ_ONLY				0x00000001L
#define SQL_SCCO_LOCK					0x00000002L
#define SQL_SCCO_OPT_ROWVER				0x00000004L
#define SQL_SCCO_OPT_VALUES				0x00000008L


/*
 * Scroll Options. A SQLUINTEGER bitmask enumerating the scroll options
 * supported for scrollable cursors.
 */
#define SQL_SO_FORWARD_ONLY				0x00000001L
#define SQL_SO_KEYSET_DRIVEN			0x00000002L
#define SQL_SO_DYNAMIC					0x00000004L
#define SQL_SO_MIXED					0x00000008L
#define SQL_SO_STATIC					0x00000010L

/*
 * Static Sensitity. A SQLINTEGER bitmask enumerating whether changes made
 * by an application to a static or keyset-driven cursor through SQLSetPos
 * or positioned update or delete statements can be detected by that
 * application.
 */
#define SQL_SS_ADDITIONS				0x00000001L
#define SQL_SS_DELETIONS				0x00000002L
#define SQL_SS_UPDATES					0x00000004L

/*
 * String Functions. A SQLUINTEGER bitmask enumerating the scalar string
 * functions supported by the driver and associated data source.
 */
#define SQL_FN_STR_CONCAT				0x00000001L
#define SQL_FN_STR_INSERT				0x00000002L
#define SQL_FN_STR_LEFT					0x00000004L
#define SQL_FN_STR_LTRIM				0x00000008L
#define SQL_FN_STR_LENGTH				0x00000010L
#define SQL_FN_STR_LOCATE				0x00000020L
#define SQL_FN_STR_LCASE				0x00000040L
#define SQL_FN_STR_REPEAT				0x00000080L
#define SQL_FN_STR_REPLACE				0x00000100L
#define SQL_FN_STR_RIGHT				0x00000200L
#define SQL_FN_STR_RTRIM				0x00000400L
#define SQL_FN_STR_SUBSTRING			0x00000800L
#define SQL_FN_STR_UCASE				0x00001000L
#define SQL_FN_STR_ASCII				0x00002000L
#define SQL_FN_STR_CHAR					0x00004000L
#define SQL_FN_STR_DIFFERENCE			0x00008000L
#define SQL_FN_STR_LOCATE_2				0x00010000L
#define SQL_FN_STR_SOUNDEX				0x00020000L
#define SQL_FN_STR_SPACE				0x00040000L

/* introduced in ODBC 3.0 */
#define SQL_FN_STR_BIT_LENGTH			0x00080000L
#define SQL_FN_STR_CHAR_LENGTH			0x00100000L
#define SQL_FN_STR_CHARACTER_LENGTH		0x00200000L
#define SQL_FN_STR_OCTET_LENGTH			0x00400000L
#define SQL_FN_STR_POSITION				0x00800000L

/*
 * Subqueries. A SQLUINTEGER bitmask enumerating the predicates that support
 * subqueries.
 */
#define SQL_SQ_COMPARISON				0x00000001L
#define SQL_SQ_EXISTS					0x00000002L
#define SQL_SQ_IN						0x00000004L
#define SQL_SQ_QUANTIFIED				0x00000008L
#define SQL_SQ_CORRELATED_SUBQUERIES	0x00000010L

/*
 * System Functions. A SQLUINTEGER bitmask enumerating the scalar system
 * functions supported by the driver and associated data source.
 */
#define SQL_FN_SYS_USERNAME				0x00000001L
#define SQL_FN_SYS_DBNAME				0x00000002L
#define SQL_FN_SYS_IFNULL				0x00000004L

/*
 * Time-Date add and diff intervals. A SQLUINTEGER bitmask enumerating the
 * timestamp intervals supported by the driver and associated data source
 *	for the TIMESTAMPADD and TIMESTAMPDIFF scalar function.
 */
#define SQL_FN_TSI_FRAC_SECOND			0x00000001L
#define SQL_FN_TSI_SECOND				0x00000002L
#define SQL_FN_TSI_MINUTE				0x00000004L
#define SQL_FN_TSI_HOUR					0x00000008L
#define SQL_FN_TSI_DAY					0x00000010L
#define SQL_FN_TSI_WEEK					0x00000020L
#define SQL_FN_TSI_MONTH				0x00000040L
#define SQL_FN_TSI_QUARTER				0x00000080L
#define SQL_FN_TSI_YEAR					0x00000100L

/*
 * Time/Date functions. A SQLUINTEGER bitmask enumerating the scalar date
 * and time functions supported by the driver and associated data source.
 */
#define SQL_FN_TD_NOW					0x00000001L
#define SQL_FN_TD_CURDATE				0x00000002L
#define SQL_FN_TD_DAYOFMONTH			0x00000004L
#define SQL_FN_TD_DAYOFWEEK				0x00000008L
#define SQL_FN_TD_DAYOFYEAR				0x00000010L
#define SQL_FN_TD_MONTH					0x00000020L
#define SQL_FN_TD_QUARTER				0x00000040L
#define SQL_FN_TD_WEEK					0x00000080L
#define SQL_FN_TD_YEAR					0x00000100L
#define SQL_FN_TD_CURTIME				0x00000200L
#define SQL_FN_TD_HOUR					0x00000400L
#define SQL_FN_TD_MINUTE				0x00000800L
#define SQL_FN_TD_SECOND				0x00001000L
#define SQL_FN_TD_TIMESTAMPADD			0x00002000L
#define SQL_FN_TD_TIMESTAMPDIFF			0x00004000L
#define SQL_FN_TD_DAYNAME				0x00008000L
#define SQL_FN_TD_MONTHNAME				0x00010000L

/* Added in ODBC 3.0 */
#define SQL_FN_TD_CURRENT_DATE			0x00020000L
#define SQL_FN_TD_CURRENT_TIME			0x00040000L
#define SQL_FN_TD_CURRENT_TIMESTAMP		0x00080000L
#define SQL_FN_TD_EXTRACT				0x00100000L

/*
 * Transaction Capable. A SQLUSMALLINT value describing the transaction
 * support in the driver or data source.
 */
#define SQL_TC_NONE						0x0000
#define SQL_TC_DML						0x0001
#define SQL_TC_ALL						0x0002
#define SQL_TC_DDL_COMMIT				0x0003
#define SQL_TC_DDL_IGNORE				0x0004

/*
 * Unions. A SQLUINTEGER bitmask enumerating the support for the UNION
 * clause.
 */
#define SQL_U_UNION						0x00000001L
#define SQL_U_UNION_ALL					0x00000002L


/* SQLStatistics: Type, Smallint */
#define SQL_TABLE_STAT					0
#define SQL_INDEX_CLUSTERED				1
#define SQL_INDEX_HASHED				2
#define SQL_INDEX_OTHER					3

/* SQLProcedures: Type: Smallint */
#define SQL_PT_UNKNOWN					0
#define SQL_PT_PROCEDURE				1
#define SQL_PT_FUNCTION					2

/* SQLSpecialColumns: PSEUDO_COLUMN: Smallint */
#define SQL_PC_UNKNOWN					0
#define SQL_PC_PSEUDO					1
#define SQL_PC_NOT_PSEUDO				2

/* SQLSet/Get/StmtOptions: ASYNC_ENABLE. A SQLUINTEGER */
#define SQL_ASYNC_ENABLE_OFF			0UL
#define SQL_ASYNC_ENABLE_ON				1UL
#define SQL_ASYNC_ENABLE_DEFAULT		SQL_ASYNC_ENABLE_OFF

/*
 * SQLSet/GetStmtOptions: CONCURRENCY. A SQLUINTEGER. Note most of these
 * are above in the original isqlext.h code.
 */
#define SQL_CONCUR_DEFAULT				SQL_CONCUR_READ_ONLY

/*
 * SQLSet/GetStmtOptions: CURSOR_SCROLLABLE. A SQLUINTEGER. Added in ODBC
 * 3.0.
 */
#define SQL_NONSCROLLABLE				0UL
#define SQL_SCROLLABLE					1UL
#define SQL_CURSOR_SCROLLABLE_DEFAULT	SQL_NONSCROLLABLE

/*
 * SQLSet/GetStmtOptions: CURSOR_SENSITITY. A SQLUINTEGER. Added in ODBC
 * 3.0.
 */
#define SQL_UNSPECIFIED					0UL
#define SQL_INSENSITIVE					1UL
#define SQL_SENSITIVIE					2UL
#define SQL_CURSOR_SENSITIVITY_DEFAULT	SQL_UNSPECIFIED

/*
 * SQLSet/GetStmtOptions: CURSOR_TYPE: A SQLUINTEGER value that specifies the
 * cursor type
 */
#define SQL_CURSOR_FORWARD_ONLY			0UL
#define SQL_CURSOR_KEYSET_DRIVEN		1UL
#define SQL_CURSOR_DYNAMIC				2UL
#define SQL_CURSOR_STATIC				3UL
#define SQL_CURSOR_DEFAULT				SQL_CURSOR_FORWARD_ONLY

/*
 * ENABLE_AUTO_IPD: A SQLUINTEGER, either SQL_TRUE or SQL_FALSE. Default
 * dependent on connection option SQL_ATTR_AUTO_IPD. Added in ODBC 3.0.
 */

/*
 * METADATA_ID: A SQLUINTEGER, either SQL_TRUE or SQL_FALSE. Added in
 * ODBC 3.0.
 */
#define SQL_ATTR_METADATA_ID_DEFAULT	SQL_FALSE

/*
 * SQLSet/GetStmtOptions: NOSCAN. A SQLUINTEGER value that indicates whether
 * the driver should scan SQL strings for escape sequences.
 */
#define SQL_NOSCAN_OFF					0UL
#define SQL_NOSCAN_ON					1UL
#define SQL_NOSCAN_DEFAULT				SQL_NOSCAN_OFF

/*
 * SQLSet/GetStmtOptions: PARAM_OPERATION: SQLUSMALLINT *. Added in ODBC 3.0
 *
 */
#define SQL_PARAM_PROCEED				0
#define SQL_PARAM_IGNORE				1

/*
 * SQLSet/GetStmtOptions: PARAM_STATUS: SQLUSMALLINT *. Added in ODBC 3.0
 *
*/
#define SQL_PARAM_SUCCESS				0
#define SQL_PARAM_SUCCESS_WITH_INFO		6
#define SQL_PARAM_ERROR					5
#define SQL_PARAM_UNUSED				7
#define SQL_PARAM_DIAG_UNAVAILABLE		1

/*
 * SQLSet/GetStmtOptions: RETRIEVE_DATA: SQLUINTEGER value.
 */
#define SQL_RD_OFF						0UL
#define SQL_RD_ON						1UL
#define SQL_RD_DEFAULT					SQL_RD_ON

/*
 * SQLSet/GetStmtOptions: BIND_TYPE: SQLUINTEGER. sets binding orientation.
 */
#define SQL_BIND_BY_COLUMN				0UL
#define SQL_BIND_TYPE_DEFAULT			SQL_BIND_BY_COLUMN

/*
 * SQLSet/GetStmtOptions: ROW_OPERATION: SQLUSMALLINT *. Added in ODBC 3.0
 */
#define SQL_ROW_PROCEED					0
#define SQL_ROW_IGNORE					1

/*
 *	SQL_ROWSET_SIZE
 */
#define SQL_ROWSET_SIZE_DEFAULT			1UL

/*
 *	SQL_KEYSET_SIZE
 */
#define SQL_KEYSET_SIZE_DEFAULT			0UL

/*
 * SQLSet/GetStmtOptions: SIMULATE_CURSOR: SQLUINTEGER value that specifies
 * whether drivers that simulate positioned update and delete statements
 * guarantee that such statements affect only a single row.
 */
#define SQL_SC_NON_UNIQUE				0UL
#define SQL_SC_TRY_UNIQUE				1UL
#define SQL_SC_UNIQUE					2UL

/*
 * SQLSet/GetStmtOptions: USE_BOOKMARKS: SQLUINTEGER value that specifies
 * whether an application will use bookmarks with a cursor.
 */
#define SQL_UB_OFF						0UL
#define SQL_UB_ON						1UL
#define SQL_UB_FIXED					SQL_UB_ON		/* Deprecated in ODBC
														 * 3.0 */
#define SQL_UB_VARIABLE					2UL		/* Added in ODBC 3.0 */
#define SQL_UB_DEFAULT					SQL_UB_OFF

/* Deprecated */
#define SQL_DATABASE_NAME				16
#define SQL_FD_FETCH_PREV				SQL_FD_FETCH_PRIOR
#define SQL_FETCH_PREV					SQL_FETCH_PRIOR
#define SQL_CONCUR_TIMESTAMP			SQL_CONCUR_ROWVER
#define SQL_SCCO_OPT_TIMESTAMP			SQL_SCCO_OPT_ROWVER
#define SQL_CC_DELETE					SQL_CB_DELETE
#define SQL_CR_DELETE					SQL_CB_DELETE
#define SQL_CC_CLOSE					SQL_CB_CLOSE
#define SQL_CR_CLOSE					SQL_CB_CLOSE
#define SQL_CC_PRESERVE					SQL_CB_PRESERVE
#define SQL_CR_PRESERVE					SQL_CB_PRESERVE
#define SQL_FETCH_RESUME				7
#define SQL_SCROLL_FORWARD_ONLY			0L
#define SQL_SCROLL_KEYSET_DRIVEN		(-1L)
#define SQL_SCROLL_DYNAMIC				(-2L)
#define SQL_SCROLL_STATIC				(-3L)

/*
 *	ODBC keywords
 */
#define SQL_ODBC_KEYWORDS \
"ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\
"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\
"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\
"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\
"COBOL,COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\
"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\
"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\
"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\
"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\
"DISTINCT,DOMAIN,DOUBLE,DROP,"\
"ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\
"EXISTS,EXTERNAL,EXTRACT,"\
"FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\
"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\
"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\
"INPUT,INSENSITIVE,INSERT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\
"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\
"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,MUMPS,"\
"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\
"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\
"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\
"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\
"REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS,"\
"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SEQUENCE,SESSION,SESSION_USER,SET,SIZE,"\
"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\
"SUBSTRING,SUM,SYSTEM_USER,"\
"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\
"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\
"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\
"VALUE,,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,YEAR"

#ifdef __cplusplus
extern		"C"
{
#endif

	RETCODE SQL_API SQLSetConnectOption(HDBC, UWORD, UDWORD);
	RETCODE SQL_API SQLNumResultCols(HSTMT, SWORD FAR *);

/*
 *	 function prototypes previously missing from isqlext.h
 */
	RETCODE SQL_API SQLColumns(HSTMT hstmt,
										   UCHAR FAR * szTableQualifier,
										   SWORD cbTableQualifier,
										   UCHAR FAR * szTableOwner,
										   SWORD cbTableOwner,
										   UCHAR FAR * szTableName,
										   SWORD cbTableName,
										   UCHAR FAR * szColumnName,
										   SWORD cbColumnName);

	RETCODE SQL_API SQLDriverConnect(HDBC hdbc,
												 HWND hwnd,
												 UCHAR FAR * szConnStrIn,
												 SWORD cbConnStrIn,
												 UCHAR FAR * szConnStrOut,
												 SWORD cbConnStrOutMax,
											   SWORD FAR * pcbConnStrOut,
												 UWORD fDriverCompletion);

	RETCODE SQL_API SQLGetConnectOption(HDBC hdbc,
													UWORD fOption,
													PTR pvParam);

	RETCODE SQL_API SQLGetData(HSTMT hstmt,
										   UWORD icol,
										   SWORD fCType,
										   PTR rgbValue,
										   SDWORD cbValueMax,
										   SDWORD FAR * pcbValue);

	RETCODE SQL_API SQLGetFunctions(HDBC hdbc,
												UWORD fFunction,
												UWORD FAR * pfExists);

	RETCODE SQL_API SQLGetInfo(HDBC hdbc,
										   UWORD fInfoType,
										   PTR rgbInfoValue,
										   SWORD cbInfoValueMax,
										   SWORD FAR * pcbInfoValue);

	RETCODE SQL_API SQLGetStmtOption(HSTMT hstmt,
												 UWORD fOption,
												 PTR pvParam);

	RETCODE SQL_API SQLGetTypeInfo(HSTMT hstmt,
											   SWORD fSqlType);

	RETCODE SQL_API SQLParamData(HSTMT hstmt,
											 PTR FAR * prgbValue);

	RETCODE SQL_API SQLPutData(HSTMT hstmt,
										   PTR rgbValue,
										   SDWORD cbValue);

	RETCODE SQL_API SQLSetStmtOption(HSTMT hstmt,
												 UWORD fOption,
												 UDWORD vParam);

	RETCODE SQL_API SQLSpecialColumns(HSTMT hstmt,
												  UWORD fColType,
											UCHAR FAR * szTableQualifier,
												  SWORD cbTableQualifier,
												UCHAR FAR * szTableOwner,
												  SWORD cbTableOwner,
												  UCHAR FAR * szTableName,
												  SWORD cbTableName,
												  UWORD fScope,
												  UWORD fNullable);

	RETCODE SQL_API SQLStatistics(HSTMT hstmt,
											UCHAR FAR * szTableQualifier,
											  SWORD cbTableQualifier,
											  UCHAR FAR * szTableOwner,
											  SWORD cbTableOwner,
											  UCHAR FAR * szTableName,
											  SWORD cbTableName,
											  UWORD fUnique,
											  UWORD fAccuracy);

	RETCODE SQL_API SQLTables(HSTMT hstmt,
										  UCHAR FAR * szTableQualifier,
										  SWORD cbTableQualifier,
										  UCHAR FAR * szTableOwner,
										  SWORD cbTableOwner,
										  UCHAR FAR * szTableName,
										  SWORD cbTableName,
										  UCHAR FAR * szTableType,
										  SWORD cbTableType);

	RETCODE SQL_API SQLBrowseConnect(HDBC hdbc,
												 UCHAR FAR * szConnStrIn,
												 SWORD cbConnStrIn,
												 UCHAR FAR * szConnStrOut,
												 SWORD cbConnStrOutMax,
											  SWORD FAR * pcbConnStrOut);

	RETCODE SQL_API SQLColumnPrivileges(HSTMT hstmt,
											UCHAR FAR * szTableQualifier,
												  SWORD cbTableQualifier,
												UCHAR FAR * szTableOwner,
													SWORD cbTableOwner,
												 UCHAR FAR * szTableName,
													SWORD cbTableName,
												UCHAR FAR * szColumnName,
													SWORD cbColumnName);

	RETCODE SQL_API SQLDescribeParam(HSTMT hstmt,
												 UWORD ipar,
												 SWORD FAR * pfSqlType,
												 UDWORD FAR * pcbColDef,
												 SWORD FAR * pibScale,
												 SWORD FAR * pfNullable);

	RETCODE SQL_API SQLExtendedFetch(HSTMT hstmt,
												 UWORD fFetchType,
												 SDWORD irow,
												 UDWORD FAR * pcrow,
											   UWORD FAR * rgfRowStatus);

	RETCODE SQL_API SQLForeignKeys(HSTMT hstmt,
										  UCHAR FAR * szPkTableQualifier,
											   SWORD cbPkTableQualifier,
											   UCHAR FAR * szPkTableOwner,
											   SWORD cbPkTableOwner,
											   UCHAR FAR * szPkTableName,
											   SWORD cbPkTableName,
										  UCHAR FAR * szFkTableQualifier,
											   SWORD cbFkTableQualifier,
											   UCHAR FAR * szFkTableOwner,
											   SWORD cbFkTableOwner,
											   UCHAR FAR * szFkTableName,
											   SWORD cbFkTableName);

	RETCODE SQL_API SQLMoreResults(HSTMT hstmt);

	RETCODE SQL_API SQLNativeSql(HDBC hdbc,
											 UCHAR FAR * szSqlStrIn,
											 SDWORD cbSqlStrIn,
											 UCHAR FAR * szSqlStr,
											 SDWORD cbSqlStrMax,
											 SDWORD FAR * pcbSqlStr);

	RETCODE SQL_API SQLNumParams(HSTMT hstmt,
											 SWORD FAR * pcpar);

	RETCODE SQL_API SQLParamOptions(HSTMT hstmt,
												UDWORD crow,
												UDWORD FAR * pirow);

	RETCODE SQL_API SQLPrimaryKeys(HSTMT hstmt,
											UCHAR FAR * szTableQualifier,
											   SWORD cbTableQualifier,
											   UCHAR FAR * szTableOwner,
											   SWORD cbTableOwner,
											   UCHAR FAR * szTableName,
											   SWORD cbTableName);

	RETCODE SQL_API SQLProcedureColumns(HSTMT hstmt,
											 UCHAR FAR * szProcQualifier,
													SWORD cbProcQualifier,
												 UCHAR FAR * szProcOwner,
													SWORD cbProcOwner,
												  UCHAR FAR * szProcName,
													SWORD cbProcName,
												UCHAR FAR * szColumnName,
													SWORD cbColumnName);

	RETCODE SQL_API SQLProcedures(HSTMT hstmt,
											  UCHAR FAR * szProcQualifier,
											  SWORD cbProcQualifier,
											  UCHAR FAR * szProcOwner,
											  SWORD cbProcOwner,
											  UCHAR FAR * szProcName,
											  SWORD cbProcName);

	RETCODE SQL_API SQLSetPos(HSTMT hstmt,
										  UWORD irow,
										  UWORD fOption,
										  UWORD fLock);

	RETCODE SQL_API SQLTablePrivileges(HSTMT hstmt,
											UCHAR FAR * szTableQualifier,
												   SWORD cbTableQualifier,
												UCHAR FAR * szTableOwner,
												   SWORD cbTableOwner,
												 UCHAR FAR * szTableName,
												   SWORD cbTableName);

	RETCODE SQL_API SQLBindParameter(HSTMT hstmt,
												 UWORD ipar,
												 SWORD fParamType,
												 SWORD fCType,
												 SWORD fSqlType,
												 UDWORD cbColDef,
												 SWORD ibScale,
												 PTR rgbValue,
												 SDWORD cbValueMax,
												 SDWORD FAR * pcbValue);

	RETCODE SQL_API SQLSetScrollOptions(HSTMT hstmt,
													UWORD fConcurrency,
													SDWORD crowKeyset,
													UWORD crowRowset);


#ifdef __cplusplus
}
#endif

#endif
