From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/odbc32/proxyodbc.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index d31a08af14f..3dc7cbedce9 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -6016,6 +6016,7 @@ static SQLRETURN error_win32_w( struct environment *env, struct connection *con, SQLINTEGER *native_err, SQLWCHAR *msg, SQLSMALLINT buflen, SQLSMALLINT *retlen ) { const struct win32_funcs *win32_funcs; + SQLRETURN ret;
if (env) win32_funcs = env->hdr.win32_funcs; else if (con) win32_funcs = con->hdr.win32_funcs; @@ -6024,7 +6025,25 @@ static SQLRETURN error_win32_w( struct environment *env, struct connection *con, if (win32_funcs->SQLErrorW) return win32_funcs->SQLErrorW( env ? env->hdr.win32_handle : NULL, con ? con->hdr.win32_handle : NULL, stmt ? stmt->hdr.win32_handle : NULL, state, native_err, msg, buflen, retlen ); - if (win32_funcs->SQLError) FIXME( "Unicode to ANSI conversion not handled\n" ); + if (win32_funcs->SQLError) + { + SQLCHAR stateA[6], *msgA; + SQLSMALLINT lenA; + + if (!(msgA = malloc( buflen * sizeof(*msgA) ))) return SQL_ERROR; + ret = win32_funcs->SQLError( env ? env->hdr.win32_handle : NULL, con ? con->hdr.win32_handle : NULL, + stmt ? stmt->hdr.win32_handle : NULL, stateA, native_err, msgA, buflen, &lenA ); + if (SUCCESS( ret )) + { + int len = MultiByteToWideChar( CP_ACP, 0, (const char *)msgA, -1, msg, buflen ); + if (retlen) *retlen = len - 1; + MultiByteToWideChar( CP_ACP, 0, (const char *)stateA, -1, state, 6 ); + } + free( msgA ); + + return ret; + } + return SQL_ERROR; }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/odbc32/proxyodbc.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 3dc7cbedce9..7cfa442f493 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -1768,6 +1768,10 @@ static SQLRETURN error_win32_a( struct environment *env, struct connection *con, } free( msgW ); } + + if (win32_funcs->SQLGetDiagRec) FIXME("Use SQLGetDiagRec\n"); + else if (win32_funcs->SQLGetDiagRecW) FIXME("Use SQLGetDiagRecW\n"); + return ret; }
@@ -6044,6 +6048,9 @@ static SQLRETURN error_win32_w( struct environment *env, struct connection *con, return ret; }
+ if (win32_funcs->SQLGetDiagRecW) FIXME("Use SQLGetDiagRecW\n"); + else if (win32_funcs->SQLGetDiagRec) FIXME("Use SQLGetDiagRec\n"); + return SQL_ERROR; }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/odbc32/proxyodbc.c | 48 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 7cfa442f493..073ac716e33 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -1098,6 +1098,25 @@ static SQLWCHAR *strnAtoW( const SQLCHAR *str, int len ) return ret; }
+static SQLCHAR *strnWtoA( const SQLWCHAR *str, int len ) +{ + SQLCHAR *ret; + int lenA; + + if (!str) return NULL; + + if (len == SQL_NTS) len = -1; + lenA = WideCharToMultiByte( CP_ACP, 0, str, len, NULL, 0, NULL, NULL ); + + if ((ret = malloc( (lenA + 1) * sizeof(*ret) ))) + { + WideCharToMultiByte( CP_ACP, 0, str, len, (char *)ret, lenA, NULL, NULL ); + ret[lenA] = 0; + } + + return ret; +} + static SQLRETURN columns_unix_a( struct statement *stmt, SQLCHAR *catalog, SQLSMALLINT len1, SQLCHAR *schema, SQLSMALLINT len2, SQLCHAR *table, SQLSMALLINT len3, SQLCHAR *column, SQLSMALLINT len4 ) @@ -6870,14 +6889,35 @@ SQLRETURN WINAPI SQLColumnsW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQ }
static SQLRETURN driver_connect_win32_w( struct connection *con, SQLHWND window, SQLWCHAR *in_conn_str, - SQLSMALLINT len, SQLWCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2, + SQLSMALLINT len1, SQLWCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2, SQLUSMALLINT completion ) { + SQLRETURN ret = SQL_ERROR; + if (con->hdr.win32_funcs->SQLDriverConnectW) - return con->hdr.win32_funcs->SQLDriverConnectW( con->hdr.win32_handle, window, in_conn_str, len, out_conn_str, + return con->hdr.win32_funcs->SQLDriverConnectW( con->hdr.win32_handle, window, in_conn_str, len1, out_conn_str, buflen, len2, completion ); - if (con->hdr.win32_funcs->SQLDriverConnect) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; + if (con->hdr.win32_funcs->SQLDriverConnect) + { + SQLCHAR *in_conn_str_a, *out_conn_str_a; + SQLSMALLINT out_len; + + if (!(out_conn_str_a = malloc( buflen * sizeof(*out_conn_str_a) ))) return SQL_ERROR; + in_conn_str_a = strnWtoA( in_conn_str, len1 ); + + ret = con->hdr.win32_funcs->SQLDriverConnect( con->hdr.win32_handle, window, in_conn_str_a, SQL_NTS, out_conn_str_a, + buflen, &out_len, completion ); + if (SUCCESS( ret )) + { + int len = MultiByteToWideChar( CP_ACP, 0, (const char *)out_conn_str_a, -1, out_conn_str, buflen ); + if (len2) *len2 = len - 1; + } + + free(in_conn_str_a); + free(out_conn_str_a); + } + + return ret; }
static SQLRETURN driver_connect_unix_w( struct connection *con, SQLHWND window, SQLWCHAR *in_conn_str, SQLSMALLINT len,
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/odbc32/proxyodbc.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 073ac716e33..1fe678243e4 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7050,10 +7050,24 @@ static SQLRETURN get_info_unix_w( struct connection *con, SQLUSMALLINT type, SQL static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQLPOINTER value, SQLSMALLINT buflen, SQLSMALLINT *retlen ) { + SQLRETURN ret = SQL_ERROR; + if (con->hdr.win32_funcs->SQLGetInfoW) return con->hdr.win32_funcs->SQLGetInfoW( con->hdr.win32_handle, type, value, buflen, retlen ); - if (con->hdr.win32_funcs->SQLGetInfo) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; + + if (con->hdr.win32_funcs->SQLGetInfo) + { + switch (type) + { + case SQL_ODBC_API_CONFORMANCE: + ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); + break; + default: + FIXME( "Unicode to ANSI conversion not handled, for info type %u.\n", type ); + } + } + + return ret; }
/*************************************************************************
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 1fe678243e4..7bfdf17bf48 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7059,6 +7059,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ { switch (type) { + case SQL_ACTIVE_STATEMENTS: case SQL_ODBC_API_CONFORMANCE: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 7bfdf17bf48..aa5e9e7f7e3 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7059,6 +7059,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ { switch (type) { + case SQL_ACTIVE_CONNECTIONS: case SQL_ACTIVE_STATEMENTS: case SQL_ODBC_API_CONFORMANCE: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen );
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 aa5e9e7f7e3..c66c8268b4f 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7064,6 +7064,26 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_ODBC_API_CONFORMANCE: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break; + case SQL_DRIVER_NAME: + { + SQLSMALLINT lenA; + SQLCHAR *strA; + + /* For string types sizes are in bytes. */ + + buflen /= sizeof(WCHAR); + if (!(strA = malloc(buflen))) return SQL_ERROR; + + ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, strA, buflen, &lenA ); + if (SUCCESS( ret )) + { + int len = MultiByteToWideChar( CP_ACP, 0, (const char *)strA, -1, (WCHAR *)value, buflen ); + if (retlen) *retlen = (len - 1) * sizeof(WCHAR); + } + free( strA ); + + break; + } default: FIXME( "Unicode to ANSI conversion not handled, for info type %u.\n", type ); }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 c66c8268b4f..69d2e6122e3 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7062,6 +7062,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_TXN_CAPABLE: ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break; case SQL_DRIVER_NAME:
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 69d2e6122e3..0cf1f513ca1 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7066,6 +7066,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ ret = con->hdr.win32_funcs->SQLGetInfo( con->hdr.win32_handle, type, value, buflen, retlen ); break; case SQL_DRIVER_NAME: + case SQL_DBMS_NAME: { SQLSMALLINT lenA; SQLCHAR *strA;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 0cf1f513ca1..e028d5b1bad 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7067,6 +7067,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ break; case SQL_DRIVER_NAME: case SQL_DBMS_NAME: + case SQL_DATA_SOURCE_READ_ONLY: { SQLSMALLINT lenA; SQLCHAR *strA;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@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 e028d5b1bad..f5f2f6ade8a 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -7068,6 +7068,7 @@ static SQLRETURN get_info_win32_w( struct connection *con, SQLUSMALLINT type, SQ case SQL_DRIVER_NAME: case SQL_DBMS_NAME: case SQL_DATA_SOURCE_READ_ONLY: + case SQL_IDENTIFIER_QUOTE_CHAR: { SQLSMALLINT lenA; SQLCHAR *strA;
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/odbc32/proxyodbc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index f5f2f6ade8a..7645e0ba543 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -6122,10 +6122,19 @@ static SQLRETURN exec_direct_unix_w( struct statement *stmt, SQLWCHAR *text, SQL
static SQLRETURN exec_direct_win32_w( struct statement *stmt, SQLWCHAR *text, SQLINTEGER len ) { + SQLRETURN ret = SQL_ERROR; + if (stmt->hdr.win32_funcs->SQLExecDirectW) return stmt->hdr.win32_funcs->SQLExecDirectW( stmt->hdr.win32_handle, text, len ); - if (stmt->hdr.win32_funcs->SQLExecDirect) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; + + if (stmt->hdr.win32_funcs->SQLExecDirect) + { + SQLCHAR *textA = strnWtoA( text, len ); + ret = stmt->hdr.win32_funcs->SQLExecDirect( stmt->hdr.win32_handle, textA, SQL_NTS ); + free(textA); + } + + return ret; }
/*************************************************************************