-- v4: odbc32: SQLColAttributesW support ODBC v2.0 odbc32: SQLGetData support ODBC v2.0
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/odbc32/proxyodbc.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index dbe080f424f..0be72844311 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -325,6 +325,16 @@ static CRITICAL_SECTION_DEBUG loader_cs_debug = }; static CRITICAL_SECTION loader_cs = { &loader_cs_debug, -1, 0, 0, 0, 0 };
+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; @@ -2630,8 +2640,21 @@ static SQLRETURN get_data_win32( struct statement *stmt, SQLUSMALLINT column, SQ free( data ); return ret; } + else + { + struct connection *conn = (struct connection *)find_object_type(SQL_HANDLE_DBC, stmt->hdr.parent); + if (conn && conn->driver_odbc_ver < 0x300) + { + if (type == SQL_C_TYPE_TIME) + type = SQL_C_TIME; + else if (type == SQL_C_TYPE_DATE) + type = SQL_C_DATE; + else if (type == SQL_C_TYPE_TIMESTAMP) + type = SQL_C_TIMESTAMP; + }
- return stmt->hdr.win32_funcs->SQLGetData( stmt->hdr.win32_handle, column, type, value, buflen, retlen ); + return stmt->hdr.win32_funcs->SQLGetData( stmt->hdr.win32_handle, column, type, value, buflen, retlen ); + } }
/*************************************************************************
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/odbc32/proxyodbc.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 0be72844311..3a4a6743001 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -6454,6 +6454,10 @@ static SQLRETURN col_attribute_win32_w( struct statement *stmt, SQLUSMALLINT col SQLPOINTER char_attr, SQLSMALLINT buflen, SQLSMALLINT *retlen, SQLLEN *num_attr ) { + struct environment *env; + struct connection *conn; + SQLRETURN ret = SQL_ERROR; + if (stmt->hdr.win32_funcs->SQLColAttributeW) return stmt->hdr.win32_funcs->SQLColAttributeW( stmt->hdr.win32_handle, col, field_id, char_attr, buflen, retlen, num_attr ); @@ -6514,11 +6518,24 @@ static SQLRETURN col_attribute_win32_w( struct statement *stmt, SQLUSMALLINT col return SQL_ERROR; }
- return stmt->hdr.win32_funcs->SQLColAttributesW( stmt->hdr.win32_handle, col, field_id, char_attr, buflen, + ret = stmt->hdr.win32_funcs->SQLColAttributesW( stmt->hdr.win32_handle, col, field_id, char_attr, buflen, retlen, num_attr ); + /* Convert back for ODBC2 drivers */ + env = (struct environment *)find_object_type(SQL_HANDLE_ENV, stmt->hdr.parent); + conn = (struct connection *)find_object_type(SQL_HANDLE_DBC, stmt->hdr.parent); + if (SQL_SUCCEEDED(ret) && num_attr && field_id == SQL_COLUMN_TYPE && + env && env->attr_version == SQL_OV_ODBC3 && conn && conn->driver_odbc_ver < 0x300) + { + if (*num_attr == SQL_TIME) + *num_attr = SQL_TYPE_TIME; + else if (*num_attr == SQL_DATETIME) + *num_attr = SQL_TYPE_DATE; + else if (*num_attr == SQL_TIMESTAMP) + *num_attr = SQL_TYPE_TIMESTAMP; + } }
- return SQL_ERROR; + return ret; }
/*************************************************************************