From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/recordset.c | 32 +++++++++++++++++++++++++++++++- dlls/msado15/tests/msado15.c | 9 +++++---- 2 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 9e9f8f117ab..cfd27ae1f73 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -89,6 +89,7 @@ struct recordset LONG cache_size; ADO_LONGPTR max_records; VARIANT filter; + BOOL use_bookmarks;
DBTYPE *columntypes; HACCESSOR hacc_empty; /* haccessor for adding empty rows */ @@ -1036,6 +1037,9 @@ static HRESULT init_fields( struct fields *fields ) colinfo[i].dwFlags, colinfo[i].ulColumnSize, colinfo[i].wType, colinfo[i].bPrecision, colinfo[i].bScale);
+ /* skip bookmark column */ + if (!i && rec->use_bookmarks) continue; + hr = append_field(fields, &colinfo[i]); if (FAILED(hr)) { @@ -1314,6 +1318,7 @@ static void close_recordset( struct recordset *recordset ) recordset->accessor = NULL;
VariantClear( &recordset->filter ); + recordset->use_bookmarks = FALSE;
col_count = get_column_count( recordset );
@@ -2969,8 +2974,10 @@ static HRESULT WINAPI rsconstruction_get_Rowset(ADORecordsetConstruction *iface, static HRESULT WINAPI rsconstruction_put_Rowset(ADORecordsetConstruction *iface, IUnknown *unk) { struct recordset *recordset = impl_from_ADORecordsetConstruction( iface ); - HRESULT hr; + DBPROPSET *propset = NULL; + IRowsetInfo *info; IRowset *rowset; + HRESULT hr;
TRACE( "%p, %p\n", recordset, unk );
@@ -2982,6 +2989,29 @@ static HRESULT WINAPI rsconstruction_put_Rowset(ADORecordsetConstruction *iface, if ( recordset->row_set ) IRowset_Release( recordset->row_set ); recordset->row_set = rowset;
+ hr = IRowset_QueryInterface( rowset, &IID_IRowsetInfo, (void**)&info ); + if ( SUCCEEDED(hr) && info) + { + DBPROPIDSET propidset; + DBPROPID id[1]; + ULONG count; + + propidset.rgPropertyIDs = id; + propidset.cPropertyIDs = ARRAY_SIZE(id); + propidset.guidPropertySet = DBPROPSET_ROWSET; + id[0] = DBPROP_BOOKMARKS; + hr = IRowsetInfo_GetProperties( info, 1, &propidset, &count, &propset ); + IRowsetInfo_Release( info ); + if ( FAILED(hr) ) propset = NULL; + } + if ( propset ) + { + if (V_VT(&propset->rgProperties[0].vValue) == VT_BOOL && V_BOOL(&propset->rgProperties[0].vValue)) + recordset->use_bookmarks = TRUE; + CoTaskMemFree( propset->rgProperties ); + CoTaskMemFree( propset ); + } + recordset->state = adStateOpen; return S_OK; } diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c index 10e9dd5105b..959ffcfe832 100644 --- a/dlls/msado15/tests/msado15.c +++ b/dlls/msado15/tests/msado15.c @@ -569,10 +569,11 @@ static HRESULT WINAPI rowset_info_GetProperties(IRowsetInfo *iface, const ULONG const DBPROPIDSET propertyidsets[], ULONG *out_count, DBPROPSET **propertysets1) { CHECK_EXPECT(rowset_info_GetProperties); - ok( count == 2, "got %ld\n", count ); + todo_wine ok( count == 2, "got %ld\n", count );
ok( IsEqualIID(&DBPROPSET_ROWSET, &propertyidsets[0].guidPropertySet), "got %s\n", wine_dbgstr_guid(&propertyidsets[0].guidPropertySet)); - ok( propertyidsets[0].cPropertyIDs == 17, "got %ld\n", propertyidsets[0].cPropertyIDs ); + todo_wine ok( propertyidsets[0].cPropertyIDs == 17, "got %ld\n", propertyidsets[0].cPropertyIDs ); + if (count < 2) return E_NOTIMPL;
ok( IsEqualIID(&DBPROPSET_PROVIDERROWSET, &propertyidsets[1].guidPropertySet), "got %s\n", wine_dbgstr_guid(&propertyidsets[1].guidPropertySet)); ok( propertyidsets[1].cPropertyIDs == 1, "got %ld\n", propertyidsets[1].cPropertyIDs ); @@ -1063,10 +1064,10 @@ static void test_ADORecordsetConstruction(BOOL exact_scroll) SET_EXPECT( column_info_GetColumnInfo ); hr = ADORecordsetConstruction_put_Rowset( construct, rowset ); CHECK_CALLED( rowset_QI_IRowset ); - todo_wine CHECK_CALLED( rowset_QI_IRowsetInfo ); + CHECK_CALLED( rowset_QI_IRowsetInfo ); todo_wine CHECK_CALLED( rowset_QI_IRowsetExactScroll ); todo_wine CHECK_CALLED( rowset_QI_IDBAsynchStatus ); - todo_wine CHECK_CALLED( rowset_info_GetProperties ); + CHECK_CALLED( rowset_info_GetProperties ); if (exact_scroll) todo_wine CHECK_CALLED( rowset_QI_IColumnsInfo ); else CHECK_NOT_CALLED( rowset_QI_IColumnsInfo ); if (exact_scroll) todo_wine CHECK_CALLED( column_info_GetColumnInfo );