From: Piotr Caban piotr@codeweavers.com
--- dlls/msado15/recordset.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index 611c509003d..2cfdfbe8e1c 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -96,6 +96,7 @@ struct recordset LockTypeEnum lock_type; IRowset *row_set; IRowsetLocate *rowset_locate; + IRowsetScroll *rowset_scroll; IRowsetExactScroll *rowset_es; IRowsetChange *rowset_change; IRowsetUpdate *rowset_update; @@ -1650,6 +1651,9 @@ static void close_recordset( struct recordset *recordset ) if ( recordset->rowset_locate ) IRowsetLocate_Release( recordset->rowset_locate ); recordset->rowset_locate = NULL; + if ( recordset->rowset_scroll && recordset->rowset_scroll != NO_INTERFACE ) + IRowsetScroll_Release( recordset->rowset_scroll ); + recordset->rowset_scroll = NULL; if ( recordset->rowset_es && recordset->rowset_es != NO_INTERFACE ) IRowsetExactScroll_Release( recordset->rowset_es ); recordset->rowset_es = NULL; @@ -2130,12 +2134,29 @@ static HRESULT WINAPI recordset_get_RecordCount( _Recordset *iface, ADO_LONGPTR if (FAILED(hr) || !recordset->rowset_es) recordset->rowset_es = NO_INTERFACE; } - if (recordset->rowset_es == NO_INTERFACE) + + if (recordset->rowset_es != NO_INTERFACE) + { + hr = IRowsetExactScroll_GetExactPosition( recordset->rowset_es, 0, 0, 0, 0, &rows ); + if (SUCCEEDED(hr)) + *count = rows; return S_OK; + }
- hr = IRowsetExactScroll_GetExactPosition( recordset->rowset_es, 0, 0, 0, 0, &rows ); - if (SUCCEEDED(hr)) - *count = rows; + if (!recordset->rowset_scroll) + { + hr = IUnknown_QueryInterface( recordset->row_set, &IID_IRowsetScroll, + (void**)&recordset->rowset_scroll ); + if (FAILED(hr) || !recordset->rowset_scroll) + recordset->rowset_scroll = NO_INTERFACE; + } + + if (recordset->rowset_scroll != NO_INTERFACE) + { + hr = IRowsetScroll_GetApproximatePosition( recordset->rowset_scroll, 0, 0, 0, 0, &rows ); + if (SUCCEEDED(hr)) + *count = rows; + } return S_OK; }
@@ -2387,7 +2408,7 @@ static HRESULT get_rowset(struct recordset *recordset, IUnknown *session, BSTR s IOpenRowset *openrowset; DBROWCOUNT affected; DBPROPSET propset; - DBPROP props[3]; + DBPROP props[5]; ICommand *cmd; DBID table; HRESULT hr; @@ -2413,6 +2434,12 @@ static HRESULT get_rowset(struct recordset *recordset, IUnknown *session, BSTR s V_VT(&props[2].vValue) = VT_I4; V_I4(&props[2].vValue) = (recordset->lock_type == adLockReadOnly ? 0 : DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE | DBPROPVAL_UP_INSERT); + props[3].dwPropertyID = DBPROP_IRowsetLocate; + V_VT(&props[3].vValue) = VT_BOOL; + V_BOOL(&props[3].vValue) = VARIANT_TRUE; + props[4].dwPropertyID = DBPROP_IRowsetScroll; + V_VT(&props[4].vValue) = VT_BOOL; + V_BOOL(&props[4].vValue) = VARIANT_TRUE;
hr = IOpenRowset_OpenRowset(openrowset, NULL, &table, NULL, &IID_IUnknown, 1, &propset, rowset); if (SUCCEEDED(hr))