Hans Leidekker : msado15: Implement _Recordset_MoveFirst and _Recordset_MoveLast.
Alexandre Julliard
julliard at winehq.org
Fri Dec 13 15:27:22 CST 2019
Module: wine
Branch: master
Commit: eedc6b06ca6538c982004f0e2a529cf900ead04a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=eedc6b06ca6538c982004f0e2a529cf900ead04a
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Dec 13 15:52:29 2019 +0100
msado15: Implement _Recordset_MoveFirst and _Recordset_MoveLast.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msado15/recordset.c | 16 ++++++---
dlls/msado15/tests/msado15.c | 84 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 95 insertions(+), 5 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index b2bc93bb9c..cd623d0dc8 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -987,14 +987,22 @@ static HRESULT WINAPI recordset_MovePrevious( _Recordset *iface )
static HRESULT WINAPI recordset_MoveFirst( _Recordset *iface )
{
- FIXME( "%p\n", iface );
- return E_NOTIMPL;
+ struct recordset *recordset = impl_from_Recordset( iface );
+
+ TRACE( "%p\n", recordset );
+
+ recordset->index = 0;
+ return S_OK;
}
static HRESULT WINAPI recordset_MoveLast( _Recordset *iface )
{
- FIXME( "%p\n", iface );
- return E_NOTIMPL;
+ struct recordset *recordset = impl_from_Recordset( iface );
+
+ TRACE( "%p\n", recordset );
+
+ recordset->index = (recordset->count > 0) ? recordset->count - 1 : 0;
+ return S_OK;
}
static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT active_connection,
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 04ca338dd8..0e69142b21 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -61,8 +61,9 @@ static void test_Recordset(void)
{
_Recordset *recordset;
Fields *fields, *fields2;
+ Field *field;
LONG refs, count, state;
- VARIANT missing;
+ VARIANT missing, val, index;
BSTR name;
HRESULT hr;
@@ -132,6 +133,11 @@ static void test_Recordset(void)
name = SysAllocString( L"field" );
hr = Fields__Append( fields, name, adInteger, 4, adFldUnspecified );
ok( hr == S_OK, "got %08x\n", hr );
+
+ V_VT( &index ) = VT_BSTR;
+ V_BSTR( &index ) = name;
+ hr = Fields_get_Item( fields, index, &field );
+ ok( hr == S_OK, "got %08x\n", hr );
SysFreeString( name );
hr = _Recordset_Open( recordset, missing, missing, adOpenStatic, adLockBatchOptimistic, adCmdUnspecified );
@@ -159,6 +165,81 @@ static void test_Recordset(void)
ok( hr == S_OK, "got %08x\n", hr );
ok( count == 1, "got %d\n", count );
+ /* get_Fields still returns the same object */
+ hr = _Recordset_get_Fields( recordset, &fields2 );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( fields2 == fields, "expected same object\n" );
+ Fields_Release( fields2 );
+
+ count = -1;
+ hr = Fields_get_Count( fields2, &count );
+ ok( count == 1, "got %d\n", count );
+
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_EMPTY, "got %u\n", V_VT( &val ) );
+
+ V_VT( &val ) = VT_I4;
+ V_I4( &val ) = -1;
+ hr = Field_put_Value( field, val );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ V_VT( &val ) = VT_ERROR;
+ V_ERROR( &val ) = DISP_E_PARAMNOTFOUND;
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_I4, "got %u\n", V_VT( &val ) );
+ ok( V_I4( &val ) == -1, "got %d\n", V_I4( &val ) );
+
+ hr = _Recordset_AddNew( recordset, missing, missing );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ /* field object returns different value after AddNew */
+ V_VT( &val ) = VT_ERROR;
+ V_ERROR( &val ) = DISP_E_PARAMNOTFOUND;
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_EMPTY, "got %u\n", V_VT( &val ) );
+
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+ hr = _Recordset_MoveFirst( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+
+ V_VT( &val ) = VT_ERROR;
+ V_ERROR( &val ) = DISP_E_PARAMNOTFOUND;
+ hr = Field_get_Value( field, &val );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( V_VT( &val ) == VT_I4, "got %u\n", V_VT( &val ) );
+ ok( V_I4( &val ) == -1, "got %d\n", V_I4( &val ) );
+
+ hr = _Recordset_MoveNext( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "not bof\n" );
+
+ hr = _Recordset_MoveNext( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( is_eof( recordset ), "not eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+
+ hr = _Recordset_MoveFirst( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( !is_bof( recordset ), "bof\n" );
+
+ hr = _Recordset_MovePrevious( recordset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !is_eof( recordset ), "eof\n" );
+ ok( is_bof( recordset ), "not bof\n" );
+
+ /* try get value at BOF */
+ VariantInit( &val );
+ hr = Field_get_Value( field, &val );
+ ok( hr == MAKE_ADO_HRESULT( adErrNoCurrentRecord ), "got %08x\n", hr );
+
hr = _Recordset_Close( recordset );
ok( hr == S_OK, "got %08x\n", hr );
@@ -167,6 +248,7 @@ static void test_Recordset(void)
ok( hr == S_OK, "got %08x\n", hr );
ok( state == adStateClosed, "got %d\n", state );
+ Field_Release( field );
Fields_Release( fields );
_Recordset_Release( recordset );
}
More information about the wine-cvs
mailing list