Hans Leidekker : msado15: Implement Fields_get_Item.

Alexandre Julliard julliard at winehq.org
Thu Dec 12 16:29:43 CST 2019


Module: wine
Branch: master
Commit: a9452acbfafb7e72e3a5099de78c2fa7383e1684
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a9452acbfafb7e72e3a5099de78c2fa7383e1684

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Dec 12 17:12:22 2019 +0100

msado15: Implement Fields_get_Item.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msado15/recordset.c     | 42 ++++++++++++++++++++++++++++++++++++++++--
 dlls/msado15/tests/msado15.c | 42 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 80 insertions(+), 4 deletions(-)

diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index a20d5920da..ff06b8789a 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -433,10 +433,48 @@ static HRESULT WINAPI fields_Refresh( Fields *iface )
     return E_NOTIMPL;
 }
 
+static HRESULT map_index( struct fields *fields, VARIANT *index, ULONG *ret )
+{
+    ULONG i;
+
+    if (V_VT( index ) != VT_BSTR)
+    {
+        FIXME( "variant type %u not supported\n", V_VT( index ) );
+        return E_INVALIDARG;
+    }
+
+    for (i = 0; i < fields->count; i++)
+    {
+        BSTR name;
+        BOOL match;
+        HRESULT hr;
+
+        if ((hr = Field_get_Name( fields->field[i], &name )) != S_OK) return hr;
+        match = !wcsicmp( V_BSTR( index ), name );
+        SysFreeString( name );
+        if (match)
+        {
+            *ret = i;
+            return S_OK;
+        }
+    }
+
+    return E_INVALIDARG;
+}
+
 static HRESULT WINAPI fields_get_Item( Fields *iface, VARIANT index, Field **obj )
 {
-    FIXME( "%p, %s, %p\n", iface, debugstr_variant(&index), obj );
-    return E_NOTIMPL;
+    struct fields *fields = impl_from_Fields( iface );
+    HRESULT hr;
+    ULONG i;
+
+    TRACE( "%p, %s, %p\n", fields, debugstr_variant(&index), obj );
+
+    if ((hr = map_index( fields, &index, &i )) != S_OK) return hr;
+
+    Field_AddRef( fields->field[i] );
+    *obj = fields->field[i];
+    return S_OK;
 }
 
 static BOOL resize_fields( struct fields *fields, ULONG count )
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 03b2828d9f..800eb236fe 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -25,6 +25,12 @@
 
 #define MAKE_ADO_HRESULT( err ) MAKE_HRESULT( SEVERITY_ERROR, FACILITY_CONTROL, err )
 
+static LONG get_refs_field( Field *field )
+{
+    Field_AddRef( field );
+    return Field_Release( field );
+}
+
 static LONG get_refs_fields( Fields *fields )
 {
     Fields_AddRef( fields );
@@ -92,9 +98,10 @@ static void test_Fields(void)
 {
     _Recordset *recordset;
     Fields *fields;
-    VARIANT val;
+    Field *field, *field2;
+    VARIANT val, index;
     BSTR name;
-    LONG count;
+    LONG refs, count;
     HRESULT hr;
 
     hr = CoCreateInstance( &CLSID_Recordset, NULL, CLSCTX_INPROC_SERVER, &IID__Recordset, (void **)&recordset );
@@ -127,6 +134,37 @@ static void test_Fields(void)
     hr = Fields_get_Count( fields, &count );
     ok( count == 2, "got %d\n", count );
 
+    /* handing out field object doesn't add reference to fields or recordset object */
+    name = SysAllocString( L"field" );
+    V_VT( &index ) = VT_BSTR;
+    V_BSTR( &index ) = name;
+    refs = get_refs_recordset( recordset );
+    ok( refs == 2, "got %d\n", refs );
+    refs = get_refs_fields( fields );
+    ok( refs == 1, "got %d\n", refs );
+    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 );
+    refs = get_refs_recordset( recordset );
+    ok( refs == 2, "got %d\n", refs );
+    refs = get_refs_fields( fields );
+    ok( refs == 1, "got %d\n", refs );
+
+    /* calling get_Item again returns the same object and adds reference */
+    hr = Fields_get_Item( fields, index, &field2 );
+    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 );
+    refs = get_refs_recordset( recordset );
+    ok( refs == 2, "got %d\n", refs );
+    refs = get_refs_fields( fields );
+    ok( refs == 1, "got %d\n", refs );
+    Field_Release( field2 );
+    SysFreeString( name );
+
+    Field_Release( field );
     Fields_Release( fields );
     _Recordset_Release( recordset );
 }




More information about the wine-cvs mailing list