[PATCH v3 1/2] msado15: Free field objects in recordset close.
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Sat Mar 20 05:44:54 CDT 2021
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 at 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 );
--
2.30.1
More information about the wine-devel
mailing list