From f5f196c547b33bf17657747a355ebb2acba4a5a9 Mon Sep 17 00:00:00 2001 From: joost Date: Sun, 30 Oct 2005 16:35:46 +0000 Subject: [PATCH] Patch from Bram Kuijvenhoven: - several updates for odbc v3 - added SQLGetDiagField git-svn-id: trunk@1604 - --- packages/base/odbc/odbcsql.pp | 164 +++++++++++++++++++++++++++++++--- 1 file changed, 152 insertions(+), 12 deletions(-) diff --git a/packages/base/odbc/odbcsql.pp b/packages/base/odbc/odbcsql.pp index 55abcef8ca..bc3a09cf18 100644 --- a/packages/base/odbc/odbcsql.pp +++ b/packages/base/odbc/odbcsql.pp @@ -1,10 +1,13 @@ unit odbcsql; -{$ifndef fpc} -{$I mODBC.INC} -{$else} + {$mode objfpc} {$h+} -{$define odbcver3} +{$macro on} + + // define ODBC version 3.51 by default +{$define ODBCVER:=$0351} +{$if ODBCVER >= $0300} + {$define ODBCVER3} {$endif} interface @@ -79,18 +82,144 @@ const {$endif} SQL_VARCHAR = 12; - SQL_C_LONG = SQL_INTEGER; {$ifdef ODBCVER3} SQL_TYPE_DATE = 91; SQL_TYPE_TIME = 92; SQL_TYPE_TIMESTAMP= 93; {$endif} - {ODBC2} SQL_DATE = 9; SQL_TIME = 10; SQL_TIMESTAMP = 11; - {end of Odbc2} + {$if ODBCVER >= $0300} + SQL_INTERVAL = 10; + {$endif} + {$if ODBCVER >= $0350} + SQL_GUID = -11; + {$endif} + + { interval codes} + {$ifdef ODBCVER3} + SQL_CODE_YEAR = 1; + SQL_CODE_MONTH = 2; + SQL_CODE_DAY = 3; + SQL_CODE_HOUR = 4; + SQL_CODE_MINUTE = 5; + SQL_CODE_SECOND = 6; + SQL_CODE_YEAR_TO_MONTH = 7; + SQL_CODE_DAY_TO_HOUR = 8; + SQL_CODE_DAY_TO_MINUTE = 9; + SQL_CODE_DAY_TO_SECOND = 10; + SQL_CODE_HOUR_TO_MINUTE = 11; + SQL_CODE_HOUR_TO_SECOND = 12; + SQL_CODE_MINUTE_TO_SECOND = 13; + + SQL_INTERVAL_YEAR = 100 + SQL_CODE_YEAR; + SQL_INTERVAL_MONTH = 100 + SQL_CODE_MONTH; + SQL_INTERVAL_DAY = 100 + SQL_CODE_DAY; + SQL_INTERVAL_HOUR = 100 + SQL_CODE_HOUR; + SQL_INTERVAL_MINUTE = 100 + SQL_CODE_MINUTE; + SQL_INTERVAL_SECOND = 100 + SQL_CODE_SECOND; + SQL_INTERVAL_YEAR_TO_MONTH = 100 + SQL_CODE_YEAR_TO_MONTH; + SQL_INTERVAL_DAY_TO_HOUR = 100 + SQL_CODE_DAY_TO_HOUR; + SQL_INTERVAL_DAY_TO_MINUTE = 100 + SQL_CODE_DAY_TO_MINUTE; + SQL_INTERVAL_DAY_TO_SECOND = 100 + SQL_CODE_DAY_TO_SECOND; + SQL_INTERVAL_HOUR_TO_MINUTE = 100 + SQL_CODE_HOUR_TO_MINUTE; + SQL_INTERVAL_HOUR_TO_SECOND = 100 + SQL_CODE_HOUR_TO_SECOND; + SQL_INTERVAL_MINUTE_TO_SECOND = 100 + SQL_CODE_MINUTE_TO_SECOND; + {$else} + SQL_INTERVAL_YEAR = -80; + SQL_INTERVAL_MONTH = -81; + SQL_INTERVAL_YEAR_TO_MONTH = -82; + SQL_INTERVAL_DAY = -83; + SQL_INTERVAL_HOUR = -84; + SQL_INTERVAL_MINUTE = -85; + SQL_INTERVAL_SECOND = -86; + SQL_INTERVAL_DAY_TO_HOUR = -87; + SQL_INTERVAL_DAY_TO_MINUTE = -88; + SQL_INTERVAL_DAY_TO_SECOND = -89; + SQL_INTERVAL_HOUR_TO_MINUTE = -90; + SQL_INTERVAL_HOUR_TO_SECOND = -91; + SQL_INTERVAL_MINUTE_TO_SECOND = -92; + {$endif} + + { Unicode data type codes } + {$if ODBCVER <= $0300} + SQL_UNICODE = -95; + SQL_UNICODE_VARCHAR = -96; + SQL_UNICODE_LONGVARCHAR = -97; + SQL_UNICODE_CHAR = SQL_UNICODE; + {$else} + { The previous definitions for SQL_UNICODE_ are historical and obsolete } + SQL_UNICODE = SQL_WCHAR; + SQL_UNICODE_VARCHAR = SQL_WVARCHAR; + SQL_UNICODE_LONGVARCHAR = SQL_WLONGVARCHAR; + SQL_UNICODE_CHAR = SQL_WCHAR; + {$endif} + + { C datatype to SQL datatype mapping } + SQL_C_CHAR = SQL_CHAR; + SQL_C_LONG = SQL_INTEGER; + SQL_C_SHORT = SQL_SMALLINT; + SQL_C_FLOAT = SQL_REAL; + SQL_C_DOUBLE = SQL_DOUBLE; +{$ifdef ODBCVER3} + SQL_C_NUMERIC = SQL_NUMERIC; +{$endif} + SQL_C_DEFAULT = 99; + + SQL_SIGNED_OFFSET = -20; + SQL_UNSIGNED_OFFSET = -22; + + SQL_C_DATE = SQL_DATE; + SQL_C_TIME = SQL_TIME; + SQL_C_TIMESTAMP = SQL_TIMESTAMP; +{$ifdef ODBCVER3} + SQL_C_TYPE_DATE = SQL_TYPE_DATE; + SQL_C_TYPE_TIME = SQL_TYPE_TIME; + SQL_C_TYPE_TIMESTAMP = SQL_TYPE_TIMESTAMP; + SQL_C_INTERVAL_YEAR = SQL_INTERVAL_YEAR; + SQL_C_INTERVAL_MONTH = SQL_INTERVAL_MONTH; + SQL_C_INTERVAL_DAY = SQL_INTERVAL_DAY; + SQL_C_INTERVAL_HOUR = SQL_INTERVAL_HOUR; + SQL_C_INTERVAL_MINUTE = SQL_INTERVAL_MINUTE; + SQL_C_INTERVAL_SECOND = SQL_INTERVAL_SECOND; + SQL_C_INTERVAL_YEAR_TO_MONTH = SQL_INTERVAL_YEAR_TO_MONTH; + SQL_C_INTERVAL_DAY_TO_HOUR = SQL_INTERVAL_DAY_TO_HOUR; + SQL_C_INTERVAL_DAY_TO_MINUTE = SQL_INTERVAL_DAY_TO_MINUTE; + SQL_C_INTERVAL_DAY_TO_SECOND = SQL_INTERVAL_DAY_TO_SECOND; + SQL_C_INTERVAL_HOUR_TO_MINUTE = SQL_INTERVAL_HOUR_TO_MINUTE; + SQL_C_INTERVAL_HOUR_TO_SECOND = SQL_INTERVAL_HOUR_TO_SECOND; + SQL_C_INTERVAL_MINUTE_TO_SECOND = SQL_INTERVAL_MINUTE_TO_SECOND; +{$endif} + SQL_C_BINARY = SQL_BINARY; + SQL_C_BIT = SQL_BIT; +{$ifdef ODBCVER3} + SQL_C_SBIGINT = SQL_BIGINT+SQL_SIGNED_OFFSET; // SIGNED BIGINT + SQL_C_UBIGINT = SQL_BIGINT+SQL_UNSIGNED_OFFSET; // UNSIGNED BIGINT +{$endif} + SQL_C_TINYINT = SQL_TINYINT; + SQL_C_SLONG = SQL_C_LONG +SQL_SIGNED_OFFSET; // SIGNED INTEGER + SQL_C_SSHORT = SQL_C_SHORT+SQL_SIGNED_OFFSET; // SIGNED SMALLINT + SQL_C_STINYINT = SQL_TINYINT+SQL_SIGNED_OFFSET; // SIGNED TINYINT + SQL_C_ULONG = SQL_C_LONG +SQL_UNSIGNED_OFFSET; // UNSIGNED INTEGER + SQL_C_USHORT = SQL_C_SHORT+SQL_UNSIGNED_OFFSET; // UNSIGNED SMALLINT + SQL_C_UTINYINT = SQL_TINYINT+SQL_UNSIGNED_OFFSET; // UNSIGNED TINYINT + SQL_C_BOOKMARK = SQL_C_ULONG; // BOOKMARK + +{$if ODBCVER >= $0350} + SQL_C_GUID = SQL_GUID; +{$endif} + + SQL_TYPE_NULL = 0; +{$ifndef ODBCVER3} + SQL_TYPE_MIN = SQL_BIT; + SQL_TYPE_MAX = SQL_VARCHAR; +{$endif} + +{$ifdef ODBCVER3} + SQL_C_VARBOOKMARK = SQL_C_BINARY; +{$endif} SQL_NO_TOTAL = -4; @@ -350,6 +479,7 @@ const SQL_USE_BOOKMARKS =12; SQL_GET_BOOKMARK =13; // GetStmtOption Only */ SQL_ROW_NUMBER = 14; // GetStmtOption Only */ + SQL_ATTR_CURSOR_TYPE = SQL_CURSOR_TYPE; SQL_ATTR_CONCURRENCY = SQL_CONCURRENCY; SQL_ATTR_FETCH_BOOKMARK_PTR = 16; @@ -478,11 +608,6 @@ const SQL_DIAG_UPDATE_WHERE = 82; {$endif} { ODBCVER >= 0x0300 } - SQL_C_DEFAULT = 99; - SQL_UNSIGNED_OFFSET = (-22); - SQL_C_ULONG = (SQL_C_LONG+SQL_UNSIGNED_OFFSET); - SQL_C_BOOKMARK = SQL_C_ULONG; - { Statement attribute values for cursor sensitivity } {$ifdef ODBCVER3} SQL_UNSPECIFIED = 0; @@ -860,6 +985,11 @@ type TSQLGetDiagRec=function (HandleType:SQLSMALLINT; Sqlstate:PSQLCHAR;var NativeError:SQLINTEGER; MessageText:PSQLCHAR;BufferLength:SQLSMALLINT; var TextLength:SQLSMALLINT ):SQLRETURN;stdcall; + +type TSQLGetDiagField=function (HandleType:SQLSMALLINT; + Handle:SQLHANDLE;RecNumber:SQLSMALLINT; + DiagIdentifier:SQLSMALLINT;DiagInfoPtr:SQLPOINTER; + BufferLength:SQLSMALLINT;var StringLengthPtr:SQLSMALLINT):SQLRETURN;stdcall; type TSQLConnect=function (ConnectionHandle:SQLHDBC; ServerName:PSQLCHAR;NameLength1:SQLSMALLINT; @@ -1020,6 +1150,7 @@ var SQLProcedures:TSQLProcedures; var SQLColumns:TSQLColumns; var SQLSpecialColumns:TSQLSpecialColumns; var SQLGetDiagRec:TSQLGetDiagRec; +var SQLGetDiagField:TSQLGetDiagField; var SQLConnect:TSQLConnect; var SQLDisconnect:TSQLDisconnect; var SQLDriverConnect:TSQLDriverConnect; @@ -1090,6 +1221,14 @@ Const MessageText: PSQLCHAR; BufferLength: SQLSMALLINT; var TextLength: SQLSMALLINT ):SQLRETURN;{$ifdef win32}stdcall{$else}cdecl{$endif};external LibName; + function SQLGetDiagField( + HandleType:SQLSMALLINT; + Handle:SQLHANDLE; + RecNumber:SQLSMALLINT; + DiagIdentifier:SQLSMALLINT; + DiagInfoPtr:SQLPOINTER; + BufferLength:SQLSMALLINT; + var StringLengthPtr:SQLSMALLINT ):SQLRETURN;{$ifdef win32}stdcall{$else}cdecl{$endif};external LibName; function SQLConnect( ConnectionHandle:SQLHDBC; ServerName:PSQLCHAR; NameLength1:SQLSMALLINT; @@ -1484,6 +1623,7 @@ begin SQLColumns:=GetAdresstoFunction('SQLColumns'); SQLSpecialColumns:=GetAdresstoFunction('SQLSpecialColumns'); SQLGetDiagRec:=GetAdresstoFunction('SQLGetDiagRec'); + SQLGetDiagField:=GetAdresstoFunction('SQLGetDiagField'); SQLConnect:=GetAdresstoFunction('SQLConnect'); SQLDisconnect:=GetAdresstoFunction('SQLDisconnect'); SQLDriverConnect:=GetAdresstoFunction('SQLDriverConnect');