From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index a3732c001be..85d18d94139 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -187,15 +187,16 @@ static const char *debugstr_sqllen( SQLLEN len ) #endif }
-static BOOL resize_binding( struct param_binding *binding, UINT32 count ) +#define MAX_BINDING_PARAMS 1024 +static BOOL alloc_binding( struct param_binding *binding, UINT32 count ) { - struct param *tmp; - UINT32 new_count = max( binding->count, count ); - - if (!(tmp = realloc( binding->param, new_count * sizeof(*tmp) ))) return FALSE; - memset( tmp + binding->count, 0, (new_count - binding->count) * sizeof(*tmp) ); - binding->param = tmp; - binding->count = new_count; + if (count > MAX_BINDING_PARAMS) + { + FIXME( "increase maximum number of parameters\n" ); + return FALSE; + } + binding->count = count; + if (binding->param || (binding->param = calloc( MAX_BINDING_PARAMS, sizeof(*binding->param)))) return TRUE; return TRUE; }
@@ -219,7 +220,7 @@ SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, FIXME( "column 0 not handled\n" ); return SQL_ERROR; } - if (!resize_binding( &handle->bind_col, ColumnNumber )) return SQL_ERROR; + if (!alloc_binding( &handle->bind_col, ColumnNumber )) return SQL_ERROR; params.StatementHandle = handle->unix_handle; params.StrLen_or_Ind = &handle->bind_col.param[i].len; if (SUCCESS(( ret = ODBC_CALL( SQLBindCol, ¶ms )))) handle->bind_col.param[i].ptr = StrLen_or_Ind; @@ -259,7 +260,7 @@ SQLRETURN WINAPI SQLBindParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNu FIXME( "parameter 0 not handled\n" ); return SQL_ERROR; } - if (!resize_binding( &handle->bind_param, ParameterNumber )) return SQL_ERROR; + if (!alloc_binding( &handle->bind_param, ParameterNumber )) return SQL_ERROR;
params.StatementHandle = handle->unix_handle; params.StrLen_or_Ind = &handle->bind_param.param[i].len; @@ -1884,7 +1885,7 @@ SQLRETURN WINAPI SQLBindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT Paramet FIXME( "parameter 0 not handled\n" ); return SQL_ERROR; } - if (!resize_binding( &handle->bind_parameter, ParameterNumber )) return SQL_ERROR; + if (!alloc_binding( &handle->bind_parameter, ParameterNumber )) return SQL_ERROR;
params.StatementHandle = handle->unix_handle; params.StrLen_or_Ind = &handle->bind_parameter.param[i].len;
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/proxyodbc.c | 142 +++++++++++++++++++++++++++++++--------- dlls/odbc32/unixlib.c | 6 +- dlls/odbc32/unixlib.h | 11 ++-- 3 files changed, 121 insertions(+), 38 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index 85d18d94139..658dda29a6c 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -47,6 +47,16 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
#define ODBC_CALL( func, params ) WINE_UNIX_CALL( unix_ ## func, params )
+static BOOL is_wow64; + +static struct handle *alloc_handle( void ) +{ + struct handle *ret; + if (!(ret = calloc( 1, sizeof(*ret) ))) return NULL; + ret->row_count = 1; + return ret; +} + /************************************************************************* * SQLAllocConnect [ODBC32.001] */ @@ -59,7 +69,7 @@ SQLRETURN WINAPI SQLAllocConnect(SQLHENV EnvironmentHandle, SQLHDBC *ConnectionH TRACE("(EnvironmentHandle %p, ConnectionHandle %p)\n", EnvironmentHandle, ConnectionHandle);
*ConnectionHandle = 0; - if (!(con = calloc( 1, sizeof(*con) ))) return SQL_ERROR; + if (!(con = alloc_handle())) return SQL_ERROR;
params.EnvironmentHandle = env->unix_handle; if (SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms )))) @@ -85,7 +95,7 @@ SQLRETURN WINAPI SQLAllocEnv(SQLHENV *EnvironmentHandle) TRACE("(EnvironmentHandle %p)\n", EnvironmentHandle);
*EnvironmentHandle = 0; - if (!(env = calloc( 1, sizeof(*env) ))) return SQL_ERROR; + if (!(env = alloc_handle())) return SQL_ERROR;
if (SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms )))) { @@ -110,7 +120,7 @@ SQLRETURN WINAPI SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, S TRACE("(HandleType %d, InputHandle %p, OutputHandle %p)\n", HandleType, InputHandle, OutputHandle);
*OutputHandle = 0; - if (!(output = calloc( 1, sizeof(*output) ))) return SQL_ERROR; + if (!(output = alloc_handle())) return SQL_ERROR;
params.HandleType = HandleType; params.InputHandle = input ? input->unix_handle : 0; @@ -137,7 +147,7 @@ SQLRETURN WINAPI SQLAllocStmt(SQLHDBC ConnectionHandle, SQLHSTMT *StatementHandl TRACE("(ConnectionHandle %p, StatementHandle %p)\n", ConnectionHandle, StatementHandle);
*StatementHandle = 0; - if (!(stmt = calloc( 1, sizeof(*stmt) ))) return SQL_ERROR; + if (!(stmt = alloc_handle())) return SQL_ERROR;
params.ConnectionHandle = con->unix_handle; if (SUCCESS((ret = ODBC_CALL( SQLAllocStmt, ¶ms )))) @@ -163,7 +173,7 @@ SQLRETURN WINAPI SQLAllocHandleStd(SQLSMALLINT HandleType, SQLHANDLE InputHandle TRACE("(HandleType %d, InputHandle %p, OutputHandle %p)\n", HandleType, InputHandle, OutputHandle);
*OutputHandle = 0; - if (!(output = calloc( 1, sizeof(*output) ))) return SQL_ERROR; + if (!(output = alloc_handle())) return SQL_ERROR;
params.HandleType = HandleType; params.InputHandle = input ? input->unix_handle : 0; @@ -188,15 +198,17 @@ static const char *debugstr_sqllen( SQLLEN len ) }
#define MAX_BINDING_PARAMS 1024 -static BOOL alloc_binding( struct param_binding *binding, UINT32 count ) +static BOOL alloc_binding( struct param_binding *binding, UINT column, UINT row_count ) { - if (count > MAX_BINDING_PARAMS) + if (column > MAX_BINDING_PARAMS) { FIXME( "increase maximum number of parameters\n" ); return FALSE; } - binding->count = count; - if (binding->param || (binding->param = calloc( MAX_BINDING_PARAMS, sizeof(*binding->param)))) return TRUE; + if (!binding->param && !(binding->param = calloc( MAX_BINDING_PARAMS, sizeof(*binding->param)))) return FALSE; + + if (!(binding->param[column - 1].len = calloc( row_count, sizeof(UINT64) ))) return FALSE; + binding->count = column; return TRUE; }
@@ -220,9 +232,10 @@ SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, FIXME( "column 0 not handled\n" ); return SQL_ERROR; } - if (!alloc_binding( &handle->bind_col, ColumnNumber )) return SQL_ERROR; + if (!alloc_binding( &handle->bind_col, ColumnNumber, handle->row_count )) return SQL_ERROR; params.StatementHandle = handle->unix_handle; - params.StrLen_or_Ind = &handle->bind_col.param[i].len; + params.StrLen_or_Ind = handle->bind_col.param[i].len; + *(UINT64 *)params.StrLen_or_Ind = *StrLen_or_Ind; if (SUCCESS(( ret = ODBC_CALL( SQLBindCol, ¶ms )))) handle->bind_col.param[i].ptr = StrLen_or_Ind; TRACE ("Returning %d\n", ret); return ret; @@ -260,10 +273,11 @@ SQLRETURN WINAPI SQLBindParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNu FIXME( "parameter 0 not handled\n" ); return SQL_ERROR; } - if (!alloc_binding( &handle->bind_param, ParameterNumber )) return SQL_ERROR; + if (!alloc_binding( &handle->bind_param, ParameterNumber, handle->row_count )) return SQL_ERROR;
params.StatementHandle = handle->unix_handle; - params.StrLen_or_Ind = &handle->bind_param.param[i].len; + params.StrLen_or_Ind = handle->bind_param.param[i].len; + *(UINT64 *)params.StrLen_or_Ind = *StrLen_or_Ind; if (SUCCESS(( ret = ODBC_CALL( SQLBindParam, ¶ms )))) handle->bind_param.param[i].ptr = StrLen_or_Ind; TRACE ("Returning %d\n", ret); return ret; @@ -593,22 +607,39 @@ SQLRETURN WINAPI SQLExecute(SQLHSTMT StatementHandle)
static void update_result_lengths( struct handle *handle ) { - UINT i; + UINT i, j, width = sizeof(void *) == 8 ? 8 : is_wow64 ? 8 : 4; + for (i = 0; i < handle->bind_col.count; i++) { - if (handle->bind_col.param[i].ptr) - *(SQLLEN *)handle->bind_col.param[i].ptr = handle->bind_col.param[i].len; + SQLLEN *ptr = handle->bind_col.param[i].ptr; + if (ptr) + { + for (j = 0; j < handle->row_count; j++) + { + *ptr++ = *(SQLLEN *)(handle->bind_col.param[i].len + j * width); + } + } } for (i = 0; i < handle->bind_param.count; i++) { - if (handle->bind_param.param[i].ptr) - *(SQLLEN *)handle->bind_param.param[i].ptr = handle->bind_param.param[i].len; + SQLLEN *ptr = handle->bind_param.param[i].ptr; + if (ptr) + { + for (j = 0; j < handle->row_count; j++) + { + *ptr++ = *(SQLLEN *)(handle->bind_param.param[i].len + j * width); + } + } } for (i = 0; i < handle->bind_parameter.count; i++) { - if (handle->bind_parameter.param[i].ptr) + SQLLEN *ptr = handle->bind_parameter.param[i].ptr; + if (ptr) { - *(SQLLEN *)handle->bind_parameter.param[i].ptr = handle->bind_parameter.param[i].len; + for (j = 0; j < handle->row_count; j++) + { + *ptr++ = *(SQLLEN *)(handle->bind_parameter.param[i].len + j * width); + } } } } @@ -694,9 +725,21 @@ SQLRETURN WINAPI SQLFreeEnv(SQLHENV EnvironmentHandle)
static void free_bindings( struct handle *handle ) { - free( handle->bind_col.param ); - free( handle->bind_param.param ); - free( handle->bind_parameter.param ); + if (handle->bind_col.param) + { + free( handle->bind_col.param->len ); + free( handle->bind_col.param ); + } + if (handle->bind_param.param) + { + free( handle->bind_param.param->len ); + free( handle->bind_param.param ); + } + if (handle->bind_parameter.param) + { + free( handle->bind_parameter.param->len ); + free( handle->bind_parameter.param ); + } }
/************************************************************************* @@ -1306,6 +1349,30 @@ SQLRETURN WINAPI SQLSetParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNum return ret; }
+static BOOL resize_result_lengths( struct handle *handle, UINT size ) +{ + UINT i; + for (i = 0; i < handle->bind_col.count; i++) + { + UINT8 *tmp = realloc( handle->bind_col.param[i].len, size * sizeof(UINT64) ); + if (!tmp) return FALSE; + handle->bind_col.param[i].len = tmp; + } + for (i = 0; i < handle->bind_param.count; i++) + { + UINT8 *tmp = realloc( handle->bind_param.param[i].len, size * sizeof(UINT64) ); + if (!tmp) return FALSE; + handle->bind_param.param[i].len = tmp; + } + for (i = 0; i < handle->bind_parameter.count; i++) + { + UINT8 *tmp = realloc( handle->bind_parameter.param[i].len, size * sizeof(UINT64) ); + if (!tmp) return FALSE; + handle->bind_parameter.param[i].len = tmp; + } + return TRUE; +} + /************************************************************************* * SQLSetStmtAttr [ODBC32.076] */ @@ -1322,7 +1389,16 @@ SQLRETURN WINAPI SQLSetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, if (!handle) return SQL_INVALID_HANDLE;
params.StatementHandle = handle->unix_handle; - ret = ODBC_CALL( SQLSetStmtAttr, ¶ms ); + if (SUCCESS((ret = ODBC_CALL( SQLSetStmtAttr, ¶ms )))) + { + SQLULEN row_count = (SQLULEN)Value; + if (Attribute == SQL_ATTR_ROW_ARRAY_SIZE && row_count != handle->row_count) + { + TRACE( "resizing result length array\n" ); + if (!resize_result_lengths( handle, row_count )) ret = SQL_ERROR; + else handle->row_count = row_count; + } + } TRACE("Returning %d\n", ret); return ret; } @@ -1885,10 +1961,11 @@ SQLRETURN WINAPI SQLBindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT Paramet FIXME( "parameter 0 not handled\n" ); return SQL_ERROR; } - if (!alloc_binding( &handle->bind_parameter, ParameterNumber )) return SQL_ERROR; + if (!alloc_binding( &handle->bind_parameter, ParameterNumber, handle->row_count )) return SQL_ERROR;
params.StatementHandle = handle->unix_handle; - params.StrLen_or_Ind = &handle->bind_parameter.param[i].len; + params.StrLen_or_Ind = handle->bind_parameter.param[i].len; + *(UINT64 *)params.StrLen_or_Ind = *StrLen_or_Ind; if (SUCCESS((ret = ODBC_CALL( SQLBindParameter, ¶ms )))) handle->bind_parameter.param[i].ptr = StrLen_or_Ind; TRACE("Returning %d\n", ret); return ret; @@ -2887,11 +2964,15 @@ SQLRETURN WINAPI SQLSetStmtAttrW(SQLHSTMT StatementHandle, SQLINTEGER Attribute, if (!handle) return SQL_INVALID_HANDLE;
params.StatementHandle = handle->unix_handle; - ret = ODBC_CALL( SQLSetStmtAttrW, ¶ms ); - if (ret == SQL_ERROR && (Attribute == SQL_ROWSET_SIZE || Attribute == SQL_ATTR_ROW_ARRAY_SIZE)) + if (SUCCESS((ret = ODBC_CALL( SQLSetStmtAttrW, ¶ms )))) { - TRACE("CHEAT: returning SQL_SUCCESS to ADO\n"); - return SQL_SUCCESS; + SQLULEN row_count = (SQLULEN)Value; + if (Attribute == SQL_ATTR_ROW_ARRAY_SIZE && row_count != handle->row_count) + { + TRACE( "resizing result length array\n" ); + if (!resize_result_lengths( handle, row_count )) ret = SQL_ERROR; + else handle->row_count = row_count; + } }
TRACE("Returning %d\n", ret); @@ -2924,6 +3005,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved) { if (WINE_UNIX_CALL( process_attach, NULL )) __wine_unixlib_handle = 0; } + IsWow64Process( GetCurrentProcess(), &is_wow64 ); break;
case DLL_PROCESS_DETACH: diff --git a/dlls/odbc32/unixlib.c b/dlls/odbc32/unixlib.c index dbc0da8d274..cc963c5a893 100644 --- a/dlls/odbc32/unixlib.c +++ b/dlls/odbc32/unixlib.c @@ -368,7 +368,7 @@ static NTSTATUS wrap_SQLBindCol( void *args ) { struct SQLBindCol_params *params = args; return SQLBindCol( (SQLHSTMT)(ULONG_PTR)params->StatementHandle, params->ColumnNumber, params->TargetType, - params->TargetValue, params->BufferLength, (SQLLEN *)(ULONG_PTR)params->StrLen_or_Ind ); + params->TargetValue, params->BufferLength, params->StrLen_or_Ind ); }
static NTSTATUS wrap_SQLBindParam( void *args ) @@ -376,7 +376,7 @@ static NTSTATUS wrap_SQLBindParam( void *args ) struct SQLBindParam_params *params = args; return SQLBindParam( (SQLHSTMT)(ULONG_PTR)params->StatementHandle, params->ParameterNumber, params->ValueType, params->ParameterType, params->LengthPrecision, params->ParameterScale, - params->ParameterValue, (SQLLEN *)(ULONG_PTR)params->StrLen_or_Ind ); + params->ParameterValue, params->StrLen_or_Ind ); }
static NTSTATUS wrap_SQLBindParameter( void *args ) @@ -385,7 +385,7 @@ static NTSTATUS wrap_SQLBindParameter( void *args ) return SQLBindParameter( (SQLHSTMT)(ULONG_PTR)params->StatementHandle, params->ParameterNumber, params->InputOutputType, params->ValueType, params->ParameterType, params->ColumnSize, params->DecimalDigits, params->ParameterValue, params->BufferLength, - (SQLLEN *)(ULONG_PTR)params->StrLen_or_Ind ); + params->StrLen_or_Ind ); }
static NTSTATUS wrap_SQLBrowseConnect( void *args ) diff --git a/dlls/odbc32/unixlib.h b/dlls/odbc32/unixlib.h index ed5f0129fd2..87ee271904f 100644 --- a/dlls/odbc32/unixlib.h +++ b/dlls/odbc32/unixlib.h @@ -154,8 +154,8 @@ enum sql_funcs
struct param { - INT64 len; /* result length stored in Unix lib */ - void *ptr; /* result length ptr passed by client */ + UINT8 *len; /* result length array stored in Unix lib */ + void *ptr; /* result length ptr passed by client */ };
struct param_binding @@ -170,6 +170,7 @@ struct handle struct param_binding bind_col; struct param_binding bind_param; struct param_binding bind_parameter; + UINT32 row_count; /* number of rows returned by SQLFetch() */ };
struct SQLAllocConnect_params @@ -210,7 +211,7 @@ struct SQLBindCol_params INT16 TargetType; void *TargetValue; INT64 BufferLength; - INT64 *StrLen_or_Ind; + void *StrLen_or_Ind; };
struct SQLBindParam_params @@ -222,7 +223,7 @@ struct SQLBindParam_params UINT64 LengthPrecision; INT16 ParameterScale; void *ParameterValue; - INT64 *StrLen_or_Ind; + void *StrLen_or_Ind; };
struct SQLBindParameter_params @@ -236,7 +237,7 @@ struct SQLBindParameter_params INT16 DecimalDigits; void *ParameterValue; INT64 BufferLength; - INT64 *StrLen_or_Ind; + void *StrLen_or_Ind; };
struct SQLBrowseConnect_params
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/unixlib.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/odbc32/unixlib.h b/dlls/odbc32/unixlib.h index 87ee271904f..c021eb22c50 100644 --- a/dlls/odbc32/unixlib.h +++ b/dlls/odbc32/unixlib.h @@ -29,7 +29,7 @@ #include "winbase.h" #include "wine/unixlib.h"
-#define SUCCESS(ret) (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) +static inline BOOL SUCCESS( SQLRETURN ret ) { return ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO; }
enum sql_funcs {
From: Hans Leidekker hans@codeweavers.com
--- dlls/odbc32/tests/odbc32.c | 123 ++++++++++++++++++++++++++++++++----- 1 file changed, 107 insertions(+), 16 deletions(-)
diff --git a/dlls/odbc32/tests/odbc32.c b/dlls/odbc32/tests/odbc32.c index 8a744f23834..57bb17ef617 100644 --- a/dlls/odbc32/tests/odbc32.c +++ b/dlls/odbc32/tests/odbc32.c @@ -198,8 +198,9 @@ static void test_SQLExecDirect( void ) SQLHDBC con; SQLHSTMT stmt; SQLRETURN ret; - SQLLEN count, len_id, len_name; - SQLINTEGER id; + SQLLEN count, len_id[2], len_name[2]; + SQLULEN rows_fetched; + SQLINTEGER id[2]; SQLCHAR name[32];
ret = SQLAllocEnv( &env ); @@ -232,6 +233,11 @@ static void test_SQLExecDirect( void ) ok( ret == SQL_SUCCESS, "got %d\n", ret ); if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT );
+ ret = SQLExecDirect( stmt, (SQLCHAR *)"INSERT INTO winetest VALUES (1, 'Mary')", + ARRAYSIZE("INSERT INTO winetest VALUES (1, 'Mary')") - 1 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + ret = SQLExecDirect( stmt, (SQLCHAR *)"SELECT * FROM winetest", ARRAYSIZE("SELECT * FROM winetest") - 1 ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); @@ -239,17 +245,17 @@ static void test_SQLExecDirect( void ) count = 0xdeadbeef; ret = SQLRowCount( stmt, &count ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( count != 0xdeadbeef, "got %d\n", (int)count ); + ok( count == 2, "got %d\n", (int)count );
ret = SQLFetch( stmt ); ok( ret == SQL_SUCCESS, "got %d\n", ret );
- id = -1; - len_id = 0; - ret = SQLGetData( stmt, 1, SQL_C_SLONG, &id, sizeof(id), &len_id ); + id[0] = -1; + len_id[0] = 0; + ret = SQLGetData( stmt, 1, SQL_C_SLONG, id, sizeof(id[0]), len_id ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( !id, "id not set\n" ); - ok( len_id == sizeof(id), "got %d\n", (int)len_id ); + ok( !id[0], "id not set\n" ); + ok( len_id[0] == sizeof(id[0]), "got %d\n", (int)len_id[0] );
ret = SQLFreeStmt( stmt, 0 ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); @@ -261,25 +267,110 @@ static void test_SQLExecDirect( void ) ok( ret == SQL_SUCCESS, "got %d\n", ret ); if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT );
- id = -1; - len_id = 0; - ret = SQLBindCol( stmt, 1, SQL_C_SLONG, &id, sizeof(id), &len_id ); + ret = SQLSetStmtAttr( stmt, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER)2, 0 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + rows_fetched = 0xdeadbeef; + ret = SQLSetStmtAttr( stmt, SQL_ATTR_ROWS_FETCHED_PTR, (SQLPOINTER)&rows_fetched, 0 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + id[0] = -1; + id[1] = -1; + len_id[0] = 0; + len_id[1] = 0; + ret = SQLBindCol( stmt, 1, SQL_C_SLONG, id, sizeof(id), len_id ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT );
memset( name, 0, sizeof(name) ); - len_name = 0; - ret = SQLBindCol( stmt, 2, SQL_C_CHAR, name, sizeof(name), &len_name ); + len_name[0] = 0; + len_name[1] = 0; + ret = SQLBindCol( stmt, 2, SQL_C_CHAR, name, sizeof(name), len_name ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT );
ret = SQLFetch( stmt ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( !id, "id not set\n" ); - ok( len_id == sizeof(id), "got %d\n", (int)len_id ); + ok( rows_fetched == 2, "got %d\n", (int)rows_fetched ); + ok( id[0] == 0, "got %d\n", id[0] ); + ok( id[1] == 1, "got %d\n", id[1] ); + ok( len_id[0] == sizeof(id[0]), "got %d\n", (int)len_id[0] ); + ok( len_id[1] == sizeof(id[1]), "got %d\n", (int)len_id[1] ); ok( !strcmp( (const char *)name, "John" ), "got %s\n", name ); - ok( len_name == sizeof("John") - 1, "got %d\n", (int)len_name ); + ok( len_name[0] == sizeof("John") - 1, "got %d\n", (int)len_name[0] ); + ok( len_name[1] == sizeof("Mary") - 1, "got %d\n", (int)len_name[1] ); + + ret = SQLFreeStmt( stmt, 0 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + + ret = SQLAllocStmt( con, &stmt ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + + ret = SQLPrepare( stmt, (SQLCHAR *)"SELECT * FROM winetest WHERE Id = ? AND Name = ?", + ARRAYSIZE("SELECT * FROM winetest WHERE Id = ? AND Name = ?") - 1 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + id[0] = 1; + len_id[0] = sizeof(id[0]); + ret = SQLBindParam( stmt, 1, SQL_INTEGER, SQL_INTEGER, 0, 0, id, len_id ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + memcpy( name, "Mary", sizeof("Mary") ); + len_name[0] = sizeof( "Mary" ) - 1; + ret = SQLBindParam( stmt, 2, SQL_CHAR, SQL_VARCHAR, 0, 0, name, len_name ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + ret = SQLExecute( stmt ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + ret = SQLFetch( stmt ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + ok( id[0] == 1, "got %d\n", id[0] ); + ok( len_id[0] == sizeof(id[0]), "got %d\n", (int)len_id[0] ); + ok( !strcmp( (const char *)name, "Mary" ), "got %s\n", name ); + ok( len_name[0] == sizeof("Mary") - 1, "got %d\n", (int)len_name[0] ); + + ret = SQLFreeStmt( stmt, 0 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + + ret = SQLAllocStmt( con, &stmt ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + + ret = SQLPrepare( stmt, (SQLCHAR *)"SELECT * FROM winetest WHERE Id = ? AND Name = ?", + ARRAYSIZE("SELECT * FROM winetest WHERE Id = ? AND Name = ?") - 1 ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + id[0] = 1; + len_id[0] = sizeof(id[0]); + ret = SQLBindParameter( stmt, 1, SQL_PARAM_INPUT, SQL_INTEGER, SQL_INTEGER, 0, 0, id, 0, len_id ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + memcpy( name, "Mary", sizeof("Mary") ); + len_name[0] = sizeof( "Mary" ) - 1; + ret = SQLBindParameter( stmt, 2, SQL_PARAM_INPUT, SQL_CHAR, SQL_VARCHAR, 0, 0, name, 0, len_name ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT );
+ ret = SQLExecute( stmt ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + + ret = SQLFetch( stmt ); + ok( ret == SQL_SUCCESS, "got %d\n", ret ); + if (ret == SQL_ERROR) diag( stmt, SQL_HANDLE_STMT ); + ok( id[0] == 1, "got %d\n", id[0] ); + ok( len_id[0] == sizeof(id[0]), "got %d\n", (int)len_id[0] ); + ok( !strcmp( (const char *)name, "Mary" ), "got %s\n", name ); + ok( len_name[0] == sizeof("Mary") - 1, "got %d\n", (int)len_name[0] ); ret = SQLFreeStmt( stmt, SQL_UNBIND ); ok( ret == SQL_SUCCESS, "got %d\n", ret );
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=146212
Your paranoid android.
=== debian11 (build log) ===
0120:err:winediag:SQLDrivers No ODBC drivers could be found. Check the settings for your libodbc provider. 0120:err:winediag:SQLDrivers No ODBC drivers could be found. Check the settings for your libodbc provider. 0120:err:winediag:SQLDrivers No ODBC drivers could be found. Check the settings for your libodbc provider. 0120:err:winediag:SQLDrivers No ODBC drivers could be found. Check the settings for your libodbc provider. 0120:err:winediag:SQLDrivers No ODBC drivers could be found. Check the settings for your libodbc provider. 0124:err:winediag:SQLDrivers No ODBC drivers could be found. Check the settings for your libodbc provider.