12f86921cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 32f86921cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 42f86921cSAndrew Rist * or more contributor license agreements. See the NOTICE file 52f86921cSAndrew Rist * distributed with this work for additional information 62f86921cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 72f86921cSAndrew Rist * to you under the Apache License, Version 2.0 (the 82f86921cSAndrew Rist * "License"); you may not use this file except in compliance 92f86921cSAndrew Rist * with the License. You may obtain a copy of the License at 102f86921cSAndrew Rist * 112f86921cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 122f86921cSAndrew Rist * 132f86921cSAndrew Rist * Unless required by applicable law or agreed to in writing, 142f86921cSAndrew Rist * software distributed under the License is distributed on an 152f86921cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 162f86921cSAndrew Rist * KIND, either express or implied. See the License for the 172f86921cSAndrew Rist * specific language governing permissions and limitations 182f86921cSAndrew Rist * under the License. 192f86921cSAndrew Rist * 202f86921cSAndrew Rist *************************************************************/ 212f86921cSAndrew Rist 222f86921cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25*421ed02eSdamjan #include "precompiled_cacher.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <cachedcontentresultsetstub.hxx> 28cdf0e10cSrcweir #include <com/sun/star/sdbc/FetchDirection.hpp> 29cdf0e10cSrcweir #include <com/sun/star/ucb/FetchError.hpp> 30cdf0e10cSrcweir #include <osl/diagnose.h> 31cdf0e10cSrcweir 32cdf0e10cSrcweir using namespace com::sun::star::beans; 33cdf0e10cSrcweir using namespace com::sun::star::lang; 34cdf0e10cSrcweir using namespace com::sun::star::sdbc; 35cdf0e10cSrcweir using namespace com::sun::star::ucb; 36cdf0e10cSrcweir using namespace com::sun::star::uno; 37cdf0e10cSrcweir using namespace com::sun::star::util; 38cdf0e10cSrcweir using namespace cppu; 39cdf0e10cSrcweir using namespace rtl; 40cdf0e10cSrcweir 41cdf0e10cSrcweir CachedContentResultSetStub::CachedContentResultSetStub( Reference< XResultSet > xOrigin ) 42cdf0e10cSrcweir : ContentResultSetWrapper( xOrigin ) 43cdf0e10cSrcweir , m_nColumnCount( 0 ) 44cdf0e10cSrcweir , m_bColumnCountCached( sal_False ) 45cdf0e10cSrcweir , m_bNeedToPropagateFetchSize( sal_True ) 46cdf0e10cSrcweir , m_bFirstFetchSizePropagationDone( sal_False ) 47cdf0e10cSrcweir , m_nLastFetchSize( 1 )//this value is not important at all 48cdf0e10cSrcweir , m_bLastFetchDirection( sal_True )//this value is not important at all 49cdf0e10cSrcweir , m_aPropertyNameForFetchSize( OUString::createFromAscii( "FetchSize" ) ) 50cdf0e10cSrcweir , m_aPropertyNameForFetchDirection( OUString::createFromAscii( "FetchDirection" ) ) 51cdf0e10cSrcweir { 52cdf0e10cSrcweir impl_init(); 53cdf0e10cSrcweir } 54cdf0e10cSrcweir 55cdf0e10cSrcweir CachedContentResultSetStub::~CachedContentResultSetStub() 56cdf0e10cSrcweir { 57cdf0e10cSrcweir impl_deinit(); 58cdf0e10cSrcweir } 59cdf0e10cSrcweir 60cdf0e10cSrcweir //-------------------------------------------------------------------------- 61cdf0e10cSrcweir // XInterface methods. 62cdf0e10cSrcweir //-------------------------------------------------------------------------- 63cdf0e10cSrcweir XINTERFACE_COMMON_IMPL( CachedContentResultSetStub ) 64cdf0e10cSrcweir 65cdf0e10cSrcweir Any SAL_CALL CachedContentResultSetStub 66cdf0e10cSrcweir ::queryInterface( const Type& rType ) 67cdf0e10cSrcweir throw ( RuntimeException ) 68cdf0e10cSrcweir { 69cdf0e10cSrcweir //list all interfaces inclusive baseclasses of interfaces 70cdf0e10cSrcweir 71cdf0e10cSrcweir Any aRet = ContentResultSetWrapper::queryInterface( rType ); 72cdf0e10cSrcweir if( aRet.hasValue() ) 73cdf0e10cSrcweir return aRet; 74cdf0e10cSrcweir 75cdf0e10cSrcweir aRet = cppu::queryInterface( rType 76cdf0e10cSrcweir , static_cast< XTypeProvider* >( this ) 77cdf0e10cSrcweir , static_cast< XServiceInfo* >( this ) 78cdf0e10cSrcweir , static_cast< XFetchProvider* >( this ) 79cdf0e10cSrcweir , static_cast< XFetchProviderForContentAccess* >( this ) 80cdf0e10cSrcweir ); 81cdf0e10cSrcweir 82cdf0e10cSrcweir return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir //-------------------------------------------------------------------------- 86cdf0e10cSrcweir // own methods. ( inherited ) 87cdf0e10cSrcweir //-------------------------------------------------------------------------- 88cdf0e10cSrcweir 89cdf0e10cSrcweir //virtual 90cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 91cdf0e10cSrcweir ::impl_propertyChange( const PropertyChangeEvent& rEvt ) 92cdf0e10cSrcweir throw( RuntimeException ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir impl_EnsureNotDisposed(); 95cdf0e10cSrcweir 96cdf0e10cSrcweir //don't notify events on fetchsize and fetchdirection to the above CachedContentResultSet 97cdf0e10cSrcweir //because it will ignore them anyway and we can save this remote calls 98cdf0e10cSrcweir if( rEvt.PropertyName == m_aPropertyNameForFetchSize 99cdf0e10cSrcweir || rEvt.PropertyName == m_aPropertyNameForFetchDirection ) 100cdf0e10cSrcweir return; 101cdf0e10cSrcweir 102cdf0e10cSrcweir PropertyChangeEvent aEvt( rEvt ); 103cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this ); 104cdf0e10cSrcweir aEvt.Further = sal_False; 105cdf0e10cSrcweir 106cdf0e10cSrcweir impl_notifyPropertyChangeListeners( aEvt ); 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir 110cdf0e10cSrcweir //virtual 111cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 112cdf0e10cSrcweir ::impl_vetoableChange( const PropertyChangeEvent& rEvt ) 113cdf0e10cSrcweir throw( PropertyVetoException, 114cdf0e10cSrcweir RuntimeException ) 115cdf0e10cSrcweir { 116cdf0e10cSrcweir impl_EnsureNotDisposed(); 117cdf0e10cSrcweir 118cdf0e10cSrcweir //don't notify events on fetchsize and fetchdirection to the above CachedContentResultSet 119cdf0e10cSrcweir //because it will ignore them anyway and we can save this remote calls 120cdf0e10cSrcweir if( rEvt.PropertyName == m_aPropertyNameForFetchSize 121cdf0e10cSrcweir || rEvt.PropertyName == m_aPropertyNameForFetchDirection ) 122cdf0e10cSrcweir return; 123cdf0e10cSrcweir 124cdf0e10cSrcweir PropertyChangeEvent aEvt( rEvt ); 125cdf0e10cSrcweir aEvt.Source = static_cast< XPropertySet * >( this ); 126cdf0e10cSrcweir aEvt.Further = sal_False; 127cdf0e10cSrcweir 128cdf0e10cSrcweir impl_notifyVetoableChangeListeners( aEvt ); 129cdf0e10cSrcweir } 130cdf0e10cSrcweir 131cdf0e10cSrcweir //-------------------------------------------------------------------------- 132cdf0e10cSrcweir // XTypeProvider methods. 133cdf0e10cSrcweir //-------------------------------------------------------------------------- 134cdf0e10cSrcweir 135cdf0e10cSrcweir XTYPEPROVIDER_COMMON_IMPL( CachedContentResultSetStub ) 136cdf0e10cSrcweir //list all interfaces exclusive baseclasses 137cdf0e10cSrcweir Sequence< Type > SAL_CALL CachedContentResultSetStub 138cdf0e10cSrcweir ::getTypes() 139cdf0e10cSrcweir throw( RuntimeException ) 140cdf0e10cSrcweir { 141cdf0e10cSrcweir static Sequence< Type >* pTypes = NULL; 142cdf0e10cSrcweir if( !pTypes ) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() ); 145cdf0e10cSrcweir if( !pTypes ) 146cdf0e10cSrcweir { 147cdf0e10cSrcweir pTypes = new Sequence< Type >(13); 148cdf0e10cSrcweir (*pTypes)[0] = CPPU_TYPE_REF( XTypeProvider ); 149cdf0e10cSrcweir (*pTypes)[1] = CPPU_TYPE_REF( XServiceInfo ); 150cdf0e10cSrcweir (*pTypes)[2] = CPPU_TYPE_REF( XComponent ); 151cdf0e10cSrcweir (*pTypes)[3] = CPPU_TYPE_REF( XCloseable ); 152cdf0e10cSrcweir (*pTypes)[4] = CPPU_TYPE_REF( XResultSetMetaDataSupplier ); 153cdf0e10cSrcweir (*pTypes)[5] = CPPU_TYPE_REF( XPropertySet ); 154cdf0e10cSrcweir (*pTypes)[6] = CPPU_TYPE_REF( XPropertyChangeListener ); 155cdf0e10cSrcweir (*pTypes)[7] = CPPU_TYPE_REF( XVetoableChangeListener ); 156cdf0e10cSrcweir (*pTypes)[8] = CPPU_TYPE_REF( XResultSet ); 157cdf0e10cSrcweir (*pTypes)[9] = CPPU_TYPE_REF( XContentAccess ); 158cdf0e10cSrcweir (*pTypes)[10] = CPPU_TYPE_REF( XRow ); 159cdf0e10cSrcweir (*pTypes)[11] = CPPU_TYPE_REF( XFetchProvider ); 160cdf0e10cSrcweir (*pTypes)[12] = CPPU_TYPE_REF( XFetchProviderForContentAccess ); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir return *pTypes; 164cdf0e10cSrcweir /* 165cdf0e10cSrcweir static cppu::OTypeCollection * pCollection = 0; 166cdf0e10cSrcweir if (!pCollection) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir osl::MutexGuard aGuard(osl::Mutex::getGlobalMutex()); 169cdf0e10cSrcweir if (!pCollection) 170cdf0e10cSrcweir { 171cdf0e10cSrcweir static cppu::OTypeCollection 172cdf0e10cSrcweir aTheCollection( 173cdf0e10cSrcweir getCppuType( 174cdf0e10cSrcweir static_cast< Reference< XTypeProvider > 175cdf0e10cSrcweir const * >( 176cdf0e10cSrcweir 0)), 177cdf0e10cSrcweir getCppuType( 178cdf0e10cSrcweir static_cast< Reference< XServiceInfo > 179cdf0e10cSrcweir const * >( 180cdf0e10cSrcweir 0)), 181cdf0e10cSrcweir getCppuType( 182cdf0e10cSrcweir static_cast< Reference< XComponent > 183cdf0e10cSrcweir const * >( 184cdf0e10cSrcweir 0)), 185cdf0e10cSrcweir getCppuType( 186cdf0e10cSrcweir static_cast< Reference< XCloseable > 187cdf0e10cSrcweir const * >( 188cdf0e10cSrcweir 0)), 189cdf0e10cSrcweir getCppuType( 190cdf0e10cSrcweir static_cast< Reference< XResultSetMetaDataSupplier > 191cdf0e10cSrcweir const * >( 192cdf0e10cSrcweir 0)), 193cdf0e10cSrcweir getCppuType( 194cdf0e10cSrcweir static_cast< Reference< XPropertySet > 195cdf0e10cSrcweir const * >( 196cdf0e10cSrcweir 0)), 197cdf0e10cSrcweir getCppuType( 198cdf0e10cSrcweir static_cast< Reference< XPropertyChangeListener > 199cdf0e10cSrcweir const * >( 200cdf0e10cSrcweir 0)), 201cdf0e10cSrcweir getCppuType( 202cdf0e10cSrcweir static_cast< Reference< XVetoableChangeListener > 203cdf0e10cSrcweir const * >( 204cdf0e10cSrcweir 0)), 205cdf0e10cSrcweir getCppuType( 206cdf0e10cSrcweir static_cast< Reference< XResultSet > 207cdf0e10cSrcweir const * >( 208cdf0e10cSrcweir 0)), 209cdf0e10cSrcweir getCppuType( 210cdf0e10cSrcweir static_cast< Reference< XContentAccess > 211cdf0e10cSrcweir const * >( 212cdf0e10cSrcweir 0)), 213cdf0e10cSrcweir getCppuType( 214cdf0e10cSrcweir static_cast< Reference< XRow > 215cdf0e10cSrcweir const * >( 216cdf0e10cSrcweir 0)), 217cdf0e10cSrcweir getCppuType( 218cdf0e10cSrcweir static_cast< Reference< XFetchProvider > 219cdf0e10cSrcweir const * >( 220cdf0e10cSrcweir 0)), 221cdf0e10cSrcweir getCppuType( 222cdf0e10cSrcweir static_cast< Reference< XFetchProviderForContentAccess > 223cdf0e10cSrcweir const * >( 224cdf0e10cSrcweir 0)) 225cdf0e10cSrcweir ); 226cdf0e10cSrcweir pCollection = &aTheCollection; 227cdf0e10cSrcweir } 228cdf0e10cSrcweir } 229cdf0e10cSrcweir return pCollection->getTypes(); 230cdf0e10cSrcweir */ 231cdf0e10cSrcweir } 232cdf0e10cSrcweir 233cdf0e10cSrcweir //-------------------------------------------------------------------------- 234cdf0e10cSrcweir // XServiceInfo methods. 235cdf0e10cSrcweir //-------------------------------------------------------------------------- 236cdf0e10cSrcweir 237cdf0e10cSrcweir XSERVICEINFO_NOFACTORY_IMPL_1( CachedContentResultSetStub, 238cdf0e10cSrcweir OUString::createFromAscii( 239cdf0e10cSrcweir "com.sun.star.comp.ucb.CachedContentResultSetStub" ), 240cdf0e10cSrcweir OUString::createFromAscii( 241cdf0e10cSrcweir CACHED_CRS_STUB_SERVICE_NAME ) ); 242cdf0e10cSrcweir 243cdf0e10cSrcweir //----------------------------------------------------------------- 244cdf0e10cSrcweir // XFetchProvider methods. 245cdf0e10cSrcweir //----------------------------------------------------------------- 246cdf0e10cSrcweir 247cdf0e10cSrcweir #define FETCH_XXX( impl_loadRow, loadInterface ) \ 248cdf0e10cSrcweir impl_EnsureNotDisposed(); \ 249cdf0e10cSrcweir if( !m_xResultSetOrigin.is() ) \ 250cdf0e10cSrcweir { \ 251cdf0e10cSrcweir OSL_ENSURE( sal_False, "broadcaster was disposed already" ); \ 252cdf0e10cSrcweir throw RuntimeException(); \ 253cdf0e10cSrcweir } \ 254cdf0e10cSrcweir impl_propagateFetchSizeAndDirection( nRowCount, bDirection ); \ 255cdf0e10cSrcweir FetchResult aRet; \ 256cdf0e10cSrcweir aRet.StartIndex = nRowStartPosition; \ 257cdf0e10cSrcweir aRet.Orientation = bDirection; \ 258cdf0e10cSrcweir aRet.FetchError = FetchError::SUCCESS; /*ENDOFDATA, EXCEPTION*/ \ 259cdf0e10cSrcweir sal_Int32 nOldOriginal_Pos = m_xResultSetOrigin->getRow(); \ 260cdf0e10cSrcweir if( impl_isForwardOnly() ) \ 261cdf0e10cSrcweir { \ 262cdf0e10cSrcweir if( nOldOriginal_Pos != nRowStartPosition ) \ 263cdf0e10cSrcweir { \ 264cdf0e10cSrcweir /*@todo*/ \ 265cdf0e10cSrcweir aRet.FetchError = FetchError::EXCEPTION; \ 266cdf0e10cSrcweir return aRet; \ 267cdf0e10cSrcweir } \ 268cdf0e10cSrcweir if( nRowCount != 1 ) \ 269cdf0e10cSrcweir aRet.FetchError = FetchError::EXCEPTION; \ 270cdf0e10cSrcweir \ 271cdf0e10cSrcweir aRet.Rows.realloc( 1 ); \ 272cdf0e10cSrcweir \ 273cdf0e10cSrcweir try \ 274cdf0e10cSrcweir { \ 275cdf0e10cSrcweir impl_loadRow( aRet.Rows[0], loadInterface ); \ 276cdf0e10cSrcweir } \ 277cdf0e10cSrcweir catch( SQLException& ) \ 278cdf0e10cSrcweir { \ 279cdf0e10cSrcweir aRet.Rows.realloc( 0 ); \ 280cdf0e10cSrcweir aRet.FetchError = FetchError::EXCEPTION; \ 281cdf0e10cSrcweir return aRet; \ 282cdf0e10cSrcweir } \ 283cdf0e10cSrcweir return aRet; \ 284cdf0e10cSrcweir } \ 285cdf0e10cSrcweir aRet.Rows.realloc( nRowCount ); \ 286cdf0e10cSrcweir sal_Bool bOldOriginal_AfterLast = sal_False; \ 287cdf0e10cSrcweir if( !nOldOriginal_Pos ) \ 288cdf0e10cSrcweir bOldOriginal_AfterLast = m_xResultSetOrigin->isAfterLast(); \ 289cdf0e10cSrcweir sal_Int32 nN = 1; \ 290cdf0e10cSrcweir sal_Bool bValidNewPos = sal_False; \ 291cdf0e10cSrcweir try \ 292cdf0e10cSrcweir { \ 293cdf0e10cSrcweir try \ 294cdf0e10cSrcweir { \ 295cdf0e10cSrcweir /*if( nOldOriginal_Pos != nRowStartPosition )*/ \ 296cdf0e10cSrcweir bValidNewPos = m_xResultSetOrigin->absolute( nRowStartPosition ); \ 297cdf0e10cSrcweir } \ 298cdf0e10cSrcweir catch( SQLException& ) \ 299cdf0e10cSrcweir { \ 300cdf0e10cSrcweir aRet.Rows.realloc( 0 ); \ 301cdf0e10cSrcweir aRet.FetchError = FetchError::EXCEPTION; \ 302cdf0e10cSrcweir return aRet; \ 303cdf0e10cSrcweir } \ 304cdf0e10cSrcweir if( !bValidNewPos ) \ 305cdf0e10cSrcweir { \ 306cdf0e10cSrcweir aRet.Rows.realloc( 0 ); \ 307cdf0e10cSrcweir aRet.FetchError = FetchError::EXCEPTION; \ 308cdf0e10cSrcweir \ 309cdf0e10cSrcweir /*restore old position*/ \ 310cdf0e10cSrcweir if( nOldOriginal_Pos ) \ 311cdf0e10cSrcweir m_xResultSetOrigin->absolute( nOldOriginal_Pos ); \ 312cdf0e10cSrcweir else if( bOldOriginal_AfterLast ) \ 313cdf0e10cSrcweir m_xResultSetOrigin->afterLast(); \ 314cdf0e10cSrcweir else \ 315cdf0e10cSrcweir m_xResultSetOrigin->beforeFirst(); \ 316cdf0e10cSrcweir \ 317cdf0e10cSrcweir return aRet; \ 318cdf0e10cSrcweir } \ 319cdf0e10cSrcweir for( ; nN <= nRowCount; ) \ 320cdf0e10cSrcweir { \ 321cdf0e10cSrcweir impl_loadRow( aRet.Rows[nN-1], loadInterface ); \ 322cdf0e10cSrcweir nN++; \ 323cdf0e10cSrcweir if( nN <= nRowCount ) \ 324cdf0e10cSrcweir { \ 325cdf0e10cSrcweir if( bDirection ) \ 326cdf0e10cSrcweir { \ 327cdf0e10cSrcweir if( !m_xResultSetOrigin->next() ) \ 328cdf0e10cSrcweir { \ 329cdf0e10cSrcweir aRet.Rows.realloc( nN-1 ); \ 330cdf0e10cSrcweir aRet.FetchError = FetchError::ENDOFDATA; \ 331cdf0e10cSrcweir break; \ 332cdf0e10cSrcweir } \ 333cdf0e10cSrcweir } \ 334cdf0e10cSrcweir else \ 335cdf0e10cSrcweir { \ 336cdf0e10cSrcweir if( !m_xResultSetOrigin->previous() ) \ 337cdf0e10cSrcweir { \ 338cdf0e10cSrcweir aRet.Rows.realloc( nN-1 ); \ 339cdf0e10cSrcweir aRet.FetchError = FetchError::ENDOFDATA; \ 340cdf0e10cSrcweir break; \ 341cdf0e10cSrcweir } \ 342cdf0e10cSrcweir } \ 343cdf0e10cSrcweir } \ 344cdf0e10cSrcweir } \ 345cdf0e10cSrcweir } \ 346cdf0e10cSrcweir catch( SQLException& ) \ 347cdf0e10cSrcweir { \ 348cdf0e10cSrcweir aRet.Rows.realloc( nN-1 ); \ 349cdf0e10cSrcweir aRet.FetchError = FetchError::EXCEPTION; \ 350cdf0e10cSrcweir } \ 351cdf0e10cSrcweir /*restore old position*/ \ 352cdf0e10cSrcweir if( nOldOriginal_Pos ) \ 353cdf0e10cSrcweir m_xResultSetOrigin->absolute( nOldOriginal_Pos ); \ 354cdf0e10cSrcweir else if( bOldOriginal_AfterLast ) \ 355cdf0e10cSrcweir m_xResultSetOrigin->afterLast(); \ 356cdf0e10cSrcweir else \ 357cdf0e10cSrcweir m_xResultSetOrigin->beforeFirst(); \ 358cdf0e10cSrcweir return aRet; 359cdf0e10cSrcweir 360cdf0e10cSrcweir FetchResult SAL_CALL CachedContentResultSetStub 361cdf0e10cSrcweir ::fetch( sal_Int32 nRowStartPosition 362cdf0e10cSrcweir , sal_Int32 nRowCount, sal_Bool bDirection ) 363cdf0e10cSrcweir throw( RuntimeException ) 364cdf0e10cSrcweir { 365cdf0e10cSrcweir impl_init_xRowOrigin(); 366cdf0e10cSrcweir FETCH_XXX( impl_getCurrentRowContent, m_xRowOrigin ); 367cdf0e10cSrcweir } 368cdf0e10cSrcweir 369cdf0e10cSrcweir sal_Int32 SAL_CALL CachedContentResultSetStub 370cdf0e10cSrcweir ::impl_getColumnCount() 371cdf0e10cSrcweir { 372cdf0e10cSrcweir sal_Int32 nCount; 373cdf0e10cSrcweir sal_Bool bCached; 374cdf0e10cSrcweir { 375cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex ); 376cdf0e10cSrcweir nCount = m_nColumnCount; 377cdf0e10cSrcweir bCached = m_bColumnCountCached; 378cdf0e10cSrcweir } 379cdf0e10cSrcweir if( !bCached ) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir try 382cdf0e10cSrcweir { 383cdf0e10cSrcweir Reference< XResultSetMetaData > xMetaData = getMetaData(); 384cdf0e10cSrcweir if( xMetaData.is() ) 385cdf0e10cSrcweir nCount = xMetaData->getColumnCount(); 386cdf0e10cSrcweir } 387cdf0e10cSrcweir catch( SQLException& ) 388cdf0e10cSrcweir { 389cdf0e10cSrcweir OSL_ENSURE( sal_False, "couldn't determine the column count" ); 390cdf0e10cSrcweir nCount = 0; 391cdf0e10cSrcweir } 392cdf0e10cSrcweir } 393cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex ); 394cdf0e10cSrcweir m_nColumnCount = nCount; 395cdf0e10cSrcweir m_bColumnCountCached = sal_True; 396cdf0e10cSrcweir return m_nColumnCount; 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 400cdf0e10cSrcweir ::impl_getCurrentRowContent( Any& rRowContent 401cdf0e10cSrcweir , Reference< XRow > xRow ) 402cdf0e10cSrcweir throw ( SQLException, RuntimeException ) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir sal_Int32 nCount = impl_getColumnCount(); 405cdf0e10cSrcweir 406cdf0e10cSrcweir Sequence< Any > aContent( nCount ); 407cdf0e10cSrcweir for( sal_Int32 nN = 1; nN <= nCount; nN++ ) 408cdf0e10cSrcweir { 409cdf0e10cSrcweir aContent[nN-1] = xRow->getObject( nN, NULL ); 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir rRowContent <<= aContent; 413cdf0e10cSrcweir } 414cdf0e10cSrcweir 415cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 416cdf0e10cSrcweir ::impl_propagateFetchSizeAndDirection( sal_Int32 nFetchSize, sal_Bool bFetchDirection ) 417cdf0e10cSrcweir throw ( RuntimeException ) 418cdf0e10cSrcweir { 419cdf0e10cSrcweir //this is done only for the case, that there is another CachedContentResultSet in the chain of underlying ResulSets 420cdf0e10cSrcweir 421cdf0e10cSrcweir //we do not propagate the property 'FetchSize' or 'FetchDirection' via 'setPropertyValue' from the above CachedContentResultSet to save remote calls 422cdf0e10cSrcweir 423cdf0e10cSrcweir //if the underlying ResultSet has a property FetchSize and FetchDirection, 424cdf0e10cSrcweir //we will set these properties, if the new given parameters are different from the last ones 425cdf0e10cSrcweir 426cdf0e10cSrcweir if( !m_bNeedToPropagateFetchSize ) 427cdf0e10cSrcweir return; 428cdf0e10cSrcweir 429cdf0e10cSrcweir sal_Bool bNeedAction; 430cdf0e10cSrcweir sal_Int32 nLastSize; 431cdf0e10cSrcweir sal_Bool bLastDirection; 432cdf0e10cSrcweir sal_Bool bFirstPropagationDone; 433cdf0e10cSrcweir { 434cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex ); 435cdf0e10cSrcweir bNeedAction = m_bNeedToPropagateFetchSize; 436cdf0e10cSrcweir nLastSize = m_nLastFetchSize; 437cdf0e10cSrcweir bLastDirection = m_bLastFetchDirection; 438cdf0e10cSrcweir bFirstPropagationDone = m_bFirstFetchSizePropagationDone; 439cdf0e10cSrcweir } 440cdf0e10cSrcweir if( bNeedAction ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir if( nLastSize == nFetchSize 443cdf0e10cSrcweir && bLastDirection == bFetchDirection 444cdf0e10cSrcweir && bFirstPropagationDone == sal_True ) 445cdf0e10cSrcweir return; 446cdf0e10cSrcweir 447cdf0e10cSrcweir if(!bFirstPropagationDone) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir //check wether the properties 'FetchSize' and 'FetchDirection' do exist 450cdf0e10cSrcweir 451cdf0e10cSrcweir Reference< XPropertySetInfo > xPropertySetInfo = getPropertySetInfo(); 452cdf0e10cSrcweir sal_Bool bHasSize = xPropertySetInfo->hasPropertyByName( m_aPropertyNameForFetchSize ); 453cdf0e10cSrcweir sal_Bool bHasDirection = xPropertySetInfo->hasPropertyByName( m_aPropertyNameForFetchDirection ); 454cdf0e10cSrcweir 455cdf0e10cSrcweir if(!bHasSize || !bHasDirection) 456cdf0e10cSrcweir { 457cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex ); 458cdf0e10cSrcweir m_bNeedToPropagateFetchSize = sal_False; 459cdf0e10cSrcweir return; 460cdf0e10cSrcweir } 461cdf0e10cSrcweir } 462cdf0e10cSrcweir 463cdf0e10cSrcweir sal_Bool bSetSize = ( nLastSize !=nFetchSize ) || !bFirstPropagationDone; 464cdf0e10cSrcweir sal_Bool bSetDirection = ( bLastDirection !=bFetchDirection ) || !bFirstPropagationDone; 465cdf0e10cSrcweir 466cdf0e10cSrcweir { 467cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( m_aMutex ); 468cdf0e10cSrcweir m_bFirstFetchSizePropagationDone = sal_True; 469cdf0e10cSrcweir m_nLastFetchSize = nFetchSize; 470cdf0e10cSrcweir m_bLastFetchDirection = bFetchDirection; 471cdf0e10cSrcweir } 472cdf0e10cSrcweir 473cdf0e10cSrcweir if( bSetSize ) 474cdf0e10cSrcweir { 475cdf0e10cSrcweir Any aValue; 476cdf0e10cSrcweir aValue <<= nFetchSize; 477cdf0e10cSrcweir try 478cdf0e10cSrcweir { 479cdf0e10cSrcweir setPropertyValue( m_aPropertyNameForFetchSize, aValue ); 480cdf0e10cSrcweir } 481cdf0e10cSrcweir catch( com::sun::star::uno::Exception& ) {} 482cdf0e10cSrcweir } 483cdf0e10cSrcweir if( bSetDirection ) 484cdf0e10cSrcweir { 485cdf0e10cSrcweir sal_Int32 nFetchDirection = FetchDirection::FORWARD; 486cdf0e10cSrcweir if( !bFetchDirection ) 487cdf0e10cSrcweir nFetchDirection = FetchDirection::REVERSE; 488cdf0e10cSrcweir Any aValue; 489cdf0e10cSrcweir aValue <<= nFetchDirection; 490cdf0e10cSrcweir try 491cdf0e10cSrcweir { 492cdf0e10cSrcweir setPropertyValue( m_aPropertyNameForFetchDirection, aValue ); 493cdf0e10cSrcweir } 494cdf0e10cSrcweir catch( com::sun::star::uno::Exception& ) {} 495cdf0e10cSrcweir } 496cdf0e10cSrcweir 497cdf0e10cSrcweir } 498cdf0e10cSrcweir } 499cdf0e10cSrcweir 500cdf0e10cSrcweir //----------------------------------------------------------------- 501cdf0e10cSrcweir // XFetchProviderForContentAccess methods. 502cdf0e10cSrcweir //----------------------------------------------------------------- 503cdf0e10cSrcweir 504cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 505cdf0e10cSrcweir ::impl_getCurrentContentIdentifierString( Any& rAny 506cdf0e10cSrcweir , Reference< XContentAccess > xContentAccess ) 507cdf0e10cSrcweir throw ( RuntimeException ) 508cdf0e10cSrcweir { 509cdf0e10cSrcweir rAny <<= xContentAccess->queryContentIdentifierString(); 510cdf0e10cSrcweir } 511cdf0e10cSrcweir 512cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 513cdf0e10cSrcweir ::impl_getCurrentContentIdentifier( Any& rAny 514cdf0e10cSrcweir , Reference< XContentAccess > xContentAccess ) 515cdf0e10cSrcweir throw ( RuntimeException ) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir rAny <<= xContentAccess->queryContentIdentifier(); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir 520cdf0e10cSrcweir void SAL_CALL CachedContentResultSetStub 521cdf0e10cSrcweir ::impl_getCurrentContent( Any& rAny 522cdf0e10cSrcweir , Reference< XContentAccess > xContentAccess ) 523cdf0e10cSrcweir throw ( RuntimeException ) 524cdf0e10cSrcweir { 525cdf0e10cSrcweir rAny <<= xContentAccess->queryContent(); 526cdf0e10cSrcweir } 527cdf0e10cSrcweir 528cdf0e10cSrcweir //virtual 529cdf0e10cSrcweir FetchResult SAL_CALL CachedContentResultSetStub 530cdf0e10cSrcweir ::fetchContentIdentifierStrings( sal_Int32 nRowStartPosition 531cdf0e10cSrcweir , sal_Int32 nRowCount, sal_Bool bDirection ) 532cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir impl_init_xContentAccessOrigin(); 535cdf0e10cSrcweir FETCH_XXX( impl_getCurrentContentIdentifierString, m_xContentAccessOrigin ); 536cdf0e10cSrcweir } 537cdf0e10cSrcweir 538cdf0e10cSrcweir //virtual 539cdf0e10cSrcweir FetchResult SAL_CALL CachedContentResultSetStub 540cdf0e10cSrcweir ::fetchContentIdentifiers( sal_Int32 nRowStartPosition 541cdf0e10cSrcweir , sal_Int32 nRowCount, sal_Bool bDirection ) 542cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException ) 543cdf0e10cSrcweir { 544cdf0e10cSrcweir impl_init_xContentAccessOrigin(); 545cdf0e10cSrcweir FETCH_XXX( impl_getCurrentContentIdentifier, m_xContentAccessOrigin ); 546cdf0e10cSrcweir } 547cdf0e10cSrcweir 548cdf0e10cSrcweir //virtual 549cdf0e10cSrcweir FetchResult SAL_CALL CachedContentResultSetStub 550cdf0e10cSrcweir ::fetchContents( sal_Int32 nRowStartPosition 551cdf0e10cSrcweir , sal_Int32 nRowCount, sal_Bool bDirection ) 552cdf0e10cSrcweir throw( com::sun::star::uno::RuntimeException ) 553cdf0e10cSrcweir { 554cdf0e10cSrcweir impl_init_xContentAccessOrigin(); 555cdf0e10cSrcweir FETCH_XXX( impl_getCurrentContent, m_xContentAccessOrigin ); 556cdf0e10cSrcweir } 557cdf0e10cSrcweir 558cdf0e10cSrcweir //-------------------------------------------------------------------------- 559cdf0e10cSrcweir //-------------------------------------------------------------------------- 560cdf0e10cSrcweir // class CachedContentResultSetStubFactory 561cdf0e10cSrcweir //-------------------------------------------------------------------------- 562cdf0e10cSrcweir //-------------------------------------------------------------------------- 563cdf0e10cSrcweir 564cdf0e10cSrcweir CachedContentResultSetStubFactory::CachedContentResultSetStubFactory( 565cdf0e10cSrcweir const Reference< XMultiServiceFactory > & rSMgr ) 566cdf0e10cSrcweir { 567cdf0e10cSrcweir m_xSMgr = rSMgr; 568cdf0e10cSrcweir } 569cdf0e10cSrcweir 570cdf0e10cSrcweir CachedContentResultSetStubFactory::~CachedContentResultSetStubFactory() 571cdf0e10cSrcweir { 572cdf0e10cSrcweir } 573cdf0e10cSrcweir 574cdf0e10cSrcweir //-------------------------------------------------------------------------- 575cdf0e10cSrcweir // CachedContentResultSetStubFactory XInterface methods. 576cdf0e10cSrcweir //-------------------------------------------------------------------------- 577cdf0e10cSrcweir 578cdf0e10cSrcweir XINTERFACE_IMPL_3( CachedContentResultSetStubFactory, 579cdf0e10cSrcweir XTypeProvider, 580cdf0e10cSrcweir XServiceInfo, 581cdf0e10cSrcweir XCachedContentResultSetStubFactory ); 582cdf0e10cSrcweir 583cdf0e10cSrcweir //-------------------------------------------------------------------------- 584cdf0e10cSrcweir // CachedContentResultSetStubFactory XTypeProvider methods. 585cdf0e10cSrcweir //-------------------------------------------------------------------------- 586cdf0e10cSrcweir 587cdf0e10cSrcweir XTYPEPROVIDER_IMPL_3( CachedContentResultSetStubFactory, 588cdf0e10cSrcweir XTypeProvider, 589cdf0e10cSrcweir XServiceInfo, 590cdf0e10cSrcweir XCachedContentResultSetStubFactory ); 591cdf0e10cSrcweir 592cdf0e10cSrcweir //-------------------------------------------------------------------------- 593cdf0e10cSrcweir // CachedContentResultSetStubFactory XServiceInfo methods. 594cdf0e10cSrcweir //-------------------------------------------------------------------------- 595cdf0e10cSrcweir 596cdf0e10cSrcweir XSERVICEINFO_IMPL_1( CachedContentResultSetStubFactory, 597cdf0e10cSrcweir OUString::createFromAscii( 598cdf0e10cSrcweir "com.sun.star.comp.ucb.CachedContentResultSetStubFactory" ), 599cdf0e10cSrcweir OUString::createFromAscii( 600cdf0e10cSrcweir CACHED_CRS_STUB_FACTORY_NAME ) ); 601cdf0e10cSrcweir 602cdf0e10cSrcweir //-------------------------------------------------------------------------- 603cdf0e10cSrcweir // Service factory implementation. 604cdf0e10cSrcweir //-------------------------------------------------------------------------- 605cdf0e10cSrcweir 606cdf0e10cSrcweir ONE_INSTANCE_SERVICE_FACTORY_IMPL( CachedContentResultSetStubFactory ); 607cdf0e10cSrcweir 608cdf0e10cSrcweir //-------------------------------------------------------------------------- 609cdf0e10cSrcweir // CachedContentResultSetStubFactory XCachedContentResultSetStubFactory methods. 610cdf0e10cSrcweir //-------------------------------------------------------------------------- 611cdf0e10cSrcweir 612cdf0e10cSrcweir //virtual 613cdf0e10cSrcweir Reference< XResultSet > SAL_CALL CachedContentResultSetStubFactory 614cdf0e10cSrcweir ::createCachedContentResultSetStub( 615cdf0e10cSrcweir const Reference< XResultSet > & xSource ) 616cdf0e10cSrcweir throw( RuntimeException ) 617cdf0e10cSrcweir { 618cdf0e10cSrcweir if( xSource.is() ) 619cdf0e10cSrcweir { 620cdf0e10cSrcweir Reference< XResultSet > xRet; 621cdf0e10cSrcweir xRet = new CachedContentResultSetStub( xSource ); 622cdf0e10cSrcweir return xRet; 623cdf0e10cSrcweir } 624cdf0e10cSrcweir return NULL; 625cdf0e10cSrcweir } 626cdf0e10cSrcweir 627cdf0e10cSrcweir 628