 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/odbc32.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/odbc32/odbc32.spec b/dlls/odbc32/odbc32.spec index 0de9bf2bf70..e0207385822 100644 --- a/dlls/odbc32/odbc32.spec +++ b/dlls/odbc32/odbc32.spec @@ -140,7 +140,7 @@ 238 stub SQLGetStmtAttrA 239 stub SQLSetConnectAttrA 240 stub SQLColumnsA -241 stub SQLDriverConnectA +241 stdcall SQLDriverConnectA(long long str long ptr long ptr long) SQLDriverConnect 242 stub SQLGetConnectOptionA 245 stub SQLGetInfoA 247 stub SQLGetTypeInfoA
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index dcb61aa3adb..5287073c162 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -427,6 +427,11 @@ static void unlock_object( struct object *obj ) LeaveCriticalSection( &obj->cs ); }
+static BOOL is_ansi_driver( struct object *obj ) +{ + return obj->win32_handle && !obj->win32_funcs->SQLConnectW; +} + static struct connection *create_connection( struct environment *env ) { struct connection *ret; @@ -2517,9 +2522,32 @@ static SQLRETURN get_data_unix( struct statement *stmt, SQLUSMALLINT column, SQL static SQLRETURN get_data_win32( struct statement *stmt, SQLUSMALLINT column, SQLSMALLINT type, SQLPOINTER value, SQLLEN buflen, SQLLEN *retlen ) { - if (stmt->hdr.win32_funcs->SQLGetData) - return stmt->hdr.win32_funcs->SQLGetData( stmt->hdr.win32_handle, column, type, value, buflen, retlen ); - return SQL_ERROR; + if (!stmt->hdr.win32_funcs->SQLGetData) + return SQL_ERROR; + + if (type == SQL_C_WCHAR && is_ansi_driver( &stmt->hdr )) + { + SQLLEN data_len = buflen / sizeof(WCHAR) - 1; + char *data = malloc( data_len ); + SQLRETURN ret; + + ret = stmt->hdr.win32_funcs->SQLGetData( stmt->hdr.win32_handle, + column, SQL_C_CHAR, data, data_len, &data_len ); + if (SUCCESS(ret) && data_len == -1) + { + if (retlen) *retlen = data_len; + } + else if (SUCCESS(ret)) + { + data_len = MultiByteToWideChar( CP_ACP, 0, data, data_len, value, buflen / sizeof(WCHAR) - 1 ); + ((WCHAR *)value)[data_len] = 0; + if (retlen) *retlen = data_len * sizeof(WCHAR); + } + free( data ); + return ret; + } + + return stmt->hdr.win32_funcs->SQLGetData( stmt->hdr.win32_handle, column, type, value, buflen, retlen ); }
/*************************************************************************
 
            From: Piotr Caban piotr@codeweavers.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 5287073c162..655d02b871a 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7367,11 +7367,28 @@ static SQLRETURN statistics_win32_w( struct statement *stmt, SQLWCHAR *catalog, SQLSMALLINT len2, SQLWCHAR *table, SQLSMALLINT len3, SQLUSMALLINT unique, SQLUSMALLINT reserved ) { + SQLRETURN ret = SQL_ERROR; + if (stmt->hdr.win32_funcs->SQLStatisticsW) return stmt->hdr.win32_funcs->SQLStatisticsW( stmt->hdr.win32_handle, catalog, len1, schema, len2, table, len3, unique, reserved ); - if (stmt->hdr.win32_funcs->SQLStatistics) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; + if (stmt->hdr.win32_funcs->SQLStatistics) + { + SQLCHAR *catalogA, *schemaA, *tableA; + + catalogA = strnWtoA( catalog, len1 ); + schemaA = strnWtoA( schema, len2 ); + tableA = strnWtoA( table, len3 ); + + ret = stmt->hdr.win32_funcs->SQLStatistics( stmt->hdr.win32_handle, catalogA, SQL_NTS, + schemaA, SQL_NTS, tableA, SQL_NTS, unique, reserved ); + + free( catalogA ); + free( schemaA ); + free( tableA ); + } + + return ret; }
/*************************************************************************
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 655d02b871a..085927d4a3c 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7119,6 +7119,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_ACTIVE_STATEMENTS: case SQL_ODBC_API_CONFORMANCE: case SQL_TXN_CAPABLE: + case SQL_STRING_FUNCTIONS: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break; case SQL_DRIVER_NAME:
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 085927d4a3c..d9023c48886 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7119,6 +7119,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_ACTIVE_STATEMENTS: case SQL_ODBC_API_CONFORMANCE: case SQL_TXN_CAPABLE: + case SQL_NUMERIC_FUNCTIONS: case SQL_STRING_FUNCTIONS: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break;
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index d9023c48886..ec34be8138b 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7121,6 +7121,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_TXN_CAPABLE: case SQL_NUMERIC_FUNCTIONS: case SQL_STRING_FUNCTIONS: + case SQL_TIMEDATE_FUNCTIONS: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break; case SQL_DRIVER_NAME:
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index ec34be8138b..3af530da81a 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7121,6 +7121,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_TXN_CAPABLE: case SQL_NUMERIC_FUNCTIONS: case SQL_STRING_FUNCTIONS: + case SQL_SYSTEM_FUNCTIONS: case SQL_TIMEDATE_FUNCTIONS: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break;
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 3af530da81a..1840a632e17 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7119,10 +7119,30 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_ACTIVE_STATEMENTS: case SQL_ODBC_API_CONFORMANCE: case SQL_TXN_CAPABLE: + case SQL_CONVERT_FUNCTIONS: case SQL_NUMERIC_FUNCTIONS: case SQL_STRING_FUNCTIONS: case SQL_SYSTEM_FUNCTIONS: case SQL_TIMEDATE_FUNCTIONS: + case SQL_CONVERT_BIGINT: + case SQL_CONVERT_BINARY: + case SQL_CONVERT_BIT: + case SQL_CONVERT_CHAR: + case SQL_CONVERT_DATE: + case SQL_CONVERT_DECIMAL: + case SQL_CONVERT_DOUBLE: + case SQL_CONVERT_FLOAT: + case SQL_CONVERT_INTEGER: + case SQL_CONVERT_LONGVARCHAR: + case SQL_CONVERT_NUMERIC: + case SQL_CONVERT_REAL: + case SQL_CONVERT_SMALLINT: + case SQL_CONVERT_TIME: + case SQL_CONVERT_TIMESTAMP: + case SQL_CONVERT_TINYINT: + case SQL_CONVERT_VARBINARY: + case SQL_CONVERT_VARCHAR: + case SQL_CONVERT_LONGVARBINARY: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break; case SQL_DRIVER_NAME:
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 1840a632e17..360d9848c6f 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7118,6 +7118,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_ACTIVE_CONNECTIONS: case SQL_ACTIVE_STATEMENTS: case SQL_ODBC_API_CONFORMANCE: + case SQL_CONCAT_NULL_BEHAVIOR: case SQL_TXN_CAPABLE: case SQL_CONVERT_FUNCTIONS: case SQL_NUMERIC_FUNCTIONS:
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 360d9848c6f..9367acbcf28 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7151,6 +7151,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_DATA_SOURCE_READ_ONLY: case SQL_IDENTIFIER_QUOTE_CHAR: case SQL_SEARCH_PATTERN_ESCAPE: + case SQL_EXPRESSIONS_IN_ORDERBY: { SQLSMALLINT lenA; SQLCHAR *strA;
 
            From: Piotr Caban piotr@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 9367acbcf28..4cdfe43fc2f 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7152,6 +7152,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_IDENTIFIER_QUOTE_CHAR: case SQL_SEARCH_PATTERN_ESCAPE: case SQL_EXPRESSIONS_IN_ORDERBY: + case SQL_ORDER_BY_COLUMNS_IN_SELECT: { SQLSMALLINT lenA; SQLCHAR *strA;

