Due to not have having any programs that explicitly use Recordset::put_Active_connection. I've only supporting Recordset::Open at this stage.
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msado15/recordset.c | 8 ++++++-- dlls/msado15/tests/msado15.c | 14 +++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 9107aca26e7..272131a0d31 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -39,6 +39,7 @@ struct recordset ADORecordsetConstruction ADORecordsetConstruction_iface; ISupportErrorInfo ISupportErrorInfo_iface; LONG refs; + VARIANT active_connection; LONG state; struct fields *fields; LONG count; @@ -1401,8 +1402,9 @@ static HRESULT WINAPI recordset_put_ActiveConnection( _Recordset *iface, VARIANT
static HRESULT WINAPI recordset_get_ActiveConnection( _Recordset *iface, VARIANT *connection ) { - FIXME( "%p, %p\n", iface, connection ); - return E_NOTIMPL; + struct recordset *recordset = impl_from_Recordset( iface ); + TRACE( "%p, %p\n", iface, connection ); + return VariantCopy(connection, &recordset->active_connection); }
static HRESULT WINAPI recordset_get_BOF( _Recordset *iface, VARIANT_BOOL *bof ) @@ -2737,6 +2739,8 @@ HRESULT Recordset_create( void **obj ) recordset->Recordset_iface.lpVtbl = &recordset_vtbl; recordset->ISupportErrorInfo_iface.lpVtbl = &recordset_supporterrorinfo_vtbl; recordset->ADORecordsetConstruction_iface.lpVtbl = &rsconstruction_vtbl; + V_VT(&recordset->active_connection) = VT_DISPATCH; + V_DISPATCH(&recordset->active_connection) = NULL; recordset->refs = 1; recordset->index = -1; recordset->cursor_location = adUseServer; diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 724787870e0..c60ea69227c 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -59,7 +59,7 @@ static void test_Recordset(void) CursorTypeEnum cursor; BSTR name; HRESULT hr; - VARIANT bookmark, filter; + VARIANT bookmark, filter, active; EditModeEnum editmode;
hr = CoCreateInstance( &CLSID_Recordset, NULL, CLSCTX_INPROC_SERVER, &IID__Recordset, (void **)&recordset ); @@ -222,6 +222,18 @@ static void test_Recordset(void) ok( is_eof( recordset ), "not eof\n" ); ok( is_bof( recordset ), "not bof\n" );
+if (0) +{ /* Causes a crash */ + hr = _Recordset_get_ActiveConnection( recordset, NULL ); +} + + VariantInit(&active); + hr = _Recordset_get_ActiveConnection( recordset, &active ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( V_VT(&active) == VT_DISPATCH, "got %d\n", V_VT(&active) ); + ok( V_DISPATCH(&active) == NULL, "got %p\n", V_DISPATCH(&active) ); + VariantClear(&active); + editmode = -1; hr = _Recordset_get_EditMode( recordset, &editmode ); ok( hr == MAKE_ADO_HRESULT( adErrNoCurrentRecord ), "got %08lx\n", hr );
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msado15/recordset.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 272131a0d31..ce91e7b17c0 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -2071,6 +2071,10 @@ static HRESULT WINAPI recordset_Open( _Recordset *iface, VARIANT source, VARIANT if (FAILED(hr)) return E_FAIL;
+ hr = VariantCopy(&recordset->active_connection, &active_connection); + if (FAILED(hr)) + return E_FAIL; + if (V_VT(&source) != VT_BSTR) { FIXME("Unsupported source type!\n");
From: Alistair Leslie-Hughes leslie_alistair@hotmail.com
--- dlls/msado15/recordset.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/msado15/tests/msado15.c | 19 ++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index ce91e7b17c0..99779f99dfa 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -1588,12 +1588,20 @@ static HRESULT WINAPI recordset_AddNew( _Recordset *iface, VARIANT field_list, V
if (!resize_recordset( recordset, recordset->count + 1 )) return E_OUTOFMEMORY; recordset->index++; + recordset->editmode = adEditAdd; return S_OK; }
static HRESULT WINAPI recordset_CancelUpdate( _Recordset *iface ) { + struct recordset *recordset = impl_from_Recordset( iface ); + FIXME( "%p\n", iface ); + + if (V_DISPATCH(&recordset->active_connection) == NULL) + return S_OK; + + recordset->editmode = adEditNone; return E_NOTIMPL; }
@@ -2153,7 +2161,14 @@ static HRESULT WINAPI recordset__xResync( _Recordset *iface, AffectEnum affect_r
static HRESULT WINAPI recordset_Update( _Recordset *iface, VARIANT fields, VARIANT values ) { + struct recordset *recordset = impl_from_Recordset( iface ); + FIXME( "%p, %s, %s\n", iface, debugstr_variant(&fields), debugstr_variant(&values) ); + + if (V_DISPATCH(&recordset->active_connection) == NULL) + return S_OK; + + recordset->editmode = adEditNone; return E_NOTIMPL; }
@@ -2270,13 +2285,27 @@ static HRESULT WINAPI recordset__xClone( _Recordset *iface, _Recordset **obj )
static HRESULT WINAPI recordset_UpdateBatch( _Recordset *iface, AffectEnum affect_records ) { + struct recordset *recordset = impl_from_Recordset( iface ); + FIXME( "%p, %u\n", iface, affect_records ); + + if (V_DISPATCH(&recordset->active_connection) == NULL) + return S_OK; + + recordset->editmode = adEditNone; return E_NOTIMPL; }
static HRESULT WINAPI recordset_CancelBatch( _Recordset *iface, AffectEnum affect_records ) { + struct recordset *recordset = impl_from_Recordset( iface ); + FIXME( "%p, %u\n", iface, affect_records ); + + if (V_DISPATCH(&recordset->active_connection) == NULL) + return S_OK; + + recordset->editmode = adEditNone; return E_NOTIMPL; }
@@ -2350,7 +2379,14 @@ static HRESULT WINAPI recordset_Find( _Recordset *iface, BSTR criteria, LONG ski
static HRESULT WINAPI recordset_Cancel( _Recordset *iface ) { + struct recordset *recordset = impl_from_Recordset( iface ); + FIXME( "%p\n", iface ); + + if (V_DISPATCH(&recordset->active_connection) == NULL) + return S_OK; + + recordset->editmode = adEditNone; return E_NOTIMPL; }
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index c60ea69227c..9c9afbc120f 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -267,7 +267,7 @@ if (0) editmode = -1; hr = _Recordset_get_EditMode( recordset, &editmode ); ok( hr == S_OK, "got %08lx\n", hr ); - todo_wine ok( editmode == adEditAdd, "got %d\n", editmode ); + ok( editmode == adEditAdd, "got %d\n", editmode );
rec_count = -1; hr = _Recordset_get_RecordCount( recordset, &rec_count ); @@ -317,6 +317,23 @@ if (0) ok( V_VT( &val ) == VT_I4, "got %u\n", V_VT( &val ) ); ok( V_I4( &val ) == -1, "got %ld\n", V_I4( &val ) );
+ /* Update/Cancel doesn't update EditMode when no active connection. */ + hr = _Recordset_Update( recordset, missing, missing ); + ok( hr == S_OK, "got %08lx\n", hr ); + + editmode = -1; + hr = _Recordset_get_EditMode( recordset, &editmode ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( editmode == adEditAdd, "got %d\n", editmode ); + + hr = _Recordset_Cancel( recordset ); + ok( hr == S_OK, "got %08lx\n", hr ); + + editmode = -1; + hr = _Recordset_get_EditMode( recordset, &editmode ); + ok( hr == S_OK, "got %08lx\n", hr ); + ok( editmode == adEditAdd, "got %d\n", editmode ); + hr = _Recordset_AddNew( recordset, missing, missing ); ok( hr == S_OK, "got %08lx\n", hr );