From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 1 + dlls/odbc32/tests/odbc32.c | 10 ++++++++++ 2 files changed, 11 insertions(+)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 13eba50fdb4..d6e1888694f 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -432,6 +432,7 @@ static struct connection *create_connection( struct environment *env ) struct connection *ret; if (!(ret = calloc( 1, sizeof(*ret) ))) return NULL; init_object( &ret->hdr, SQL_HANDLE_DBC, &env->hdr ); + ret->attr_login_timeout = 15; return ret; }
diff --git a/dlls/odbc32/tests/odbc32.c b/dlls/odbc32/tests/odbc32.c index 9ef119c205a..905ab2ba482 100644 --- a/dlls/odbc32/tests/odbc32.c +++ b/dlls/odbc32/tests/odbc32.c @@ -126,6 +126,11 @@ static void test_SQLConnect( void ) ok( len == strlen(str), "got %d\n", len ); trace( "version %s\n", str );
+ timeout = 0xdeadbeef; + ret = SQLGetConnectAttr( con, SQL_ATTR_LOGIN_TIMEOUT, &timeout, sizeof(timeout), NULL ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + ok( timeout == 15, "wrong timeout %d\n", timeout ); + ret = SQLConnect( con, (SQLCHAR *)"winetest", SQL_NTS, (SQLCHAR *)"winetest", SQL_NTS, (SQLCHAR *)"winetest", SQL_NTS ); if (ret == SQL_ERROR) diag( con, SQL_HANDLE_DBC ); @@ -137,6 +142,11 @@ static void test_SQLConnect( void ) return; }
+ timeout = 0xdeadbeef; + ret = SQLGetConnectAttr( con, SQL_ATTR_LOGIN_TIMEOUT, &timeout, sizeof(timeout), NULL ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + todo_wine ok( !timeout, "wrong timeout %d\n", timeout ); + timeout = 0xdeadbeef; size = -1; ret = SQLGetConnectAttr( con, SQL_ATTR_CONNECTION_TIMEOUT, &timeout, sizeof(timeout), &size );
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 86 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index d6e1888694f..549ac4d87d2 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -949,7 +949,7 @@ static SQLRETURN col_attribute_win32_a( struct statement *stmt, SQLUSMALLINT col SQLPOINTER char_attr, SQLSMALLINT buflen, SQLSMALLINT *retlen, SQLLEN *num_attr ) { - SQLRETURN ret = SQL_ERROR; + SQLRETURN ret;
if (stmt->hdr.win32_funcs->SQLColAttribute) return stmt->hdr.win32_funcs->SQLColAttribute( stmt->hdr.win32_handle, col, field_id, char_attr, buflen, @@ -975,8 +975,46 @@ static SQLRETURN col_attribute_win32_a( struct statement *stmt, SQLUSMALLINT col } free( strW ); } + return ret; } - return ret; + + if (stmt->hdr.win32_funcs->SQLColAttributes) + { + if (buflen < 0) return SQL_ERROR; + if (!col) + { + FIXME( "column 0 not handled\n" ); + return SQL_ERROR; + } + + switch (field_id) + { + case SQL_COLUMN_COUNT: + field_id = SQL_DESC_COUNT; + break; + + case SQL_COLUMN_NAME: + field_id = SQL_DESC_NAME; + break; + + case SQL_COLUMN_NULLABLE: + field_id = SQL_DESC_NULLABLE; + break; + + case SQL_COLUMN_TYPE: + case SQL_COLUMN_DISPLAY_SIZE: + break; + + default: + FIXME( "field id %u not handled\n", field_id ); + return SQL_ERROR; + } + + return stmt->hdr.win32_funcs->SQLColAttributes( stmt->hdr.win32_handle, col, field_id, char_attr, buflen, + retlen, num_attr ); + } + + return SQL_ERROR; }
/************************************************************************* @@ -6087,7 +6125,49 @@ static SQLRETURN col_attribute_win32_w( struct statement *stmt, SQLUSMALLINT col 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 ); - if (stmt->hdr.win32_funcs->SQLColAttribute) FIXME( "Unicode to ANSI conversion not handled\n" ); + + if (stmt->hdr.win32_funcs->SQLColAttribute) + { + FIXME( "Unicode to ANSI conversion not handled\n" ); + return SQL_ERROR; + } + + if (stmt->hdr.win32_funcs->SQLColAttributesW) + { + if (buflen < 0) return SQL_ERROR; + if (!col) + { + FIXME( "column 0 not handled\n" ); + return SQL_ERROR; + } + + switch (field_id) + { + case SQL_COLUMN_COUNT: + field_id = SQL_DESC_COUNT; + break; + + case SQL_COLUMN_NAME: + field_id = SQL_DESC_NAME; + break; + + case SQL_COLUMN_NULLABLE: + field_id = SQL_DESC_NULLABLE; + break; + + case SQL_COLUMN_TYPE: + case SQL_COLUMN_DISPLAY_SIZE: + break; + + default: + FIXME( "field id %u not handled\n", field_id ); + return SQL_ERROR; + } + + return stmt->hdr.win32_funcs->SQLColAttributesW( stmt->hdr.win32_handle, col, field_id, char_attr, buflen, + retlen, num_attr ); + } + return SQL_ERROR; }
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 71 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 549ac4d87d2..49e16b1df08 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -2696,7 +2696,7 @@ static SQLRETURN get_diag_rec_unix_a( SQLSMALLINT type, struct object *obj, SQLS static SQLRETURN get_diag_rec_win32_a( SQLSMALLINT type, struct object *obj, SQLSMALLINT rec_num, SQLCHAR *state, SQLINTEGER *native_err, SQLCHAR *msg, SQLSMALLINT buflen, SQLSMALLINT *retlen ) { - SQLRETURN ret = SQL_ERROR; + SQLRETURN ret; SQLWCHAR stateW[6], *msgW; SQLSMALLINT lenW;
@@ -2716,8 +2716,39 @@ static SQLRETURN get_diag_rec_win32_a( SQLSMALLINT type, struct object *obj, SQL WideCharToMultiByte( CP_ACP, 0, stateW, -1, (char *)state, 6, NULL, NULL ); } free( msgW ); + return ret; } - return ret; + + if (obj->win32_funcs->SQLError) + { + SQLHENV env = NULL; + SQLHDBC con = NULL; + SQLHSTMT stmt = NULL; + + if (rec_num > 1) return SQL_NO_DATA; + + switch (type) + { + case SQL_HANDLE_ENV: + env = obj->win32_handle; + break; + + case SQL_HANDLE_DBC: + con = obj->win32_handle; + break; + + case SQL_HANDLE_STMT: + stmt = obj->win32_handle; + break; + + default: + return SQL_ERROR; + } + + return obj->win32_funcs->SQLError( env, con, stmt, state, native_err, msg, buflen, retlen ); + } + + return SQL_ERROR; }
/************************************************************************* @@ -6432,7 +6463,41 @@ static SQLRETURN get_diag_rec_win32_w( SQLSMALLINT type, struct object *obj, SQL if (obj->win32_funcs->SQLGetDiagRecW) return obj->win32_funcs->SQLGetDiagRecW( type, obj->win32_handle, rec_num, state, native_err, msg, buflen, retlen ); - if (obj->win32_funcs->SQLGetDiagRec) FIXME( "Unicode to ANSI conversion not handled\n" ); + if (obj->win32_funcs->SQLGetDiagRec) + { + FIXME( "Unicode to ANSI conversion not handled\n" ); + return SQL_ERROR; + } + + if (obj->win32_funcs->SQLErrorW) + { + SQLHENV env = NULL; + SQLHDBC con = NULL; + SQLHSTMT stmt = NULL; + + if (rec_num > 1) return SQL_NO_DATA; + + switch (type) + { + case SQL_HANDLE_ENV: + env = obj->win32_handle; + break; + + case SQL_HANDLE_DBC: + con = obj->win32_handle; + break; + + case SQL_HANDLE_STMT: + stmt = obj->win32_handle; + break; + + default: + return SQL_ERROR; + } + + return obj->win32_funcs->SQLErrorW( env, con, stmt, state, native_err, msg, buflen, retlen ); + } + return SQL_ERROR; }