LCOV - code coverage report
Current view: top level - libreoffice/ucbhelper/source/provider - resultset.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 597 0.0 %
Date: 2012-12-27 Functions: 0 91 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : /**************************************************************************
      22             :                                 TODO
      23             :  **************************************************************************
      24             : 
      25             :  *************************************************************************/
      26             : #include <cppuhelper/interfacecontainer.hxx>
      27             : #include <com/sun/star/beans/PropertyAttribute.hpp>
      28             : #include <ucbhelper/getcomponentcontext.hxx>
      29             : #include <ucbhelper/resultset.hxx>
      30             : #include <ucbhelper/resultsetmetadata.hxx>
      31             : 
      32             : using namespace com::sun::star;
      33             : 
      34             : //=========================================================================
      35             : 
      36             : namespace ucbhelper_impl
      37             : {
      38             : 
      39             : struct PropertyInfo
      40             : {
      41             :     const char* pName;
      42             :     sal_Int32   nHandle;
      43             :     sal_Int16   nAttributes;
      44             :     const uno::Type& (*pGetCppuType)();
      45             : };
      46             : 
      47           0 : static const uno::Type& sal_Int32_getCppuType()
      48             : {
      49           0 :     return getCppuType( static_cast< const sal_Int32 * >( 0 ) );
      50             : }
      51             : 
      52           0 : static const uno::Type& sal_Bool_getCppuType()
      53             : {
      54           0 :     return getCppuBooleanType();
      55             : }
      56             : 
      57             : static const PropertyInfo aPropertyTable[] =
      58             : {
      59             :     { "IsRowCountFinal",
      60             :       1000,
      61             :       beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY,
      62             :       &sal_Bool_getCppuType
      63             :     },
      64             :     { "RowCount",
      65             :       1001,
      66             :       beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY,
      67             :       &sal_Int32_getCppuType
      68             :     },
      69             :     { 0,
      70             :       0,
      71             :       0,
      72             :       0
      73             :     }
      74             : };
      75             : 
      76             : #define RESULTSET_PROPERTY_COUNT 2
      77             : 
      78             : //=========================================================================
      79             : //
      80             : // class PropertySetInfo
      81             : //
      82             : //=========================================================================
      83             : 
      84             : class PropertySetInfo :
      85             :         public cppu::OWeakObject,
      86             :         public lang::XTypeProvider,
      87             :         public beans::XPropertySetInfo
      88             : {
      89             :     uno::Sequence< beans::Property >*            m_pProps;
      90             : 
      91             : private:
      92             :     sal_Bool queryProperty(
      93             :         const rtl::OUString& aName, beans::Property& rProp );
      94             : 
      95             : public:
      96             :     PropertySetInfo(
      97             :         const PropertyInfo* pProps,
      98             :         sal_Int32 nProps );
      99             :     virtual ~PropertySetInfo();
     100             : 
     101             :     // XInterface
     102             :     XINTERFACE_DECL()
     103             : 
     104             :     // XTypeProvider
     105             :     XTYPEPROVIDER_DECL()
     106             : 
     107             :     // XPropertySetInfo
     108             :     virtual uno::Sequence< beans::Property > SAL_CALL getProperties()
     109             :         throw( uno::RuntimeException );
     110             :     virtual beans::Property SAL_CALL getPropertyByName(
     111             :             const rtl::OUString& aName )
     112             :         throw( beans::UnknownPropertyException, uno::RuntimeException );
     113             :     virtual sal_Bool SAL_CALL hasPropertyByName( const rtl::OUString& Name )
     114             :         throw( uno::RuntimeException );
     115             : };
     116             : 
     117             : //=========================================================================
     118             : //
     119             : // PropertyChangeListenerContainer.
     120             : //
     121             : //=========================================================================
     122             : 
     123             : struct equalStr_Impl
     124             : {
     125           0 :     bool operator()( const rtl::OUString& s1, const rtl::OUString& s2 ) const
     126             :       {
     127           0 :         return !!( s1 == s2 );
     128             :     }
     129             : };
     130             : 
     131             : struct hashStr_Impl
     132             : {
     133             :     size_t operator()( const rtl::OUString& rName ) const
     134             :     {
     135             :         return rName.hashCode();
     136             :     }
     137             : };
     138             : 
     139             : typedef cppu::OMultiTypeInterfaceContainerHelperVar
     140             : <
     141             :     rtl::OUString,
     142             :     hashStr_Impl,
     143             :     equalStr_Impl
     144             : > PropertyChangeListenerContainer;
     145             : 
     146             : //=========================================================================
     147             : //
     148             : // class PropertyChangeListeners.
     149             : //
     150             : //=========================================================================
     151             : 
     152           0 : class PropertyChangeListeners : public PropertyChangeListenerContainer
     153             : {
     154             : public:
     155           0 :     PropertyChangeListeners( osl::Mutex& rMtx )
     156           0 :     : PropertyChangeListenerContainer( rMtx ) {}
     157             : };
     158             : 
     159             : } // namespace ucbhelper_impl
     160             : 
     161             : using namespace ucbhelper_impl;
     162             : 
     163             : namespace ucbhelper
     164             : {
     165             : 
     166             : //=========================================================================
     167             : //
     168             : // struct ResultSet_Impl.
     169             : //
     170             : //=========================================================================
     171             : 
     172             : struct ResultSet_Impl
     173             : {
     174             :     uno::Reference< uno::XComponentContext >    m_xContext;
     175             :     uno::Reference< com::sun::star::ucb::XCommandEnvironment >  m_xEnv;
     176             :     uno::Reference< beans::XPropertySetInfo >       m_xPropSetInfo;
     177             :     uno::Reference< sdbc::XResultSetMetaData >      m_xMetaData;
     178             :     uno::Sequence< beans::Property >                m_aProperties;
     179             :     rtl::Reference< ResultSetDataSupplier >         m_xDataSupplier;
     180             :     osl::Mutex                          m_aMutex;
     181             :     cppu::OInterfaceContainerHelper*    m_pDisposeEventListeners;
     182             :     PropertyChangeListeners*            m_pPropertyChangeListeners;
     183             :     sal_Int32                           m_nPos;
     184             :     sal_Bool                            m_bWasNull;
     185             :     sal_Bool                            m_bAfterLast;
     186             : 
     187             :     inline ResultSet_Impl(
     188             :         const uno::Reference< uno::XComponentContext >& rxContext,
     189             :         const uno::Sequence< beans::Property >& rProperties,
     190             :         const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
     191             :         const uno::Reference< com::sun::star::ucb::XCommandEnvironment >&
     192             :             rxEnv );
     193             :     inline ~ResultSet_Impl();
     194             : };
     195             : 
     196           0 : inline ResultSet_Impl::ResultSet_Impl(
     197             :     const uno::Reference< uno::XComponentContext >& rxContext,
     198             :     const uno::Sequence< beans::Property >& rProperties,
     199             :     const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
     200             :     const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv )
     201             : : m_xContext( rxContext ),
     202             :   m_xEnv( rxEnv ),
     203             :   m_aProperties( rProperties ),
     204             :   m_xDataSupplier( rDataSupplier ),
     205             :   m_pDisposeEventListeners( 0 ),
     206             :   m_pPropertyChangeListeners( 0 ),
     207             :   m_nPos( 0 ), // Position is one-based. Zero means: before first element.
     208             :   m_bWasNull( sal_False ),
     209           0 :   m_bAfterLast( sal_False )
     210             : {
     211           0 : }
     212             : 
     213             : //=========================================================================
     214           0 : inline ResultSet_Impl::~ResultSet_Impl()
     215             : {
     216           0 :     delete m_pDisposeEventListeners;
     217           0 :     delete m_pPropertyChangeListeners;
     218           0 : }
     219             : 
     220             : //=========================================================================
     221             : //=========================================================================
     222             : //
     223             : // ResultSet Implementation.
     224             : //
     225             : //=========================================================================
     226             : //=========================================================================
     227             : 
     228           0 : ResultSet::ResultSet(
     229             :     const uno::Reference< uno::XComponentContext >& rxContext,
     230             :     const uno::Sequence< beans::Property >& rProperties,
     231             :     const rtl::Reference< ResultSetDataSupplier >& rDataSupplier )
     232             : : m_pImpl( new ResultSet_Impl(
     233             :                rxContext,
     234             :                rProperties,
     235             :                rDataSupplier,
     236           0 :                uno::Reference< com::sun::star::ucb::XCommandEnvironment >() ) )
     237             : {
     238           0 :     rDataSupplier->m_pResultSet = this;
     239           0 : }
     240             : 
     241             : //=========================================================================
     242           0 : ResultSet::ResultSet(
     243             :     const uno::Reference< uno::XComponentContext >& rxContext,
     244             :     const uno::Sequence< beans::Property >& rProperties,
     245             :     const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
     246             :     const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv )
     247           0 : : m_pImpl( new ResultSet_Impl( rxContext, rProperties, rDataSupplier, rxEnv ) )
     248             : {
     249           0 :     rDataSupplier->m_pResultSet = this;
     250           0 : }
     251             : 
     252             : //=========================================================================
     253             : // virtual
     254           0 : ResultSet::~ResultSet()
     255             : {
     256           0 :     delete m_pImpl;
     257           0 : }
     258             : 
     259             : //=========================================================================
     260             : //
     261             : // XInterface methods.
     262             : //
     263             : //=========================================================================
     264             : 
     265           0 : XINTERFACE_IMPL_9( ResultSet,
     266             :                    lang::XTypeProvider,
     267             :                    lang::XServiceInfo,
     268             :                    lang::XComponent,
     269             :                    com::sun::star::ucb::XContentAccess,
     270             :                    sdbc::XResultSet,
     271             :                    sdbc::XResultSetMetaDataSupplier,
     272             :                    sdbc::XRow,
     273             :                    sdbc::XCloseable,
     274             :                    beans::XPropertySet );
     275             : 
     276             : //=========================================================================
     277             : //
     278             : // XTypeProvider methods.
     279             : //
     280             : //=========================================================================
     281             : 
     282           0 : XTYPEPROVIDER_IMPL_9( ResultSet,
     283             :                       lang::XTypeProvider,
     284             :                          lang::XServiceInfo,
     285             :                       lang::XComponent,
     286             :                       com::sun::star::ucb::XContentAccess,
     287             :                       sdbc::XResultSet,
     288             :                       sdbc::XResultSetMetaDataSupplier,
     289             :                       sdbc::XRow,
     290             :                       sdbc::XCloseable,
     291             :                       beans::XPropertySet );
     292             : 
     293             : //=========================================================================
     294             : //
     295             : // XServiceInfo methods.
     296             : //
     297             : //=========================================================================
     298             : 
     299           0 : XSERVICEINFO_NOFACTORY_IMPL_1( ResultSet,
     300             :                     rtl::OUString("ResultSet"),
     301             :                     rtl::OUString(RESULTSET_SERVICE_NAME ) );
     302             : 
     303             : //=========================================================================
     304             : //
     305             : // XComponent methods.
     306             : //
     307             : //=========================================================================
     308             : 
     309             : // virtual
     310           0 : void SAL_CALL ResultSet::dispose()
     311             :     throw( uno::RuntimeException )
     312             : {
     313           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     314             : 
     315           0 :     if ( m_pImpl->m_pDisposeEventListeners &&
     316           0 :          m_pImpl->m_pDisposeEventListeners->getLength() )
     317             :     {
     318           0 :         lang::EventObject aEvt;
     319           0 :         aEvt.Source = static_cast< lang::XComponent * >( this );
     320           0 :         m_pImpl->m_pDisposeEventListeners->disposeAndClear( aEvt );
     321             :     }
     322             : 
     323           0 :     if ( m_pImpl->m_pPropertyChangeListeners )
     324             :     {
     325           0 :         lang::EventObject aEvt;
     326           0 :         aEvt.Source = static_cast< beans::XPropertySet * >( this );
     327           0 :         m_pImpl->m_pPropertyChangeListeners->disposeAndClear( aEvt );
     328             :     }
     329             : 
     330           0 :     m_pImpl->m_xDataSupplier->close();
     331           0 : }
     332             : 
     333             : //=========================================================================
     334             : // virtual
     335           0 : void SAL_CALL ResultSet::addEventListener(
     336             :         const uno::Reference< lang::XEventListener >& Listener )
     337             :     throw( uno::RuntimeException )
     338             : {
     339           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     340             : 
     341           0 :     if ( !m_pImpl->m_pDisposeEventListeners )
     342             :         m_pImpl->m_pDisposeEventListeners =
     343           0 :             new cppu::OInterfaceContainerHelper( m_pImpl->m_aMutex );
     344             : 
     345           0 :     m_pImpl->m_pDisposeEventListeners->addInterface( Listener );
     346           0 : }
     347             : 
     348             : //=========================================================================
     349             : // virtual
     350           0 : void SAL_CALL ResultSet::removeEventListener(
     351             :         const uno::Reference< lang::XEventListener >& Listener )
     352             :     throw( uno::RuntimeException )
     353             : {
     354           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     355             : 
     356           0 :     if ( m_pImpl->m_pDisposeEventListeners )
     357           0 :         m_pImpl->m_pDisposeEventListeners->removeInterface( Listener );
     358           0 : }
     359             : 
     360             : //=========================================================================
     361             : //
     362             : // XResultSetMetaDataSupplier methods.
     363             : //
     364             : //=========================================================================
     365             : 
     366             : // virtual
     367           0 : uno::Reference< sdbc::XResultSetMetaData > SAL_CALL ResultSet::getMetaData()
     368             :     throw( sdbc::SQLException, uno::RuntimeException )
     369             : {
     370           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     371             : 
     372           0 :     if ( !m_pImpl->m_xMetaData.is() )
     373             :         m_pImpl->m_xMetaData = new ResultSetMetaData( m_pImpl->m_xContext,
     374           0 :                                                       m_pImpl->m_aProperties );
     375             : 
     376           0 :     return m_pImpl->m_xMetaData;
     377             : }
     378             : 
     379             : //=========================================================================
     380             : //
     381             : // XResultSet methods.
     382             : //
     383             : //=========================================================================
     384             : 
     385             : // virtual
     386           0 : sal_Bool SAL_CALL ResultSet::next()
     387             :     throw( sdbc::SQLException, uno::RuntimeException )
     388             : {
     389             :     // Note: Cursor is initially positioned before the first row.
     390             :     //       First call to 'next()' moves it to first row.
     391             : 
     392           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     393             : 
     394           0 :     if ( m_pImpl->m_bAfterLast )
     395             :     {
     396           0 :         m_pImpl->m_xDataSupplier->validate();
     397           0 :         return sal_False;
     398             :     }
     399             : 
     400             :     // getResult works zero-based!
     401           0 :     if ( !m_pImpl->m_xDataSupplier->getResult( m_pImpl->m_nPos ) )
     402             :     {
     403           0 :         m_pImpl->m_bAfterLast = sal_True;
     404           0 :         m_pImpl->m_xDataSupplier->validate();
     405           0 :         return sal_False;
     406             :     }
     407             : 
     408           0 :     m_pImpl->m_nPos++;
     409           0 :     m_pImpl->m_xDataSupplier->validate();
     410           0 :     return sal_True;
     411             : }
     412             : 
     413             : //=========================================================================
     414             : // virtual
     415           0 : sal_Bool SAL_CALL ResultSet::isBeforeFirst()
     416             :     throw( sdbc::SQLException, uno::RuntimeException )
     417             : {
     418           0 :     if ( m_pImpl->m_bAfterLast )
     419             :     {
     420           0 :         m_pImpl->m_xDataSupplier->validate();
     421           0 :         return sal_False;
     422             :     }
     423             : 
     424             :     // getResult works zero-based!
     425           0 :     if ( !m_pImpl->m_xDataSupplier->getResult( 0 ) )
     426             :     {
     427           0 :         m_pImpl->m_xDataSupplier->validate();
     428           0 :         return sal_False;
     429             :     }
     430             : 
     431           0 :     m_pImpl->m_xDataSupplier->validate();
     432           0 :     return ( m_pImpl->m_nPos == 0 );
     433             : }
     434             : 
     435             : //=========================================================================
     436             : // virtual
     437           0 : sal_Bool SAL_CALL ResultSet::isAfterLast()
     438             :     throw( sdbc::SQLException, uno::RuntimeException )
     439             : {
     440           0 :     m_pImpl->m_xDataSupplier->validate();
     441           0 :     return m_pImpl->m_bAfterLast;
     442             : }
     443             : 
     444             : //=========================================================================
     445             : // virtual
     446           0 : sal_Bool SAL_CALL ResultSet::isFirst()
     447             :     throw( sdbc::SQLException, uno::RuntimeException )
     448             : {
     449           0 :     if ( m_pImpl->m_bAfterLast )
     450             :     {
     451           0 :         m_pImpl->m_xDataSupplier->validate();
     452           0 :         return sal_False;
     453             :     }
     454             : 
     455           0 :     m_pImpl->m_xDataSupplier->validate();
     456           0 :     return ( m_pImpl->m_nPos == 1 );
     457             : }
     458             : 
     459             : //=========================================================================
     460             : // virtual
     461           0 : sal_Bool SAL_CALL ResultSet::isLast()
     462             :     throw( sdbc::SQLException, uno::RuntimeException )
     463             : {
     464           0 :     if ( m_pImpl->m_bAfterLast )
     465             :     {
     466           0 :         m_pImpl->m_xDataSupplier->validate();
     467           0 :         return sal_False;
     468             :     }
     469             : 
     470           0 :     sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
     471           0 :     if ( !nCount )
     472             :     {
     473           0 :         m_pImpl->m_xDataSupplier->validate();
     474           0 :         return sal_False;
     475             :     }
     476             : 
     477           0 :     m_pImpl->m_xDataSupplier->validate();
     478           0 :     return ( m_pImpl->m_nPos == nCount );
     479             : }
     480             : 
     481             : //=========================================================================
     482             : // virtual
     483           0 : void SAL_CALL ResultSet::beforeFirst()
     484             :     throw( sdbc::SQLException, uno::RuntimeException )
     485             : {
     486           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     487           0 :     m_pImpl->m_bAfterLast = sal_False;
     488           0 :     m_pImpl->m_nPos = 0;
     489           0 :     m_pImpl->m_xDataSupplier->validate();
     490           0 : }
     491             : 
     492             : //=========================================================================
     493             : // virtual
     494           0 : void SAL_CALL ResultSet::afterLast()
     495             :     throw( sdbc::SQLException, uno::RuntimeException )
     496             : {
     497           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     498           0 :     m_pImpl->m_bAfterLast = sal_True;
     499           0 :     m_pImpl->m_xDataSupplier->validate();
     500           0 : }
     501             : 
     502             : //=========================================================================
     503             : // virtual
     504           0 : sal_Bool SAL_CALL ResultSet::first()
     505             :     throw( sdbc::SQLException, uno::RuntimeException )
     506             : {
     507             :     // getResult works zero-based!
     508           0 :     if ( m_pImpl->m_xDataSupplier->getResult( 0 ) )
     509             :     {
     510           0 :         osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     511           0 :         m_pImpl->m_bAfterLast = sal_False;
     512           0 :         m_pImpl->m_nPos = 1;
     513           0 :         m_pImpl->m_xDataSupplier->validate();
     514           0 :         return sal_True;
     515             :     }
     516             : 
     517           0 :     m_pImpl->m_xDataSupplier->validate();
     518           0 :     return sal_False;
     519             : }
     520             : 
     521             : //=========================================================================
     522             : // virtual
     523           0 : sal_Bool SAL_CALL ResultSet::last()
     524             :     throw( sdbc::SQLException, uno::RuntimeException )
     525             : {
     526           0 :     sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
     527           0 :     if ( nCount )
     528             :     {
     529           0 :         osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     530           0 :         m_pImpl->m_bAfterLast = sal_False;
     531           0 :         m_pImpl->m_nPos = nCount;
     532           0 :         m_pImpl->m_xDataSupplier->validate();
     533           0 :         return sal_True;
     534             :     }
     535             : 
     536           0 :     m_pImpl->m_xDataSupplier->validate();
     537           0 :     return sal_False;
     538             : }
     539             : 
     540             : //=========================================================================
     541             : // virtual
     542           0 : sal_Int32 SAL_CALL ResultSet::getRow()
     543             :     throw( sdbc::SQLException, uno::RuntimeException )
     544             : {
     545           0 :     if ( m_pImpl->m_bAfterLast )
     546             :     {
     547           0 :         m_pImpl->m_xDataSupplier->validate();
     548           0 :         return 0;
     549             :     }
     550             : 
     551           0 :     m_pImpl->m_xDataSupplier->validate();
     552           0 :     return m_pImpl->m_nPos;
     553             : }
     554             : 
     555             : //=========================================================================
     556             : // virtual
     557           0 : sal_Bool SAL_CALL ResultSet::absolute( sal_Int32 row )
     558             :     throw( sdbc::SQLException, uno::RuntimeException )
     559             : {
     560             : /*
     561             :     If the row number is positive, the cursor moves to the given row number
     562             :     with respect to the beginning of the result set. The first row is row 1,
     563             :     the second is row 2, and so on.
     564             : 
     565             :     If the given row number is negative, the cursor moves to an absolute row
     566             :     position with respect to the end of the result set. For example, calling
     567             :     absolaute( -1 ) positions the cursor on the last row, absolaute( -2 )
     568             :     indicates the next-to-last row, and so on.
     569             : 
     570             :     An attempt to position the cursor beyond the first/last row in the result
     571             :     set leaves the cursor before/after the first/last row, respectively.
     572             : 
     573             :     Calling absolute( 1 ) is the same as calling first().
     574             : 
     575             :     Calling absolute( -1 ) is the same as calling last().
     576             : */
     577           0 :     if ( row < 0 )
     578             :     {
     579           0 :         sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
     580             : 
     581           0 :         if ( ( row * -1 ) > nCount )
     582             :         {
     583           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     584           0 :             m_pImpl->m_bAfterLast = sal_False;
     585           0 :             m_pImpl->m_nPos = 0;
     586           0 :             m_pImpl->m_xDataSupplier->validate();
     587           0 :             return sal_False;
     588             :         }
     589             :         else // |row| <= nCount
     590             :         {
     591           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     592           0 :             m_pImpl->m_bAfterLast = sal_False;
     593           0 :             m_pImpl->m_nPos = ( nCount + row + 1 );
     594           0 :             m_pImpl->m_xDataSupplier->validate();
     595           0 :             return sal_True;
     596             :         }
     597             :     }
     598           0 :     else if ( row == 0 )
     599             :     {
     600             :         // @throws SQLException
     601             :         //      ... if row is 0 ...
     602           0 :         throw sdbc::SQLException();
     603             :     }
     604             :     else // row > 0
     605             :     {
     606           0 :         sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
     607             : 
     608           0 :         if ( row <= nCount )
     609             :         {
     610           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     611           0 :             m_pImpl->m_bAfterLast = sal_False;
     612           0 :             m_pImpl->m_nPos = row;
     613           0 :             m_pImpl->m_xDataSupplier->validate();
     614           0 :             return sal_True;
     615             :         }
     616             :         else // row > nCount
     617             :         {
     618           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     619           0 :             m_pImpl->m_bAfterLast = sal_True;
     620           0 :             m_pImpl->m_xDataSupplier->validate();
     621           0 :             return sal_False;
     622             :         }
     623             :     }
     624             : 
     625             :     // unreachable...
     626             : }
     627             : 
     628             : //=========================================================================
     629             : // virtual
     630           0 : sal_Bool SAL_CALL ResultSet::relative( sal_Int32 rows )
     631             :     throw( sdbc::SQLException, uno::RuntimeException )
     632             : {
     633             : /*
     634             :     Attempting to move beyond the first/last row in the result set
     635             :     positions the cursor before/after the the first/last row.
     636             : 
     637             :     Calling relative( 0 ) is valid, but does not change the cursor position.
     638             : 
     639             :     Calling relative( 1 ) is different from calling next() because it makes
     640             :     sense to call next() when there is no current row, for example, when
     641             :     the cursor is positioned before the first row or after the last row of
     642             :     the result set.
     643             : */
     644           0 :     if ( m_pImpl->m_bAfterLast || ( m_pImpl->m_nPos == 0 ) )
     645             :     {
     646             :         // "No current row".
     647           0 :         throw sdbc::SQLException();
     648             :     }
     649             : 
     650           0 :     if ( rows < 0 )
     651             :     {
     652           0 :         if ( ( m_pImpl->m_nPos + rows ) > 0 )
     653             :         {
     654           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     655           0 :             m_pImpl->m_bAfterLast = sal_False;
     656           0 :             m_pImpl->m_nPos = ( m_pImpl->m_nPos + rows );
     657           0 :             m_pImpl->m_xDataSupplier->validate();
     658           0 :             return sal_True;
     659             :         }
     660             :         else
     661             :         {
     662           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     663           0 :             m_pImpl->m_bAfterLast = sal_False;
     664           0 :             m_pImpl->m_nPos = 0;
     665           0 :             m_pImpl->m_xDataSupplier->validate();
     666           0 :             return sal_False;
     667             :         }
     668             :     }
     669           0 :     else if ( rows == 0 )
     670             :     {
     671             :         // nop.
     672           0 :         m_pImpl->m_xDataSupplier->validate();
     673           0 :         return sal_True;
     674             :     }
     675             :     else // rows > 0
     676             :     {
     677           0 :         sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
     678           0 :         if ( ( m_pImpl->m_nPos + rows ) <= nCount )
     679             :         {
     680           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     681           0 :             m_pImpl->m_bAfterLast = sal_False;
     682           0 :             m_pImpl->m_nPos = ( m_pImpl->m_nPos + rows );
     683           0 :             m_pImpl->m_xDataSupplier->validate();
     684           0 :             return sal_True;
     685             :         }
     686             :         else
     687             :         {
     688           0 :             osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     689           0 :             m_pImpl->m_bAfterLast = sal_True;
     690           0 :             m_pImpl->m_xDataSupplier->validate();
     691           0 :             return sal_False;
     692             :         }
     693             :     }
     694             : 
     695             :     // unreachable...
     696             : }
     697             : 
     698             : //=========================================================================
     699             : // virtual
     700           0 : sal_Bool SAL_CALL ResultSet::previous()
     701             :     throw( sdbc::SQLException, uno::RuntimeException )
     702             : {
     703             : /*
     704             :     previous() is not the same as relative( -1 ) because it makes sense
     705             :     to call previous() when there is no current row.
     706             : */
     707           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     708             : 
     709           0 :     if ( m_pImpl->m_bAfterLast )
     710             :     {
     711           0 :         m_pImpl->m_bAfterLast = sal_False;
     712           0 :         sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
     713           0 :         m_pImpl->m_nPos = nCount;
     714             :     }
     715           0 :     else if ( m_pImpl->m_nPos )
     716           0 :         m_pImpl->m_nPos--;
     717             : 
     718           0 :     if ( m_pImpl->m_nPos )
     719             :     {
     720           0 :         m_pImpl->m_xDataSupplier->validate();
     721           0 :         return sal_True;
     722             :     }
     723             : 
     724           0 :     m_pImpl->m_xDataSupplier->validate();
     725           0 :     return sal_False;
     726             : }
     727             : 
     728             : //=========================================================================
     729             : // virtual
     730           0 : void SAL_CALL ResultSet::refreshRow()
     731             :     throw( sdbc::SQLException, uno::RuntimeException )
     732             : {
     733           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
     734           0 :     if ( m_pImpl->m_bAfterLast || ( m_pImpl->m_nPos == 0 ) )
     735           0 :         return;
     736             : 
     737           0 :     m_pImpl->m_xDataSupplier->releasePropertyValues( m_pImpl->m_nPos );
     738           0 :     m_pImpl->m_xDataSupplier->validate();
     739             : }
     740             : 
     741             : //=========================================================================
     742             : // virtual
     743           0 : sal_Bool SAL_CALL ResultSet::rowUpdated()
     744             :     throw( sdbc::SQLException, uno::RuntimeException )
     745             : {
     746           0 :     m_pImpl->m_xDataSupplier->validate();
     747           0 :     return sal_False;
     748             : }
     749             : 
     750             : //=========================================================================
     751             : // virtual
     752           0 : sal_Bool SAL_CALL ResultSet::rowInserted()
     753             :     throw( sdbc::SQLException, uno::RuntimeException )
     754             : {
     755           0 :     m_pImpl->m_xDataSupplier->validate();
     756           0 :     return sal_False;
     757             : }
     758             : 
     759             : //=========================================================================
     760             : // virtual
     761           0 : sal_Bool SAL_CALL ResultSet::rowDeleted()
     762             :     throw( sdbc::SQLException, uno::RuntimeException )
     763             : {
     764           0 :     m_pImpl->m_xDataSupplier->validate();
     765           0 :     return sal_False;
     766             : }
     767             : 
     768             : //=========================================================================
     769             : // virtual
     770           0 : uno::Reference< uno::XInterface > SAL_CALL ResultSet::getStatement()
     771             :     throw( sdbc::SQLException, uno::RuntimeException )
     772             : {
     773             : /*
     774             :     returns the Statement that produced this ResultSet object. If the
     775             :     result set was generated some other way, ... this method returns null.
     776             : */
     777           0 :     m_pImpl->m_xDataSupplier->validate();
     778           0 :     return uno::Reference< uno::XInterface >();
     779             : }
     780             : 
     781             : //=========================================================================
     782             : //
     783             : // XRow methods.
     784             : //
     785             : //=========================================================================
     786             : 
     787             : // virtual
     788           0 : sal_Bool SAL_CALL ResultSet::wasNull()
     789             :     throw( sdbc::SQLException, uno::RuntimeException )
     790             : {
     791             :     // This method can not be implemented correctly!!! Imagine different
     792             :     // threads doing a getXYZ - wasNull calling sequence on the same
     793             :     // implementation object...
     794             : 
     795           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     796             :     {
     797             :         uno::Reference< sdbc::XRow > xValues
     798           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     799           0 :                                                         m_pImpl->m_nPos - 1 );
     800           0 :         if ( xValues.is() )
     801             :         {
     802           0 :             m_pImpl->m_xDataSupplier->validate();
     803           0 :             return xValues->wasNull();
     804           0 :         }
     805             :     }
     806             : 
     807           0 :     m_pImpl->m_xDataSupplier->validate();
     808           0 :     return m_pImpl->m_bWasNull;
     809             : }
     810             : 
     811             : //=========================================================================
     812             : // virtual
     813           0 : rtl::OUString SAL_CALL ResultSet::getString( sal_Int32 columnIndex )
     814             :     throw( sdbc::SQLException, uno::RuntimeException )
     815             : {
     816           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     817             :     {
     818             :         uno::Reference< sdbc::XRow > xValues
     819           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     820           0 :                                                         m_pImpl->m_nPos - 1 );
     821           0 :         if ( xValues.is() )
     822             :         {
     823           0 :             m_pImpl->m_bWasNull = sal_False;
     824           0 :             m_pImpl->m_xDataSupplier->validate();
     825           0 :             return xValues->getString( columnIndex );
     826           0 :         }
     827             :     }
     828             : 
     829           0 :     m_pImpl->m_bWasNull = sal_True;
     830           0 :     m_pImpl->m_xDataSupplier->validate();
     831           0 :     return rtl::OUString();
     832             : }
     833             : 
     834             : //=========================================================================
     835             : // virtual
     836           0 : sal_Bool SAL_CALL ResultSet::getBoolean( sal_Int32 columnIndex )
     837             :     throw( sdbc::SQLException, uno::RuntimeException )
     838             : {
     839           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     840             :     {
     841             :         uno::Reference< sdbc::XRow > xValues
     842           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     843           0 :                                                         m_pImpl->m_nPos - 1 );
     844           0 :         if ( xValues.is() )
     845             :         {
     846           0 :             m_pImpl->m_bWasNull = sal_False;
     847           0 :             m_pImpl->m_xDataSupplier->validate();
     848           0 :             return xValues->getBoolean( columnIndex );
     849           0 :         }
     850             :     }
     851             : 
     852           0 :     m_pImpl->m_bWasNull = sal_True;
     853           0 :     m_pImpl->m_xDataSupplier->validate();
     854           0 :     return sal_False;
     855             : }
     856             : 
     857             : //=========================================================================
     858             : // virtual
     859           0 : sal_Int8 SAL_CALL ResultSet::getByte( sal_Int32 columnIndex )
     860             :     throw( sdbc::SQLException, uno::RuntimeException )
     861             : {
     862           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     863             :     {
     864             :         uno::Reference< sdbc::XRow > xValues
     865           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     866           0 :                                                         m_pImpl->m_nPos - 1 );
     867           0 :         if ( xValues.is() )
     868             :         {
     869           0 :             m_pImpl->m_bWasNull = sal_False;
     870           0 :             m_pImpl->m_xDataSupplier->validate();
     871           0 :             return xValues->getByte( columnIndex );
     872           0 :         }
     873             :     }
     874             : 
     875           0 :     m_pImpl->m_bWasNull = sal_True;
     876           0 :     m_pImpl->m_xDataSupplier->validate();
     877           0 :     return 0;
     878             : }
     879             : 
     880             : //=========================================================================
     881             : // virtual
     882           0 : sal_Int16 SAL_CALL ResultSet::getShort( sal_Int32 columnIndex )
     883             :     throw( sdbc::SQLException, uno::RuntimeException )
     884             : {
     885           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     886             :     {
     887             :         uno::Reference< sdbc::XRow > xValues
     888           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     889           0 :                                                         m_pImpl->m_nPos - 1 );
     890           0 :         if ( xValues.is() )
     891             :         {
     892           0 :             m_pImpl->m_bWasNull = sal_False;
     893           0 :             m_pImpl->m_xDataSupplier->validate();
     894           0 :             return xValues->getShort( columnIndex );
     895           0 :         }
     896             :     }
     897             : 
     898           0 :     m_pImpl->m_bWasNull = sal_True;
     899           0 :     m_pImpl->m_xDataSupplier->validate();
     900           0 :     return 0;
     901             : }
     902             : 
     903             : //=========================================================================
     904             : // virtual
     905           0 : sal_Int32 SAL_CALL ResultSet::getInt( sal_Int32 columnIndex )
     906             :     throw( sdbc::SQLException, uno::RuntimeException )
     907             : {
     908           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     909             :     {
     910             :         uno::Reference< sdbc::XRow > xValues
     911           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     912           0 :                                                         m_pImpl->m_nPos - 1 );
     913           0 :         if ( xValues.is() )
     914             :         {
     915           0 :             m_pImpl->m_bWasNull = sal_False;
     916           0 :             m_pImpl->m_xDataSupplier->validate();
     917           0 :             return xValues->getInt( columnIndex );
     918           0 :         }
     919             :     }
     920             : 
     921           0 :     m_pImpl->m_bWasNull = sal_True;
     922           0 :     m_pImpl->m_xDataSupplier->validate();
     923           0 :     return 0;
     924             : }
     925             : 
     926             : //=========================================================================
     927             : // virtual
     928           0 : sal_Int64 SAL_CALL ResultSet::getLong( sal_Int32 columnIndex )
     929             :     throw( sdbc::SQLException, uno::RuntimeException )
     930             : {
     931           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     932             :     {
     933             :         uno::Reference< sdbc::XRow > xValues
     934           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     935           0 :                                                         m_pImpl->m_nPos - 1 );
     936           0 :         if ( xValues.is() )
     937             :         {
     938           0 :             m_pImpl->m_bWasNull = sal_False;
     939           0 :             m_pImpl->m_xDataSupplier->validate();
     940           0 :             return xValues->getLong( columnIndex );
     941           0 :         }
     942             :     }
     943             : 
     944           0 :     m_pImpl->m_bWasNull = sal_True;
     945           0 :     m_pImpl->m_xDataSupplier->validate();
     946           0 :     return 0;
     947             : }
     948             : 
     949             : //=========================================================================
     950             : // virtual
     951           0 : float SAL_CALL ResultSet::getFloat( sal_Int32 columnIndex )
     952             :     throw( sdbc::SQLException, uno::RuntimeException )
     953             : {
     954           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     955             :     {
     956             :         uno::Reference< sdbc::XRow > xValues
     957           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     958           0 :                                                         m_pImpl->m_nPos - 1 );
     959           0 :         if ( xValues.is() )
     960             :         {
     961           0 :             m_pImpl->m_bWasNull = sal_False;
     962           0 :             m_pImpl->m_xDataSupplier->validate();
     963           0 :             return xValues->getFloat( columnIndex );
     964           0 :         }
     965             :     }
     966             : 
     967           0 :     m_pImpl->m_bWasNull = sal_True;
     968           0 :     m_pImpl->m_xDataSupplier->validate();
     969           0 :     return 0;
     970             : }
     971             : 
     972             : //=========================================================================
     973             : // virtual
     974           0 : double SAL_CALL ResultSet::getDouble( sal_Int32 columnIndex )
     975             :     throw( sdbc::SQLException, uno::RuntimeException )
     976             : {
     977           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
     978             :     {
     979             :         uno::Reference< sdbc::XRow > xValues
     980           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
     981           0 :                                                         m_pImpl->m_nPos - 1 );
     982           0 :         if ( xValues.is() )
     983             :         {
     984           0 :             m_pImpl->m_bWasNull = sal_False;
     985           0 :             m_pImpl->m_xDataSupplier->validate();
     986           0 :             return xValues->getDouble( columnIndex );
     987           0 :         }
     988             :     }
     989             : 
     990           0 :     m_pImpl->m_bWasNull = sal_True;
     991           0 :     m_pImpl->m_xDataSupplier->validate();
     992           0 :     return 0;
     993             : }
     994             : 
     995             : //=========================================================================
     996             : // virtual
     997             : uno::Sequence< sal_Int8 > SAL_CALL
     998           0 : ResultSet::getBytes( sal_Int32 columnIndex )
     999             :     throw( sdbc::SQLException, uno::RuntimeException )
    1000             : {
    1001           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1002             :     {
    1003             :         uno::Reference< sdbc::XRow > xValues
    1004           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1005           0 :                                                         m_pImpl->m_nPos - 1 );
    1006           0 :         if ( xValues.is() )
    1007             :         {
    1008           0 :             m_pImpl->m_bWasNull = sal_False;
    1009           0 :             m_pImpl->m_xDataSupplier->validate();
    1010           0 :             return xValues->getBytes( columnIndex );
    1011           0 :         }
    1012             :     }
    1013             : 
    1014           0 :     m_pImpl->m_bWasNull = sal_True;
    1015           0 :     m_pImpl->m_xDataSupplier->validate();
    1016           0 :     return uno::Sequence< sal_Int8 >();
    1017             : }
    1018             : 
    1019             : //=========================================================================
    1020             : // virtual
    1021           0 : util::Date SAL_CALL ResultSet::getDate( sal_Int32 columnIndex )
    1022             :     throw( sdbc::SQLException, uno::RuntimeException )
    1023             : {
    1024           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1025             :     {
    1026             :         uno::Reference< sdbc::XRow > xValues
    1027           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1028           0 :                                                         m_pImpl->m_nPos - 1 );
    1029           0 :         if ( xValues.is() )
    1030             :         {
    1031           0 :             m_pImpl->m_bWasNull = sal_False;
    1032           0 :             m_pImpl->m_xDataSupplier->validate();
    1033           0 :             return xValues->getDate( columnIndex );
    1034           0 :         }
    1035             :     }
    1036             : 
    1037           0 :     m_pImpl->m_bWasNull = sal_True;
    1038           0 :     m_pImpl->m_xDataSupplier->validate();
    1039           0 :     return util::Date();
    1040             : }
    1041             : 
    1042             : //=========================================================================
    1043             : // virtual
    1044           0 : util::Time SAL_CALL ResultSet::getTime( sal_Int32 columnIndex )
    1045             :     throw( sdbc::SQLException, uno::RuntimeException )
    1046             : {
    1047           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1048             :     {
    1049             :         uno::Reference< sdbc::XRow > xValues
    1050           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1051           0 :                                                         m_pImpl->m_nPos - 1 );
    1052           0 :         if ( xValues.is() )
    1053             :         {
    1054           0 :             m_pImpl->m_bWasNull = sal_False;
    1055           0 :             m_pImpl->m_xDataSupplier->validate();
    1056           0 :             return xValues->getTime( columnIndex );
    1057           0 :         }
    1058             :     }
    1059             : 
    1060           0 :     m_pImpl->m_bWasNull = sal_True;
    1061           0 :     m_pImpl->m_xDataSupplier->validate();
    1062           0 :     return util::Time();
    1063             : }
    1064             : 
    1065             : //=========================================================================
    1066             : // virtual
    1067             : util::DateTime SAL_CALL
    1068           0 : ResultSet::getTimestamp( sal_Int32 columnIndex )
    1069             :     throw( sdbc::SQLException, uno::RuntimeException )
    1070             : {
    1071           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1072             :     {
    1073             :         uno::Reference< sdbc::XRow > xValues
    1074           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1075           0 :                                                         m_pImpl->m_nPos - 1 );
    1076           0 :         if ( xValues.is() )
    1077             :         {
    1078           0 :             m_pImpl->m_bWasNull = sal_False;
    1079           0 :             m_pImpl->m_xDataSupplier->validate();
    1080           0 :             return xValues->getTimestamp( columnIndex );
    1081           0 :         }
    1082             :     }
    1083             : 
    1084           0 :     m_pImpl->m_bWasNull = sal_True;
    1085           0 :     m_pImpl->m_xDataSupplier->validate();
    1086           0 :     return util::DateTime();
    1087             : }
    1088             : 
    1089             : //=========================================================================
    1090             : // virtual
    1091             : uno::Reference< io::XInputStream > SAL_CALL
    1092           0 : ResultSet::getBinaryStream( sal_Int32 columnIndex )
    1093             :     throw( sdbc::SQLException, uno::RuntimeException )
    1094             : {
    1095           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1096             :     {
    1097             :         uno::Reference< sdbc::XRow > xValues
    1098           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1099           0 :                                                         m_pImpl->m_nPos - 1 );
    1100           0 :         if ( xValues.is() )
    1101             :         {
    1102           0 :             m_pImpl->m_bWasNull = sal_False;
    1103           0 :             m_pImpl->m_xDataSupplier->validate();
    1104           0 :             return xValues->getBinaryStream( columnIndex );
    1105           0 :         }
    1106             :     }
    1107             : 
    1108           0 :     m_pImpl->m_bWasNull = sal_True;
    1109           0 :     m_pImpl->m_xDataSupplier->validate();
    1110           0 :     return uno::Reference< io::XInputStream >();
    1111             : }
    1112             : 
    1113             : //=========================================================================
    1114             : // virtual
    1115             : uno::Reference< io::XInputStream > SAL_CALL
    1116           0 : ResultSet::getCharacterStream( sal_Int32 columnIndex )
    1117             :     throw( sdbc::SQLException, uno::RuntimeException )
    1118             : {
    1119           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1120             :     {
    1121             :         uno::Reference< sdbc::XRow > xValues
    1122           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1123           0 :                                                         m_pImpl->m_nPos - 1 );
    1124           0 :         if ( xValues.is() )
    1125             :         {
    1126           0 :             m_pImpl->m_bWasNull = sal_False;
    1127           0 :             m_pImpl->m_xDataSupplier->validate();
    1128           0 :             return xValues->getCharacterStream( columnIndex );
    1129           0 :         }
    1130             :     }
    1131             : 
    1132           0 :     m_pImpl->m_bWasNull = sal_True;
    1133           0 :     m_pImpl->m_xDataSupplier->validate();
    1134           0 :     return uno::Reference< io::XInputStream >();
    1135             : }
    1136             : 
    1137             : //=========================================================================
    1138             : // virtual
    1139           0 : uno::Any SAL_CALL ResultSet::getObject(
    1140             :         sal_Int32 columnIndex,
    1141             :         const uno::Reference< container::XNameAccess >& typeMap )
    1142             :     throw( sdbc::SQLException, uno::RuntimeException )
    1143             : {
    1144           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1145             :     {
    1146             :         uno::Reference< sdbc::XRow > xValues
    1147           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1148           0 :                                                         m_pImpl->m_nPos - 1 );
    1149           0 :         if ( xValues.is() )
    1150             :         {
    1151           0 :             m_pImpl->m_bWasNull = sal_False;
    1152           0 :             m_pImpl->m_xDataSupplier->validate();
    1153           0 :             return xValues->getObject( columnIndex, typeMap );
    1154           0 :         }
    1155             :     }
    1156             : 
    1157           0 :     m_pImpl->m_bWasNull = sal_True;
    1158           0 :     m_pImpl->m_xDataSupplier->validate();
    1159           0 :     return uno::Any();
    1160             : }
    1161             : 
    1162             : //=========================================================================
    1163             : // virtual
    1164             : uno::Reference< sdbc::XRef > SAL_CALL
    1165           0 : ResultSet::getRef( sal_Int32 columnIndex )
    1166             :     throw( sdbc::SQLException, uno::RuntimeException )
    1167             : {
    1168           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1169             :     {
    1170             :         uno::Reference< sdbc::XRow > xValues
    1171           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1172           0 :                                                         m_pImpl->m_nPos - 1 );
    1173           0 :         if ( xValues.is() )
    1174             :         {
    1175           0 :             m_pImpl->m_bWasNull = sal_False;
    1176           0 :             m_pImpl->m_xDataSupplier->validate();
    1177           0 :             return xValues->getRef( columnIndex );
    1178           0 :         }
    1179             :     }
    1180             : 
    1181           0 :     m_pImpl->m_bWasNull = sal_True;
    1182           0 :     m_pImpl->m_xDataSupplier->validate();
    1183           0 :     return uno::Reference< sdbc::XRef >();
    1184             : }
    1185             : 
    1186             : //=========================================================================
    1187             : // virtual
    1188             : uno::Reference< sdbc::XBlob > SAL_CALL
    1189           0 : ResultSet::getBlob( sal_Int32 columnIndex )
    1190             :     throw( sdbc::SQLException, uno::RuntimeException )
    1191             : {
    1192           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1193             :     {
    1194             :         uno::Reference< sdbc::XRow > xValues
    1195           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1196           0 :                                                         m_pImpl->m_nPos - 1 );
    1197           0 :         if ( xValues.is() )
    1198             :         {
    1199           0 :             m_pImpl->m_bWasNull = sal_False;
    1200           0 :             m_pImpl->m_xDataSupplier->validate();
    1201           0 :             return xValues->getBlob( columnIndex );
    1202           0 :         }
    1203             :     }
    1204             : 
    1205           0 :     m_pImpl->m_bWasNull = sal_True;
    1206           0 :     m_pImpl->m_xDataSupplier->validate();
    1207           0 :     return uno::Reference< sdbc::XBlob >();
    1208             : }
    1209             : 
    1210             : //=========================================================================
    1211             : // virtual
    1212             : uno::Reference< sdbc::XClob > SAL_CALL
    1213           0 : ResultSet::getClob( sal_Int32 columnIndex )
    1214             :     throw( sdbc::SQLException, uno::RuntimeException )
    1215             : {
    1216           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1217             :     {
    1218             :         uno::Reference< sdbc::XRow > xValues
    1219           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1220           0 :                                                         m_pImpl->m_nPos - 1 );
    1221           0 :         if ( xValues.is() )
    1222             :         {
    1223           0 :             m_pImpl->m_bWasNull = sal_False;
    1224           0 :             m_pImpl->m_xDataSupplier->validate();
    1225           0 :             return xValues->getClob( columnIndex );
    1226           0 :         }
    1227             :     }
    1228             : 
    1229           0 :     m_pImpl->m_bWasNull = sal_True;
    1230           0 :     m_pImpl->m_xDataSupplier->validate();
    1231           0 :     return uno::Reference< sdbc::XClob >();
    1232             : }
    1233             : 
    1234             : //=========================================================================
    1235             : // virtual
    1236             : uno::Reference< sdbc::XArray > SAL_CALL
    1237           0 : ResultSet::getArray( sal_Int32 columnIndex )
    1238             :     throw( sdbc::SQLException, uno::RuntimeException )
    1239             : {
    1240           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1241             :     {
    1242             :         uno::Reference< sdbc::XRow > xValues
    1243           0 :             = m_pImpl->m_xDataSupplier->queryPropertyValues(
    1244           0 :                                                         m_pImpl->m_nPos - 1 );
    1245           0 :         if ( xValues.is() )
    1246             :         {
    1247           0 :             m_pImpl->m_bWasNull = sal_False;
    1248           0 :             m_pImpl->m_xDataSupplier->validate();
    1249           0 :             return xValues->getArray( columnIndex );
    1250           0 :         }
    1251             :     }
    1252             : 
    1253           0 :     m_pImpl->m_bWasNull = sal_True;
    1254           0 :     m_pImpl->m_xDataSupplier->validate();
    1255           0 :     return uno::Reference< sdbc::XArray >();
    1256             : }
    1257             : 
    1258             : //=========================================================================
    1259             : //
    1260             : // XCloseable methods.
    1261             : //
    1262             : //=========================================================================
    1263             : 
    1264             : // virtual
    1265           0 : void SAL_CALL ResultSet::close()
    1266             :     throw( sdbc::SQLException, uno::RuntimeException )
    1267             : {
    1268           0 :     m_pImpl->m_xDataSupplier->close();
    1269           0 :     m_pImpl->m_xDataSupplier->validate();
    1270           0 : }
    1271             : 
    1272             : //=========================================================================
    1273             : //
    1274             : // XContentAccess methods.
    1275             : //
    1276             : //=========================================================================
    1277             : 
    1278             : // virtual
    1279           0 : rtl::OUString SAL_CALL ResultSet::queryContentIdentifierString()
    1280             :     throw( uno::RuntimeException )
    1281             : {
    1282           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1283           0 :         return m_pImpl->m_xDataSupplier->queryContentIdentifierString(
    1284           0 :                                                         m_pImpl->m_nPos - 1 );
    1285             : 
    1286           0 :     return rtl::OUString();
    1287             : }
    1288             : 
    1289             : //=========================================================================
    1290             : // virtual
    1291             : uno::Reference< com::sun::star::ucb::XContentIdentifier > SAL_CALL
    1292           0 : ResultSet::queryContentIdentifier()
    1293             :     throw( uno::RuntimeException )
    1294             : {
    1295           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1296           0 :         return m_pImpl->m_xDataSupplier->queryContentIdentifier(
    1297           0 :                                                         m_pImpl->m_nPos - 1 );
    1298             : 
    1299           0 :     return uno::Reference< com::sun::star::ucb::XContentIdentifier >();
    1300             : }
    1301             : 
    1302             : //=========================================================================
    1303             : // virtual
    1304             : uno::Reference< com::sun::star::ucb::XContent > SAL_CALL
    1305           0 : ResultSet::queryContent()
    1306             :     throw( uno::RuntimeException )
    1307             : {
    1308           0 :     if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
    1309           0 :         return m_pImpl->m_xDataSupplier->queryContent( m_pImpl->m_nPos - 1 );
    1310             : 
    1311           0 :     return uno::Reference< com::sun::star::ucb::XContent >();
    1312             : }
    1313             : 
    1314             : //=========================================================================
    1315             : //
    1316             : // XPropertySet methods.
    1317             : //
    1318             : //=========================================================================
    1319             : 
    1320             : // virtual
    1321             : uno::Reference< beans::XPropertySetInfo > SAL_CALL
    1322           0 : ResultSet::getPropertySetInfo()
    1323             :     throw( uno::RuntimeException )
    1324             : {
    1325           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
    1326             : 
    1327           0 :     if ( !m_pImpl->m_xPropSetInfo.is() )
    1328             :         m_pImpl->m_xPropSetInfo
    1329             :             = new PropertySetInfo( aPropertyTable,
    1330           0 :                                    RESULTSET_PROPERTY_COUNT );
    1331           0 :     return m_pImpl->m_xPropSetInfo;
    1332             : }
    1333             : 
    1334             : //=========================================================================
    1335             : // virtual
    1336           0 : void SAL_CALL ResultSet::setPropertyValue( const rtl::OUString& aPropertyName,
    1337             :                                            const uno::Any& )
    1338             :     throw( beans::UnknownPropertyException,
    1339             :            beans::PropertyVetoException,
    1340             :            lang::IllegalArgumentException,
    1341             :            lang::WrappedTargetException,
    1342             :            uno::RuntimeException )
    1343             : {
    1344           0 :     if ( aPropertyName.isEmpty() )
    1345           0 :         throw beans::UnknownPropertyException();
    1346             : 
    1347           0 :     if ( aPropertyName.equals(
    1348           0 :                 rtl::OUString("RowCount") ) )
    1349             :     {
    1350             :         // property is read-only.
    1351           0 :         throw lang::IllegalArgumentException();
    1352             :     }
    1353           0 :     else if ( aPropertyName.equals(
    1354           0 :                 rtl::OUString("IsRowCountFinal") ) )
    1355             :     {
    1356             :         // property is read-only.
    1357           0 :         throw lang::IllegalArgumentException();
    1358             :     }
    1359             :     else
    1360             :     {
    1361           0 :         throw beans::UnknownPropertyException();
    1362             :     }
    1363             : }
    1364             : 
    1365             : //=========================================================================
    1366             : // virtual
    1367           0 : uno::Any SAL_CALL ResultSet::getPropertyValue(
    1368             :         const rtl::OUString& PropertyName )
    1369             :     throw( beans::UnknownPropertyException,
    1370             :            lang::WrappedTargetException,
    1371             :            uno::RuntimeException )
    1372             : {
    1373           0 :     if ( PropertyName.isEmpty() )
    1374           0 :         throw beans::UnknownPropertyException();
    1375             : 
    1376           0 :     uno::Any aValue;
    1377             : 
    1378           0 :     if ( PropertyName.equals(
    1379           0 :                 rtl::OUString("RowCount") ) )
    1380             :     {
    1381           0 :         aValue <<= m_pImpl->m_xDataSupplier->currentCount();
    1382             :     }
    1383           0 :     else if ( PropertyName.equals(
    1384           0 :                 rtl::OUString("IsRowCountFinal") ) )
    1385             :     {
    1386           0 :         aValue <<= m_pImpl->m_xDataSupplier->isCountFinal();
    1387             :     }
    1388             :     else
    1389             :     {
    1390           0 :         throw beans::UnknownPropertyException();
    1391             :     }
    1392             : 
    1393           0 :     return aValue;
    1394             : }
    1395             : 
    1396             : //=========================================================================
    1397             : // virtual
    1398           0 : void SAL_CALL ResultSet::addPropertyChangeListener(
    1399             :         const rtl::OUString& aPropertyName,
    1400             :         const uno::Reference< beans::XPropertyChangeListener >& xListener )
    1401             :     throw( beans::UnknownPropertyException,
    1402             :            lang::WrappedTargetException,
    1403             :            uno::RuntimeException )
    1404             : {
    1405             :     // Note: An empty property name means a listener for "all" properties.
    1406             : 
    1407           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
    1408             : 
    1409           0 :     if ( !aPropertyName.isEmpty() &&
    1410             :          !aPropertyName.equals(
    1411           0 :                 rtl::OUString("RowCount") ) &&
    1412             :          !aPropertyName.equals(
    1413           0 :                 rtl::OUString("IsRowCountFinal") ) )
    1414           0 :         throw beans::UnknownPropertyException();
    1415             : 
    1416           0 :     if ( !m_pImpl->m_pPropertyChangeListeners )
    1417             :         m_pImpl->m_pPropertyChangeListeners
    1418           0 :             = new PropertyChangeListeners( m_pImpl->m_aMutex );
    1419             : 
    1420             :     m_pImpl->m_pPropertyChangeListeners->addInterface(
    1421           0 :                                                 aPropertyName, xListener );
    1422           0 : }
    1423             : 
    1424             : //=========================================================================
    1425             : // virtual
    1426           0 : void SAL_CALL ResultSet::removePropertyChangeListener(
    1427             :         const rtl::OUString& aPropertyName,
    1428             :         const uno::Reference< beans::XPropertyChangeListener >& xListener )
    1429             :     throw( beans::UnknownPropertyException,
    1430             :            lang::WrappedTargetException,
    1431             :            uno::RuntimeException )
    1432             : {
    1433           0 :     osl::MutexGuard aGuard( m_pImpl->m_aMutex );
    1434             : 
    1435           0 :     if ( !aPropertyName.isEmpty() &&
    1436             :          !aPropertyName.equals(
    1437           0 :                 rtl::OUString("RowCount") ) &&
    1438             :          !aPropertyName.equals(
    1439           0 :                 rtl::OUString("IsRowCountFinal") ) )
    1440           0 :         throw beans::UnknownPropertyException();
    1441             : 
    1442           0 :     if ( m_pImpl->m_pPropertyChangeListeners )
    1443             :         m_pImpl->m_pPropertyChangeListeners->removeInterface(
    1444           0 :                                                     aPropertyName, xListener );
    1445             : 
    1446           0 : }
    1447             : 
    1448             : //=========================================================================
    1449             : // virtual
    1450           0 : void SAL_CALL ResultSet::addVetoableChangeListener(
    1451             :         const rtl::OUString&,
    1452             :         const uno::Reference< beans::XVetoableChangeListener >& )
    1453             :     throw( beans::UnknownPropertyException,
    1454             :            lang::WrappedTargetException,
    1455             :            uno::RuntimeException )
    1456             : {
    1457             :     //  No constrained props, at the moment.
    1458           0 : }
    1459             : 
    1460             : //=========================================================================
    1461             : // virtual
    1462           0 : void SAL_CALL ResultSet::removeVetoableChangeListener(
    1463             :         const rtl::OUString&,
    1464             :         const uno::Reference< beans::XVetoableChangeListener >& )
    1465             :     throw( beans::UnknownPropertyException,
    1466             :            lang::WrappedTargetException,
    1467             :            uno::RuntimeException )
    1468             : {
    1469             :     //  No constrained props, at the moment.
    1470           0 : }
    1471             : 
    1472             : //=========================================================================
    1473             : //
    1474             : // Non-interface methods.
    1475             : //
    1476             : //=========================================================================
    1477             : 
    1478           0 : void ResultSet::propertyChanged( const beans::PropertyChangeEvent& rEvt )
    1479             : {
    1480           0 :     if ( !m_pImpl->m_pPropertyChangeListeners )
    1481           0 :         return;
    1482             : 
    1483             :     // Notify listeners interested especially in the changed property.
    1484             :     cppu::OInterfaceContainerHelper* pPropsContainer
    1485             :         = m_pImpl->m_pPropertyChangeListeners->getContainer(
    1486           0 :                                                         rEvt.PropertyName );
    1487           0 :     if ( pPropsContainer )
    1488             :     {
    1489           0 :         cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
    1490           0 :         while ( aIter.hasMoreElements() )
    1491             :         {
    1492             :             uno::Reference< beans::XPropertyChangeListener > xListener(
    1493           0 :                 aIter.next(), uno::UNO_QUERY );
    1494           0 :             if ( xListener.is() )
    1495           0 :                 xListener->propertyChange( rEvt );
    1496           0 :         }
    1497             :     }
    1498             : 
    1499             :     // Notify listeners interested in all properties.
    1500             :     pPropsContainer
    1501           0 :         = m_pImpl->m_pPropertyChangeListeners->getContainer( rtl::OUString() );
    1502           0 :     if ( pPropsContainer )
    1503             :     {
    1504           0 :         cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
    1505           0 :         while ( aIter.hasMoreElements() )
    1506             :         {
    1507             :             uno::Reference< beans::XPropertyChangeListener > xListener(
    1508           0 :                 aIter.next(), uno::UNO_QUERY );
    1509           0 :             if ( xListener.is() )
    1510           0 :                 xListener->propertyChange( rEvt );
    1511           0 :         }
    1512             :     }
    1513             : }
    1514             : 
    1515             : //=========================================================================
    1516           0 : void ResultSet::rowCountChanged( sal_uInt32 nOld, sal_uInt32 nNew )
    1517             : {
    1518             :     OSL_ENSURE( nOld < nNew, "ResultSet::rowCountChanged - nOld >= nNew!" );
    1519             : 
    1520           0 :     if ( !m_pImpl->m_pPropertyChangeListeners )
    1521           0 :         return;
    1522             : 
    1523             :     propertyChanged(
    1524             :         beans::PropertyChangeEvent(
    1525             :             static_cast< cppu::OWeakObject * >( this ),
    1526             :             rtl::OUString("RowCount"),
    1527             :             sal_False,
    1528             :             1001,
    1529             :             uno::makeAny( nOld ),     // old value
    1530           0 :             uno::makeAny( nNew ) ) ); // new value
    1531             : }
    1532             : 
    1533             : //=========================================================================
    1534           0 : void ResultSet::rowCountFinal()
    1535             : {
    1536           0 :     if ( !m_pImpl->m_pPropertyChangeListeners )
    1537           0 :         return;
    1538             : 
    1539             :     propertyChanged(
    1540             :         beans::PropertyChangeEvent(
    1541             :             static_cast< cppu::OWeakObject * >( this ),
    1542             :             rtl::OUString("IsRowCountFinal"),
    1543             :             sal_False,
    1544             :             1000,
    1545             :             uno:: makeAny( sal_False ),   // old value
    1546           0 :             uno::makeAny( sal_True ) ) ); // new value
    1547             : }
    1548             : 
    1549             : //=========================================================================
    1550           0 : const uno::Sequence< beans::Property >& ResultSet::getProperties()
    1551             : {
    1552           0 :     return m_pImpl->m_aProperties;
    1553             : }
    1554             : 
    1555             : //=========================================================================
    1556             : const uno::Reference< com::sun::star::ucb::XCommandEnvironment >&
    1557           0 : ResultSet::getEnvironment()
    1558             : {
    1559           0 :     return m_pImpl->m_xEnv;
    1560             : }
    1561             : 
    1562             : } // namespace ucbhelper
    1563             : 
    1564             : namespace ucbhelper_impl {
    1565             : 
    1566             : //=========================================================================
    1567             : //=========================================================================
    1568             : //
    1569             : // PropertySetInfo Implementation.
    1570             : //
    1571             : //=========================================================================
    1572             : //=========================================================================
    1573             : 
    1574           0 : PropertySetInfo::PropertySetInfo(
    1575             :     const PropertyInfo* pProps,
    1576           0 :     sal_Int32 nProps )
    1577             : {
    1578           0 :     m_pProps = new uno::Sequence< beans::Property >( nProps );
    1579             : 
    1580           0 :     if ( nProps )
    1581             :     {
    1582           0 :         const PropertyInfo* pEntry = pProps;
    1583           0 :         beans::Property* pProperties = m_pProps->getArray();
    1584             : 
    1585           0 :         for ( sal_Int32 n = 0; n < nProps; ++n )
    1586             :         {
    1587           0 :             beans::Property& rProp = pProperties[ n ];
    1588             : 
    1589           0 :             rProp.Name       = rtl::OUString::createFromAscii( pEntry->pName );
    1590           0 :             rProp.Handle     = pEntry->nHandle;
    1591           0 :             rProp.Type       = pEntry->pGetCppuType();
    1592           0 :             rProp.Attributes = pEntry->nAttributes;
    1593             : 
    1594           0 :             pEntry++;
    1595             :         }
    1596             :     }
    1597           0 : }
    1598             : 
    1599             : //=========================================================================
    1600             : // virtual
    1601           0 : PropertySetInfo::~PropertySetInfo()
    1602             : {
    1603           0 :     delete m_pProps;
    1604           0 : }
    1605             : 
    1606             : //=========================================================================
    1607             : //
    1608             : // XInterface methods.
    1609             : //
    1610             : //=========================================================================
    1611             : 
    1612           0 : XINTERFACE_IMPL_2( PropertySetInfo,
    1613             :                    lang::XTypeProvider,
    1614             :                    beans::XPropertySetInfo );
    1615             : 
    1616             : //=========================================================================
    1617             : //
    1618             : // XTypeProvider methods.
    1619             : //
    1620             : //=========================================================================
    1621             : 
    1622           0 : XTYPEPROVIDER_IMPL_2( PropertySetInfo,
    1623             :                          lang::XTypeProvider,
    1624             :                          beans::XPropertySetInfo );
    1625             : 
    1626             : //=========================================================================
    1627             : //
    1628             : // XPropertySetInfo methods.
    1629             : //
    1630             : //=========================================================================
    1631             : 
    1632             : // virtual
    1633           0 : uno::Sequence< beans::Property > SAL_CALL PropertySetInfo::getProperties()
    1634             :     throw( uno::RuntimeException )
    1635             : {
    1636           0 :     return uno::Sequence< beans::Property >( *m_pProps );
    1637             : }
    1638             : 
    1639             : //=========================================================================
    1640             : // virtual
    1641           0 : beans::Property SAL_CALL PropertySetInfo::getPropertyByName(
    1642             :         const rtl::OUString& aName )
    1643             :     throw( beans::UnknownPropertyException, uno::RuntimeException )
    1644             : {
    1645           0 :     beans::Property aProp;
    1646           0 :     if ( queryProperty( aName, aProp ) )
    1647           0 :         return aProp;
    1648             : 
    1649           0 :     throw beans::UnknownPropertyException();
    1650             : }
    1651             : 
    1652             : //=========================================================================
    1653             : // virtual
    1654           0 : sal_Bool SAL_CALL PropertySetInfo::hasPropertyByName(
    1655             :         const rtl::OUString& Name )
    1656             :     throw( uno::RuntimeException )
    1657             : {
    1658           0 :     beans::Property aProp;
    1659           0 :     return queryProperty( Name, aProp );
    1660             : }
    1661             : 
    1662             : //=========================================================================
    1663           0 : sal_Bool PropertySetInfo::queryProperty(
    1664             :     const rtl::OUString& aName, beans::Property& rProp )
    1665             : {
    1666           0 :     sal_Int32 nCount = m_pProps->getLength();
    1667           0 :     const beans::Property* pProps = m_pProps->getConstArray();
    1668           0 :     for ( sal_Int32 n = 0; n < nCount; ++n )
    1669             :     {
    1670           0 :         const beans::Property& rCurr = pProps[ n ];
    1671           0 :         if ( rCurr.Name == aName )
    1672             :         {
    1673           0 :             rProp = rCurr;
    1674           0 :             return sal_True;
    1675             :         }
    1676             :     }
    1677             : 
    1678           0 :     return sal_False;
    1679             : }
    1680             : 
    1681             : } // namespace ucbhelper_impl
    1682             : 
    1683             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10