LCOV - code coverage report
Current view: top level - ucb/source/sorter - sortresult.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 172 842 20.4 %
Date: 2015-06-13 12:38:46 Functions: 21 98 21.4 %
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             : #include <vector>
      22             : #include <sortresult.hxx>
      23             : #include <com/sun/star/sdbc/DataType.hpp>
      24             : #include <com/sun/star/sdbc/XResultSetMetaData.hpp>
      25             : #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
      26             : #include <com/sun/star/ucb/ListActionType.hpp>
      27             : #include <com/sun/star/ucb/XAnyCompare.hpp>
      28             : #include <com/sun/star/ucb/XAnyCompareFactory.hpp>
      29             : #include <cppuhelper/implbase1.hxx>
      30             : #include <cppuhelper/interfacecontainer.hxx>
      31             : #include <cppuhelper/supportsservice.hxx>
      32             : #include <osl/diagnose.h>
      33             : #include <boost/scoped_array.hpp>
      34             : 
      35             : using namespace com::sun::star::beans;
      36             : using namespace com::sun::star::container;
      37             : using namespace com::sun::star::io;
      38             : using namespace com::sun::star::lang;
      39             : using namespace com::sun::star::sdbc;
      40             : using namespace com::sun::star::ucb;
      41             : using namespace com::sun::star::uno;
      42             : using namespace com::sun::star::util;
      43             : using namespace cppu;
      44             : 
      45             : 
      46             : 
      47             : 
      48             : //  The mutex to synchronize access to containers.
      49           0 : static osl::Mutex& getContainerMutex()
      50             : {
      51             :     static osl::Mutex* pMutex = NULL;
      52           0 :     if( !pMutex )
      53             :     {
      54           0 :         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
      55           0 :         if( !pMutex )
      56             :         {
      57           0 :             static osl::Mutex aMutex;
      58           0 :             pMutex = &aMutex;
      59           0 :         }
      60             :     }
      61             : 
      62           0 :     return *pMutex;
      63             : }
      64             : 
      65             : 
      66             : 
      67         140 : struct SortInfo
      68             : {
      69             :     bool    mbUseOwnCompare;
      70             :     bool    mbAscending;
      71             :     bool    mbCaseSensitive;
      72             :     sal_Int32   mnColumn;
      73             :     sal_Int32   mnType;
      74             :     SortInfo*   mpNext;
      75             :     Reference < XAnyCompare >   mxCompareFunction;
      76             : };
      77             : 
      78             : 
      79             : 
      80             : struct SortListData
      81             : {
      82             :     bool    mbModified;
      83             :     sal_IntPtr  mnCurPos;
      84             :     sal_IntPtr  mnOldPos;
      85             : 
      86             :     SortListData( sal_IntPtr nPos, bool bModified = false );
      87             : };
      88             : 
      89             : 
      90             : 
      91             : // class SRSPropertySetInfo.
      92             : 
      93             : 
      94             : 
      95             : class SRSPropertySetInfo : public cppu::WeakImplHelper1 <
      96             :     XPropertySetInfo >
      97             : {
      98             :     Property    maProps[2];
      99             : 
     100             : private:
     101             : 
     102             : public:
     103             :                 SRSPropertySetInfo();
     104             :     virtual     ~SRSPropertySetInfo();
     105             : 
     106             :     // XPropertySetInfo
     107             :     virtual Sequence< Property > SAL_CALL getProperties()
     108             :         throw( RuntimeException, std::exception ) SAL_OVERRIDE;
     109             :     virtual Property SAL_CALL getPropertyByName( const OUString& aName )
     110             :         throw( UnknownPropertyException, RuntimeException, std::exception ) SAL_OVERRIDE;
     111             :     virtual sal_Bool SAL_CALL hasPropertyByName( const OUString& Name )
     112             :         throw( RuntimeException, std::exception ) SAL_OVERRIDE;
     113             : };
     114             : 
     115             : typedef OMultiTypeInterfaceContainerHelperVar<OUString>
     116             :     PropertyChangeListenerContainer_Impl;
     117             : 
     118           0 : class PropertyChangeListeners_Impl : public PropertyChangeListenerContainer_Impl
     119             : {
     120             : public:
     121           0 :     PropertyChangeListeners_Impl()
     122           0 :     : PropertyChangeListenerContainer_Impl( getContainerMutex() ) {}
     123             : };
     124             : 
     125             : 
     126          70 : SortedResultSet::SortedResultSet( Reference< XResultSet > aResult )
     127             : {
     128          70 :     mpDisposeEventListeners = NULL;
     129          70 :     mpPropChangeListeners   = NULL;
     130          70 :     mpVetoChangeListeners   = NULL;
     131          70 :     mpPropSetInfo           = NULL;
     132             : 
     133          70 :     mxOriginal  = aResult;
     134          70 :     mpSortInfo  = NULL;
     135          70 :     mnLastSort  = 0;
     136          70 :     mnCurEntry  = 0;
     137          70 :     mnCount     = 0;
     138          70 :     mbIsCopy    = false;
     139          70 : }
     140             : 
     141             : 
     142         210 : SortedResultSet::~SortedResultSet()
     143             : {
     144          70 :     mxOriginal.clear();
     145          70 :     mxOther.clear();
     146             : 
     147          70 :     if ( !mbIsCopy )
     148             :     {
     149          70 :         SortInfo *pInfo = mpSortInfo;
     150         210 :         while ( pInfo )
     151             :         {
     152          70 :             mpSortInfo = pInfo->mpNext;
     153          70 :             delete pInfo;
     154          70 :             pInfo = mpSortInfo;
     155             :         }
     156             :     }
     157             : 
     158          70 :     mpSortInfo = NULL;
     159             : 
     160          70 :     if ( mpPropSetInfo )
     161           0 :         mpPropSetInfo->release();
     162             : 
     163          70 :     delete mpPropChangeListeners;
     164          70 :     delete mpVetoChangeListeners;
     165         140 : }
     166             : 
     167             : 
     168             : // XServiceInfo methods.
     169             : 
     170           0 : OUString SAL_CALL SortedResultSet::getImplementationName()
     171             :     throw( css::uno::RuntimeException, std::exception )
     172             : {
     173           0 :     return getImplementationName_Static();
     174             : }
     175             : 
     176           0 : OUString SortedResultSet::getImplementationName_Static()
     177             : {
     178           0 :     return OUString( "com.sun.star.comp.ucb.SortedResultSet" );
     179             : }
     180             : 
     181           0 : sal_Bool SAL_CALL SortedResultSet::supportsService( const OUString& ServiceName )
     182             :     throw( css::uno::RuntimeException, std::exception )
     183             : {
     184           0 :     return cppu::supportsService( this, ServiceName );
     185             : }
     186             : 
     187           0 : css::uno::Sequence< OUString > SAL_CALL SortedResultSet::getSupportedServiceNames()
     188             :     throw( css::uno::RuntimeException, std::exception )
     189             : {
     190           0 :     return getSupportedServiceNames_Static();
     191             : }
     192             : 
     193           0 : css::uno::Sequence< OUString >SortedResultSet::getSupportedServiceNames_Static()
     194             : {
     195           0 :     css::uno::Sequence< OUString > aSNS( 1 );
     196           0 :     aSNS.getArray()[ 0 ] = RESULTSET_SERVICE_NAME;
     197           0 :     return aSNS;
     198             : }
     199             : 
     200             : 
     201             : // XComponent methods.
     202             : 
     203           0 : void SAL_CALL SortedResultSet::dispose()
     204             :     throw( RuntimeException, std::exception )
     205             : {
     206           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     207             : 
     208           0 :     if ( mpDisposeEventListeners && mpDisposeEventListeners->getLength() )
     209             :     {
     210           0 :         EventObject aEvt;
     211           0 :         aEvt.Source = static_cast< XComponent * >( this );
     212           0 :         mpDisposeEventListeners->disposeAndClear( aEvt );
     213             :     }
     214             : 
     215           0 :     if ( mpPropChangeListeners )
     216             :     {
     217           0 :         EventObject aEvt;
     218           0 :         aEvt.Source = static_cast< XPropertySet * >( this );
     219           0 :         mpPropChangeListeners->disposeAndClear( aEvt );
     220             :     }
     221             : 
     222           0 :     if ( mpVetoChangeListeners )
     223             :     {
     224           0 :         EventObject aEvt;
     225           0 :         aEvt.Source = static_cast< XPropertySet * >( this );
     226           0 :         mpVetoChangeListeners->disposeAndClear( aEvt );
     227             :     }
     228             : 
     229           0 :     mxOriginal.clear();
     230           0 :     mxOther.clear();
     231           0 : }
     232             : 
     233             : 
     234           0 : void SAL_CALL SortedResultSet::addEventListener(
     235             :                             const Reference< XEventListener >& Listener )
     236             :     throw( RuntimeException, std::exception )
     237             : {
     238           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     239             : 
     240           0 :     if ( !mpDisposeEventListeners )
     241             :         mpDisposeEventListeners =
     242           0 :                     new OInterfaceContainerHelper( getContainerMutex() );
     243             : 
     244           0 :     mpDisposeEventListeners->addInterface( Listener );
     245           0 : }
     246             : 
     247             : 
     248           0 : void SAL_CALL SortedResultSet::removeEventListener(
     249             :                             const Reference< XEventListener >& Listener )
     250             :     throw( RuntimeException, std::exception )
     251             : {
     252           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     253             : 
     254           0 :     if ( mpDisposeEventListeners )
     255           0 :         mpDisposeEventListeners->removeInterface( Listener );
     256           0 : }
     257             : 
     258             : 
     259             : // XContentAccess methods.
     260             : 
     261             : 
     262             : OUString SAL_CALL
     263           0 : SortedResultSet::queryContentIdentifierString()
     264             :     throw( RuntimeException, std::exception )
     265             : {
     266           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     267           0 :     return Reference< XContentAccess >::query(mxOriginal)->queryContentIdentifierString();
     268             : }
     269             : 
     270             : 
     271             : Reference< XContentIdentifier > SAL_CALL
     272           0 : SortedResultSet::queryContentIdentifier()
     273             :     throw( RuntimeException, std::exception )
     274             : {
     275           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     276           0 :     return Reference< XContentAccess >::query(mxOriginal)->queryContentIdentifier();
     277             : }
     278             : 
     279             : 
     280             : Reference< XContent > SAL_CALL
     281           0 : SortedResultSet::queryContent()
     282             :     throw( RuntimeException, std::exception )
     283             : {
     284           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     285           0 :     return Reference< XContentAccess >::query(mxOriginal)->queryContent();
     286             : }
     287             : 
     288             : 
     289             : 
     290             : // XResultSet methods.
     291             : 
     292         282 : sal_Bool SAL_CALL SortedResultSet::next()
     293             :     throw ( SQLException, RuntimeException, std::exception )
     294             : {
     295         282 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     296             : 
     297         282 :     mnCurEntry++;
     298             : 
     299         282 :     if ( mnCurEntry > 0 )
     300             :     {
     301         282 :         if ( mnCurEntry <= mnCount )
     302             :         {
     303         212 :             sal_Int32 nIndex = maS2O[ mnCurEntry ];
     304         212 :             return mxOriginal->absolute( nIndex );
     305             :         }
     306             :         else
     307             :         {
     308          70 :             mnCurEntry = mnCount + 1;
     309             :         }
     310             :     }
     311          70 :     return sal_False;
     312             : }
     313             : 
     314             : 
     315           0 : sal_Bool SAL_CALL SortedResultSet::isBeforeFirst()
     316             :     throw ( SQLException, RuntimeException, std::exception )
     317             : {
     318           0 :     if ( mnCurEntry )
     319           0 :         return sal_False;
     320             :     else
     321           0 :         return sal_True;
     322             : }
     323             : 
     324             : 
     325           0 : sal_Bool SAL_CALL SortedResultSet::isAfterLast()
     326             :     throw ( SQLException, RuntimeException, std::exception )
     327             : {
     328           0 :     if ( mnCurEntry > mnCount )
     329           0 :         return sal_True;
     330             :     else
     331           0 :         return sal_False;
     332             : }
     333             : 
     334             : 
     335           0 : sal_Bool SAL_CALL SortedResultSet::isFirst()
     336             :     throw ( SQLException, RuntimeException, std::exception )
     337             : {
     338           0 :     if ( mnCurEntry == 1 )
     339           0 :         return sal_True;
     340             :     else
     341           0 :         return sal_False;
     342             : }
     343             : 
     344             : 
     345           0 : sal_Bool SAL_CALL SortedResultSet::isLast()
     346             :     throw ( SQLException, RuntimeException, std::exception )
     347             : {
     348           0 :     if ( mnCurEntry == mnCount )
     349           0 :         return sal_True;
     350             :     else
     351           0 :         return sal_False;
     352             : }
     353             : 
     354             : 
     355          70 : void SAL_CALL SortedResultSet::beforeFirst()
     356             :     throw ( SQLException, RuntimeException, std::exception )
     357             : {
     358          70 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     359          70 :     mnCurEntry = 0;
     360          70 :     mxOriginal->beforeFirst();
     361          70 : }
     362             : 
     363             : 
     364           0 : void SAL_CALL SortedResultSet::afterLast()
     365             :     throw ( SQLException, RuntimeException, std::exception )
     366             : {
     367           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     368           0 :     mnCurEntry = mnCount+1;
     369           0 :     mxOriginal->afterLast();
     370           0 : }
     371             : 
     372             : 
     373           0 : sal_Bool SAL_CALL SortedResultSet::first()
     374             :     throw ( SQLException, RuntimeException, std::exception )
     375             : {
     376           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     377             : 
     378           0 :     if ( mnCount )
     379             :     {
     380           0 :         mnCurEntry = 1;
     381           0 :         sal_Int32 nIndex = maS2O[ mnCurEntry ];
     382           0 :         return mxOriginal->absolute( nIndex );
     383             :     }
     384             :     else
     385             :     {
     386           0 :         mnCurEntry = 0;
     387           0 :         return sal_False;
     388           0 :     }
     389             : }
     390             : 
     391             : 
     392           0 : sal_Bool SAL_CALL SortedResultSet::last()
     393             :     throw ( SQLException, RuntimeException, std::exception )
     394             : {
     395           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     396             : 
     397           0 :     if ( mnCount )
     398             :     {
     399           0 :         mnCurEntry = mnCount;
     400           0 :         sal_Int32 nIndex = maS2O[ mnCurEntry ];
     401           0 :         return mxOriginal->absolute( nIndex );
     402             :     }
     403             :     else
     404             :     {
     405           0 :         mnCurEntry = 0;
     406           0 :         return sal_False;
     407           0 :     }
     408             : }
     409             : 
     410             : 
     411           0 : sal_Int32 SAL_CALL SortedResultSet::getRow()
     412             :     throw ( SQLException, RuntimeException, std::exception )
     413             : {
     414           0 :     return mnCurEntry;
     415             : }
     416             : 
     417             : 
     418             : /**
     419             :  moves the cursor to the given row number in the result set.
     420             :  <p>If the row number is positive, the cursor moves to the given row
     421             :  number with respect to the beginning of the result set. The first
     422             :  row is row 1, the second is row 2, and so on.
     423             :  <p>If the given row number is negative, the cursor moves to an
     424             :  absolute row position with respect to the end of the result set.
     425             :  For example, calling <code>moveToPosition(-1)</code> positions the
     426             :  cursor on the last row, <code>moveToPosition(-2)</code> indicates the
     427             :  next-to-last row, and so on.
     428             :  <p>An attempt to position the cursor beyond the first/last row in the
     429             :  result set leaves the cursor before/after the first/last row,
     430             :  respectively.
     431             :  <p>Note: Calling <code>moveToPosition(1)</code> is the same
     432             :  as calling <code>moveToFirst()</code>. Calling
     433             :  <code>moveToPosition(-1)</code> is the same as calling
     434             :  <code>moveToLast()</code>.
     435             :  @param row
     436             :     is the number of rows to move. Could be negative.
     437             :  @returns
     438             :     <TRUE/> if the cursor is on a row; <FALSE/> otherwise
     439             :  @throws SQLException
     440             :     if a database access error occurs or if row is 0, or the result set
     441             :     type is FORWARD_ONLY.
     442             :  */
     443           0 : sal_Bool SAL_CALL SortedResultSet::absolute( sal_Int32 row )
     444             :     throw ( SQLException, RuntimeException, std::exception )
     445             : {
     446           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     447             : 
     448             :     sal_Int32 nIndex;
     449             : 
     450           0 :     if ( row > 0 )
     451             :     {
     452           0 :         if ( row <= mnCount )
     453             :         {
     454           0 :             mnCurEntry = row;
     455           0 :             nIndex = maS2O[ mnCurEntry ];
     456           0 :             return mxOriginal->absolute( nIndex );
     457             :         }
     458             :         else
     459             :         {
     460           0 :             mnCurEntry = mnCount + 1;
     461           0 :             return sal_False;
     462             :         }
     463             :     }
     464           0 :     else if ( row == 0 )
     465             :     {
     466           0 :         throw SQLException();
     467             :     }
     468             :     else
     469             :     {
     470           0 :         if ( mnCount + row + 1 > 0 )
     471             :         {
     472           0 :             mnCurEntry = mnCount + row + 1;
     473           0 :             nIndex = maS2O[ mnCurEntry ];
     474           0 :             return mxOriginal->absolute( nIndex );
     475             :         }
     476             :         else
     477             :         {
     478           0 :             mnCurEntry = 0;
     479           0 :             return sal_False;
     480             :         }
     481           0 :     }
     482             : }
     483             : 
     484             : 
     485             : /**
     486             :  moves the cursor a relative number of rows, either positive or negative.
     487             :  <p>
     488             :  Attempting to move beyond the first/last row in the result set positions
     489             :  the cursor before/after the first/last row. Calling
     490             :  <code>moveRelative(0)</code> is valid, but does not change the cursor
     491             :  position.
     492             :  <p>Note: Calling <code>moveRelative(1)</code> is different from calling
     493             :  <code>moveNext()</code> because is makes sense to call
     494             :  <code>moveNext()</code> when there is no current row, for example,
     495             :  when the cursor is positioned before the first row or after the last
     496             :  row of the result set.
     497             :  @param rows
     498             :     is the number of rows to move. Could be negative.
     499             :  @returns
     500             :     <TRUE/> if the cursor is on a valid row; <FALSE/> if it is off
     501             :     the result set.
     502             :  @throws SQLException
     503             :     if a database access error occurs or if there is no
     504             :     current row, or the result set type is FORWARD_ONLY.
     505             :  */
     506           0 : sal_Bool SAL_CALL SortedResultSet::relative( sal_Int32 rows )
     507             :     throw ( SQLException, RuntimeException, std::exception )
     508             : {
     509           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     510             : 
     511           0 :     if ( ( mnCurEntry <= 0 ) || ( mnCurEntry > mnCount ) )
     512             :     {
     513           0 :         throw SQLException();
     514             :     }
     515             : 
     516           0 :     if ( rows == 0 )
     517           0 :         return sal_True;
     518             : 
     519           0 :     sal_Int32 nTmp = mnCurEntry + rows;
     520             : 
     521           0 :     if ( nTmp <= 0 )
     522             :     {
     523           0 :         mnCurEntry = 0;
     524           0 :         return sal_False;
     525             :     }
     526           0 :     else if ( nTmp > mnCount )
     527             :     {
     528           0 :         mnCurEntry = mnCount + 1;
     529           0 :         return sal_False;
     530             :     }
     531             :     else
     532             :     {
     533           0 :         mnCurEntry = nTmp;
     534           0 :         nTmp = maS2O[ mnCurEntry ];
     535           0 :         return mxOriginal->absolute( nTmp );
     536           0 :     }
     537             : }
     538             : 
     539             : 
     540             : /**
     541             :  moves the cursor to the previous row in the result set.
     542             :  <p>Note: <code>previous()</code> is not the same as
     543             :  <code>relative(-1)</code> because it makes sense to call
     544             :  <code>previous()</code> when there is no current row.
     545             :  @returns <TRUE/> if the cursor is on a valid row; <FALSE/> if it is off
     546             :     the result set.
     547             :  @throws SQLException
     548             :     if a database access error occurs or the result set type
     549             :     is FORWARD_ONLY.
     550             :  */
     551           0 : sal_Bool SAL_CALL SortedResultSet::previous()
     552             :     throw ( SQLException, RuntimeException, std::exception )
     553             : {
     554           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     555             : 
     556           0 :     mnCurEntry -= 1;
     557             : 
     558           0 :     if ( mnCurEntry > 0 )
     559             :     {
     560           0 :         if ( mnCurEntry <= mnCount )
     561             :         {
     562           0 :             sal_Int32 nIndex = maS2O[ mnCurEntry ];
     563           0 :             return mxOriginal->absolute( nIndex );
     564             :         }
     565             :     }
     566             :     else
     567           0 :         mnCurEntry = 0;
     568             : 
     569           0 :     return sal_False;
     570             : }
     571             : 
     572             : 
     573           0 : void SAL_CALL SortedResultSet::refreshRow()
     574             :     throw ( SQLException, RuntimeException, std::exception )
     575             : {
     576           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     577             : 
     578           0 :     if ( ( mnCurEntry <= 0 ) || ( mnCurEntry > mnCount ) )
     579             :     {
     580           0 :         throw SQLException();
     581             :     }
     582             : 
     583           0 :     mxOriginal->refreshRow();
     584           0 : }
     585             : 
     586             : 
     587           0 : sal_Bool SAL_CALL SortedResultSet::rowUpdated()
     588             :     throw ( SQLException, RuntimeException, std::exception )
     589             : {
     590           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     591             : 
     592           0 :     if ( ( mnCurEntry <= 0 ) || ( mnCurEntry > mnCount ) )
     593             :     {
     594           0 :         throw SQLException();
     595             :     }
     596             : 
     597           0 :     return mxOriginal->rowUpdated();
     598             : }
     599             : 
     600             : 
     601           0 : sal_Bool SAL_CALL SortedResultSet::rowInserted()
     602             :     throw ( SQLException, RuntimeException, std::exception )
     603             : {
     604           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     605             : 
     606           0 :     if ( ( mnCurEntry <= 0 ) || ( mnCurEntry > mnCount ) )
     607             :     {
     608           0 :         throw SQLException();
     609             :     }
     610             : 
     611           0 :     return mxOriginal->rowInserted();
     612             : }
     613             : 
     614             : 
     615           0 : sal_Bool SAL_CALL SortedResultSet::rowDeleted()
     616             :     throw ( SQLException, RuntimeException, std::exception )
     617             : {
     618           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     619             : 
     620           0 :     if ( ( mnCurEntry <= 0 ) || ( mnCurEntry > mnCount ) )
     621             :     {
     622           0 :         throw SQLException();
     623             :     }
     624             : 
     625           0 :     return mxOriginal->rowDeleted();
     626             : }
     627             : 
     628             : 
     629           0 : Reference< XInterface > SAL_CALL SortedResultSet::getStatement()
     630             :     throw ( SQLException, RuntimeException, std::exception )
     631             : {
     632           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     633             : 
     634           0 :     if ( ( mnCurEntry <= 0 ) || ( mnCurEntry > mnCount ) )
     635             :     {
     636           0 :         throw SQLException();
     637             :     }
     638             : 
     639           0 :     return mxOriginal->getStatement();
     640             : }
     641             : 
     642             : 
     643             : // XRow methods.
     644             : 
     645             : 
     646           0 : sal_Bool SAL_CALL SortedResultSet::wasNull()
     647             :     throw( SQLException, RuntimeException, std::exception )
     648             : {
     649           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     650           0 :     return Reference< XRow >::query(mxOriginal)->wasNull();
     651             : }
     652             : 
     653             : 
     654         212 : OUString SAL_CALL SortedResultSet::getString( sal_Int32 columnIndex )
     655             :     throw( SQLException, RuntimeException, std::exception )
     656             : {
     657         212 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     658         212 :     return Reference< XRow >::query(mxOriginal)->getString( columnIndex );
     659             : }
     660             : 
     661             : 
     662           0 : sal_Bool SAL_CALL SortedResultSet::getBoolean( sal_Int32 columnIndex )
     663             :     throw( SQLException, RuntimeException, std::exception )
     664             : {
     665           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     666           0 :     return Reference< XRow >::query(mxOriginal)->getBoolean( columnIndex );
     667             : }
     668             : 
     669             : 
     670           0 : sal_Int8 SAL_CALL SortedResultSet::getByte( sal_Int32 columnIndex )
     671             :     throw( SQLException, RuntimeException, std::exception )
     672             : {
     673           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     674           0 :     return Reference< XRow >::query(mxOriginal)->getByte( columnIndex );
     675             : }
     676             : 
     677             : 
     678           0 : sal_Int16 SAL_CALL SortedResultSet::getShort( sal_Int32 columnIndex )
     679             :     throw( SQLException, RuntimeException, std::exception )
     680             : {
     681           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     682           0 :     return Reference< XRow >::query(mxOriginal)->getShort( columnIndex );
     683             : }
     684             : 
     685             : 
     686           0 : sal_Int32 SAL_CALL SortedResultSet::getInt( sal_Int32 columnIndex )
     687             :     throw( SQLException, RuntimeException, std::exception )
     688             : {
     689           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     690           0 :     return Reference< XRow >::query(mxOriginal)->getInt( columnIndex );
     691             : }
     692             : 
     693           0 : sal_Int64 SAL_CALL SortedResultSet::getLong( sal_Int32 columnIndex )
     694             :     throw( SQLException, RuntimeException, std::exception )
     695             : {
     696           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     697           0 :     return Reference< XRow >::query(mxOriginal)->getLong( columnIndex );
     698             : }
     699             : 
     700             : 
     701           0 : float SAL_CALL SortedResultSet::getFloat( sal_Int32 columnIndex )
     702             :     throw( SQLException, RuntimeException, std::exception )
     703             : {
     704           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     705           0 :     return Reference< XRow >::query(mxOriginal)->getFloat( columnIndex );
     706             : }
     707             : 
     708             : 
     709           0 : double SAL_CALL SortedResultSet::getDouble( sal_Int32 columnIndex )
     710             :     throw( SQLException, RuntimeException, std::exception )
     711             : {
     712           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     713           0 :     return Reference< XRow >::query(mxOriginal)->getDouble( columnIndex );
     714             : }
     715             : 
     716             : 
     717           0 : Sequence< sal_Int8 > SAL_CALL SortedResultSet::getBytes( sal_Int32 columnIndex )
     718             :     throw( SQLException, RuntimeException, std::exception )
     719             : {
     720           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     721           0 :     return Reference< XRow >::query(mxOriginal)->getBytes( columnIndex );
     722             : }
     723             : 
     724             : 
     725           0 : Date SAL_CALL SortedResultSet::getDate( sal_Int32 columnIndex )
     726             :     throw( SQLException, RuntimeException, std::exception )
     727             : {
     728           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     729           0 :     return Reference< XRow >::query(mxOriginal)->getDate( columnIndex );
     730             : }
     731             : 
     732             : 
     733           0 : Time SAL_CALL SortedResultSet::getTime( sal_Int32 columnIndex )
     734             :     throw( SQLException, RuntimeException, std::exception )
     735             : {
     736           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     737           0 :     return Reference< XRow >::query(mxOriginal)->getTime( columnIndex );
     738             : }
     739             : 
     740             : 
     741           0 : DateTime SAL_CALL SortedResultSet::getTimestamp( sal_Int32 columnIndex )
     742             :     throw( SQLException, RuntimeException, std::exception )
     743             : {
     744           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     745           0 :     return Reference< XRow >::query(mxOriginal)->getTimestamp( columnIndex );
     746             : }
     747             : 
     748             : 
     749             : Reference< XInputStream > SAL_CALL
     750           0 : SortedResultSet::getBinaryStream( sal_Int32 columnIndex )
     751             :     throw( SQLException, RuntimeException, std::exception )
     752             : {
     753           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     754           0 :     return Reference< XRow >::query(mxOriginal)->getBinaryStream( columnIndex );
     755             : }
     756             : 
     757             : 
     758             : Reference< XInputStream > SAL_CALL
     759           0 : SortedResultSet::getCharacterStream( sal_Int32 columnIndex )
     760             :     throw( SQLException, RuntimeException, std::exception )
     761             : {
     762           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     763           0 :     return Reference< XRow >::query(mxOriginal)->getCharacterStream( columnIndex );
     764             : }
     765             : 
     766             : 
     767           0 : Any SAL_CALL SortedResultSet::getObject( sal_Int32 columnIndex,
     768             :                        const Reference< XNameAccess >& typeMap )
     769             :     throw( SQLException, RuntimeException, std::exception )
     770             : {
     771           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     772           0 :     return Reference< XRow >::query(mxOriginal)->getObject( columnIndex,
     773           0 :                                                             typeMap);
     774             : }
     775             : 
     776             : 
     777           0 : Reference< XRef > SAL_CALL SortedResultSet::getRef( sal_Int32 columnIndex )
     778             :     throw( SQLException, RuntimeException, std::exception )
     779             : {
     780           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     781           0 :     return Reference< XRow >::query(mxOriginal)->getRef( columnIndex );
     782             : }
     783             : 
     784             : 
     785           0 : Reference< XBlob > SAL_CALL SortedResultSet::getBlob( sal_Int32 columnIndex )
     786             :     throw( SQLException, RuntimeException, std::exception )
     787             : {
     788           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     789           0 :     return Reference< XRow >::query(mxOriginal)->getBlob( columnIndex );
     790             : }
     791             : 
     792             : 
     793           0 : Reference< XClob > SAL_CALL SortedResultSet::getClob( sal_Int32 columnIndex )
     794             :     throw( SQLException, RuntimeException, std::exception )
     795             : {
     796           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     797           0 :     return Reference< XRow >::query(mxOriginal)->getClob( columnIndex );
     798             : }
     799             : 
     800             : 
     801           0 : Reference< XArray > SAL_CALL SortedResultSet::getArray( sal_Int32 columnIndex )
     802             :     throw( SQLException, RuntimeException, std::exception )
     803             : {
     804           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     805           0 :     return Reference< XRow >::query(mxOriginal)->getArray( columnIndex );
     806             : }
     807             : 
     808             : 
     809             : 
     810             : // XCloseable methods.
     811             : 
     812             : 
     813           0 : void SAL_CALL SortedResultSet::close()
     814             :     throw( SQLException, RuntimeException, std::exception )
     815             : {
     816           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     817           0 :     Reference< XCloseable >::query(mxOriginal)->close();
     818           0 : }
     819             : 
     820             : 
     821             : // XResultSetMetaDataSupplier methods.
     822             : 
     823             : 
     824           0 : Reference< XResultSetMetaData > SAL_CALL SortedResultSet::getMetaData()
     825             :     throw( SQLException, RuntimeException, std::exception )
     826             : {
     827           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     828           0 :     return Reference< XResultSetMetaDataSupplier >::query(mxOriginal)->getMetaData();
     829             : }
     830             : 
     831             : 
     832             : 
     833             : // XPropertySet methods.
     834             : 
     835             : 
     836             : Reference< XPropertySetInfo > SAL_CALL
     837           0 : SortedResultSet::getPropertySetInfo() throw( RuntimeException, std::exception )
     838             : {
     839           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     840             : 
     841           0 :     if ( !mpPropSetInfo )
     842             :     {
     843           0 :         mpPropSetInfo = new SRSPropertySetInfo();
     844           0 :         mpPropSetInfo->acquire();
     845             :     }
     846             : 
     847           0 :     return Reference< XPropertySetInfo >( mpPropSetInfo );
     848             : }
     849             : 
     850             : 
     851           0 : void SAL_CALL SortedResultSet::setPropertyValue(
     852             :                         const OUString& PropertyName,
     853             :                         const Any& )
     854             :     throw( UnknownPropertyException,
     855             :            PropertyVetoException,
     856             :            IllegalArgumentException,
     857             :            WrappedTargetException,
     858             :            RuntimeException, std::exception )
     859             : {
     860           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     861             : 
     862           0 :     if ( PropertyName == "RowCount" || PropertyName == "IsRowCountFinal" )
     863           0 :         throw IllegalArgumentException();
     864             :     else
     865           0 :         throw UnknownPropertyException();
     866             : }
     867             : 
     868             : 
     869           0 : Any SAL_CALL SortedResultSet::getPropertyValue( const OUString& PropertyName )
     870             :     throw( UnknownPropertyException,
     871             :            WrappedTargetException,
     872             :            RuntimeException, std::exception )
     873             : {
     874           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     875             : 
     876           0 :     Any aRet;
     877             : 
     878           0 :     if ( PropertyName == "RowCount" )
     879             :     {
     880           0 :         aRet <<= maS2O.Count();
     881             :     }
     882           0 :     else if ( PropertyName == "IsRowCountFinal" )
     883             :     {
     884           0 :         bool    bOrgFinal = false;
     885           0 :         Any         aOrgRet;
     886             : 
     887           0 :         aRet <<= false;
     888             : 
     889           0 :         aOrgRet = Reference< XPropertySet >::query(mxOriginal)->
     890           0 :                         getPropertyValue( PropertyName );
     891           0 :         aOrgRet >>= bOrgFinal;
     892             : 
     893           0 :         if ( bOrgFinal )
     894             :         {
     895           0 :             aOrgRet = Reference< XPropertySet >::query(mxOriginal)->
     896           0 :                 getPropertyValue("RowCount");
     897           0 :             sal_uInt32  nOrgCount = 0;
     898           0 :             aOrgRet >>= nOrgCount;
     899           0 :             if ( nOrgCount == maS2O.Count() )
     900           0 :                 aRet <<= true;
     901           0 :         }
     902             :     }
     903             :     else
     904           0 :         throw UnknownPropertyException();
     905             : 
     906           0 :     return aRet;
     907             : }
     908             : 
     909             : 
     910           0 : void SAL_CALL SortedResultSet::addPropertyChangeListener(
     911             :                         const OUString& PropertyName,
     912             :                         const Reference< XPropertyChangeListener >& Listener )
     913             :     throw( UnknownPropertyException,
     914             :            WrappedTargetException,
     915             :            RuntimeException, std::exception )
     916             : {
     917           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     918             : 
     919           0 :     if ( !mpPropChangeListeners )
     920             :         mpPropChangeListeners =
     921           0 :                     new PropertyChangeListeners_Impl();
     922             : 
     923           0 :     mpPropChangeListeners->addInterface( PropertyName, Listener );
     924           0 : }
     925             : 
     926             : 
     927           0 : void SAL_CALL SortedResultSet::removePropertyChangeListener(
     928             :                         const OUString& PropertyName,
     929             :                         const Reference< XPropertyChangeListener >& Listener )
     930             :     throw( UnknownPropertyException,
     931             :            WrappedTargetException,
     932             :            RuntimeException, std::exception )
     933             : {
     934           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     935             : 
     936           0 :     if ( mpPropChangeListeners )
     937           0 :         mpPropChangeListeners->removeInterface( PropertyName, Listener );
     938           0 : }
     939             : 
     940             : 
     941           0 : void SAL_CALL SortedResultSet::addVetoableChangeListener(
     942             :                         const OUString& PropertyName,
     943             :                         const Reference< XVetoableChangeListener >& Listener )
     944             :     throw( UnknownPropertyException,
     945             :            WrappedTargetException,
     946             :            RuntimeException, std::exception )
     947             : {
     948           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     949             : 
     950           0 :     if ( !mpVetoChangeListeners )
     951             :         mpVetoChangeListeners =
     952           0 :                     new PropertyChangeListeners_Impl();
     953             : 
     954           0 :     mpVetoChangeListeners->addInterface( PropertyName, Listener );
     955           0 : }
     956             : 
     957             : 
     958           0 : void SAL_CALL SortedResultSet::removeVetoableChangeListener(
     959             :                         const OUString& PropertyName,
     960             :                         const Reference< XVetoableChangeListener >& Listener )
     961             :     throw( UnknownPropertyException,
     962             :            WrappedTargetException,
     963             :            RuntimeException, std::exception )
     964             : {
     965           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
     966             : 
     967           0 :     if ( mpVetoChangeListeners )
     968           0 :         mpVetoChangeListeners->removeInterface( PropertyName, Listener );
     969           0 : }
     970             : 
     971             : 
     972             : // private methods
     973             : 
     974         255 : sal_IntPtr SortedResultSet::CompareImpl( Reference < XResultSet > xResultOne,
     975             :                                    Reference < XResultSet > xResultTwo,
     976             :                                    sal_IntPtr nIndexOne, sal_IntPtr nIndexTwo,
     977             :                                    SortInfo* pSortInfo )
     978             : 
     979             :     throw( SQLException, RuntimeException )
     980             : {
     981         255 :     Reference < XRow > xRowOne = Reference< XRow >::query( xResultOne );
     982         510 :     Reference < XRow > xRowTwo = Reference< XRow >::query( xResultTwo );
     983             : 
     984         255 :     sal_IntPtr nCompare = 0;
     985         255 :     sal_IntPtr nColumn = pSortInfo->mnColumn;
     986             : 
     987         255 :     switch ( pSortInfo->mnType )
     988             :     {
     989             :         case DataType::BIT :
     990             :         case DataType::TINYINT :
     991             :         case DataType::SMALLINT :
     992             :         case DataType::INTEGER :
     993             :             {
     994           0 :                 sal_Int32 aOne = 0;
     995           0 :                 sal_Int32 aTwo = 0;
     996             : 
     997           0 :                 if ( xResultOne->absolute( nIndexOne ) )
     998           0 :                     aOne = xRowOne->getInt( nColumn );
     999           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1000           0 :                     aTwo = xRowTwo->getInt( nColumn );
    1001             : 
    1002           0 :                 if ( aOne < aTwo )
    1003           0 :                     nCompare = -1;
    1004           0 :                 else if ( aOne == aTwo )
    1005           0 :                     nCompare = 0;
    1006             :                 else
    1007           0 :                     nCompare = 1;
    1008             : 
    1009           0 :                 break;
    1010             :             }
    1011             :         case DataType::BIGINT :
    1012             :             {
    1013           0 :                 sal_Int64 aOne = 0;
    1014           0 :                 sal_Int64 aTwo = 0;
    1015             : 
    1016           0 :                 if ( xResultOne->absolute( nIndexOne ) )
    1017           0 :                     aOne = xRowOne->getLong( nColumn );
    1018           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1019           0 :                     aTwo = xRowTwo->getLong( nColumn );
    1020             : 
    1021           0 :                 if ( aOne < aTwo )
    1022           0 :                     nCompare = -1;
    1023           0 :                 else if ( aOne == aTwo )
    1024           0 :                     nCompare = 0;
    1025             :                 else
    1026           0 :                     nCompare = 1;
    1027             : 
    1028           0 :                 break;
    1029             :             }
    1030             :         case DataType::CHAR :
    1031             :         case DataType::VARCHAR :
    1032             :         case DataType::LONGVARCHAR :
    1033             :             {
    1034         510 :                 OUString aOne, aTwo;
    1035             : 
    1036         255 :                 if ( xResultOne->absolute( nIndexOne ) )
    1037         255 :                     aOne = xRowOne->getString( nColumn );
    1038         255 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1039         255 :                     aTwo = xRowTwo->getString( nColumn );
    1040             : 
    1041         255 :                 if ( ! pSortInfo->mbCaseSensitive )
    1042             :                 {
    1043         255 :                     aOne = aOne.toAsciiLowerCase();
    1044         255 :                     aTwo = aTwo.toAsciiLowerCase();
    1045             :                 }
    1046             : 
    1047         255 :                 nCompare = aOne.compareTo( aTwo );
    1048         510 :                 break;
    1049             :             }
    1050             :         case DataType::DATE :
    1051             :             {
    1052           0 :                 Date aOne, aTwo;
    1053             :                 sal_Int32   nTmp;
    1054             : 
    1055           0 :                 if ( xResultOne->absolute( nIndexOne ) )
    1056           0 :                     aOne = xRowOne->getDate( nColumn );
    1057           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1058           0 :                     aTwo = xRowTwo->getDate( nColumn );
    1059             : 
    1060           0 :                 nTmp = (sal_Int32) aTwo.Year - (sal_Int32) aOne.Year;
    1061           0 :                 if ( !nTmp ) {
    1062           0 :                     nTmp = (sal_Int32) aTwo.Month - (sal_Int32) aOne.Month;
    1063           0 :                 if ( !nTmp )
    1064           0 :                     nTmp = (sal_Int32) aTwo.Day - (sal_Int32) aOne.Day;
    1065             :                 }
    1066             : 
    1067           0 :                 if ( nTmp < 0 )
    1068           0 :                     nCompare = -1;
    1069           0 :                 else if ( nTmp == 0 )
    1070           0 :                     nCompare = 0;
    1071             :                 else
    1072           0 :                     nCompare = 1;
    1073             : 
    1074           0 :                 break;
    1075             :             }
    1076             :         case DataType::TIME :
    1077             :             {
    1078           0 :                 Time aOne, aTwo;
    1079             :                 sal_Int32   nTmp;
    1080             : 
    1081           0 :                 if ( xResultOne->absolute( nIndexOne ) )
    1082           0 :                     aOne = xRowOne->getTime( nColumn );
    1083           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1084           0 :                     aTwo = xRowTwo->getTime( nColumn );
    1085             : 
    1086           0 :                 nTmp = (sal_Int32) aTwo.Hours - (sal_Int32) aOne.Hours;
    1087           0 :                 if ( !nTmp ) {
    1088           0 :                     nTmp = (sal_Int32) aTwo.Minutes - (sal_Int32) aOne.Minutes;
    1089           0 :                 if ( !nTmp ) {
    1090           0 :                     nTmp = (sal_Int32) aTwo.Seconds - (sal_Int32) aOne.Seconds;
    1091           0 :                 if ( !nTmp )
    1092             :                     nTmp = (sal_Int32) aTwo.NanoSeconds
    1093           0 :                                     - (sal_Int32) aOne.NanoSeconds;
    1094             :                 }}
    1095             : 
    1096           0 :                 if ( nTmp < 0 )
    1097           0 :                     nCompare = -1;
    1098           0 :                 else if ( nTmp == 0 )
    1099           0 :                     nCompare = 0;
    1100             :                 else
    1101           0 :                     nCompare = 1;
    1102             : 
    1103           0 :                 break;
    1104             :             }
    1105             :         case DataType::TIMESTAMP :
    1106             :             {
    1107           0 :                 DateTime aOne, aTwo;
    1108             :                 sal_Int32   nTmp;
    1109             : 
    1110           0 :                 if ( xResultOne->absolute( nIndexOne ) )
    1111           0 :                     aOne = xRowOne->getTimestamp( nColumn );
    1112           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1113           0 :                     aTwo = xRowTwo->getTimestamp( nColumn );
    1114             : 
    1115           0 :                 nTmp = (sal_Int32) aTwo.Year - (sal_Int32) aOne.Year;
    1116           0 :                 if ( !nTmp ) {
    1117           0 :                     nTmp = (sal_Int32) aTwo.Month - (sal_Int32) aOne.Month;
    1118           0 :                 if ( !nTmp ) {
    1119           0 :                     nTmp = (sal_Int32) aTwo.Day - (sal_Int32) aOne.Day;
    1120           0 :                 if ( !nTmp ) {
    1121           0 :                     nTmp = (sal_Int32) aTwo.Hours - (sal_Int32) aOne.Hours;
    1122           0 :                 if ( !nTmp ) {
    1123           0 :                     nTmp = (sal_Int32) aTwo.Minutes - (sal_Int32) aOne.Minutes;
    1124           0 :                 if ( !nTmp ) {
    1125           0 :                     nTmp = (sal_Int32) aTwo.Seconds - (sal_Int32) aOne.Seconds;
    1126           0 :                 if ( !nTmp )
    1127             :                     nTmp = (sal_Int32) aTwo.NanoSeconds
    1128           0 :                                     - (sal_Int32) aOne.NanoSeconds;
    1129             :                 }}}}}
    1130             : 
    1131           0 :                 if ( nTmp < 0 )
    1132           0 :                     nCompare = -1;
    1133           0 :                 else if ( nTmp == 0 )
    1134           0 :                     nCompare = 0;
    1135             :                 else
    1136           0 :                     nCompare = 1;
    1137             : 
    1138           0 :                 break;
    1139             :             }
    1140             :         case DataType::REAL :
    1141             :             {
    1142           0 :                 float aOne = 0;
    1143           0 :                 float aTwo = 0;
    1144             : 
    1145           0 :                 if ( xResultOne->absolute( nIndexOne ) )
    1146           0 :                     aOne = xRowOne->getFloat( nColumn );
    1147           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1148           0 :                     aTwo = xRowTwo->getFloat( nColumn );
    1149             : 
    1150           0 :                 if ( aOne < aTwo )
    1151           0 :                     nCompare = -1;
    1152           0 :                 else if ( aOne == aTwo )
    1153           0 :                     nCompare = 0;
    1154             :                 else
    1155           0 :                     nCompare = 1;
    1156             : 
    1157           0 :                 break;
    1158             :             }
    1159             :         case DataType::FLOAT :
    1160             :         case DataType::DOUBLE :
    1161             :             {
    1162           0 :                 double aOne = 0;
    1163           0 :                 double aTwo = 0;
    1164             : 
    1165           0 :                 if ( xResultOne->absolute( nIndexOne ) )
    1166           0 :                     aOne = xRowOne->getDouble( nColumn );
    1167           0 :                 if ( xResultTwo->absolute( nIndexTwo ) )
    1168           0 :                     aTwo = xRowTwo->getDouble( nColumn );
    1169             : 
    1170           0 :                 if ( aOne < aTwo )
    1171           0 :                     nCompare = -1;
    1172           0 :                 else if ( aOne == aTwo )
    1173           0 :                     nCompare = 0;
    1174             :                 else
    1175           0 :                     nCompare = 1;
    1176             : 
    1177           0 :                 break;
    1178             :             }
    1179             :         default:
    1180             :             {
    1181             :                 OSL_FAIL( "DataType not supported for compare!" );
    1182             :             }
    1183             :     }
    1184             : 
    1185         510 :     return nCompare;
    1186             : }
    1187             : 
    1188             : 
    1189         255 : sal_IntPtr SortedResultSet::CompareImpl( Reference < XResultSet > xResultOne,
    1190             :                                    Reference < XResultSet > xResultTwo,
    1191             :                                    sal_IntPtr nIndexOne, sal_IntPtr nIndexTwo )
    1192             :     throw( SQLException, RuntimeException )
    1193             : {
    1194         255 :     sal_IntPtr  nCompare = 0;
    1195         255 :     SortInfo*   pInfo = mpSortInfo;
    1196             : 
    1197         765 :     while ( !nCompare && pInfo )
    1198             :     {
    1199         255 :         if ( pInfo->mbUseOwnCompare )
    1200             :         {
    1201             :             nCompare = CompareImpl( xResultOne, xResultTwo,
    1202         255 :                                     nIndexOne, nIndexTwo, pInfo );
    1203             :         }
    1204             :         else
    1205             :         {
    1206           0 :             Any aOne, aTwo;
    1207             : 
    1208             :             Reference < XRow > xRowOne =
    1209           0 :                             Reference< XRow >::query( xResultOne );
    1210             :             Reference < XRow > xRowTwo =
    1211           0 :                             Reference< XRow >::query( xResultTwo );
    1212             : 
    1213           0 :             if ( xResultOne->absolute( nIndexOne ) )
    1214           0 :                 aOne = xRowOne->getObject( pInfo->mnColumn, NULL );
    1215           0 :             if ( xResultTwo->absolute( nIndexTwo ) )
    1216           0 :                 aTwo = xRowTwo->getObject( pInfo->mnColumn, NULL );
    1217             : 
    1218           0 :             nCompare = pInfo->mxCompareFunction->compare( aOne, aTwo );
    1219             :         }
    1220             : 
    1221         255 :         if ( ! pInfo->mbAscending )
    1222           0 :             nCompare = - nCompare;
    1223             : 
    1224         255 :         pInfo = pInfo->mpNext;
    1225             :     }
    1226             : 
    1227         255 :     return nCompare;
    1228             : }
    1229             : 
    1230             : 
    1231         255 : sal_IntPtr SortedResultSet::Compare( SortListData *pOne,
    1232             :                                SortListData *pTwo )
    1233             :     throw( SQLException, RuntimeException )
    1234             : {
    1235             :     sal_IntPtr nIndexOne;
    1236             :     sal_IntPtr nIndexTwo;
    1237             : 
    1238         255 :     Reference < XResultSet > xResultOne;
    1239         510 :     Reference < XResultSet > xResultTwo;
    1240             : 
    1241         255 :     if ( pOne->mbModified )
    1242             :     {
    1243           0 :         xResultOne = mxOther;
    1244           0 :         nIndexOne = pOne->mnOldPos;
    1245             :     }
    1246             :     else
    1247             :     {
    1248         255 :         xResultOne = mxOriginal;
    1249         255 :         nIndexOne = pOne->mnCurPos;
    1250             :     }
    1251             : 
    1252         255 :     if ( pTwo->mbModified )
    1253             :     {
    1254           0 :         xResultTwo = mxOther;
    1255           0 :         nIndexTwo = pTwo->mnOldPos;
    1256             :     }
    1257             :     else
    1258             :     {
    1259         255 :         xResultTwo = mxOriginal;
    1260         255 :         nIndexTwo = pTwo->mnCurPos;
    1261             :     }
    1262             : 
    1263             :     sal_IntPtr nCompare;
    1264             :     nCompare = CompareImpl( xResultOne, xResultTwo,
    1265         255 :                             nIndexOne, nIndexTwo );
    1266         510 :     return nCompare;
    1267             : }
    1268             : 
    1269             : 
    1270         212 : sal_IntPtr SortedResultSet::FindPos( SortListData *pEntry,
    1271             :                                sal_IntPtr _nStart, sal_IntPtr _nEnd )
    1272             :     throw( SQLException, RuntimeException )
    1273             : {
    1274         212 :     if ( _nStart > _nEnd )
    1275          70 :         return _nStart + 1;
    1276             : 
    1277         142 :     sal_IntPtr nStart = _nStart;
    1278         142 :     sal_IntPtr nEnd   = _nEnd;
    1279         142 :     sal_IntPtr nMid = 0, nCompare = 0;
    1280             : 
    1281             : 
    1282         539 :     while ( nStart <= nEnd )
    1283             :     {
    1284         255 :         nMid = ( nEnd - nStart ) / 2 + nStart;
    1285         255 :         SortListData *pMid = maS2O.GetData( nMid );
    1286         255 :         nCompare = Compare( pEntry, pMid );
    1287             : 
    1288         255 :         if ( !nCompare )
    1289           0 :             nCompare = (pEntry != pMid) ? ((pEntry < pMid) ? -1 : 1) : 0;
    1290             : 
    1291         255 :         if ( nCompare < 0 ) // pEntry < pMid
    1292         125 :             nEnd = nMid - 1;
    1293             :         else
    1294         130 :             nStart = nMid + 1;
    1295             :     }
    1296             : 
    1297         142 :     if ( nCompare < 0 )     // pEntry < pMid
    1298          58 :         return nMid;
    1299             :     else
    1300          84 :         return nMid+1;
    1301             : }
    1302             : 
    1303             : 
    1304           0 : void SortedResultSet::PropertyChanged( const PropertyChangeEvent& rEvt )
    1305             : {
    1306           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
    1307             : 
    1308           0 :     if ( !mpPropChangeListeners )
    1309           0 :         return;
    1310             : 
    1311             :     // Notify listeners interested especially in the changed property.
    1312             :     OInterfaceContainerHelper* pPropsContainer =
    1313           0 :             mpPropChangeListeners->getContainer( rEvt.PropertyName );
    1314           0 :     if ( pPropsContainer )
    1315             :     {
    1316           0 :         OInterfaceIteratorHelper aIter( *pPropsContainer );
    1317           0 :         while ( aIter.hasMoreElements() )
    1318             :         {
    1319             :             Reference< XPropertyChangeListener > xListener(
    1320           0 :                                                     aIter.next(), UNO_QUERY );
    1321           0 :             if ( xListener.is() )
    1322           0 :                 xListener->propertyChange( rEvt );
    1323           0 :         }
    1324             :     }
    1325             : 
    1326             :     // Notify listeners interested in all properties.
    1327           0 :     pPropsContainer = mpPropChangeListeners->getContainer( OUString() );
    1328           0 :     if ( pPropsContainer )
    1329             :     {
    1330           0 :         OInterfaceIteratorHelper aIter( *pPropsContainer );
    1331           0 :         while ( aIter.hasMoreElements() )
    1332             :         {
    1333             :             Reference< XPropertyChangeListener > xListener(
    1334           0 :                                                     aIter.next(), UNO_QUERY );
    1335           0 :             if ( xListener.is() )
    1336           0 :                 xListener->propertyChange( rEvt );
    1337           0 :         }
    1338           0 :     }
    1339             : }
    1340             : 
    1341             : 
    1342             : 
    1343             : 
    1344             : // public methods
    1345             : 
    1346             : 
    1347           0 : void SortedResultSet::CopyData( SortedResultSet *pSource )
    1348             : {
    1349           0 :     const SortedEntryList& rSrcS2O = pSource->GetS2OList();
    1350           0 :     const SimpleList&      rSrcO2S = pSource->GetO2SList();
    1351             : 
    1352             :     sal_IntPtr i, nCount;
    1353             : 
    1354           0 :     maS2O.Clear();
    1355           0 :     maO2S.Clear();
    1356           0 :     maModList.Clear();
    1357             : 
    1358           0 :     maS2O.Insert( NULL, 0 );
    1359           0 :     maO2S.Insert( 0, (sal_uInt32) 0 );  // value, pos
    1360             : 
    1361           0 :     nCount = rSrcS2O.Count();
    1362             : 
    1363           0 :     for ( i=1; i<nCount; i++ )
    1364             :     {
    1365           0 :         maS2O.Insert( new SortListData( rSrcS2O[ i ] ), i );
    1366           0 :         maO2S.Insert( rSrcO2S.GetObject( i ), (sal_uInt32) i );
    1367             :     }
    1368             : 
    1369           0 :     mnLastSort = maS2O.Count();
    1370           0 :     mxOther = pSource->GetResultSet();
    1371             : 
    1372           0 :     if ( !mpSortInfo )
    1373             :     {
    1374           0 :         mpSortInfo = pSource->GetSortInfo();
    1375           0 :         mbIsCopy = true;
    1376             :     }
    1377           0 : }
    1378             : 
    1379             : 
    1380          70 : void SortedResultSet::Initialize(
    1381             :                 const Sequence < NumberedSortingInfo > &xSortInfo,
    1382             :                 const Reference< XAnyCompareFactory > &xCompFactory )
    1383             : {
    1384          70 :     BuildSortInfo( mxOriginal, xSortInfo, xCompFactory );
    1385             :     // Insert dummy at pos 0
    1386          70 :     SortListData *pData = new SortListData( 0 );
    1387          70 :     maS2O.Insert( pData, 0 );
    1388             : 
    1389          70 :     sal_IntPtr nIndex = 1;
    1390             : 
    1391             :     // now fetch all the elements from the original result set,
    1392             :     // get there new position in the sorted result set and insert
    1393             :     // an entry in the sorted to original mapping list
    1394             :     try {
    1395         352 :         while ( mxOriginal->absolute( nIndex ) )
    1396             :         {
    1397         212 :             pData       = new SortListData( nIndex );
    1398         212 :             sal_IntPtr nPos   = FindPos( pData, 1, nIndex-1 );
    1399             : 
    1400         212 :             maS2O.Insert( pData, nPos );
    1401             : 
    1402         212 :             nIndex++;
    1403             :         }
    1404             :     }
    1405           0 :     catch (const SQLException&)
    1406             :     {
    1407             :         OSL_FAIL( "SortedResultSet::Initialize() : Got unexpected SQLException" );
    1408             :     }
    1409             : 
    1410             :     // when we have fetched all the elements, we can create the
    1411             :     // original to sorted mapping list from the s2o list
    1412          70 :     maO2S.Clear();
    1413          70 :     maO2S.Insert( NULL, (sal_uInt32) 0 );
    1414             : 
    1415             :     // insert some dummy entries first and replace then
    1416             :     // the entries with the right ones
    1417             :     size_t i;
    1418             : 
    1419         282 :     for ( i=1; i<maS2O.Count(); i++ )
    1420         212 :         maO2S.Insert( nullptr, i );   // Insert( data, pos )
    1421         282 :     for ( i=1; i<maS2O.Count(); i++ )
    1422         212 :         maO2S.Replace( reinterpret_cast<void*>(i), maS2O[ i ] ); // Insert( data, pos )
    1423             : 
    1424          70 :     mnCount = maS2O.Count() - 1;
    1425          70 : }
    1426             : 
    1427             : 
    1428           0 : void SortedResultSet::CheckProperties( sal_IntPtr nOldCount, bool bWasFinal )
    1429             : {
    1430           0 :     osl::Guard< osl::Mutex > aGuard( maMutex );
    1431             : 
    1432           0 :     if ( !mpPropChangeListeners )
    1433           0 :         return;
    1434             : 
    1435             :     try {
    1436             :         // check for propertyChangeEvents
    1437           0 :         if ( nOldCount != GetCount() )
    1438             :         {
    1439           0 :             bool bIsFinal = false;
    1440           0 :             PropertyChangeEvent aEvt;
    1441             : 
    1442           0 :             aEvt.PropertyName = "RowCount";
    1443           0 :             aEvt.Further = sal_False;
    1444           0 :             aEvt.PropertyHandle = -1;
    1445           0 :             aEvt.OldValue <<= nOldCount;
    1446           0 :             aEvt.NewValue <<= GetCount();
    1447             : 
    1448           0 :             PropertyChanged( aEvt );
    1449             : 
    1450           0 :             OUString aName = "IsRowCountFinal";
    1451           0 :             Any aRet = getPropertyValue( aName );
    1452           0 :             if ( (aRet >>= bIsFinal) && bIsFinal != bWasFinal )
    1453             :             {
    1454           0 :                 aEvt.PropertyName = aName;
    1455           0 :                 aEvt.Further = sal_False;
    1456           0 :                 aEvt.PropertyHandle = -1;
    1457           0 :                 aEvt.OldValue <<= bWasFinal;
    1458           0 :                 aEvt.NewValue <<= bIsFinal;
    1459           0 :                 PropertyChanged( aEvt );
    1460           0 :             }
    1461             :         }
    1462             :     }
    1463           0 :     catch (const UnknownPropertyException&) {}
    1464           0 :     catch (const WrappedTargetException&) {}
    1465             : }
    1466             : 
    1467             : 
    1468           0 : void SortedResultSet::InsertNew( sal_IntPtr nPos, sal_IntPtr nCount )
    1469             : {
    1470             :     // for all entries in the msS20-list, which are >= nPos, increase by nCount
    1471             :     SortListData    *pData;
    1472             :     sal_IntPtr      i, nEnd;
    1473             : 
    1474           0 :     nEnd = maS2O.Count();
    1475           0 :     for ( i=1; i<=nEnd; i++ )
    1476             :     {
    1477           0 :         pData = maS2O.GetData( i );
    1478           0 :         if ( pData->mnCurPos >= nPos )
    1479             :         {
    1480           0 :             pData->mnCurPos += nCount;
    1481             :         }
    1482             :     }
    1483             : 
    1484             :     // and append the new entries at the end of the maS20-list or insert at the
    1485             :     // position nPos in the maS2O-list
    1486           0 :     for ( i=0; i<nCount; i++ )
    1487             :     {
    1488           0 :         nEnd += 1;
    1489           0 :         pData = new SortListData( nEnd );
    1490             : 
    1491           0 :         maS2O.Insert( pData, nEnd );    // Insert( Value, Position )
    1492           0 :         maO2S.Insert( reinterpret_cast<void*>(nEnd), (sal_uInt32)(nPos+i) );  // Insert( Value, Position )
    1493             :     }
    1494             : 
    1495           0 :     mnCount += nCount;
    1496           0 : }
    1497             : 
    1498             : 
    1499           0 : void SortedResultSet::Remove( sal_IntPtr nPos, sal_IntPtr nCount, EventList *pEvents )
    1500             : {
    1501             :     sal_uInt32  i, j;
    1502             :     sal_IntPtr        nOldLastSort;
    1503             : 
    1504             :     // correct mnLastSort first
    1505           0 :     nOldLastSort = mnLastSort;
    1506           0 :     if ( nPos <= mnLastSort )
    1507             :     {
    1508           0 :         if ( nPos + nCount - 1 <= mnLastSort )
    1509           0 :             mnLastSort -= nCount;
    1510             :         else
    1511           0 :             mnLastSort = nPos - 1;
    1512             :     }
    1513             : 
    1514             :     // remove the entries from the lists and correct the positions
    1515             :     // in the original2sorted list
    1516           0 :     for ( i=0; i < (sal_uInt32) nCount; i++ )
    1517             :     {
    1518           0 :         sal_IntPtr nSortPos = reinterpret_cast<sal_IntPtr>( maO2S.GetObject( nPos ) );
    1519           0 :         maO2S.Remove( (sal_uInt32) nPos );
    1520             : 
    1521           0 :         for ( j=1; j<=maO2S.Count(); j++ )
    1522             :         {
    1523           0 :             sal_IntPtr nVal = reinterpret_cast<sal_IntPtr>( maO2S.GetObject( j ) );
    1524           0 :             if ( nVal > nSortPos )
    1525             :             {
    1526           0 :                 --nVal;
    1527           0 :                 maO2S.Replace( reinterpret_cast<void*>(nVal), j );
    1528             :             }
    1529             :         }
    1530             : 
    1531           0 :         SortListData *pData = maS2O.Remove( nSortPos );
    1532           0 :         if ( pData->mbModified )
    1533           0 :             maModList.Remove( static_cast<void*>(pData) );
    1534           0 :         delete pData;
    1535             : 
    1536             :         // generate remove Event, but not for new entries
    1537           0 :         if ( nSortPos <= nOldLastSort )
    1538           0 :             pEvents->AddEvent( ListActionType::REMOVED, nSortPos, 1 );
    1539             :     }
    1540             : 
    1541             :     // correct the positions in the sorted list
    1542           0 :     for ( i=1; i<= maS2O.Count(); i++ )
    1543             :     {
    1544           0 :         SortListData *pData = maS2O.GetData( i );
    1545           0 :         if ( pData->mnCurPos > nPos )
    1546           0 :             pData->mnCurPos -= nCount;
    1547             :     }
    1548             : 
    1549           0 :     mnCount -= nCount;
    1550           0 : }
    1551             : 
    1552             : 
    1553           0 : void SortedResultSet::Move( sal_IntPtr nPos, sal_IntPtr nCount, sal_IntPtr nOffset )
    1554             : {
    1555           0 :     if ( !nOffset )
    1556           0 :         return;
    1557             : 
    1558             :     sal_IntPtr i, nSortPos, nTo;
    1559             :     SortListData *pData;
    1560             : 
    1561           0 :     for ( i=0; i<nCount; i++ )
    1562             :     {
    1563           0 :         nSortPos = reinterpret_cast<sal_IntPtr>(maO2S.GetObject( nPos+i ));
    1564           0 :         pData = maS2O.GetData( nSortPos );
    1565           0 :         pData->mnCurPos += nOffset;
    1566             :     }
    1567             : 
    1568           0 :     if ( nOffset < 0 )
    1569             :     {
    1570           0 :         for ( i=nPos+nOffset; i<nPos; i++ )
    1571             :         {
    1572           0 :             nSortPos = reinterpret_cast<sal_IntPtr>(maO2S.GetObject( i ));
    1573           0 :             pData = maS2O.GetData( nSortPos );
    1574           0 :             pData->mnCurPos += nCount;
    1575             :         }
    1576             :     }
    1577             :     else
    1578             :     {
    1579           0 :         sal_IntPtr nStart = nPos + nCount;
    1580           0 :         sal_IntPtr nEnd = nStart + nOffset;
    1581           0 :         for ( i=nStart; i<nEnd; i++ )
    1582             :         {
    1583           0 :             nSortPos = reinterpret_cast<sal_IntPtr>(maO2S.GetObject( i ));
    1584           0 :             pData = maS2O.GetData( nSortPos );
    1585           0 :             pData->mnCurPos -= nCount;
    1586             :         }
    1587             :     }
    1588             : 
    1589             :     // remember the to be moved entries
    1590           0 :     boost::scoped_array<sal_IntPtr> pTmpArr(new sal_IntPtr[ nCount ]);
    1591           0 :     for ( i=0; i<nCount; i++ )
    1592           0 :         pTmpArr[i] = reinterpret_cast<sal_IntPtr>(maO2S.GetObject( (sal_uInt32)( nPos+i ) ));
    1593             : 
    1594             :     // now move the entries, which are in the way
    1595           0 :     if ( nOffset < 0 )
    1596             :     {
    1597             :         // be carefully here, because nOffset is negative here, so an
    1598             :         // addition is a subtraction
    1599           0 :         sal_IntPtr nFrom = nPos - 1;
    1600           0 :         nTo = nPos + nCount - 1;
    1601             : 
    1602             :         // same for i here
    1603           0 :         for ( i=0; i>nOffset; i-- )
    1604             :         {
    1605           0 :             sal_IntPtr nVal = reinterpret_cast<sal_IntPtr>( maO2S.GetObject( (sal_uInt32)( nFrom+i ) ) );
    1606           0 :             maO2S.Replace( reinterpret_cast<void*>(nVal), (sal_uInt32)( nTo+i ) );
    1607             :         }
    1608             : 
    1609             :     }
    1610             :     else
    1611             :     {
    1612           0 :         sal_IntPtr nStart = nPos + nCount;
    1613           0 :         for ( i=0; i<nOffset; i++ )
    1614             :         {
    1615           0 :             sal_IntPtr nVal = reinterpret_cast<sal_IntPtr>( maO2S.GetObject( (sal_uInt32)( nStart+i ) ) );
    1616           0 :             maO2S.Replace( reinterpret_cast<void*>(nVal), (sal_uInt32)( nPos+i ) );
    1617             :         }
    1618             :     }
    1619             : 
    1620             :     // finally put the remembered entries at there new location
    1621           0 :     nTo = nPos + nOffset;
    1622           0 :     for ( i=0; i<nCount; i++ )
    1623             :     {
    1624           0 :         maO2S.Replace( reinterpret_cast<void*>(pTmpArr[ i ]), (sal_uInt32)( nTo+i ) );
    1625           0 :     }
    1626             : }
    1627             : 
    1628             : 
    1629          70 : void SortedResultSet::BuildSortInfo(
    1630             :                 Reference< XResultSet > aResult,
    1631             :                 const Sequence < NumberedSortingInfo > &xSortInfo,
    1632             :                 const Reference< XAnyCompareFactory > &xCompFactory )
    1633             : {
    1634          70 :     Reference < XResultSetMetaDataSupplier > xMeta ( aResult, UNO_QUERY );
    1635             : 
    1636          70 :     if ( ! xMeta.is() )
    1637             :     {
    1638             :         OSL_FAIL( "No MetaData, No Sorting!" );
    1639          70 :         return;
    1640             :     }
    1641             : 
    1642         140 :     Reference < XResultSetMetaData > xData = xMeta->getMetaData();
    1643          70 :     const NumberedSortingInfo *pSortInfo = xSortInfo.getConstArray();
    1644             : 
    1645             :     sal_Int32   nColumn;
    1646         140 :     OUString    aPropName;
    1647             :     SortInfo    *pInfo;
    1648             : 
    1649         210 :     for ( sal_IntPtr i=xSortInfo.getLength(); i > 0; )
    1650             :     {
    1651          70 :         --i;
    1652          70 :         nColumn = pSortInfo[ i ].ColumnIndex;
    1653          70 :         aPropName = xData->getColumnName( nColumn );
    1654          70 :         pInfo = new SortInfo;
    1655             : 
    1656          70 :         if ( xCompFactory.is() )
    1657           0 :             pInfo->mxCompareFunction = xCompFactory->createAnyCompareByName(
    1658           0 :                                             aPropName );
    1659             : 
    1660          70 :         if ( pInfo->mxCompareFunction.is() )
    1661             :         {
    1662           0 :             pInfo->mbUseOwnCompare = false;
    1663           0 :             pInfo->mnType = 0;
    1664             :         }
    1665             :         else
    1666             :         {
    1667          70 :             pInfo->mbUseOwnCompare = true;
    1668          70 :             pInfo->mnType = xData->getColumnType( nColumn );
    1669             :         }
    1670             : 
    1671          70 :         pInfo->mnColumn = nColumn;
    1672          70 :         pInfo->mbAscending = pSortInfo[ i ].Ascending;
    1673          70 :         pInfo->mbCaseSensitive = xData->isCaseSensitive( nColumn );
    1674          70 :         pInfo->mpNext = mpSortInfo;
    1675          70 :         mpSortInfo = pInfo;
    1676          70 :     }
    1677             : }
    1678             : 
    1679             : 
    1680           0 : void SortedResultSet::SetChanged( sal_IntPtr nPos, sal_IntPtr nCount )
    1681             : {
    1682           0 :     for ( sal_IntPtr i=0; i<nCount; i++ )
    1683             :     {
    1684           0 :         sal_IntPtr nSortPos = reinterpret_cast<sal_IntPtr>(maO2S.GetObject( nPos ));
    1685           0 :         if ( nSortPos < mnLastSort )
    1686             :         {
    1687           0 :             SortListData *pData = maS2O.GetData( nSortPos );
    1688           0 :             if ( ! pData->mbModified )
    1689             :             {
    1690           0 :                 pData->mbModified = true;
    1691           0 :                 maModList.Append( pData );
    1692             :             }
    1693             :         }
    1694           0 :         nPos += 1;
    1695             :     }
    1696           0 : }
    1697             : 
    1698             : 
    1699           0 : void SortedResultSet::ResortModified( EventList* pList )
    1700             : {
    1701             :     sal_uInt32 i, j;
    1702             :     sal_IntPtr nCompare, nCurPos, nNewPos;
    1703             :     sal_IntPtr nStart, nEnd, nOffset, nVal;
    1704             :     SortListData *pData;
    1705             :     ListAction *pAction;
    1706             : 
    1707             :     try {
    1708           0 :         for ( i=0; i<maModList.Count(); i++ )
    1709             :         {
    1710           0 :             pData = static_cast<SortListData*>(maModList.GetObject( i ));
    1711             :             nCompare = CompareImpl( mxOther, mxOriginal,
    1712           0 :                                     pData->mnOldPos, pData->mnCurPos );
    1713           0 :             pData->mbModified = false;
    1714           0 :             if ( nCompare != 0 )
    1715             :             {
    1716           0 :                 nCurPos = reinterpret_cast<sal_IntPtr>( maO2S.GetObject( (sal_uInt32) pData->mnCurPos ) );
    1717           0 :                 if ( nCompare < 0 )
    1718             :                 {
    1719           0 :                     nNewPos = FindPos( pData, 1, nCurPos-1 );
    1720           0 :                     nStart = nNewPos;
    1721           0 :                     nEnd = nCurPos;
    1722           0 :                     nOffset = 1;
    1723             :                 }
    1724             :                 else
    1725             :                 {
    1726           0 :                     nNewPos = FindPos( pData, nCurPos+1, mnLastSort );
    1727           0 :                     nStart = nCurPos;
    1728           0 :                     nEnd = mnLastSort;
    1729           0 :                     nOffset = -1;
    1730             :                 }
    1731             : 
    1732           0 :                 if ( nNewPos != nCurPos )
    1733             :                 {
    1734             :                     // correct the lists!
    1735           0 :                     maS2O.Remove( (sal_uInt32) nCurPos );
    1736           0 :                     maS2O.Insert( pData, nNewPos );
    1737           0 :                         for ( j=1; j<maO2S.Count(); j++ )
    1738             :                     {
    1739           0 :                         nVal = reinterpret_cast<sal_IntPtr>( maO2S.GetObject( (sal_uInt32)j ) );
    1740           0 :                         if ( ( nStart <= nVal ) && ( nVal <= nEnd ) )
    1741             :                         {
    1742           0 :                             nVal += nOffset;
    1743           0 :                             maO2S.Replace( reinterpret_cast<void*>(nVal), (sal_uInt32)j );
    1744             :                         }
    1745             :                     }
    1746             : 
    1747           0 :                     maO2S.Replace( reinterpret_cast<void*>(nNewPos), (sal_uInt32) pData->mnCurPos );
    1748             : 
    1749           0 :                     pAction = new ListAction;
    1750           0 :                     pAction->Position = nCurPos;
    1751           0 :                     pAction->Count = 1;
    1752           0 :                     pAction->ListActionType = ListActionType::MOVED;
    1753           0 :                     pAction->ActionInfo <<= nNewPos-nCurPos;
    1754           0 :                     pList->Insert( pAction );
    1755             :                 }
    1756             :                 pList->AddEvent( ListActionType::PROPERTIES_CHANGED,
    1757           0 :                                  nNewPos, 1 );
    1758             :             }
    1759             :         }
    1760             :     }
    1761           0 :     catch (const SQLException&)
    1762             :     {
    1763             :         OSL_FAIL( "SortedResultSet::ResortModified() : Got unexpected SQLException" );
    1764             :     }
    1765             : 
    1766           0 :     maModList.Clear();
    1767           0 : }
    1768             : 
    1769             : 
    1770           0 : void SortedResultSet::ResortNew( EventList* pList )
    1771             : {
    1772             :     sal_IntPtr            i, j, nNewPos, nVal;
    1773             : 
    1774             :     try {
    1775           0 :         for ( i = mnLastSort; i<(sal_IntPtr)maS2O.Count(); i++ )
    1776             :         {
    1777           0 :             SortListData *pData = static_cast<SortListData*>(maModList.GetObject( i ));
    1778           0 :             nNewPos = FindPos( pData, 1, mnLastSort );
    1779           0 :             if ( nNewPos != i )
    1780             :             {
    1781           0 :                 maS2O.Remove( (sal_uInt32) i );
    1782           0 :                 maS2O.Insert( pData, nNewPos );
    1783             :                 // maO2S liste korigieren
    1784           0 :                 for ( j=1; j<(sal_IntPtr)maO2S.Count(); j++ )
    1785             :                 {
    1786           0 :                     nVal = reinterpret_cast<sal_IntPtr>(maO2S.GetObject( (sal_uInt32)j ));
    1787           0 :                     if ( nVal >= nNewPos )
    1788           0 :                         maO2S.Replace( reinterpret_cast<void*>(nVal+1), (sal_uInt32)( j ) );
    1789             :                 }
    1790           0 :                 maO2S.Replace( reinterpret_cast<void*>(nNewPos), (sal_uInt32) pData->mnCurPos );
    1791             :             }
    1792           0 :             mnLastSort++;
    1793           0 :             pList->AddEvent( ListActionType::INSERTED, nNewPos, 1 );
    1794             :         }
    1795             :     }
    1796           0 :     catch (const SQLException&)
    1797             :     {
    1798             :         OSL_FAIL( "SortedResultSet::ResortNew() : Got unexpected SQLException" );
    1799             :     }
    1800           0 : }
    1801             : 
    1802             : 
    1803             : 
    1804             : // SortListData
    1805             : 
    1806             : 
    1807         282 : SortListData::SortListData( sal_IntPtr nPos, bool bModified )
    1808             : {
    1809         282 :     mbModified = bModified;
    1810         282 :     mnCurPos = nPos;
    1811         282 :     mnOldPos = nPos;
    1812         282 : };
    1813             : 
    1814             : 
    1815             : 
    1816          70 : void SortedEntryList::Clear()
    1817             : {
    1818         704 :     for ( std::deque< ListAction* >::size_type i = 0;
    1819         352 :           i < maData.size(); ++i )
    1820             :     {
    1821         282 :         delete maData[i];
    1822             :     }
    1823             : 
    1824          70 :     maData.clear();
    1825          70 : }
    1826             : 
    1827             : 
    1828         282 : void SortedEntryList::Insert( SortListData *pEntry, sal_IntPtr nPos )
    1829             : {
    1830         282 :     if ( nPos < (sal_IntPtr) maData.size() )
    1831          61 :         maData.insert( maData.begin() + nPos, pEntry );
    1832             :     else
    1833         221 :         maData.push_back( pEntry );
    1834         282 : }
    1835             : 
    1836             : 
    1837           0 : SortListData* SortedEntryList::Remove( sal_IntPtr nPos )
    1838             : {
    1839             :     SortListData *pData;
    1840             : 
    1841           0 :     if ( nPos < (sal_IntPtr) maData.size() )
    1842             :     {
    1843           0 :         pData = maData[ nPos ];
    1844           0 :         maData.erase( maData.begin() + nPos );
    1845             :     }
    1846             :     else
    1847           0 :         pData = NULL;
    1848             : 
    1849           0 :     return pData;
    1850             : }
    1851             : 
    1852             : 
    1853         255 : SortListData* SortedEntryList::GetData( sal_IntPtr nPos )
    1854             : {
    1855             :     SortListData *pData;
    1856             : 
    1857         255 :     if ( nPos < (sal_IntPtr) maData.size() )
    1858         255 :         pData = maData[ nPos ];
    1859             :     else
    1860           0 :         pData = NULL;
    1861             : 
    1862         255 :     return pData;
    1863             : }
    1864             : 
    1865             : 
    1866         424 : sal_IntPtr SortedEntryList::operator [] ( sal_IntPtr nPos ) const
    1867             : {
    1868             :     SortListData *pData;
    1869             : 
    1870         424 :     if ( nPos < (sal_IntPtr) maData.size() )
    1871         424 :         pData = maData[ nPos ];
    1872             :     else
    1873           0 :         pData = NULL;
    1874             : 
    1875         424 :     if ( pData )
    1876         424 :         if ( ! pData->mbModified )
    1877         424 :             return pData->mnCurPos;
    1878             :         else
    1879             :         {
    1880             :             OSL_FAIL( "SortedEntryList: Can't get value for modified entry!");
    1881           0 :             return 0;
    1882             :         }
    1883             :     else
    1884             :     {
    1885             :         OSL_FAIL( "SortedEntryList: invalid pos!");
    1886           0 :         return 0;
    1887             :     }
    1888             : }
    1889             : 
    1890             : 
    1891             : 
    1892             : 
    1893           0 : void SimpleList::Remove( sal_uInt32 nPos )
    1894             : {
    1895           0 :     if ( nPos < (sal_uInt32) maData.size() )
    1896             :     {
    1897           0 :         maData.erase( maData.begin() + nPos );
    1898             :     }
    1899           0 : }
    1900             : 
    1901             : 
    1902           0 : void SimpleList::Remove( void* pData )
    1903             : {
    1904           0 :     bool    bFound = false;
    1905             :     sal_uInt32  i;
    1906             : 
    1907           0 :     for ( i = 0; i < (sal_uInt32) maData.size(); i++ )
    1908             :     {
    1909           0 :         if ( maData[ i ] == pData )
    1910             :         {
    1911           0 :             bFound = true;
    1912           0 :             break;
    1913             :         }
    1914             :     }
    1915             : 
    1916           0 :     if ( bFound )
    1917           0 :         maData.erase( maData.begin() + i );
    1918           0 : }
    1919             : 
    1920             : 
    1921         282 : void SimpleList::Insert( void* pData, sal_uInt32 nPos )
    1922             : {
    1923         282 :     if ( nPos < (sal_uInt32) maData.size() )
    1924           0 :         maData.insert( maData.begin() + nPos, pData );
    1925             :     else
    1926         282 :         maData.push_back( pData );
    1927         282 : }
    1928             : 
    1929             : 
    1930           0 : void* SimpleList::GetObject( sal_uInt32 nPos ) const
    1931             : {
    1932           0 :     if ( nPos < (sal_uInt32) maData.size() )
    1933           0 :         return maData[ nPos ];
    1934             :     else
    1935           0 :         return NULL;
    1936             : }
    1937             : 
    1938             : 
    1939         212 : void SimpleList::Replace( void* pData, sal_uInt32 nPos )
    1940             : {
    1941         212 :     if ( nPos < (sal_uInt32) maData.size() )
    1942         212 :         maData[ nPos ] = pData;
    1943         212 : }
    1944             : 
    1945             : 
    1946             : 
    1947             : // class SRSPropertySetInfo.
    1948             : 
    1949             : 
    1950             : 
    1951           0 : SRSPropertySetInfo::SRSPropertySetInfo()
    1952             : {
    1953           0 :     maProps[0].Name = "RowCount";
    1954           0 :     maProps[0].Handle = -1;
    1955           0 :     maProps[0].Type = cppu::UnoType<OUString>::get();
    1956           0 :     maProps[0].Attributes = -1;
    1957             : 
    1958           0 :     maProps[1].Name = "IsRowCountFinal";
    1959           0 :     maProps[1].Handle = -1;
    1960           0 :     maProps[1].Type = cppu::UnoType<bool>::get();
    1961           0 :     maProps[1].Attributes = -1;
    1962           0 : }
    1963             : 
    1964             : 
    1965           0 : SRSPropertySetInfo::~SRSPropertySetInfo()
    1966           0 : {}
    1967             : 
    1968             : // XPropertySetInfo methods.
    1969             : 
    1970             : Sequence< Property > SAL_CALL
    1971           0 : SRSPropertySetInfo::getProperties() throw( RuntimeException, std::exception )
    1972             : {
    1973           0 :     return Sequence < Property > ( maProps, 2 );
    1974             : }
    1975             : 
    1976             : 
    1977             : Property SAL_CALL
    1978           0 : SRSPropertySetInfo::getPropertyByName( const OUString& Name )
    1979             :     throw( UnknownPropertyException, RuntimeException, std::exception )
    1980             : {
    1981           0 :     if ( Name == "RowCount" )
    1982           0 :         return maProps[0];
    1983           0 :     else if ( Name == "IsRowCountFinal" )
    1984           0 :         return maProps[1];
    1985             :     else
    1986           0 :         throw UnknownPropertyException();
    1987             : }
    1988             : 
    1989             : 
    1990             : sal_Bool SAL_CALL
    1991           0 : SRSPropertySetInfo::hasPropertyByName( const OUString& Name )
    1992             :     throw( RuntimeException, std::exception )
    1993             : {
    1994           0 :     if ( Name == "RowCount" )
    1995           0 :         return sal_True;
    1996           0 :     else if ( Name == "IsRowCountFinal" )
    1997           0 :         return sal_True;
    1998             :     else
    1999           0 :         return sal_False;
    2000             : }
    2001             : 
    2002             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11