From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/recordset.c | 31 ++++++++++++++++++++++++------- dlls/msado15/tests/msado15.c | 26 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index d37b37dbdd7..b3498246c46 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -1903,27 +1903,44 @@ static HRESULT WINAPI recordset_get_BOF( _Recordset *iface, VARIANT_BOOL *bof ) static HRESULT WINAPI recordset_get_Bookmark( _Recordset *iface, VARIANT *bookmark ) { struct recordset *recordset = impl_from_Recordset( iface ); + TRACE( "%p, %p\n", iface, bookmark );
if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); - if (recordset->index < 0) return MAKE_ADO_HRESULT( adErrNoCurrentRecord ); + if (!recordset->current_row && !recordset->is_eof && !recordset->is_bof) + { + HRESULT hr = cache_get( recordset, TRUE ); + if (FAILED(hr)) return hr; + } + if (!recordset->current_row) return MAKE_ADO_HRESULT( adErrNoCurrentRecord ); + if (!recordset->bookmark_hacc) + return MAKE_ADO_HRESULT( adErrFeatureNotAvailable );
- V_VT(bookmark) = VT_I4; - V_I4(bookmark) = recordset->index; - return S_OK; + return get_bookmark( recordset, recordset->current_row, bookmark ); }
static HRESULT WINAPI recordset_put_Bookmark( _Recordset *iface, VARIANT bookmark ) { struct recordset *recordset = impl_from_Recordset( iface ); + VARIANT copy; + HRESULT hr; + TRACE( "%p, %s\n", iface, debugstr_variant(&bookmark) );
if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); + if (V_VT(&bookmark) != VT_R8 && V_VT(&bookmark) != (VT_ARRAY | VT_UI1)) + return MAKE_ADO_HRESULT( adErrInvalidArgument ); + if (!recordset->bookmark_hacc) + return MAKE_ADO_HRESULT( adErrFeatureNotAvailable );
- if (V_VT(&bookmark) != VT_I4) return MAKE_ADO_HRESULT( adErrInvalidArgument ); + VariantInit( © ); + hr = VariantCopy( ©, &bookmark ); + if (FAILED(hr)) return hr;
- recordset->index = V_I4(&bookmark); - return S_OK; + VariantClear( &recordset->bookmark ); + recordset->bookmark = copy; + recordset->cache.dir = 0; + return cache_get( recordset, TRUE ); }
static HRESULT WINAPI recordset_get_CacheSize( _Recordset *iface, LONG *size ) diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 039b71040db..345e17001f8 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -1407,6 +1407,32 @@ static void test_ADORecordsetConstruction(BOOL exact_scroll)
Field_Release( field );
+ if (exact_scroll) SET_EXPECT( rowset_GetData ); + VariantInit(&v); + hr = _Recordset_get_Bookmark( recordset, &v ); + if (exact_scroll) + { + ok( hr == S_OK, "got %08lx\n", hr ); + CHECK_CALLED( rowset_GetData ); + ok( V_VT(&v) == VT_R8, "V_VT(v) = %x\n", V_VT(&v) ); + ok( V_R8(&v) == 1.0, "V_R8(v) = %lf\n", V_R8(&v) ); + } + else ok( hr == MAKE_ADO_HRESULT( adErrFeatureNotAvailable ), "got %08lx\n", hr ); + + if (exact_scroll) + { + SET_EXPECT( rowset_AddRefRows ); + SET_EXPECT( rowset_ReleaseRows ); + SET_EXPECT( rowset_GetRowsAt ); + SET_EXPECT( rowset_GetData ); + hr = _Recordset_put_Bookmark( recordset, v ); + ok( hr == S_OK, "hr = %lx\n", hr ); + CHECK_CALLED( rowset_AddRefRows ); + CHECK_CALLED( rowset_ReleaseRows ); + CHECK_CALLED( rowset_GetRowsAt ); + CHECK_CALLED( rowset_GetData ); + } + SET_EXPECT( rowset_QI_IRowsetExactScroll ); if (exact_scroll) SET_EXPECT( rowset_GetExactPosition ); hr = _Recordset_get_RecordCount( recordset, &size );