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