From: Piotr Caban <piotr@codeweavers.com> --- dlls/msado15/Makefile.in | 2 +- dlls/msado15/msado15_private.h | 2 +- dlls/msado15/recordset.c | 20 ++++++++++++++++---- dlls/msado15/{rowsetex.c => server_cursor.c} | 2 +- dlls/msado15/tests/msado15.c | 4 ++++ 5 files changed, 23 insertions(+), 7 deletions(-) rename dlls/msado15/{rowsetex.c => server_cursor.c} (99%) diff --git a/dlls/msado15/Makefile.in b/dlls/msado15/Makefile.in index fb7ce05d234..fbe369f6ce7 100644 --- a/dlls/msado15/Makefile.in +++ b/dlls/msado15/Makefile.in @@ -9,5 +9,5 @@ SOURCES = \ msado15_tlb.idl \ recordset.c \ rowset.c \ - rowsetex.c \ + server_cursor.c \ stream.c diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h index 40120fc2f28..e14b2e6a0aa 100644 --- a/dlls/msado15/msado15_private.h +++ b/dlls/msado15/msado15_private.h @@ -27,7 +27,7 @@ HRESULT Recordset_create( void ** ); HRESULT Stream_create( void ** ); HRESULT create_mem_rowset( int, const DBCOLUMNINFO *, IUnknown ** ); -HRESULT create_rowsetex( IUnknown *, IUnknown ** ); +HRESULT create_server_cursor( IUnknown *, IUnknown ** ); typedef enum tid_t { ADORecordsetConstruction_tid, diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 04440fc2f8b..8ebd49502b5 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -2841,10 +2841,22 @@ static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT if (FAILED(hr) || !rowset) return hr; - hr = create_rowsetex(rowset, &rowsetex); - IUnknown_Release(rowset); - if (FAILED(hr)) - return hr; + if (recordset->cursor_location == adUseServer) + { + hr = create_server_cursor(rowset, &rowsetex); + IUnknown_Release(rowset); + if (FAILED(hr)) + return hr; + } + else if (recordset->cursor_location == adUseClient) + { + FIXME("unsupported adUseClient cursor location\n"); + rowsetex = rowset; + } + else + { + rowsetex = rowset; + } hr = ADORecordsetConstruction_put_Rowset(&recordset->ADORecordsetConstruction_iface, rowsetex); IUnknown_Release(rowsetex); diff --git a/dlls/msado15/rowsetex.c b/dlls/msado15/server_cursor.c similarity index 99% rename from dlls/msado15/rowsetex.c rename to dlls/msado15/server_cursor.c index e2f68bf1d55..c18ac97c9a9 100644 --- a/dlls/msado15/rowsetex.c +++ b/dlls/msado15/server_cursor.c @@ -781,7 +781,7 @@ static const struct IRowsetFindVtbl find_vtbl = find_FindNextRow }; -HRESULT create_rowsetex(IUnknown *rowset, IUnknown **ret) +HRESULT create_server_cursor(IUnknown *rowset, IUnknown **ret) { struct rowsetex *rowsetex; HRESULT hr; diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 86757bac4b9..a0cca8a9068 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -359,6 +359,10 @@ static void test_Recordset(void) ok( is_eof( recordset ), "not eof\n" ); ok( is_bof( recordset ), "not bof\n" ); + hr = _Recordset_get_CursorLocation(recordset, &location); + ok(hr == S_OK, "hr = %08lx\n", hr); + todo_wine ok(location == adUseClient, "got %d\n", location); + hr = _Recordset_get_LockType( recordset, &lock_type ); ok( hr == S_OK, "got %08lx\n", hr ); ok( lock_type == adLockBatchOptimistic, "lock_type = %d\n", lock_type ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767