From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/rowset.c | 65 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+)
diff --git a/dlls/msado15/rowset.c b/dlls/msado15/rowset.c index c6c301a0ce3..1f9f3a92a4a 100644 --- a/dlls/msado15/rowset.c +++ b/dlls/msado15/rowset.c @@ -28,6 +28,7 @@ struct rowset { IRowsetExactScroll IRowsetExactScroll_iface; IColumnsInfo IColumnsInfo_iface; + IRowsetChange IRowsetChange_iface; LONG refs;
int columns_cnt; @@ -45,6 +46,11 @@ static inline struct rowset *impl_from_IColumnsInfo(IColumnsInfo *iface) return CONTAINING_RECORD(iface, struct rowset, IColumnsInfo_iface); }
+static inline struct rowset *impl_from_IRowsetChange(IRowsetChange *iface) +{ + return CONTAINING_RECORD(iface, struct rowset, IRowsetChange_iface); +} + static HRESULT WINAPI rowset_QueryInterface(IRowsetExactScroll *iface, REFIID riid, void **ppv) { struct rowset *rowset = impl_from_IRowsetExactScroll(iface); @@ -64,6 +70,10 @@ static HRESULT WINAPI rowset_QueryInterface(IRowsetExactScroll *iface, REFIID ri { *ppv = &rowset->IColumnsInfo_iface; } + else if(IsEqualGUID(&IID_IRowsetChange, riid)) + { + *ppv = &rowset->IRowsetChange_iface; + }
if(*ppv) { @@ -331,6 +341,60 @@ static struct IColumnsInfoVtbl columns_info_vtbl = columns_info_MapColumnIDs };
+static HRESULT WINAPI rowset_change_QueryInterface(IRowsetChange *iface, REFIID riid, void **ppv) +{ + struct rowset *rowset = impl_from_IRowsetChange(iface); + return IRowsetExactScroll_QueryInterface(&rowset->IRowsetExactScroll_iface, riid, ppv); +} + +static ULONG WINAPI rowset_change_AddRef(IRowsetChange *iface) +{ + struct rowset *rowset = impl_from_IRowsetChange(iface); + return IRowsetExactScroll_AddRef(&rowset->IRowsetExactScroll_iface); +} + +static ULONG WINAPI rowset_change_Release(IRowsetChange *iface) +{ + struct rowset *rowset = impl_from_IRowsetChange(iface); + return IRowsetExactScroll_Release(&rowset->IRowsetExactScroll_iface); +} + +static HRESULT WINAPI rowset_change_DeleteRows(IRowsetChange *iface, HCHAPTER reserved, + DBCOUNTITEM count, const HROW rows[], DBROWSTATUS status[]) +{ + struct rowset *rowset = impl_from_IRowsetChange(iface); + + FIXME("%p, %Iu, %Iu, %p, %p\n", rowset, reserved, count, rows, status); + return E_NOTIMPL; +} + +static HRESULT WINAPI rowset_change_SetData(IRowsetChange *iface, HROW row, HACCESSOR accessor, void *data) +{ + struct rowset *rowset = impl_from_IRowsetChange(iface); + + FIXME("%p, %Id, %Id, %p\n", rowset, row, accessor, data); + return E_NOTIMPL; +} + +static HRESULT WINAPI rowset_change_InsertRow(IRowsetChange *iface, HCHAPTER reserved, + HACCESSOR accessor, void *data, HROW *row) +{ + struct rowset *rowset = impl_from_IRowsetChange(iface); + + FIXME("%p, %Iu, %Id, %p, %p\n", rowset, reserved, accessor, data, row); + return E_NOTIMPL; +} + +static struct IRowsetChangeVtbl rowset_change_vtbl = +{ + rowset_change_QueryInterface, + rowset_change_AddRef, + rowset_change_Release, + rowset_change_DeleteRows, + rowset_change_SetData, + rowset_change_InsertRow +}; + HRESULT create_mem_rowset(int count, const DBCOLUMNINFO *info, IUnknown **ret) { struct rowset *rowset; @@ -341,6 +405,7 @@ HRESULT create_mem_rowset(int count, const DBCOLUMNINFO *info, IUnknown **ret)
rowset->IRowsetExactScroll_iface.lpVtbl = &rowset_vtbl; rowset->IColumnsInfo_iface.lpVtbl = &columns_info_vtbl; + rowset->IRowsetChange_iface.lpVtbl = &rowset_change_vtbl; rowset->refs = 1;
rowset->columns_cnt = count;
From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/rowset.c | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+)
diff --git a/dlls/msado15/rowset.c b/dlls/msado15/rowset.c index 1f9f3a92a4a..5e463c2de92 100644 --- a/dlls/msado15/rowset.c +++ b/dlls/msado15/rowset.c @@ -29,6 +29,7 @@ struct rowset IRowsetExactScroll IRowsetExactScroll_iface; IColumnsInfo IColumnsInfo_iface; IRowsetChange IRowsetChange_iface; + IAccessor IAccessor_iface; LONG refs;
int columns_cnt; @@ -51,6 +52,11 @@ static inline struct rowset *impl_from_IRowsetChange(IRowsetChange *iface) return CONTAINING_RECORD(iface, struct rowset, IRowsetChange_iface); }
+static inline struct rowset *impl_from_IAccessor(IAccessor *iface) +{ + return CONTAINING_RECORD(iface, struct rowset, IAccessor_iface); +} + static HRESULT WINAPI rowset_QueryInterface(IRowsetExactScroll *iface, REFIID riid, void **ppv) { struct rowset *rowset = impl_from_IRowsetExactScroll(iface); @@ -74,6 +80,10 @@ static HRESULT WINAPI rowset_QueryInterface(IRowsetExactScroll *iface, REFIID ri { *ppv = &rowset->IRowsetChange_iface; } + else if(IsEqualGUID(&IID_IAccessor, riid)) + { + *ppv = &rowset->IAccessor_iface; + }
if(*ppv) { @@ -395,6 +405,72 @@ static struct IRowsetChangeVtbl rowset_change_vtbl = rowset_change_InsertRow };
+static HRESULT WINAPI accessor_QueryInterface(IAccessor *iface, REFIID riid, void **ppv) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + return IRowsetExactScroll_QueryInterface(&rowset->IRowsetExactScroll_iface, riid, ppv); +} + +static ULONG WINAPI accessor_AddRef(IAccessor *iface) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + return IRowsetExactScroll_AddRef(&rowset->IRowsetExactScroll_iface); +} + +static ULONG WINAPI accessor_Release(IAccessor *iface) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + return IRowsetExactScroll_Release(&rowset->IRowsetExactScroll_iface); +} + +static HRESULT WINAPI accessor_AddRefAccessor(IAccessor *iface, HACCESSOR hAccessor, DBREFCOUNT *pcRefCount) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + + FIXME("%p, %Id, %p\n", rowset, hAccessor, pcRefCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI accessor_CreateAccessor(IAccessor *iface, DBACCESSORFLAGS dwAccessorFlags, + DBCOUNTITEM cBindings, const DBBINDING rgBindings[], DBLENGTH cbRowSize, + HACCESSOR *phAccessor, DBBINDSTATUS rgStatus[]) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + + FIXME("%p, %lx, %Iu, %p %Id, %p %p\n", rowset, dwAccessorFlags, cBindings, + rgBindings, cbRowSize, phAccessor, rgStatus); + return E_NOTIMPL; +} + +static HRESULT WINAPI accessor_GetBindings(IAccessor *iface, HACCESSOR hAccessor, + DBACCESSORFLAGS *pdwAccessorFlags, DBCOUNTITEM *pcBindings, DBBINDING **prgBindings) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + + FIXME("%p, %Id, %p %p %p\n", rowset, hAccessor, pdwAccessorFlags, pcBindings, prgBindings); + return E_NOTIMPL; +} + +static HRESULT WINAPI accessor_ReleaseAccessor(IAccessor *iface, + HACCESSOR hAccessor, DBREFCOUNT *pcRefCount) +{ + struct rowset *rowset = impl_from_IAccessor(iface); + + FIXME("%p, %Id, %p\n", rowset, hAccessor, pcRefCount); + return E_NOTIMPL; +} + +static struct IAccessorVtbl accessor_vtbl = +{ + accessor_QueryInterface, + accessor_AddRef, + accessor_Release, + accessor_AddRefAccessor, + accessor_CreateAccessor, + accessor_GetBindings, + accessor_ReleaseAccessor +}; + HRESULT create_mem_rowset(int count, const DBCOLUMNINFO *info, IUnknown **ret) { struct rowset *rowset; @@ -406,6 +482,7 @@ HRESULT create_mem_rowset(int count, const DBCOLUMNINFO *info, IUnknown **ret) rowset->IRowsetExactScroll_iface.lpVtbl = &rowset_vtbl; rowset->IColumnsInfo_iface.lpVtbl = &columns_info_vtbl; rowset->IRowsetChange_iface.lpVtbl = &rowset_change_vtbl; + rowset->IAccessor_iface.lpVtbl = &accessor_vtbl; rowset->refs = 1;
rowset->columns_cnt = count;
From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/recordset.c | 70 ++++++++++++++++++++++++++++++ dlls/msado15/rowset.c | 82 +++++++++++++++++++++++++++++++----- dlls/msado15/tests/msado15.c | 16 +++---- 3 files changed, 150 insertions(+), 18 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index a41023e03ef..79db8c55147 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -32,6 +32,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(msado15);
+#define NO_INTERFACE ((void*)-1) + struct recordset;
struct field @@ -79,12 +81,16 @@ struct recordset CursorLocationEnum cursor_location; CursorTypeEnum cursor_type; IRowset *row_set; + IRowsetChange *rowset_change; + IAccessor *accessor; EditModeEnum editmode; + HROW current_row; LONG cache_size; ADO_LONGPTR max_records; VARIANT filter;
DBTYPE *columntypes; + HACCESSOR hacc_empty; /* haccessor for adding empty rows */ HACCESSOR *haccessors; };
@@ -1253,8 +1259,25 @@ static void close_recordset( struct recordset *recordset ) if (recordset->haccessors) IRowset_QueryInterface(recordset->row_set, &IID_IAccessor, (void**)&accessor);
+ if ( recordset->current_row ) + { + IRowset_ReleaseRows( recordset->row_set, 1, &recordset->current_row, NULL, NULL, NULL ); + recordset->current_row = 0; + } + if ( recordset->hacc_empty ) + { + IAccessor_ReleaseAccessor( recordset->accessor, recordset->hacc_empty, NULL ); + recordset->hacc_empty = 0; + } + if ( recordset->row_set ) IRowset_Release( recordset->row_set ); recordset->row_set = NULL; + if ( recordset->rowset_change && recordset->rowset_change != NO_INTERFACE ) + IRowsetChange_Release( recordset->rowset_change ); + recordset->rowset_change = NULL; + if (recordset->accessor && recordset->accessor != NO_INTERFACE ) + IAccessor_Release( recordset->accessor ); + recordset->accessor = NULL;
VariantClear( &recordset->filter );
@@ -1653,6 +1676,8 @@ static BOOL resize_recordset( struct recordset *recordset, ULONG row_count ) static HRESULT WINAPI recordset_AddNew( _Recordset *iface, VARIANT field_list, VARIANT values ) { struct recordset *recordset = impl_from_Recordset( iface ); + DBREFCOUNT refcount; + HRESULT hr;
TRACE( "%p, %s, %s\n", recordset, debugstr_variant(&field_list), debugstr_variant(&values) ); if (V_VT(&field_list) != VT_ERROR) @@ -1660,6 +1685,51 @@ static HRESULT WINAPI recordset_AddNew( _Recordset *iface, VARIANT field_list, V
if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed );
+ if (!recordset->rowset_change) + { + hr = IRowset_QueryInterface( recordset->row_set, &IID_IRowsetChange, + (void **)&recordset->rowset_change ); + if (FAILED(hr) || !recordset->rowset_change) + recordset->rowset_change = NO_INTERFACE; + } + if (recordset->rowset_change == NO_INTERFACE) + return MAKE_ADO_HRESULT( adErrFeatureNotAvailable ); + + if (!recordset->accessor) + { + hr = IRowset_QueryInterface( recordset->row_set, &IID_IAccessor, (void **)&recordset->accessor ); + if (FAILED(hr) || !recordset->accessor) + recordset->accessor = NO_INTERFACE; + } + if (recordset->accessor == NO_INTERFACE) + return MAKE_ADO_HRESULT( adErrFeatureNotAvailable ); + + if (!recordset->hacc_empty) + { + hr = IAccessor_CreateAccessor( recordset->accessor, DBACCESSOR_ROWDATA, + 0, NULL, 0, &recordset->hacc_empty, NULL ); + if (FAILED(hr) || !recordset->hacc_empty) + return MAKE_ADO_HRESULT( adErrNoCurrentRecord ); + } + + hr = IAccessor_AddRefAccessor( recordset->accessor, recordset->hacc_empty, &refcount ); + if (FAILED(hr)) + return MAKE_ADO_HRESULT( adErrNoCurrentRecord ); + if (recordset->current_row) + { + hr = IRowset_ReleaseRows( recordset->row_set, 1, &recordset->current_row, NULL, NULL, NULL ); + if (FAILED(hr)) + { + IAccessor_ReleaseAccessor( recordset->accessor, recordset->hacc_empty, &refcount ); + return hr; + } + } + hr = IRowsetChange_InsertRow( recordset->rowset_change, 0, + recordset->hacc_empty, NULL, &recordset->current_row ); + IAccessor_ReleaseAccessor( recordset->accessor, recordset->hacc_empty, &refcount ); + if (FAILED(hr)) + return MAKE_ADO_HRESULT( adErrNoCurrentRecord ); + if (!resize_recordset( recordset, recordset->count + 1 )) return E_OUTOFMEMORY; recordset->index = recordset->count - 1; recordset->editmode = adEditAdd; diff --git a/dlls/msado15/rowset.c b/dlls/msado15/rowset.c index 5e463c2de92..c776f6c3b3d 100644 --- a/dlls/msado15/rowset.c +++ b/dlls/msado15/rowset.c @@ -18,6 +18,7 @@
#define COBJMACROS #include "oledb.h" +#include "oledberr.h" #include "unknwn.h"
#include "wine/debug.h" @@ -35,6 +36,13 @@ struct rowset int columns_cnt; DBCOLUMNINFO *columns; OLECHAR *columns_buf; + + int row_cnt; +}; + +struct accessor +{ + LONG refs; };
static inline struct rowset *impl_from_IRowsetExactScroll(IRowsetExactScroll *iface) @@ -154,8 +162,15 @@ static HRESULT WINAPI rowset_ReleaseRows(IRowsetExactScroll *iface, DBCOUNTITEM { struct rowset *rowset = impl_from_IRowsetExactScroll(iface);
- FIXME("%p, %Id, %p, %p, %p, %p\n", rowset, count, rows, options, ref_counts, status); - return E_NOTIMPL; + TRACE("%p, %Id, %p, %p, %p, %p\n", rowset, count, rows, options, ref_counts, status); + + if (options || ref_counts || status) + { + FIXME("unhandled parameters\n"); + return E_NOTIMPL; + } + + return S_OK; }
static HRESULT WINAPI rowset_RestartPosition(IRowsetExactScroll *iface, HCHAPTER reserved) @@ -391,8 +406,17 @@ static HRESULT WINAPI rowset_change_InsertRow(IRowsetChange *iface, HCHAPTER res { struct rowset *rowset = impl_from_IRowsetChange(iface);
- FIXME("%p, %Iu, %Id, %p, %p\n", rowset, reserved, accessor, data, row); - return E_NOTIMPL; + TRACE("%p, %Iu, %Id, %p, %p\n", rowset, reserved, accessor, data, row); + + if (data) + { + FIXME("setting data not implemented\n"); + return E_NOTIMPL; + } + + rowset->row_cnt++; + if (row) *row = rowset->row_cnt; + return S_OK; }
static struct IRowsetChangeVtbl rowset_change_vtbl = @@ -425,10 +449,17 @@ static ULONG WINAPI accessor_Release(IAccessor *iface)
static HRESULT WINAPI accessor_AddRefAccessor(IAccessor *iface, HACCESSOR hAccessor, DBREFCOUNT *pcRefCount) { + struct accessor *accessor = (struct accessor *)hAccessor; struct rowset *rowset = impl_from_IAccessor(iface); + LONG ref;
- FIXME("%p, %Id, %p\n", rowset, hAccessor, pcRefCount); - return E_NOTIMPL; + TRACE("%p, %Id, %p\n", rowset, hAccessor, pcRefCount); + + if (!hAccessor) return DB_E_BADACCESSORHANDLE; + + ref = InterlockedIncrement(&accessor->refs); + if (pcRefCount) *pcRefCount = ref; + return S_OK; }
static HRESULT WINAPI accessor_CreateAccessor(IAccessor *iface, DBACCESSORFLAGS dwAccessorFlags, @@ -436,10 +467,31 @@ static HRESULT WINAPI accessor_CreateAccessor(IAccessor *iface, DBACCESSORFLAGS HACCESSOR *phAccessor, DBBINDSTATUS rgStatus[]) { struct rowset *rowset = impl_from_IAccessor(iface); + struct accessor *accessor;
- FIXME("%p, %lx, %Iu, %p %Id, %p %p\n", rowset, dwAccessorFlags, cBindings, + TRACE("%p, %lx, %Iu, %p %Id, %p %p\n", rowset, dwAccessorFlags, cBindings, rgBindings, cbRowSize, phAccessor, rgStatus); - return E_NOTIMPL; + + if (!phAccessor) return E_INVALIDARG; + *phAccessor = 0; + + if (cBindings || cbRowSize) + { + FIXME("accessing data not implemented\n"); + return E_NOTIMPL; + } + if (dwAccessorFlags != DBACCESSOR_ROWDATA) + { + FIXME("unsupported flags %lx\n", dwAccessorFlags); + return E_NOTIMPL; + } + + accessor = calloc(1, sizeof(*accessor)); + if (!accessor) return E_OUTOFMEMORY; + accessor->refs = 1; + + *phAccessor = (HACCESSOR)accessor; + return S_OK; }
static HRESULT WINAPI accessor_GetBindings(IAccessor *iface, HACCESSOR hAccessor, @@ -454,10 +506,20 @@ static HRESULT WINAPI accessor_GetBindings(IAccessor *iface, HACCESSOR hAccessor static HRESULT WINAPI accessor_ReleaseAccessor(IAccessor *iface, HACCESSOR hAccessor, DBREFCOUNT *pcRefCount) { + struct accessor *accessor = (struct accessor *)hAccessor; struct rowset *rowset = impl_from_IAccessor(iface); + LONG ref;
- FIXME("%p, %Id, %p\n", rowset, hAccessor, pcRefCount); - return E_NOTIMPL; + TRACE("%p, %Id, %p\n", rowset, hAccessor, pcRefCount); + + if (!hAccessor) return DB_E_BADACCESSORHANDLE; + + ref = InterlockedDecrement(&accessor->refs); + if (!ref) + free(accessor); + + if (pcRefCount) *pcRefCount = ref; + return S_OK; }
static struct IAccessorVtbl accessor_vtbl = diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 4c974396727..111c93d99f7 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -1152,12 +1152,12 @@ static void test_ADORecordsetConstruction(BOOL exact_scroll) SET_EXPECT(accessor_ReleaseAccessor); hr = _Recordset_AddNew( recordset, missing, missing ); ok( hr == S_OK, "got %08lx\n", hr ); - todo_wine CHECK_CALLED(rowset_QI_IRowsetChange); - todo_wine CHECK_CALLED(rowset_QI_IAccessor); - todo_wine CHECK_CALLED(accessor_CreateAccessor); - todo_wine CHECK_CALLED(accessor_AddRefAccessor); - todo_wine CHECK_CALLED(rowset_change_InsertRow); - todo_wine CHECK_CALLED(accessor_ReleaseAccessor); + CHECK_CALLED(rowset_QI_IRowsetChange); + CHECK_CALLED(rowset_QI_IAccessor); + CHECK_CALLED(accessor_CreateAccessor); + CHECK_CALLED(accessor_AddRefAccessor); + CHECK_CALLED(rowset_change_InsertRow); + CHECK_CALLED(accessor_ReleaseAccessor);
Fields_Release(fields); ADORecordsetConstruction_Release(construct); @@ -1165,9 +1165,9 @@ static void test_ADORecordsetConstruction(BOOL exact_scroll) SET_EXPECT( rowset_QI_IAccessor ); SET_EXPECT(accessor_ReleaseAccessor); ok( !_Recordset_Release( recordset ), "_Recordset not released\n" ); - todo_wine CHECK_CALLED(rowset_ReleaseRows ); + CHECK_CALLED(rowset_ReleaseRows ); todo_wine CHECK_CALLED( rowset_QI_IAccessor ); - todo_wine CHECK_CALLED(accessor_ReleaseAccessor); + CHECK_CALLED(accessor_ReleaseAccessor); ok( testrowset.refs == 1, "got %ld\n", testrowset.refs ); }
From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/recordset.c | 24 +++++++++++++++++++++++- dlls/msado15/rowset.c | 7 +++++-- dlls/msado15/tests/msado15.c | 6 +++--- 3 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 79db8c55147..8e2e0edba14 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -81,6 +81,7 @@ struct recordset CursorLocationEnum cursor_location; CursorTypeEnum cursor_type; IRowset *row_set; + IRowsetExactScroll *rowset_es; IRowsetChange *rowset_change; IAccessor *accessor; EditModeEnum editmode; @@ -1272,6 +1273,9 @@ static void close_recordset( struct recordset *recordset )
if ( recordset->row_set ) IRowset_Release( recordset->row_set ); recordset->row_set = NULL; + if ( recordset->rowset_es && recordset->rowset_es != NO_INTERFACE ) + IRowsetExactScroll_Release( recordset->rowset_es ); + recordset->rowset_es = NULL; if ( recordset->rowset_change && recordset->rowset_change != NO_INTERFACE ) IRowsetChange_Release( recordset->rowset_change ); recordset->rowset_change = NULL; @@ -1630,10 +1634,28 @@ static HRESULT WINAPI recordset_put_MaxRecords( _Recordset *iface, ADO_LONGPTR m static HRESULT WINAPI recordset_get_RecordCount( _Recordset *iface, ADO_LONGPTR *count ) { struct recordset *recordset = impl_from_Recordset( iface ); + DBCOUNTITEM rows; + HRESULT hr;
TRACE( "%p, %p\n", recordset, count );
- *count = recordset->count; + *count = -1; + + if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); + + if (!recordset->rowset_es) + { + hr = IUnknown_QueryInterface( recordset->row_set, &IID_IRowsetExactScroll, + (void**)&recordset->rowset_es ); + if (FAILED(hr) || !recordset->rowset_es) + recordset->rowset_es = NO_INTERFACE; + } + if (recordset->rowset_es == NO_INTERFACE) + return S_OK; + + hr = IRowsetExactScroll_GetExactPosition( recordset->rowset_es, 0, 0, 0, 0, &rows ); + if (SUCCEEDED(hr)) + *count = rows; return S_OK; }
diff --git a/dlls/msado15/rowset.c b/dlls/msado15/rowset.c index c776f6c3b3d..286d86871fd 100644 --- a/dlls/msado15/rowset.c +++ b/dlls/msado15/rowset.c @@ -248,8 +248,11 @@ static HRESULT WINAPI rowset_GetExactPosition(IRowsetExactScroll *iface, HCHAPTE { struct rowset *rowset = impl_from_IRowsetExactScroll(iface);
- FIXME("%p, %Id, %Iu, %p, %p, %p\n", rowset, chapter, bookmark_cnt, bookmarks, position, rows); - return E_NOTIMPL; + TRACE("%p, %Id, %Iu, %p, %p, %p\n", rowset, chapter, bookmark_cnt, bookmarks, position, rows); + + if (position) FIXME("not setting position\n"); + if (rows) *rows = rowset->row_cnt; + return S_OK; }
static const struct IRowsetExactScrollVtbl rowset_vtbl = diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 111c93d99f7..cbc0feda12f 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -1110,10 +1110,10 @@ static void test_ADORecordsetConstruction(BOOL exact_scroll) SET_EXPECT( rowset_QI_IRowsetExactScroll ); if (exact_scroll) SET_EXPECT( rowset_GetExactPosition ); hr = _Recordset_get_RecordCount( recordset, &size ); - todo_wine CHECK_CALLED( rowset_QI_IRowsetExactScroll ); - if (exact_scroll) todo_wine CHECK_CALLED( rowset_GetExactPosition ); + CHECK_CALLED( rowset_QI_IRowsetExactScroll ); + if (exact_scroll) CHECK_CALLED( rowset_GetExactPosition ); ok( hr == S_OK, "got %08lx\n", hr ); - todo_wine ok( size == (exact_scroll ? 3 : -1), "size = %Id\n", size ); + ok( size == (exact_scroll ? 3 : -1), "size = %Id\n", size );
if (!exact_scroll) SET_EXPECT( rowset_GetNextRows ); else SET_EXPECT( rowset_GetRowsAt );