From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/odbc32/proxyodbc.c | 28 ++++++++++++++++++++++++++++ dlls/odbc32/unixlib.h | 1 + 2 files changed, 29 insertions(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index d31a08af14f..a2e095425e0 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -323,6 +323,19 @@ static CRITICAL_SECTION_DEBUG loader_cs_debug = }; static CRITICAL_SECTION loader_cs = { &loader_cs_debug, -1, 0, 0, 0, 0 };
+static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQLPOINTER value, SQLSMALLINT buflen, + SQLSMALLINT *retlen ); + +static struct object *find_object_type(SQLSMALLINT type, struct object *object) +{ + while (object && object->type != type) + { + object = object->parent; + } + + return object; +} + static struct { UINT32 count; @@ -462,6 +475,7 @@ static struct environment *create_environment( void ) if (!(ret = calloc( 1, sizeof(*ret) ))) return NULL; init_object( &ret->hdr, SQL_HANDLE_ENV, NULL ); ret->attr_version = SQL_OV_ODBC2; + ret->driver_ver = SQL_OV_ODBC2; return ret; }
@@ -1342,6 +1356,20 @@ static void prepare_con( struct connection *con ) WARN( "failed to set connection timeout\n" ); if (set_con_attr( con, SQL_ATTR_LOGIN_TIMEOUT, INT_PTR(con->attr_login_timeout), 0 )) WARN( "failed to set login timeout\n" ); + + if (con->hdr.win32_handle) + { + WCHAR ver[16]; + SQLRETURN ret = SQL_ERROR; + + ret = get_info_win32_w( con, SQL_DRIVER_ODBC_VER, &ver, sizeof(ver), NULL); + if (SUCCESS( ret )) + { + struct environment *env = (struct environment *)find_object_type(SQL_HANDLE_ENV, con->hdr.parent); + long nMajor = _wtol( ver ); + env->driver_ver = nMajor == 2 ? SQL_OV_ODBC2 : SQL_OV_ODBC3; + } + } }
static SQLRETURN create_con( struct connection *con ) diff --git a/dlls/odbc32/unixlib.h b/dlls/odbc32/unixlib.h index c865a83711d..4ff13a68add 100644 --- a/dlls/odbc32/unixlib.h +++ b/dlls/odbc32/unixlib.h @@ -205,6 +205,7 @@ struct environment UINT32 sources_idx; void *sources_key; BOOL sources_system; + UINT32 driver_ver; };
struct connection