Hans Leidekker : msado15: Implement _Recordset_AddNew.

Alexandre Julliard julliard at winehq.org
Fri Dec 13 15:27:22 CST 2019


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Dec 13 15:52:24 2019 +0100

msado15: Implement _Recordset_AddNew.

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

---

 dlls/msado15/recordset.c     | 29 ++++++++++++++++++++++++++--
 dlls/msado15/tests/msado15.c | 46 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 72 insertions(+), 3 deletions(-)

diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index e854b3e824..f1c864cdd9 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -887,10 +887,35 @@ static HRESULT WINAPI recordset_get_Source( _Recordset *iface, VARIANT *source )
     return E_NOTIMPL;
 }
 
+static BOOL resize_recordset( struct recordset *recordset, ULONG row_count )
+{
+    ULONG row_size = get_column_count( recordset ) * sizeof(*recordset->data);
+
+    if (row_count > recordset->allocated)
+    {
+        VARIANT *tmp;
+        ULONG count = max( row_count, recordset->allocated * 2 );
+        if (!(tmp = heap_realloc_zero( recordset->data, count * row_size ))) return FALSE;
+        recordset->data = tmp;
+        recordset->allocated = count;
+    }
+
+    recordset->count = row_count;
+    return TRUE;
+}
+
 static HRESULT WINAPI recordset_AddNew( _Recordset *iface, VARIANT field_list, VARIANT values )
 {
-    FIXME( "%p, %s, %s\n", iface, debugstr_variant(&field_list), debugstr_variant(&values) );
-    return E_NOTIMPL;
+    struct recordset *recordset = impl_from_Recordset( iface );
+
+    TRACE( "%p, %s, %s\n", recordset, debugstr_variant(&field_list), debugstr_variant(&values) );
+    FIXME( "ignoring field list and values\n" );
+
+    if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed );
+
+    if (!resize_recordset( recordset, recordset->count + 1 )) return E_OUTOFMEMORY;
+    recordset->index++;
+    return S_OK;
 }
 
 static HRESULT WINAPI recordset_CancelUpdate( _Recordset *iface )
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index f9a5377c50..3b1e953dc7 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -47,7 +47,9 @@ static void test_Recordset(void)
 {
     _Recordset *recordset;
     Fields *fields, *fields2;
-    LONG refs, count;
+    LONG refs, count, state;
+    VARIANT missing;
+    BSTR name;
     HRESULT hr;
 
     hr = CoCreateInstance( &CLSID_Recordset, NULL, CLSCTX_INPROC_SERVER, &IID__Recordset, (void **)&recordset );
@@ -92,6 +94,48 @@ static void test_Recordset(void)
     /* fields object still has a reference */
     refs = Fields_Release( fields2 );
     ok( refs == 1, "got %d\n", refs );
+
+    hr = CoCreateInstance( &CLSID_Recordset, NULL, CLSCTX_INPROC_SERVER, &IID__Recordset, (void **)&recordset );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    state = -1;
+    hr = _Recordset_get_State( recordset, &state );
+    todo_wine ok( hr == S_OK, "got %08x\n", hr );
+    todo_wine ok( state == adStateClosed, "got %d\n", state );
+
+    VariantInit( &missing );
+    hr = _Recordset_AddNew( recordset, missing, missing );
+    ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
+
+    V_VT( &missing ) = VT_ERROR;
+    V_ERROR( &missing ) = DISP_E_PARAMNOTFOUND;
+    hr = _Recordset_Open( recordset, missing, missing, adOpenStatic, adLockBatchOptimistic, adCmdUnspecified );
+    todo_wine ok( hr == MAKE_ADO_HRESULT( adErrInvalidConnection ), "got %08x\n", hr );
+
+    hr = _Recordset_get_Fields( recordset, &fields );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    name = SysAllocString( L"field" );
+    hr = Fields__Append( fields, name, adInteger, 4, adFldUnspecified );
+    ok( hr == S_OK, "got %08x\n", hr );
+    SysFreeString( name );
+
+    hr = _Recordset_Open( recordset, missing, missing, adOpenStatic, adLockBatchOptimistic, adCmdUnspecified );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    state = -1;
+    hr = _Recordset_get_State( recordset, &state );
+    todo_wine ok( hr == S_OK, "got %08x\n", hr );
+    todo_wine ok( state == adStateOpen, "got %d\n", state );
+
+    hr = _Recordset_AddNew( recordset, missing, missing );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = _Recordset_Close( recordset );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    Fields_Release( fields );
+    _Recordset_Release( recordset );
 }
 
 static void test_Fields(void)




More information about the wine-cvs mailing list