diff --git a/src/interfaces/odbc/connection.c b/src/interfaces/odbc/connection.c index d5b0d12dff..fe1344df8a 100644 --- a/src/interfaces/odbc/connection.c +++ b/src/interfaces/odbc/connection.c @@ -699,6 +699,7 @@ static char *func="CC_connect"; */ CC_send_settings(self); CC_lookup_lo(self); /* a hack to get the oid of our large object oid type */ + CC_lookup_pg_version(self); /* Get PostgreSQL version for SQLGetInfo use */ CC_clear_error(self); /* clear any initial command errors */ self->status = CONN_CONNECTED; @@ -1364,6 +1365,62 @@ static char *func = "CC_lookup_lo"; result = SQLFreeStmt(hstmt, SQL_DROP); } +/* This function gets the version of PostgreSQL that we're connected to. + This is used to return the correct info in SQLGetInfo + DJP - 25-1-2001 +*/ +void +CC_lookup_pg_version(ConnectionClass *self) +{ +HSTMT hstmt; +StatementClass *stmt; +RETCODE result; +char *szVersion = "0.0"; +static char *func = "CC_lookup_pg_version"; + + mylog( "%s: entering...\n", func); + +/* This function must use the local odbc API functions since the odbc state + has not transitioned to "connected" yet. +*/ + result = SQLAllocStmt( self, &hstmt); + if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + return; + } + stmt = (StatementClass *) hstmt; + + result = SQLExecDirect(hstmt, "select version()", SQL_NTS); + if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + SQLFreeStmt(hstmt, SQL_DROP); + return; + } + + result = SQLFetch(hstmt); + if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + SQLFreeStmt(hstmt, SQL_DROP); + return; + } + + result = SQLGetData(hstmt, 1, SQL_C_CHAR, self->pg_version, MAX_INFO_STRING, NULL); + if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) { + SQLFreeStmt(hstmt, SQL_DROP); + return; + } + + /* There's proably a nicer way of doing this... */ + /* Extract the Major and Minor numbers from the string. */ + /* This assumes the string starts 'Postgresql X.X' */ + sprintf(szVersion, "%c.%c", self->pg_version[11], self->pg_version[13]); + self->pg_version_number = (float) atof(szVersion); + + mylog("Got the PostgreSQL version string: '%s'\n", self->pg_version); + mylog("Extracted PostgreSQL version number: '%1.1f'\n", self->pg_version_number); + qlog(" [ PostgreSQL version string = '%s' ]\n", self->pg_version); + qlog(" [ PostgreSQL version number = '%1.1f' ]\n", self->pg_version_number); + + result = SQLFreeStmt(hstmt, SQL_DROP); +} + void CC_log_error(char *func, char *desc, ConnectionClass *self) { diff --git a/src/interfaces/odbc/connection.h b/src/interfaces/odbc/connection.h index 99841f33f0..8251271a05 100644 --- a/src/interfaces/odbc/connection.h +++ b/src/interfaces/odbc/connection.h @@ -221,6 +221,8 @@ struct ConnectionClass_ { DriverToDataSourceProc DriverToDataSource; char transact_status; /* Is a transaction is currently in progress */ char errormsg_created; /* has an informative error msg been created? */ + char pg_version[MAX_INFO_STRING]; /* Version of PostgreSQL we're connected to - DJP 25-1-2001 */ + float pg_version_number; }; @@ -255,6 +257,7 @@ char *CC_create_errormsg(ConnectionClass *self); int CC_send_function(ConnectionClass *conn, int fnid, void *result_buf, int *actual_result_len, int result_is_int, LO_ARG *argv, int nargs); char CC_send_settings(ConnectionClass *self); void CC_lookup_lo(ConnectionClass *conn); +void CC_lookup_pg_version(ConnectionClass *conn); void CC_log_error(char *func, char *desc, ConnectionClass *self); diff --git a/src/interfaces/odbc/info.c b/src/interfaces/odbc/info.c index 52b64bef41..681c72759d 100644 --- a/src/interfaces/odbc/info.c +++ b/src/interfaces/odbc/info.c @@ -191,7 +191,11 @@ RETCODE result; break; case SQL_DBMS_VER: /* ODBC 1.0 */ - p = DBMS_VERSION; + /* The ODBC spec wants ##.##.#### ...whatever... so prepend the driver */ + /* version number to the dbms version string */ + p = POSTGRESDRIVERVERSION; + strcat(p, " "); + strcat(p, conn->pg_version); break; case SQL_DEFAULT_TXN_ISOLATION: /* ODBC 1.0 */ @@ -337,7 +341,11 @@ RETCODE result; case SQL_MAX_ROW_SIZE: /* ODBC 2.0 */ len = 4; - value = MAX_ROW_SIZE; + if (conn->pg_version_number >= (float) 7.1) { /* Large Rowa in 7.1+ */ + value = MAX_ROW_SIZE; + } else { /* Without the Toaster we're limited to the blocksize */ + value = BLCKSZ; + } break; case SQL_MAX_ROW_SIZE_INCLUDES_LONG: /* ODBC 2.0 */ @@ -350,7 +358,11 @@ RETCODE result; case SQL_MAX_STATEMENT_LEN: /* ODBC 2.0 */ /* maybe this should be 0? */ len = 4; - value = MAX_STATEMENT_LEN; + if (conn->pg_version_number >= (float) 7.0) { /* Long Queries in 7.0+ */ + value = MAX_STATEMENT_LEN; + } else { /* Prior to 7.0 we used 2*BLCKSZ */ + value = (2*BLCKSZ); + } break; case SQL_MAX_TABLE_NAME_LEN: /* ODBC 1.0 */ @@ -419,13 +431,17 @@ RETCODE result; case SQL_OJ_CAPABILITIES: /* ODBC 2.01 */ len = 4; - value = (SQL_OJ_LEFT | - SQL_OJ_RIGHT | - SQL_OJ_FULL | - SQL_OJ_NESTED | - SQL_OJ_NOT_ORDERED | - SQL_OJ_INNER | - SQL_OJ_ALL_COMPARISON_OPS); + if (conn->pg_version_number >= (float) 7.1) { /* OJs in 7.1+ */ + value = (SQL_OJ_LEFT | + SQL_OJ_RIGHT | + SQL_OJ_FULL | + SQL_OJ_NESTED | + SQL_OJ_NOT_ORDERED | + SQL_OJ_INNER | + SQL_OJ_ALL_COMPARISON_OPS); + } else { /* OJs not in <7.1 */ + value = 0; + } break; case SQL_ORDER_BY_COLUMNS_IN_SELECT: /* ODBC 2.0 */ @@ -433,7 +449,11 @@ RETCODE result; break; case SQL_OUTER_JOINS: /* ODBC 1.0 */ - p = "Y"; + if (conn->pg_version_number >= (float) 7.1) { /* OJs in 7.1+ */ + p = "Y"; + } else { /* OJs not in <7.1 */ + p = "N"; + } break; case SQL_OWNER_TERM: /* ODBC 1.0 */ diff --git a/src/interfaces/odbc/psqlodbc.h b/src/interfaces/odbc/psqlodbc.h index b686a0e3b7..b0d8539eb7 100644 --- a/src/interfaces/odbc/psqlodbc.h +++ b/src/interfaces/odbc/psqlodbc.h @@ -6,7 +6,7 @@ * * Comments: See "notice.txt" for copyright and license information. * - * $Id: psqlodbc.h,v 1.28 2001/01/26 22:25:36 tgl Exp $ + * $Id: psqlodbc.h,v 1.29 2001/01/26 22:41:59 momjian Exp $ */ #ifndef __PSQLODBC_H__ @@ -41,8 +41,7 @@ typedef UInt4 Oid; #define DRIVERNAME "PostgreSQL ODBC" #define DBMS_NAME "PostgreSQL" -#define DBMS_VERSION "7.1.0000 PostgreSQL 7.1" -#define POSTGRESDRIVERVERSION "7.1.0000" +#define POSTGRESDRIVERVERSION "07.01.0001" #ifdef WIN32 #define DRIVER_FILE_NAME "PSQLODBC.DLL" diff --git a/src/interfaces/odbc/psqlodbc.rc b/src/interfaces/odbc/psqlodbc.rc index f8e27f8da6..1d934106d3 100644 --- a/src/interfaces/odbc/psqlodbc.rc +++ b/src/interfaces/odbc/psqlodbc.rc @@ -145,8 +145,8 @@ BEGIN CONTROL "Show System &Tables",DS_SHOWSYSTEMTABLES,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,25,25,85,10 GROUPBOX "Protocol",IDC_STATIC,15,40,180,25 - CONTROL "6.5/6.4",DS_PG64,"Button",BS_AUTORADIOBUTTON | WS_GROUP, - 25,50,35,10 + CONTROL "6.4+",DS_PG64,"Button",BS_AUTORADIOBUTTON | WS_GROUP,25, + 50,35,10 CONTROL "6.3",DS_PG63,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP, 75,50,26,10 CONTROL "6.2",DS_PG62,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP, @@ -204,8 +204,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 7,1,0,0 - PRODUCTVERSION 7,1,0,0 + FILEVERSION 7,1,0,1 + PRODUCTVERSION 7,1,0,1 FILEFLAGSMASK 0x3L #ifdef _DEBUG FILEFLAGS 0x1L @@ -223,14 +223,14 @@ BEGIN VALUE "Comments", "PostgreSQL ODBC driver\0" VALUE "CompanyName", "Insight Distribution Systems\0" VALUE "FileDescription", "PostgreSQL Driver\0" - VALUE "FileVersion", " 7.1.0000\0" + VALUE "FileVersion", " 07.01.0001\0" VALUE "InternalName", "psqlodbc\0" VALUE "LegalCopyright", "\0" VALUE "LegalTrademarks", "ODBC(TM) is a trademark of Microsoft Corporation. Microsoft® is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0" VALUE "OriginalFilename", "psqlodbc.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "Microsoft Open Database Connectivity\0" - VALUE "ProductVersion", " 7.1.0000\0" + VALUE "ProductVersion", " 07.01.0001\0" VALUE "SpecialBuild", "\0" END END diff --git a/src/interfaces/odbc/resource.h b/src/interfaces/odbc/resource.h index 81e3c9961f..c823241d7e 100644 --- a/src/interfaces/odbc/resource.h +++ b/src/interfaces/odbc/resource.h @@ -1,7 +1,7 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Developer Studio generated include file. -// Used by psqlodbc.rc -// +/* {{NO_DEPENDENCIES}} */ +/* Microsoft Developer Studio generated include file. */ +/* Used by psqlodbc.rc */ + #define IDS_BADDSN 1 #define IDS_MSGTITLE 2 #define DLG_OPTIONS_DRV 102 @@ -50,8 +50,8 @@ #define DS_PG64 1057 #define DS_PG63 1058 -// Next default values for new objects -// +/* Next default values for new objects */ + #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 104