[PATCH 0/7] MR10767: msado15: _Recordset::Find and _Recordset::CursorLocation improvements.
From: Piotr Caban <piotr@codeweavers.com> --- dlls/msado15/recordset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 5c55c274303..61f018da17d 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -2934,7 +2934,7 @@ static HRESULT WINAPI recordset_Update( _Recordset *iface, VARIANT fields, VARIA status = NULL; hr = IRowsetUpdate_Update( recordset->rowset_update, 0, 1, &recordset->current_row, NULL, &row, &status ); if (FAILED(hr)) return hr; - if (status[0] == DBROWSTATUS_E_CANCELED) FIXME("status = DBROWSTATUS_E_CANCELED\n"); + if (status && status[0] == DBROWSTATUS_E_CANCELED) FIXME("status = DBROWSTATUS_E_CANCELED\n"); CoTaskMemFree( row ); CoTaskMemFree( status ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767
From: Piotr Caban <piotr@codeweavers.com> --- dlls/msado15/recordset.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 61f018da17d..53dc8095580 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -173,22 +173,27 @@ static HRESULT update_current_row( struct recordset *recordset ) return _Recordset_Update( &recordset->Recordset_iface, missing, missing); } -static void cache_release( struct recordset *recordset ) +static int cache_release( struct recordset *recordset ) { + int off; + if (cache_is_empty( recordset )) { if (recordset->current_row) IRowset_ReleaseRows( recordset->row_set, 1, &recordset->current_row, NULL, NULL, NULL); recordset->current_row = DB_NULL_HROW; - return; + return recordset->cache.dir + (recordset->cache.dir < 0); } + off = recordset->cache.dir * recordset->cache.fetched; + if (recordset->cache.dir < 0) off++; IRowset_ReleaseRows( recordset->row_set, recordset->cache.fetched, recordset->cache.rows, NULL, NULL, NULL ); recordset->cache.fetched = 0; recordset->cache.dir = 0; recordset->cache.pos = 0; recordset->current_row = DB_NULL_HROW; + return off; } static HRESULT get_bookmark( struct recordset *recordset, HROW row, VARIANT *bookmark ) @@ -3434,7 +3439,7 @@ static HRESULT WINAPI recordset_Find( _Recordset *iface, BSTR criteria, LONG ski DBCOMPAREOP op; HACCESSOR hacc; BSTR col, val; - int int_buf; + int int_buf, off; HRESULT hr; VARIANT v; @@ -3496,20 +3501,20 @@ static HRESULT WINAPI recordset_Find( _Recordset *iface, BSTR criteria, LONG ski { row = recordset->current_row; } - cache_release( recordset ); recordset->current_row = row; + off = cache_release( recordset ); + if (search_direction == adSearchBackward) off--; + if (!bm_len) skip_records -= off; V_VT(&v) = VT_BSTR; V_BSTR(&v) = val; - if (!bm_len && search_direction == adSearchForward) - skip_records--; hr = IRowsetFind_FindNextRow( recordset->rowset_find, DB_NULL_HCHAPTER, hacc, &v, op, bm_len, bm_data, skip_records, search_direction, &obtained, &rows ); SysFreeString( val ); release_bookmark_data( &start ); if (free_bookmark) VariantClear( &start ); IAccessor_ReleaseAccessor( recordset->accessor, hacc, NULL ); - if (FAILED(hr)) return hr; + if (FAILED(hr) || !obtained) return hr; if (recordset->bookmark_hacc) { @@ -3526,6 +3531,7 @@ static HRESULT WINAPI recordset_Find( _Recordset *iface, BSTR criteria, LONG ski if (recordset->current_row) IRowset_ReleaseRows( recordset->row_set, 1, &recordset->current_row, NULL, NULL, NULL); recordset->current_row = row; + recordset->cache.dir = (search_direction == adSearchForward ? 1 : -1); return S_OK; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767
From: Piotr Caban <piotr@codeweavers.com> --- dlls/msado15/recordset.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 53dc8095580..e708288e1c1 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -3446,12 +3446,30 @@ static HRESULT WINAPI recordset_Find( _Recordset *iface, BSTR criteria, LONG ski TRACE( "%p, %s, %ld, %d, %s\n", iface, debugstr_w(criteria), skip_records, search_direction, debugstr_variant(&start) ); + if (recordset->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed ); if (!criteria) return MAKE_ADO_HRESULT( adErrInvalidArgument ); if (search_direction != adSearchForward && search_direction != adSearchBackward) return MAKE_ADO_HRESULT( adErrInvalidArgument ); if (!recordset->rowset_find) return MAKE_ADO_HRESULT( adErrFeatureNotAvailable ); + if (!recordset->current_row && !recordset->is_eof && !recordset->is_bof) + { + hr = cache_get( recordset, TRUE ); + if (FAILED(hr)) return hr; + } + else if (recordset->is_eof && search_direction == adSearchBackward) + { + hr = _Recordset_MoveLast(iface); + if (FAILED(hr)) return hr; + } + else if (recordset->is_bof && search_direction == adSearchForward) + { + hr = _Recordset_MoveFirst(iface); + if (FAILED(hr)) return hr; + } if (!recordset->current_row) return S_FALSE; + hr = update_current_row( recordset ); + if (FAILED(hr)) return hr; if ((V_VT(&start) == VT_ERROR && V_ERROR(&start) == DISP_E_PARAMNOTFOUND) || (V_VT(&start) == VT_BSTR && !SysStringLen(V_BSTR(&start)))) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767
From: Piotr Caban <piotr@codeweavers.com> --- dlls/msado15/recordset.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index e708288e1c1..04440fc2f8b 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -3085,6 +3085,8 @@ static HRESULT WINAPI recordset_put_CursorLocation( _Recordset *iface, CursorLoc TRACE( "%p, %u\n", iface, cursor_loc ); if (recordset->state == adStateOpen) return MAKE_ADO_HRESULT( adErrObjectOpen ); + if (cursor_loc < adUseNone || cursor_loc > adUseClient) + return MAKE_ADO_HRESULT( adErrInvalidArgument ); recordset->cursor_location = cursor_loc; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767
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
From: Piotr Caban <piotr@codeweavers.com> The function creates disconnected client-side cursor. --- dlls/msado15/Makefile.in | 2 +- dlls/msado15/{rowset.c => client_cursor.c} | 2 +- dlls/msado15/msado15_private.h | 2 +- dlls/msado15/recordset.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename dlls/msado15/{rowset.c => client_cursor.c} (99%) diff --git a/dlls/msado15/Makefile.in b/dlls/msado15/Makefile.in index fbe369f6ce7..4f6698f3ab3 100644 --- a/dlls/msado15/Makefile.in +++ b/dlls/msado15/Makefile.in @@ -2,12 +2,12 @@ MODULE = msado15.dll IMPORTS = oleaut32 ole32 SOURCES = \ + client_cursor.c \ command.c \ connection.c \ main.c \ msado15_classes.idl \ msado15_tlb.idl \ recordset.c \ - rowset.c \ server_cursor.c \ stream.c diff --git a/dlls/msado15/rowset.c b/dlls/msado15/client_cursor.c similarity index 99% rename from dlls/msado15/rowset.c rename to dlls/msado15/client_cursor.c index beb75ae788e..0df9f92b3fe 100644 --- a/dlls/msado15/rowset.c +++ b/dlls/msado15/client_cursor.c @@ -1078,7 +1078,7 @@ static struct IRowsetInfoVtbl rowset_info_vtbl = rowset_info_GetSpecification }; -HRESULT create_mem_rowset(int count, const DBCOLUMNINFO *info, IUnknown **ret) +HRESULT create_client_cursor(int count, const DBCOLUMNINFO *info, IUnknown **ret) { struct rowset *rowset; HRESULT hr; diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h index e14b2e6a0aa..8c271a8699d 100644 --- a/dlls/msado15/msado15_private.h +++ b/dlls/msado15/msado15_private.h @@ -26,7 +26,7 @@ HRESULT Connection_create( void ** ); HRESULT Recordset_create( void ** ); HRESULT Stream_create( void ** ); -HRESULT create_mem_rowset( int, const DBCOLUMNINFO *, IUnknown ** ); +HRESULT create_client_cursor( int, const DBCOLUMNINFO *, IUnknown ** ); HRESULT create_server_cursor( IUnknown *, IUnknown ** ); typedef enum tid_t { diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 8ebd49502b5..d2139acc8fb 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -2808,7 +2808,7 @@ static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT info[i].columnid.uName.pwszName = field->name; } - hr = create_mem_rowset(recordset->fields.count + 1, info, &rowset); + hr = create_client_cursor(recordset->fields.count + 1, info, &rowset); free(info); if (FAILED(hr)) return hr; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767
From: Piotr Caban <piotr@codeweavers.com> --- dlls/msado15/recordset.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index d2139acc8fb..e59ad1f7d5f 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -1924,6 +1924,8 @@ static HRESULT WINAPI recordset_put_ActiveConnection( _Recordset *iface, VARIANT TRACE( "%p, %s\n", iface, debugstr_variant(&connection) ); + if (recordset->state == adStateOpen) FIXME( "changing active connection\n" ); + switch( V_VT(&connection) ) { case VT_BSTR: -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10767
participants (2)
-
Piotr Caban -
Piotr Caban (@piotr)