This corrects the field reference counter to work for wine but isn't exactly the same as windows.
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/msado15/recordset.c | 6 ++++++ dlls/msado15/tests/msado15.c | 12 ++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 0bd6b7ed61c..e2f2e6407fd 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -462,6 +462,7 @@ static HRESULT Field_create( const WCHAR *name, LONG index, struct recordset *re } field->index = index; field->recordset = recordset; + field->refs = 1;
*obj = &field->Field_iface; TRACE( "returning iface %p\n", *obj ); @@ -859,6 +860,7 @@ static ULONG WINAPI recordset_AddRef( _Recordset *iface ) static void close_recordset( struct recordset *recordset ) { ULONG row, col, col_count; + ULONG i;
if ( recordset->row_set ) IRowset_Release( recordset->row_set ); recordset->row_set = NULL; @@ -866,6 +868,10 @@ static void close_recordset( struct recordset *recordset ) if (!recordset->fields) return; col_count = get_column_count( recordset );
+ for (i=0; i < recordset->fields->count; i++) + Field_Release( recordset->fields->field[i] ); + recordset->fields->count = 0; + Fields_Release( &recordset->fields->Fields_iface ); recordset->fields = NULL;
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 4de75102e12..28d5412297d 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -286,6 +286,10 @@ static void test_Recordset(void) ok( hr == S_OK, "got %08x\n", hr ); ok( state == adStateClosed, "got %d\n", state );
+ count = -1; + hr = Fields_get_Count( fields2, &count ); + ok( !count , "got %d\n", count ); + Field_Release( field ); Fields_Release( fields ); _Recordset_Release( recordset ); @@ -697,7 +701,7 @@ static void test_Fields(void) hr = Fields_get_Item( fields, index, &field ); ok( hr == S_OK, "got %08x\n", hr ); refs = get_refs_field( field ); - ok( refs == 1, "got %d\n", refs ); + todo_wine ok( refs == 1, "got %d\n", refs ); refs = get_refs_recordset( recordset ); ok( refs == 2, "got %d\n", refs ); refs = get_refs_fields( fields ); @@ -708,7 +712,7 @@ static void test_Fields(void) ok( hr == S_OK, "got %08x\n", hr ); ok( field2 == field, "expected same object\n" ); refs = get_refs_field( field2 ); - ok( refs == 2, "got %d\n", refs ); + todo_wine ok( refs == 2, "got %d\n", refs ); refs = get_refs_recordset( recordset ); ok( refs == 2, "got %d\n", refs ); refs = get_refs_fields( fields ); @@ -721,10 +725,10 @@ static void test_Fields(void) hr = Field_QueryInterface( field, &IID_ISupportErrorInfo, (void **)&errorinfo ); ok( hr == S_OK, "got %08x\n", hr ); refs = get_refs_field( field ); - ok( refs == 2, "got %d\n", refs ); + todo_wine ok( refs == 2, "got %d\n", refs ); if (errorinfo) ISupportErrorInfo_Release( errorinfo ); refs = get_refs_field( field ); - ok( refs == 1, "got %d\n", refs ); + todo_wine ok( refs == 1, "got %d\n", refs );
/* verify values set with _Append */ hr = Field_get_Name( field, &name );