2000-09-18 23:16:46 +00:00
/*************************************************************************
*
2008-04-10 11:26:07 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* Copyright 2008 by Sun Microsystems , Inc .
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* $ RCSfile : RowSetBase . cxx , v $
* $ Revision : 1.95 $
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* This file is part of OpenOffice . org .
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* OpenOffice . org is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2000-09-18 23:16:46 +00:00
*
2008-04-10 11:26:07 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
2000-09-18 23:16:46 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-17 05:32:17 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_dbaccess.hxx"
2000-10-25 06:32:52 +00:00
# ifndef DBACCESS_CORE_API_ROWSETBASE_HXX
2000-09-18 23:16:46 +00:00
# include "RowSetBase.hxx"
2000-10-25 06:32:52 +00:00
# endif
2000-09-18 23:16:46 +00:00
# ifndef DBACCESS_CORE_API_CROWSETDATACOLUMN_HXX
# include "CRowSetDataColumn.hxx"
# endif
# ifndef _CONNECTIVITY_SDBCX_COLLECTION_HXX_
# include <connectivity/sdbcx/VCollection.hxx>
# endif
# ifndef DBACCESS_CORE_API_ROWSETCACHE_HXX
# include "RowSetCache.hxx"
# endif
2000-10-25 06:32:52 +00:00
# ifndef DBACCESS_SHARED_DBASTRINGS_HRC
# include "dbastrings.hrc"
2000-09-18 23:16:46 +00:00
# endif
# ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
# include <com/sun/star/lang/DisposedException.hpp>
# endif
2000-10-25 06:32:52 +00:00
# ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
# include <com/sun/star/beans/PropertyAttribute.hpp>
# endif
2001-01-22 06:38:24 +00:00
# ifndef _COM_SUN_STAR_SDBCX_COMPAREBOOKMARK_HPP_
# include <com/sun/star/sdbcx/CompareBookmark.hpp>
# endif
2001-04-05 06:51:27 +00:00
# ifndef _COM_SUN_STAR_SDBC_RESULTSETCONCURRENCY_HPP_
# include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
# endif
2000-11-22 13:58:32 +00:00
# ifndef _COM_SUN_STAR_LANG_LOCALE_HPP_
# include <com/sun/star/lang/Locale.hpp>
# endif
# ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_
# include <com/sun/star/util/NumberFormat.hpp>
# endif
2000-10-11 10:21:40 +00:00
# ifndef _COMPHELPER_SEQUENCE_HXX_
# include <comphelper/sequence.hxx>
2000-09-18 23:16:46 +00:00
# endif
2001-03-15 07:29:16 +00:00
# ifndef _COMPHELPER_EXTRACT_HXX_
# include <comphelper/extract.hxx>
2000-09-18 23:16:46 +00:00
# endif
2000-10-11 10:21:40 +00:00
# ifndef _COMPHELPER_SEQSTREAM_HXX
# include <comphelper/seqstream.hxx>
2000-09-29 14:23:36 +00:00
# endif
2000-10-25 06:32:52 +00:00
# ifndef _DBHELPER_DBEXCEPTION_HXX_
# include <connectivity/dbexception.hxx>
2000-10-24 12:17:01 +00:00
# endif
2006-02-06 15:54:07 +00:00
# ifndef _OSL_THREAD_H_
# include <osl/thread.h>
# endif
2004-08-02 14:00:45 +00:00
# ifndef _TOOLS_DEBUG_HXX
# include <tools/debug.hxx>
# endif
2000-09-18 23:16:46 +00:00
using namespace dbaccess ;
using namespace connectivity ;
2000-11-29 09:23:32 +00:00
using namespace connectivity : : sdbcx ;
2000-10-05 08:37:27 +00:00
using namespace comphelper ;
2000-10-25 06:32:52 +00:00
using namespace dbtools ;
2000-09-18 23:16:46 +00:00
using namespace : : com : : sun : : star : : uno ;
using namespace : : com : : sun : : star : : beans ;
using namespace : : com : : sun : : star : : sdbc ;
using namespace : : com : : sun : : star : : sdb ;
using namespace : : com : : sun : : star : : sdbcx ;
using namespace : : com : : sun : : star : : container ;
using namespace : : com : : sun : : star : : lang ;
2000-11-22 13:58:32 +00:00
using namespace : : com : : sun : : star : : util ;
2000-09-18 23:16:46 +00:00
using namespace : : cppu ;
using namespace : : osl ;
2001-01-24 10:02:14 +00:00
namespace dbaccess
{
// =========================================================================
// = OEmptyCollection
// =========================================================================
2000-09-18 23:16:46 +00:00
// -------------------------------------------------------------------------
class OEmptyCollection : public sdbcx : : OCollection
{
protected :
2001-10-12 11:02:56 +00:00
virtual void impl_refresh ( ) throw ( RuntimeException ) ;
2005-03-10 15:31:23 +00:00
virtual connectivity : : sdbcx : : ObjectType createObject ( const : : rtl : : OUString & _rName ) ;
2000-09-18 23:16:46 +00:00
public :
OEmptyCollection ( : : cppu : : OWeakObject & _rParent , : : osl : : Mutex & _rMutex ) : OCollection ( _rParent , sal_True , _rMutex , : : std : : vector < : : rtl : : OUString > ( ) ) { }
} ;
2001-10-12 11:02:56 +00:00
// -----------------------------------------------------------------------------
void OEmptyCollection : : impl_refresh ( ) throw ( RuntimeException )
{
}
// -----------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
connectivity : : sdbcx : : ObjectType OEmptyCollection : : createObject ( const : : rtl : : OUString & /*_rName*/ )
2001-10-12 11:02:56 +00:00
{
2005-03-10 15:31:23 +00:00
return connectivity : : sdbcx : : ObjectType ( ) ;
2001-10-12 11:02:56 +00:00
}
// -----------------------------------------------------------------------------
2001-01-24 10:02:14 +00:00
// =========================================================================
// = ORowSetBase
// =========================================================================
2005-09-23 11:03:10 +00:00
DBG_NAME ( ORowSetBase )
2000-09-18 23:16:46 +00:00
// -------------------------------------------------------------------------
2007-11-21 14:32:31 +00:00
ORowSetBase : : ORowSetBase ( const : : comphelper : : ComponentContext & _rContext , : : cppu : : OBroadcastHelper & _rBHelper , : : osl : : Mutex * _pMutex )
: OPropertyStateContainer ( _rBHelper )
, m_pMutex ( _pMutex )
, m_pCache ( NULL )
, m_pColumns ( NULL )
, m_rBHelper ( _rBHelper )
, m_pEmptyCollection ( NULL )
, m_aContext ( _rContext )
, m_aErrors ( _rContext )
, m_nLastColumnIndex ( - 1 )
, m_nDeletedPosition ( - 1 )
, m_nResultSetType ( ResultSetType : : FORWARD_ONLY )
, m_nResultSetConcurrency ( ResultSetConcurrency : : READ_ONLY )
, m_bClone ( sal_False )
, m_bIgnoreResult ( sal_False )
, m_bBeforeFirst ( sal_True ) // changed from sal_False
, m_bAfterLast ( sal_False )
2000-09-18 23:16:46 +00:00
{
2005-09-23 11:03:10 +00:00
DBG_CTOR ( ORowSetBase , NULL ) ;
2000-09-18 23:16:46 +00:00
sal_Int32 nRBT = PropertyAttribute : : READONLY | PropertyAttribute : : BOUND | PropertyAttribute : : TRANSIENT ;
2006-01-25 14:10:18 +00:00
sal_Int32 nInitialRowCountValue = 0 ;
sal_Bool bInitialRowCountFinalValue ( sal_False ) ;
registerPropertyNoMember ( PROPERTY_ROWCOUNT , PROPERTY_ID_ROWCOUNT , nRBT , : : getCppuType ( & nInitialRowCountValue ) , & nInitialRowCountValue ) ;
registerPropertyNoMember ( PROPERTY_ISROWCOUNTFINAL , PROPERTY_ID_ISROWCOUNTFINAL , nRBT , : : getBooleanCppuType ( ) , & bInitialRowCountFinalValue ) ;
2000-09-18 23:16:46 +00:00
}
2001-04-20 10:44:05 +00:00
// -----------------------------------------------------------------------------
ORowSetBase : : ~ ORowSetBase ( )
{
if ( m_pColumns )
{
2001-08-13 07:45:02 +00:00
TDataColumns ( ) . swap ( m_aDataColumns ) ;
2004-08-02 14:00:45 +00:00
m_pColumns - > acquire ( ) ;
m_pColumns - > disposing ( ) ;
2001-04-20 10:44:05 +00:00
delete m_pColumns ;
m_pColumns = NULL ;
}
2002-01-18 17:24:07 +00:00
if ( m_pEmptyCollection )
delete m_pEmptyCollection ;
2005-09-23 11:03:10 +00:00
DBG_DTOR ( ORowSetBase , NULL ) ;
2001-04-20 10:44:05 +00:00
}
2000-09-18 23:16:46 +00:00
// com::sun::star::lang::XTypeProvider
//--------------------------------------------------------------------------
Sequence < Type > ORowSetBase : : getTypes ( ) throw ( RuntimeException )
{
2004-08-02 14:00:45 +00:00
return : : comphelper : : concatSequences ( ORowSetBase_BASE : : getTypes ( ) , OPropertyStateContainer : : getTypes ( ) ) ;
2000-09-18 23:16:46 +00:00
}
// com::sun::star::uno::XInterface
//--------------------------------------------------------------------------
Any ORowSetBase : : queryInterface ( const Type & rType ) throw ( RuntimeException )
{
2001-08-24 05:40:35 +00:00
Any aRet = ORowSetBase_BASE : : queryInterface ( rType ) ;
2000-09-18 23:16:46 +00:00
if ( ! aRet . hasValue ( ) )
2004-08-02 14:00:45 +00:00
aRet = OPropertyStateContainer : : queryInterface ( rType ) ;
2000-09-18 23:16:46 +00:00
return aRet ;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase : : getFastPropertyValue ( Any & rValue , sal_Int32 nHandle ) const
{
if ( m_pCache )
{
switch ( nHandle )
{
case PROPERTY_ID_ROWCOUNT :
2006-01-25 14:10:18 +00:00
rValue < < = impl_getRowCount ( ) ;
2000-09-18 23:16:46 +00:00
break ;
case PROPERTY_ID_ISROWCOUNTFINAL :
rValue . setValue ( & m_pCache - > m_bRowCountFinal , : : getCppuBooleanType ( ) ) ;
break ;
default :
2004-08-02 14:00:45 +00:00
OPropertyStateContainer : : getFastPropertyValue ( rValue , nHandle ) ;
2000-09-18 23:16:46 +00:00
} ;
}
else
2004-08-02 14:00:45 +00:00
OPropertyStateContainer : : getFastPropertyValue ( rValue , nHandle ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// OComponentHelper
void SAL_CALL ORowSetBase : : disposing ( void )
{
2001-11-15 09:42:42 +00:00
MutexGuard aGuard ( * m_pMutex ) ;
2000-09-18 23:16:46 +00:00
2003-03-19 16:57:12 +00:00
if ( m_pColumns )
2001-08-13 07:45:02 +00:00
{
TDataColumns ( ) . swap ( m_aDataColumns ) ;
2000-09-18 23:16:46 +00:00
m_pColumns - > disposing ( ) ;
2001-08-13 07:45:02 +00:00
}
2003-03-19 16:57:12 +00:00
if ( m_pCache )
m_pCache - > deregisterOldRow ( m_aOldRow ) ;
m_pCache = NULL ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2000-10-11 10:21:40 +00:00
// comphelper::OPropertyArrayUsageHelper
2000-09-18 23:16:46 +00:00
: : cppu : : IPropertyArrayHelper * ORowSetBase : : createArrayHelper ( ) const
{
Sequence < Property > aProps ;
describeProperties ( aProps ) ;
return new : : cppu : : OPropertyArrayHelper ( aProps ) ;
}
// -------------------------------------------------------------------------
// cppu::OPropertySetHelper
: : cppu : : IPropertyArrayHelper & SAL_CALL ORowSetBase : : getInfoHelper ( )
{
return * const_cast < ORowSetBase * > ( this ) - > getArrayHelper ( ) ;
}
// -------------------------------------------------------------------------
// XRow
sal_Bool SAL_CALL ORowSetBase : : wasNull ( ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-29 14:23:36 +00:00
2006-02-06 15:54:07 +00:00
2008-12-30 13:32:01 +00:00
return ( ( m_nLastColumnIndex ! = - 1 ) & & ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) & & m_aCurrentRow - > isValid ( ) ) ? ( ( * m_aCurrentRow ) - > get ( ) ) [ m_nLastColumnIndex ] . isNull ( ) : sal_True ;
2000-09-18 23:16:46 +00:00
}
2006-01-25 14:10:18 +00:00
// -----------------------------------------------------------------------------
2001-06-26 09:12:41 +00:00
// -----------------------------------------------------------------------------
2001-07-30 07:53:02 +00:00
const ORowSetValue & ORowSetBase : : getValue ( sal_Int32 columnIndex )
2000-09-18 23:16:46 +00:00
{
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2006-02-06 15:54:07 +00:00
2005-10-13 16:09:45 +00:00
if ( m_bBeforeFirst | | m_bAfterLast )
{
OSL_ENSURE ( 0 , " ORowSetBase::getValue: Illegal call here (we're before first or after last)! " ) ;
2006-01-25 14:10:18 +00:00
throwSQLException ( " The cursor points to before the first or after the last row. " , SQL_INVALID_CURSOR_POSITION , * m_pMySelf ) ;
2007-07-24 11:03:50 +00:00
// TODO: resource
2005-10-13 16:09:45 +00:00
}
2000-09-18 23:16:46 +00:00
2006-01-25 14:10:18 +00:00
if ( rowDeleted ( ) )
2006-02-06 15:54:07 +00:00
{
2006-01-25 14:10:18 +00:00
return m_aEmptyValue ;
2006-02-06 15:54:07 +00:00
}
2006-01-25 14:10:18 +00:00
bool bValidCurrentRow = ( ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) & & m_aCurrentRow - > isValid ( ) ) ;
if ( ! bValidCurrentRow )
{
// currentrow is null when the clone moves the window
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
m_aCurrentRow = m_pCache - > m_aMatrixIter ;
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) , " ORowSetBase::getValue: we don't stand on a valid row! Row is null. " ) ;
bValidCurrentRow = ( ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) & & m_aCurrentRow - > isValid ( ) ) ;
}
if ( bValidCurrentRow )
2002-11-13 05:56:59 +00:00
{
2003-04-15 15:02:32 +00:00
# if OSL_DEBUG_LEVEL > 0
2006-08-24 09:54:58 +00:00
ORowSetMatrix : : iterator aCacheEnd ;
ORowSetMatrix : : iterator aCurrentRow ;
aCacheEnd = m_pCache - > getEnd ( ) ;
aCurrentRow = m_aCurrentRow ;
2006-07-26 06:45:59 +00:00
ORowSetCacheMap : : iterator aCacheIter = m_aCurrentRow . getIter ( ) ;
sal_Int32 n = aCacheIter - > first ;
n = n ;
ORowSetCacheIterator_Helper aHelper = aCacheIter - > second ;
ORowSetMatrix : : iterator k = aHelper . aIterator ;
for ( ; k ! = m_pCache - > getEnd ( ) ; + + k )
{
ORowSetValueVector * pTemp = k - > getBodyPtr ( ) ;
OSL_ENSURE ( pTemp ! = ( void * ) 0xfeeefeee , " HALT! " ) ;
}
# endif
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow < m_pCache - > getEnd ( ) & & aCacheIter ! = m_pCache - > m_aCacheIterators . end ( ) , " Invalid iterator set for currentrow! " ) ;
# if OSL_DEBUG_LEVEL > 0
ORowSetRow rRow = ( * m_aCurrentRow ) ;
2008-12-30 13:32:01 +00:00
OSL_ENSURE ( rRow . isValid ( ) & & static_cast < sal_uInt16 > ( columnIndex ) < ( rRow - > get ( ) ) . size ( ) , " Invalid size of vector! " ) ;
2002-12-05 08:53:00 +00:00
# endif
2008-12-30 13:32:01 +00:00
return ( ( * m_aCurrentRow ) - > get ( ) ) [ m_nLastColumnIndex = columnIndex ] ;
2002-11-13 05:56:59 +00:00
}
2001-07-12 06:56:32 +00:00
2006-01-25 14:10:18 +00:00
// we should normally never reach this
2001-07-30 07:53:02 +00:00
return m_aEmptyValue ;
2001-06-26 09:12:41 +00:00
}
// -------------------------------------------------------------------------
: : rtl : : OUString SAL_CALL ORowSetBase : : getString ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : getBoolean ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int8 SAL_CALL ORowSetBase : : getByte ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int16 SAL_CALL ORowSetBase : : getShort ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase : : getInt ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int64 SAL_CALL ORowSetBase : : getLong ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
float SAL_CALL ORowSetBase : : getFloat ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
double SAL_CALL ORowSetBase : : getDouble ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Sequence < sal_Int8 > SAL_CALL ORowSetBase : : getBytes ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : Date SAL_CALL ORowSetBase : : getDate ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : Time SAL_CALL ORowSetBase : : getTime ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : DateTime SAL_CALL ORowSetBase : : getTimestamp ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference < : : com : : sun : : star : : io : : XInputStream > SAL_CALL ORowSetBase : : getBinaryStream ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-29 14:23:36 +00:00
2007-07-24 11:03:50 +00:00
if ( m_bBeforeFirst | | m_bAfterLast )
{
OSL_ENSURE ( 0 , " ORowSetBase::getBinaryStream: Illegal call here (we're before first or after last)! " ) ;
throwSQLException ( " The cursor points to before the first or after the last row. " , SQL_INVALID_CURSOR_POSITION , * m_pMySelf ) ;
// TODO: resource
}
2006-02-06 15:54:07 +00:00
2007-07-24 11:03:50 +00:00
if ( rowDeleted ( ) )
2001-07-12 06:56:32 +00:00
{
2007-07-24 11:03:50 +00:00
return NULL ;
}
2006-01-25 14:10:18 +00:00
2007-07-24 11:03:50 +00:00
bool bValidCurrentRow = ( ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) & & m_aCurrentRow - > isValid ( ) ) ;
if ( ! bValidCurrentRow )
{
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
m_aCurrentRow = m_pCache - > m_aMatrixIter ;
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) , " ORowSetBase::getBinaryStream: we don't stand on a valid row! Row is null. " ) ;
2001-07-12 11:14:47 +00:00
2007-07-24 11:03:50 +00:00
bValidCurrentRow = ( ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) & & m_aCurrentRow - > isValid ( ) ) ;
2001-07-12 06:56:32 +00:00
}
2007-07-24 11:03:50 +00:00
if ( bValidCurrentRow )
2008-12-30 13:32:01 +00:00
return new : : comphelper : : SequenceInputStream ( ( ( * m_aCurrentRow ) - > get ( ) ) [ m_nLastColumnIndex = columnIndex ] . getSequence ( ) ) ;
2001-07-12 06:56:32 +00:00
2007-07-24 11:03:50 +00:00
// we should normally never reach this
2000-09-29 14:23:36 +00:00
return Reference < : : com : : sun : : star : : io : : XInputStream > ( ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference < : : com : : sun : : star : : io : : XInputStream > SAL_CALL ORowSetBase : : getCharacterStream ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:12:41 +00:00
return getBinaryStream ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
Any SAL_CALL ORowSetBase : : getObject ( sal_Int32 columnIndex , const Reference < XNameAccess > & /*typeMap*/ ) throw ( SQLException , RuntimeException )
2000-09-18 23:16:46 +00:00
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-18 23:16:46 +00:00
2006-04-19 12:18:30 +00:00
return getValue ( columnIndex ) . makeAny ( ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
Reference < XRef > SAL_CALL ORowSetBase : : getRef ( sal_Int32 /*columnIndex*/ ) throw ( SQLException , RuntimeException )
2000-09-18 23:16:46 +00:00
{
2006-06-20 01:36:00 +00:00
: : dbtools : : throwFeatureNotImplementedException ( " XRow::getRef " , * m_pMySelf ) ;
return NULL ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
Reference < XBlob > SAL_CALL ORowSetBase : : getBlob ( sal_Int32 /*columnIndex*/ ) throw ( SQLException , RuntimeException )
2000-09-18 23:16:46 +00:00
{
2006-06-20 01:36:00 +00:00
: : dbtools : : throwFeatureNotImplementedException ( " XRow::getBlob " , * m_pMySelf ) ;
return NULL ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
Reference < XClob > SAL_CALL ORowSetBase : : getClob ( sal_Int32 /*columnIndex*/ ) throw ( SQLException , RuntimeException )
2000-09-18 23:16:46 +00:00
{
2006-06-20 01:36:00 +00:00
: : dbtools : : throwFeatureNotImplementedException ( " XRow::getClob " , * m_pMySelf ) ;
return NULL ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
Reference < XArray > SAL_CALL ORowSetBase : : getArray ( sal_Int32 /*columnIndex*/ ) throw ( SQLException , RuntimeException )
2000-09-18 23:16:46 +00:00
{
2006-06-20 01:36:00 +00:00
: : dbtools : : throwFeatureNotImplementedException ( " XRow::getArray " , * m_pMySelf ) ;
return NULL ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// ::com::sun::star::sdbcx::XRowLocate
Any SAL_CALL ORowSetBase : : getBookmark ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::getBookmark() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-01-25 14:10:18 +00:00
checkCache ( ) ;
2001-06-26 09:12:41 +00:00
2006-01-25 14:10:18 +00:00
if ( m_bBeforeFirst | | m_bAfterLast )
throwSQLException ( " The rows before the first and after the last row don't have a bookmark. " , SQL_INVALID_CURSOR_POSITION , * m_pMySelf ) ;
2007-07-24 11:03:50 +00:00
// TODO: resource
2006-01-25 14:10:18 +00:00
if ( rowDeleted ( ) )
2007-07-24 11:03:50 +00:00
throwSQLException ( " The current row is deleted, and thus doesn't have a bookmark. " , SQL_INVALID_CURSOR_POSITION , * m_pMySelf ) ;
// TODO: resource
2000-09-18 23:16:46 +00:00
2006-01-25 14:10:18 +00:00
OSL_ENSURE ( m_aBookmark . hasValue ( ) , " ORowSetBase::getBookmark: bookmark has no value! " ) ;
2000-09-29 14:23:36 +00:00
return m_aBookmark ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : moveToBookmark ( const Any & bookmark ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::moveToBookmark(Any) Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( bookmark . hasValue ( ) , " ORowSetBase::moveToBookmark bookmark has no value! " ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
2001-04-05 06:51:27 +00:00
if ( ! bookmark . hasValue ( ) | | m_nResultSetType = = ResultSetType : : FORWARD_ONLY )
2001-07-12 06:56:32 +00:00
{
if ( bookmark . hasValue ( ) )
OSL_ENSURE ( 0 , " MoveToBookmark is not possible when we are only forward " ) ;
else
OSL_ENSURE ( 0 , " Bookmark is not valid " ) ;
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( * m_pMySelf ) ;
2001-07-12 06:56:32 +00:00
}
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-29 14:23:36 +00:00
2006-07-10 14:03:37 +00:00
sal_Bool bRet ( notifyAllListenersCursorBeforeMove ( aGuard ) ) ;
if ( bRet )
2001-04-06 09:19:13 +00:00
{
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2000-09-29 14:23:36 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2000-09-18 23:16:46 +00:00
2001-04-06 09:19:13 +00:00
bRet = m_pCache - > moveToBookmark ( bookmark ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2001-04-06 09:19:13 +00:00
if ( bRet )
{
2002-12-05 08:53:00 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2001-07-12 06:56:32 +00:00
}
else
{
movementFailed ( ) ;
2001-04-06 09:19:13 +00:00
}
2002-12-05 08:53:00 +00:00
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
2000-09-29 14:23:36 +00:00
}
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::moveToBookmark(Any) = %i Clone = %i \n " , bRet , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : moveRelativeToBookmark ( const Any & bookmark , sal_Int32 rows ) throw ( SQLException , RuntimeException )
{
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::moveRelativeToBookmark(Any,%i) Clone = %i \n " , rows , m_bClone ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2000-09-29 14:23:36 +00:00
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2000-09-29 14:23:36 +00:00
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2006-07-10 14:03:37 +00:00
sal_Bool bRet ( notifyAllListenersCursorBeforeMove ( aGuard ) ) ;
if ( bRet )
2001-04-06 09:19:13 +00:00
{
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2000-09-29 14:23:36 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2000-09-18 23:16:46 +00:00
2001-04-06 09:19:13 +00:00
bRet = m_pCache - > moveRelativeToBookmark ( bookmark , rows ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2001-04-06 09:19:13 +00:00
if ( bRet )
2001-01-24 08:52:19 +00:00
{
2002-12-05 08:53:00 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2001-01-24 08:52:19 +00:00
}
2001-07-12 06:56:32 +00:00
else
movementFailed ( ) ;
2002-12-05 08:53:00 +00:00
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
// RowCount/IsRowCountFinal
fireRowcount ( ) ;
2000-09-29 14:23:36 +00:00
}
2004-08-02 14:00:45 +00:00
DBG_TRACE3 ( " DBACCESS ORowSetBase::moveRelativeToBookmark(Any,%i) = %i Clone = %i \n " , rows , bRet , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
2006-06-20 01:36:00 +00:00
sal_Int32 SAL_CALL ORowSetBase : : compareBookmarks ( const Any & _first , const Any & _second ) throw ( SQLException , RuntimeException )
2000-09-18 23:16:46 +00:00
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2006-06-20 01:36:00 +00:00
return m_pCache - > compareBookmarks ( _first , _second ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : hasOrderedBookmarks ( ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-18 23:16:46 +00:00
return m_pCache - > hasOrderedBookmarks ( ) ;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase : : hashBookmark ( const Any & bookmark ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-18 23:16:46 +00:00
return m_pCache - > hashBookmark ( bookmark ) ;
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// XResultSetMetaDataSupplier
Reference < XResultSetMetaData > SAL_CALL ORowSetBase : : getMetaData ( ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2000-09-18 23:16:46 +00:00
2001-07-18 09:39:14 +00:00
Reference < XResultSetMetaData > xMeta ;
if ( m_pCache )
xMeta = m_pCache - > getMetaData ( ) ;
return xMeta ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// XColumnLocate
sal_Int32 SAL_CALL ORowSetBase : : findColumn ( const : : rtl : : OUString & columnName ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2000-09-18 23:16:46 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
// it is possible to save some time her when we remember the names - position relation in a map
2001-03-27 05:42:16 +00:00
return m_pColumns ? m_pColumns - > findColumn ( columnName ) : sal_Int32 ( 0 ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// ::com::sun::star::sdbcx::XColumnsSupplier
Reference < XNameAccess > SAL_CALL ORowSetBase : : getColumns ( ) throw ( RuntimeException )
{
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:12:41 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
2000-10-17 09:19:03 +00:00
if ( ! m_pColumns )
2001-05-28 12:03:37 +00:00
{
2002-01-18 17:24:07 +00:00
if ( ! m_pEmptyCollection )
m_pEmptyCollection = new OEmptyCollection ( * m_pMySelf , m_aColumnsMutex ) ;
return m_pEmptyCollection ;
2001-05-28 12:03:37 +00:00
}
2000-09-18 23:16:46 +00:00
return m_pColumns ;
}
// -------------------------------------------------------------------------
// XResultSet
sal_Bool SAL_CALL ORowSetBase : : next ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::next() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-18 23:16:46 +00:00
2006-07-10 14:03:37 +00:00
sal_Bool bRet ( notifyAllListenersCursorBeforeMove ( aGuard ) ) ;
if ( bRet )
2000-11-14 12:28:20 +00:00
{
2001-04-06 09:19:13 +00:00
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2001-04-06 09:19:13 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2001-12-19 14:16:17 +00:00
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_FORWARD ) ;
2005-03-18 09:05:00 +00:00
sal_Bool bAfterLast = m_pCache - > isAfterLast ( ) ;
2001-04-06 09:19:13 +00:00
bRet = m_pCache - > next ( ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
2005-03-18 09:05:00 +00:00
if ( bRet | | bAfterLast ! = m_pCache - > isAfterLast ( ) )
2001-04-06 09:19:13 +00:00
{
2002-12-05 08:53:00 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( bRet , sal_True , aOldValues , aGuard ) ;
2001-07-12 06:56:32 +00:00
OSL_ENSURE ( ! m_bBeforeFirst , " BeforeFirst is true. I don't know why? " ) ;
2001-04-06 09:19:13 +00:00
}
else
{
2001-07-12 06:56:32 +00:00
// moved after the last row
movementFailed ( ) ;
OSL_ENSURE ( m_bAfterLast , " AfterLast is false. I don't know why? " ) ;
2001-04-06 09:19:13 +00:00
}
2002-12-05 08:53:00 +00:00
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
// - RowCount/IsRowCountFinal
2001-04-06 09:19:13 +00:00
fireRowcount ( ) ;
2000-11-10 15:05:41 +00:00
}
2006-02-06 15:54:07 +00:00
DBG_TRACE3 ( " DBACCESS ORowSetBase::next() = %i Clone = %i ID = %i \n " , bRet , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : isBeforeFirst ( ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-01-25 14:10:18 +00:00
checkCache ( ) ;
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::isBeforeFirst() = %i Clone = %i \n " , m_bBeforeFirst , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return m_bBeforeFirst ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : isAfterLast ( ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-01-25 14:10:18 +00:00
checkCache ( ) ;
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::isAfterLast() = %i Clone = %i \n " , m_bAfterLast , m_bClone ) ;
2000-09-18 23:16:46 +00:00
2001-01-24 08:52:19 +00:00
return m_bAfterLast ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2002-12-05 13:10:11 +00:00
sal_Bool ORowSetBase : : isOnFirst ( )
{
return isFirst ( ) ;
}
// -------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
sal_Bool SAL_CALL ORowSetBase : : isFirst ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::isFirst() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2004-08-02 14:00:45 +00:00
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-01-25 14:10:18 +00:00
checkCache ( ) ;
2000-09-18 23:16:46 +00:00
2006-01-25 14:10:18 +00:00
if ( m_bBeforeFirst | | m_bAfterLast )
return sal_False ;
if ( rowDeleted ( ) )
return ( m_nDeletedPosition = = 1 ) ;
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
sal_Bool bIsFirst = m_pCache - > isFirst ( ) ;
2000-09-18 23:16:46 +00:00
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::isFirst() = %i Clone = %i \n " , bIsFirst , m_bClone ) ;
2001-07-12 06:56:32 +00:00
return bIsFirst ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2002-12-05 13:10:11 +00:00
sal_Bool ORowSetBase : : isOnLast ( )
{
return isLast ( ) ;
}
// -----------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
sal_Bool SAL_CALL ORowSetBase : : isLast ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::isLast() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-01-25 14:10:18 +00:00
checkCache ( ) ;
if ( m_bBeforeFirst | | m_bAfterLast )
return sal_False ;
if ( rowDeleted ( ) )
2008-12-11 07:05:03 +00:00
{
2006-01-25 14:10:18 +00:00
if ( ! m_pCache - > m_bRowCountFinal )
return sal_False ;
else
return ( m_nDeletedPosition = = impl_getRowCount ( ) ) ;
2008-12-11 07:05:03 +00:00
}
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
sal_Bool bIsLast = m_pCache - > isLast ( ) ;
2000-09-18 23:16:46 +00:00
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::isLast() = %i Clone = %i \n " , bIsLast , m_bClone ) ;
2001-07-12 06:56:32 +00:00
return bIsLast ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase : : beforeFirst ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::beforeFirst() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2000-09-29 14:23:36 +00:00
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2001-12-19 14:16:17 +00:00
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2001-12-19 14:16:17 +00:00
2002-08-13 10:13:00 +00:00
if ( ( bWasNew | | ! m_bBeforeFirst ) & & notifyAllListenersCursorBeforeMove ( aGuard ) )
2000-09-18 23:16:46 +00:00
{
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2001-04-06 09:19:13 +00:00
2005-03-18 09:05:00 +00:00
if ( ! m_bBeforeFirst )
2001-12-19 14:16:17 +00:00
{
2005-03-18 09:05:00 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2001-04-06 09:19:13 +00:00
m_pCache - > beforeFirst ( ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
2003-06-25 10:02:35 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2002-12-05 08:53:00 +00:00
2005-03-18 09:05:00 +00:00
// - IsModified
// - Isnew
aNotifier . fire ( ) ;
// - RowCount/IsRowCountFinal
fireRowcount ( ) ;
}
2002-12-05 08:53:00 +00:00
// to be done _after_ the notifications!
2003-03-19 16:57:12 +00:00
m_aOldRow - > clearRow ( ) ;
2000-09-18 23:16:46 +00:00
}
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::beforeFirst() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase : : afterLast ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::afterLast() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2000-09-18 23:16:46 +00:00
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2001-12-19 14:16:17 +00:00
2002-08-13 10:13:00 +00:00
if ( ( bWasNew | | ! m_bAfterLast ) & & notifyAllListenersCursorBeforeMove ( aGuard ) )
2000-09-18 23:16:46 +00:00
{
2001-04-06 09:19:13 +00:00
// check if we are inserting a row
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2001-04-06 09:19:13 +00:00
if ( ! m_bAfterLast )
{
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2002-12-05 08:53:00 +00:00
2001-04-06 09:19:13 +00:00
m_pCache - > afterLast ( ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2002-12-05 08:53:00 +00:00
// - IsModified
// - Isnew
aNotifier . fire ( ) ;
// - RowCount/IsRowCountFinal
fireRowcount ( ) ;
2001-04-06 09:19:13 +00:00
}
2000-09-18 23:16:46 +00:00
}
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::afterLast() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2000-09-18 23:16:46 +00:00
}
2002-12-05 13:10:11 +00:00
// -----------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : move ( : : std : : mem_fun_t < sal_Bool , ORowSetBase > & _aCheckFunctor ,
: : std : : mem_fun_t < sal_Bool , ORowSetCache > & _aMovementFunctor )
2000-09-18 23:16:46 +00:00
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::move() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2000-09-29 14:23:36 +00:00
2006-07-10 14:03:37 +00:00
sal_Bool bRet ( notifyAllListenersCursorBeforeMove ( aGuard ) ) ;
if ( bRet )
2001-04-06 09:19:13 +00:00
{
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2000-09-29 14:23:36 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2000-09-18 23:16:46 +00:00
2002-12-05 13:10:11 +00:00
sal_Bool bMoved = ( bWasNew | | ! _aCheckFunctor ( this ) ) ;
2000-09-18 23:16:46 +00:00
2002-12-05 13:10:11 +00:00
bRet = _aMovementFunctor ( m_pCache ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
2002-12-05 13:10:11 +00:00
if ( bRet )
2002-12-05 08:53:00 +00:00
{
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( bMoved , sal_True , aOldValues , aGuard ) ;
2002-12-05 08:53:00 +00:00
}
2001-04-06 09:19:13 +00:00
else
2002-12-05 08:53:00 +00:00
{ // first goes wrong so there is no row
2001-07-12 06:56:32 +00:00
movementFailed ( ) ;
2001-04-06 09:19:13 +00:00
}
2002-12-05 08:53:00 +00:00
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
// - RowCount/IsRowCountFinal
2001-04-06 09:19:13 +00:00
fireRowcount ( ) ;
2000-11-14 12:28:20 +00:00
}
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::move() = %i Clone = %i \n " , bRet , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
2002-12-05 13:10:11 +00:00
sal_Bool SAL_CALL ORowSetBase : : first ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::first() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2002-12-10 11:38:44 +00:00
: : std : : mem_fun_t < sal_Bool , ORowSetBase > ioF_tmp ( & ORowSetBase : : isOnFirst ) ;
: : std : : mem_fun_t < sal_Bool , ORowSetCache > F_tmp ( & ORowSetCache : : first ) ;
return move ( ioF_tmp , F_tmp ) ;
2002-12-05 13:10:11 +00:00
}
// -------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
sal_Bool SAL_CALL ORowSetBase : : last ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::last() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2002-12-10 11:38:44 +00:00
: : std : : mem_fun_t < sal_Bool , ORowSetBase > ioL_tmp ( & ORowSetBase : : isOnLast ) ;
: : std : : mem_fun_t < sal_Bool , ORowSetCache > L_tmp ( & ORowSetCache : : last ) ;
return move ( ioL_tmp , L_tmp ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase : : getRow ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::getRow() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-02-06 15:54:07 +00:00
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2000-09-29 14:23:36 +00:00
2006-02-06 15:54:07 +00:00
2001-06-26 09:12:41 +00:00
sal_Int32 nPos = 0 ;
2006-01-25 14:10:18 +00:00
if ( m_bBeforeFirst )
nPos = 0 ;
else if ( m_bAfterLast )
nPos = impl_getRowCount ( ) + 1 ;
else if ( rowDeleted ( ) )
nPos = m_nDeletedPosition ;
2006-02-06 15:54:07 +00:00
else if ( ! m_bClone & & m_pCache - > m_bNew )
2006-01-25 14:10:18 +00:00
nPos = 0 ;
else
2001-06-26 09:12:41 +00:00
{
2006-01-25 14:10:18 +00:00
if ( m_pCache - > isAfterLast ( )
| | m_pCache - > isBeforeFirst ( )
| | ( m_pCache - > compareBookmarks ( m_aBookmark , m_pCache - > getBookmark ( ) ) ! = CompareBookmark : : EQUAL )
)
2001-06-26 09:12:41 +00:00
{
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
2001-06-26 09:12:41 +00:00
}
2006-01-25 14:10:18 +00:00
nPos = m_pCache - > getRow ( ) ;
2001-06-26 09:12:41 +00:00
}
2006-02-06 15:54:07 +00:00
DBG_TRACE3 ( " DBACCESS ORowSetBase::getRow() = %i Clone = %i ID = %i \n " , nPos , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
return nPos ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : absolute ( sal_Int32 row ) throw ( SQLException , RuntimeException )
{
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::absolute(%i) Clone = %i \n " , row , m_bClone ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2000-09-18 23:16:46 +00:00
2006-07-10 14:03:37 +00:00
sal_Bool bRet = ( row > 0 )
& & notifyAllListenersCursorBeforeMove ( aGuard ) ;
if ( bRet )
2000-09-18 23:16:46 +00:00
{
2001-04-06 09:19:13 +00:00
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2001-04-06 09:19:13 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2001-04-06 09:19:13 +00:00
bRet = m_pCache - > absolute ( row ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
2001-04-06 09:19:13 +00:00
if ( bRet )
{
2002-12-05 08:53:00 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2001-04-06 09:19:13 +00:00
}
else
2001-07-12 06:56:32 +00:00
{ // absolute movement goes wrong we stand left or right side of the rows
movementFailed ( ) ;
2001-04-06 09:19:13 +00:00
}
2002-12-05 08:53:00 +00:00
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
// - RowCount/IsRowCountFinal
2001-04-06 09:19:13 +00:00
fireRowcount ( ) ;
2000-09-18 23:16:46 +00:00
}
2004-08-02 14:00:45 +00:00
DBG_TRACE3 ( " DBACCESS ORowSetBase::absolute(%i) = %i Clone = %i \n " , row , bRet , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : relative ( sal_Int32 rows ) throw ( SQLException , RuntimeException )
{
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::relative(%i) Clone = %i \n " , rows , m_bClone ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2000-09-18 23:16:46 +00:00
if ( ! rows )
return sal_True ; // in this case do nothing
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2000-09-18 23:16:46 +00:00
2006-07-10 14:03:37 +00:00
sal_Bool bRet =
( ( ! m_bAfterLast | | rows < = 0 )
& & ( ! m_bBeforeFirst | | rows > = 0 )
& & notifyAllListenersCursorBeforeMove ( aGuard )
) ;
2000-09-18 23:16:46 +00:00
2006-07-10 14:03:37 +00:00
if ( bRet )
2000-09-18 23:16:46 +00:00
{
2001-04-06 09:19:13 +00:00
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2001-04-06 09:19:13 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2001-04-06 09:19:13 +00:00
2006-01-25 14:10:18 +00:00
positionCache ( rows > 0 ? MOVE_FORWARD : MOVE_BACKWARD ) ;
2001-04-06 09:19:13 +00:00
bRet = m_pCache - > relative ( rows ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
2001-04-06 09:19:13 +00:00
if ( bRet )
{
2002-12-05 08:53:00 +00:00
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2001-04-06 09:19:13 +00:00
}
else
{
2001-07-12 06:56:32 +00:00
movementFailed ( ) ;
2001-04-06 09:19:13 +00:00
}
2000-09-18 23:16:46 +00:00
2002-12-05 08:53:00 +00:00
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
// - RowCount/IsRowCountFinal
2001-04-06 09:19:13 +00:00
fireRowcount ( ) ;
}
2004-08-02 14:00:45 +00:00
DBG_TRACE3 ( " DBACCESS ORowSetBase::relative(%i) = %i Clone = %i \n " , rows , bRet , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : previous ( ) throw ( SQLException , RuntimeException )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::previous() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2002-08-13 10:13:00 +00:00
: : osl : : ResettableMutexGuard aGuard ( * m_pMutex ) ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:12:41 +00:00
checkPositioningAllowed ( ) ;
2000-09-29 14:23:36 +00:00
2006-07-10 14:03:37 +00:00
sal_Bool bRet = ! m_bBeforeFirst
& & notifyAllListenersCursorBeforeMove ( aGuard ) ;
2000-09-29 14:23:36 +00:00
2006-07-10 14:03:37 +00:00
if ( bRet )
2000-09-18 23:16:46 +00:00
{
2001-04-06 09:19:13 +00:00
// check if we are inserting a row
2006-02-06 15:54:07 +00:00
sal_Bool bWasNew = m_pCache - > m_bNew | | rowDeleted ( ) ;
2002-12-05 08:53:00 +00:00
ORowSetNotifier aNotifier ( this ) ;
// this will call cancelRowModification on the cache if necessary
2001-04-06 09:19:13 +00:00
2003-03-19 16:57:12 +00:00
ORowSetRow aOldValues = getOldRow ( bWasNew ) ;
2001-04-06 09:19:13 +00:00
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_BACKWARD ) ;
2001-04-06 09:19:13 +00:00
bRet = m_pCache - > previous ( ) ;
2006-04-19 12:18:30 +00:00
doCancelModification ( ) ;
2002-12-05 08:53:00 +00:00
2001-12-19 14:16:17 +00:00
// if m_bBeforeFirst is false and bRet is false than we stood on the first row
if ( ! m_bBeforeFirst | | bRet )
2002-12-05 08:53:00 +00:00
{
// notification order
// - column values
// - cursorMoved
2006-01-25 14:10:18 +00:00
setCurrentRow ( sal_True , sal_True , aOldValues , aGuard ) ;
2002-12-05 08:53:00 +00:00
}
2001-04-06 09:19:13 +00:00
else
2002-12-05 08:53:00 +00:00
{
2006-01-25 14:10:18 +00:00
DBG_ERROR ( " ORowSetBase::previous: inconsistency! " ) ;
// we should never reach this place, as we should not get into this whole branch if m_bBeforeFirst
// was |true| from the beginning
2001-07-12 06:56:32 +00:00
movementFailed ( ) ;
2002-12-05 08:53:00 +00:00
}
// - IsModified
// - IsNew
aNotifier . fire ( ) ;
2006-01-25 14:10:18 +00:00
// - RowCount/IsRowCountFinal
fireRowcount ( ) ;
2000-11-10 15:05:41 +00:00
}
2004-08-02 14:00:45 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::previous() = %i Clone = %i \n " , bRet , m_bClone ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
2001-06-26 09:12:41 +00:00
// -----------------------------------------------------------------------------
2006-01-25 14:10:18 +00:00
void ORowSetBase : : setCurrentRow ( sal_Bool _bMoved , sal_Bool _bDoNotify , const ORowSetRow & _rOldValues , : : osl : : ResettableMutexGuard & _rGuard )
2001-06-26 09:12:41 +00:00
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::setCurrentRow() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-07-12 06:56:32 +00:00
m_bBeforeFirst = m_pCache - > isBeforeFirst ( ) ;
m_bAfterLast = m_pCache - > isAfterLast ( ) ;
2006-01-25 12:43:05 +00:00
//m_pCache->resetInsertRow(sal_True);
2001-07-12 06:56:32 +00:00
if ( ! ( m_bBeforeFirst | | m_bAfterLast ) )
{
m_aBookmark = m_pCache - > getBookmark ( ) ;
2001-08-10 07:11:09 +00:00
OSL_ENSURE ( m_aBookmark . hasValue ( ) , " Bookmark has no value! " ) ;
2001-07-12 06:56:32 +00:00
m_aCurrentRow = m_pCache - > m_aMatrixIter ;
2005-09-05 07:57:38 +00:00
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) , " CurrentRow is null! " ) ;
2001-07-12 06:56:32 +00:00
m_aCurrentRow . setBookmark ( m_aBookmark ) ;
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) , " Position of matrix iterator isn't valid! " ) ;
OSL_ENSURE ( m_aCurrentRow - > isValid ( ) , " Currentrow isn't valid " ) ;
2001-11-29 15:35:26 +00:00
OSL_ENSURE ( m_aBookmark . hasValue ( ) , " Bookmark has no value! " ) ;
2001-12-19 14:16:17 +00:00
2006-06-20 01:36:00 +00:00
# if OSL_DEBUG_LEVEL > 0
2003-04-28 14:47:43 +00:00
sal_Int32 nOldRow = m_pCache - > getRow ( ) ;
2006-06-20 01:36:00 +00:00
# endif
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
2006-06-20 01:36:00 +00:00
# if OSL_DEBUG_LEVEL > 0
2003-04-28 14:47:43 +00:00
sal_Int32 nNewRow = m_pCache - > getRow ( ) ;
2006-06-20 01:36:00 +00:00
# endif
2003-06-25 10:02:35 +00:00
OSL_ENSURE ( nOldRow = = nNewRow , " Old position is not equal to new postion " ) ;
2001-12-19 14:16:17 +00:00
m_aCurrentRow = m_pCache - > m_aMatrixIter ;
2005-09-05 07:57:38 +00:00
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) , " CurrentRow is nul after positionCache! " ) ;
2006-07-26 06:45:59 +00:00
# if OSL_DEBUG_LEVEL > 0
ORowSetRow rRow = ( * m_aCurrentRow ) ;
OSL_ENSURE ( rRow . isValid ( ) , " Invalid size of vector! " ) ;
# endif
2002-10-11 10:08:33 +00:00
// the cache could repositioned so we need to adjust the cache
// #104144# OJ
2006-01-25 14:10:18 +00:00
if ( _bMoved & & m_aCurrentRow . isNull ( ) )
2002-10-11 10:08:33 +00:00
{
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
2002-10-11 10:08:33 +00:00
m_aCurrentRow = m_pCache - > m_aMatrixIter ;
2005-09-05 07:57:38 +00:00
OSL_ENSURE ( ! m_aCurrentRow . isNull ( ) , " CurrentRow is nul after positionCache! " ) ;
2002-10-11 10:08:33 +00:00
}
}
2006-01-25 14:10:18 +00:00
else
{
m_aOldRow - > clearRow ( ) ;
m_aCurrentRow = m_pCache - > getEnd ( ) ;
m_aBookmark = Any ( ) ;
m_aCurrentRow . setBookmark ( m_aBookmark ) ;
}
2001-11-08 14:02:00 +00:00
2002-12-05 08:53:00 +00:00
// notification order
// - column values
2006-01-25 14:10:18 +00:00
if ( _bDoNotify )
firePropertyChange ( _rOldValues ) ;
2001-06-26 09:12:41 +00:00
2002-12-05 08:53:00 +00:00
// TODO: can this be done before the notifications?
2004-08-02 14:00:45 +00:00
if ( ! ( m_bBeforeFirst | | m_bAfterLast ) & & ! m_aCurrentRow . isNull ( ) & & m_aCurrentRow - > isValid ( ) & & m_aCurrentRow ! = m_pCache - > getEnd ( ) )
2004-06-01 09:09:07 +00:00
m_aOldRow - > setRow ( new ORowSetValueVector ( m_aCurrentRow - > getBody ( ) ) ) ;
2002-12-05 08:53:00 +00:00
2006-01-25 14:10:18 +00:00
if ( _bMoved & & _bDoNotify )
2002-12-05 08:53:00 +00:00
// - cursorMoved
notifyAllListenersCursorMoved ( _rGuard ) ;
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::setCurrentRow() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-26 09:12:41 +00:00
}
// -----------------------------------------------------------------------------
void ORowSetBase : : checkPositioningAllowed ( ) throw ( SQLException , RuntimeException )
{
if ( ! m_pCache | | m_nResultSetType = = ResultSetType : : FORWARD_ONLY )
throwFunctionSequenceException ( * m_pMySelf ) ;
}
2000-09-18 23:16:46 +00:00
//------------------------------------------------------------------------------
Reference < XInterface > ORowSetBase : : getStatement ( void ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase : : refreshRow ( ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:12:41 +00:00
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-01-25 14:10:18 +00:00
checkCache ( ) ;
if ( rowDeleted ( ) )
throwSQLException ( " The current row is deleted " , SQL_INVALID_CURSOR_STATE , Reference < XRowSet > ( this ) ) ;
2001-06-26 09:12:41 +00:00
if ( ! ( m_bBeforeFirst | | m_bAfterLast ) )
{
2006-01-25 14:10:18 +00:00
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
2001-06-26 09:12:41 +00:00
m_pCache - > refreshRow ( ) ;
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : rowUpdated ( ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2006-02-06 15:54:07 +00:00
if ( rowDeleted ( ) )
return sal_False ;
2006-01-25 14:10:18 +00:00
if ( rowDeleted ( ) )
return sal_False ;
2000-09-18 23:16:46 +00:00
return m_pCache - > rowUpdated ( ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : rowInserted ( ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2006-02-06 15:54:07 +00:00
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2006-02-06 15:54:07 +00:00
if ( rowDeleted ( ) )
return sal_False ;
2006-01-25 14:10:18 +00:00
if ( rowDeleted ( ) )
return sal_False ;
2000-09-18 23:16:46 +00:00
return m_pCache - > rowInserted ( ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase : : rowDeleted ( ) throw ( SQLException , RuntimeException )
{
2001-11-15 09:42:42 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2001-06-26 09:12:41 +00:00
checkCache ( ) ;
2006-01-25 14:10:18 +00:00
return ! m_aBookmark . hasValue ( ) & & ! m_bBeforeFirst & & ! m_bAfterLast ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// XWarningsSupplier
Any SAL_CALL ORowSetBase : : getWarnings ( ) throw ( SQLException , RuntimeException )
{
2004-11-17 13:42:24 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
checkCache ( ) ;
Reference < XWarningsSupplier > xWarnings ( m_pCache - > m_xSet . get ( ) , UNO_QUERY ) ;
if ( xWarnings . is ( ) )
return xWarnings - > getWarnings ( ) ;
2003-04-28 14:47:43 +00:00
return Any ( ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase : : clearWarnings ( ) throw ( SQLException , RuntimeException )
{
2004-11-17 13:42:24 +00:00
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
checkCache ( ) ;
2006-02-06 15:54:07 +00:00
2004-11-17 13:42:24 +00:00
Reference < XWarningsSupplier > xWarnings ( m_pCache - > m_xSet . get ( ) , UNO_QUERY ) ;
if ( xWarnings . is ( ) )
xWarnings - > clearWarnings ( ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2002-12-05 13:10:11 +00:00
void ORowSetBase : : firePropertyChange ( const ORowSetRow & _rOldRow )
2000-09-18 23:16:46 +00:00
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::firePropertyChange() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-07-12 06:56:32 +00:00
OSL_ENSURE ( m_pColumns , " Columns can not be NULL here! " ) ;
2003-04-15 15:02:32 +00:00
# if OSL_DEBUG_LEVEL > 1
2006-08-24 09:54:58 +00:00
sal_Bool bNull ;
ORowSetMatrix : : iterator atest ;
bNull = m_aCurrentRow . isNull ( ) ;
atest = m_aCurrentRow ;
2002-10-11 10:08:33 +00:00
# endif
2000-10-17 09:19:03 +00:00
sal_Int32 i = 0 ;
try
2000-09-18 23:16:46 +00:00
{
2002-10-16 09:56:55 +00:00
for ( TDataColumns : : iterator aIter = m_aDataColumns . begin ( ) ; aIter ! = m_aDataColumns . end ( ) ; + + aIter , + + i ) // #104278# OJ ++i inserted
2008-12-30 13:32:01 +00:00
( * aIter ) - > fireValueChange ( _rOldRow . isValid ( ) ? ( _rOldRow - > get ( ) ) [ i + 1 ] : : : connectivity : : ORowSetValue ( ) ) ;
2000-09-18 23:16:46 +00:00
}
2000-11-15 14:57:40 +00:00
catch ( Exception & )
2000-10-17 09:19:03 +00:00
{
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( 0 , " firePropertyChange: Exception " ) ;
2000-10-17 09:19:03 +00:00
}
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::firePropertyChange() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2000-09-18 23:16:46 +00:00
}
2002-12-05 08:53:00 +00:00
2006-06-20 01:36:00 +00:00
// -----------------------------------------------------------------------------
void ORowSetBase : : fireRowcount ( )
{
}
// -----------------------------------------------------------------------------
sal_Bool ORowSetBase : : notifyAllListenersCursorBeforeMove ( : : osl : : ResettableMutexGuard & /*_rGuard*/ )
{
return sal_True ;
}
// -----------------------------------------------------------------------------
void ORowSetBase : : notifyAllListenersCursorMoved ( : : osl : : ResettableMutexGuard & /*_rGuard*/ )
{
}
// -----------------------------------------------------------------------------
void ORowSetBase : : notifyAllListeners ( : : osl : : ResettableMutexGuard & /*_rGuard*/ )
{
}
2002-12-05 08:53:00 +00:00
// -----------------------------------------------------------------------------
void ORowSetBase : : fireProperty ( sal_Int32 _nProperty , sal_Bool _bNew , sal_Bool _bOld )
{
Any aNew = bool2any ( _bNew ) ;
Any aOld = bool2any ( _bOld ) ;
fire ( & _nProperty , & aNew , & aOld , 1 , sal_False ) ;
}
2000-11-22 13:58:32 +00:00
// -----------------------------------------------------------------------------
2006-01-25 14:10:18 +00:00
void ORowSetBase : : positionCache ( CursorMoveDirection _ePrepareForDirection )
2001-06-22 12:08:06 +00:00
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::positionCache() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2006-01-25 14:10:18 +00:00
sal_Bool bSuccess = sal_False ;
if ( m_aBookmark . hasValue ( ) )
2001-06-22 12:08:06 +00:00
{
2006-01-25 14:10:18 +00:00
bSuccess = m_pCache - > moveToBookmark ( m_aBookmark ) ;
2001-06-22 12:08:06 +00:00
}
else
2006-01-25 14:10:18 +00:00
{
if ( m_bBeforeFirst )
{
bSuccess = m_pCache - > beforeFirst ( ) ;
}
else if ( m_bAfterLast )
{
bSuccess = m_pCache - > afterLast ( ) ;
}
else
{
OSL_ENSURE ( m_nDeletedPosition > = 1 , " ORowSetBase::positionCache: no bookmark, and no valid 'deleted position'! " ) ;
switch ( _ePrepareForDirection )
{
case MOVE_FORWARD :
if ( m_nDeletedPosition > 1 )
bSuccess = m_pCache - > absolute ( m_nDeletedPosition - 1 ) ;
else
{
m_pCache - > beforeFirst ( ) ;
bSuccess = sal_True ;
}
break ;
case MOVE_BACKWARD :
if ( m_pCache - > m_bRowCountFinal & & ( m_nDeletedPosition = = impl_getRowCount ( ) ) )
{
m_pCache - > afterLast ( ) ;
bSuccess = sal_True ;
}
else
bSuccess = m_pCache - > absolute ( m_nDeletedPosition ) ;
break ;
case MOVE_NONE_REFRESH_ONLY :
bSuccess = sal_False ; // will be asserted below
break ;
}
}
}
OSL_ENSURE ( bSuccess , " ORowSetBase::positionCache: failed! " ) ;
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::positionCache() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-06-22 12:08:06 +00:00
}
// -----------------------------------------------------------------------------
2001-06-26 09:12:41 +00:00
void ORowSetBase : : checkCache ( )
{
: : connectivity : : checkDisposed ( m_rBHelper . bDisposed ) ;
if ( ! m_pCache )
throwFunctionSequenceException ( * m_pMySelf ) ;
}
// -----------------------------------------------------------------------------
2001-07-12 06:56:32 +00:00
void ORowSetBase : : movementFailed ( )
{
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::movementFailed() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2003-03-19 16:57:12 +00:00
m_aOldRow - > clearRow ( ) ;
2001-07-12 06:56:32 +00:00
m_aCurrentRow = m_pCache - > getEnd ( ) ;
m_bBeforeFirst = m_pCache - > isBeforeFirst ( ) ;
m_bAfterLast = m_pCache - > isAfterLast ( ) ;
m_aBookmark = Any ( ) ;
m_aCurrentRow . setBookmark ( m_aBookmark ) ;
2001-08-24 05:40:35 +00:00
OSL_ENSURE ( m_bBeforeFirst | | m_bAfterLast , " BeforeFirst or AfterLast is wrong! " ) ;
2006-02-06 15:54:07 +00:00
DBG_TRACE2 ( " DBACCESS ORowSetBase::movementFailed() Clone = %i ID = %i \n " , m_bClone , osl_getThreadIdentifier ( NULL ) ) ;
2001-07-12 06:56:32 +00:00
}
// -----------------------------------------------------------------------------
2003-03-19 16:57:12 +00:00
ORowSetRow ORowSetBase : : getOldRow ( sal_Bool _bWasNew )
{
OSL_ENSURE ( m_aOldRow . isValid ( ) , " RowSetRowHElper isn't valid! " ) ;
ORowSetRow aOldValues ;
if ( ! _bWasNew & & m_aOldRow - > getRow ( ) . isValid ( ) )
aOldValues = new ORowSetValueVector ( m_aOldRow - > getRow ( ) . getBody ( ) ) ; // remember the old values
return aOldValues ;
}
2004-08-02 14:00:45 +00:00
// -----------------------------------------------------------------------------
2006-08-15 09:41:56 +00:00
void ORowSetBase : : getPropertyDefaultByHandle ( sal_Int32 /*_nHandle*/ , Any & _rDefault ) const
2004-08-02 14:00:45 +00:00
{
2006-08-15 09:41:56 +00:00
_rDefault . clear ( ) ;
2004-08-02 14:00:45 +00:00
}
2006-01-25 14:10:18 +00:00
// -----------------------------------------------------------------------------
void ORowSetBase : : onDeleteRow ( const Any & _rBookmark )
{
if ( rowDeleted ( ) )
// not interested in
return ;
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
2009-02-17 15:39:54 +00:00
//OSL_ENSURE( m_aBookmark.hasValue(), "ORowSetBase::onDeleteRow: Bookmark isn't valid!" );
2006-01-25 14:10:18 +00:00
if ( compareBookmarks ( _rBookmark , m_aBookmark ) = = 0 )
{
positionCache ( MOVE_NONE_REFRESH_ONLY ) ;
m_nDeletedPosition = m_pCache - > getRow ( ) ;
}
}
// -----------------------------------------------------------------------------
void ORowSetBase : : onDeletedRow ( const Any & _rBookmark , sal_Int32 _nPos )
{
if ( rowDeleted ( ) )
{
// if we're a clone, and on a deleted row, and the main RowSet deleted another
// row (only the main RowSet can, clones can't), which is *before* our
// deleted position, then we have to adjust this position
if ( m_bClone & & ( _nPos < m_nDeletedPosition ) )
- - m_nDeletedPosition ;
return ;
}
: : osl : : MutexGuard aGuard ( * m_pMutex ) ;
if ( compareBookmarks ( _rBookmark , m_aBookmark ) = = 0 )
{
m_aOldRow - > clearRow ( ) ;
m_aCurrentRow = m_pCache - > getEnd ( ) ;
m_aBookmark = Any ( ) ;
m_aCurrentRow . setBookmark ( m_aBookmark ) ;
}
}
// -----------------------------------------------------------------------------
sal_Int32 ORowSetBase : : impl_getRowCount ( ) const
{
sal_Int32 nRowCount ( m_pCache - > m_nRowCount ) ;
2006-02-06 15:54:07 +00:00
if ( const_cast < ORowSetBase * > ( this ) - > rowDeleted ( ) & & ! m_pCache - > m_bNew )
2006-01-25 14:10:18 +00:00
+ + nRowCount ;
return nRowCount ;
}
2002-12-05 08:53:00 +00:00
// =============================================================================
2005-09-23 11:03:10 +00:00
DBG_NAME ( ORowSetNotifier )
2002-12-05 08:53:00 +00:00
// -----------------------------------------------------------------------------
ORowSetNotifier : : ORowSetNotifier ( ORowSetBase * _pRowSet )
: m_pRowSet ( _pRowSet )
, m_bWasNew ( sal_False )
, m_bWasModified ( sal_False )
# ifdef DBG_UTIL
, m_bNotifyCalled ( sal_False )
# endif
{
2005-09-23 11:03:10 +00:00
DBG_CTOR ( ORowSetNotifier , NULL ) ;
2002-12-05 08:53:00 +00:00
OSL_ENSURE ( m_pRowSet , " ORowSetNotifier::ORowSetNotifier: invalid row set. This wil crash. " ) ;
// remember the "inserted" and "modified" state for later firing
2006-01-25 12:43:05 +00:00
m_bWasNew = m_pRowSet - > isNew ( ORowSetBase : : GrantNotifierAccess ( ) ) ;
2002-12-05 08:53:00 +00:00
m_bWasModified = m_pRowSet - > isModified ( ORowSetBase : : GrantNotifierAccess ( ) ) ;
// if the row set is on the insert row, then we need to cancel this
if ( m_pRowSet - > isModification ( ORowSetBase : : GrantNotifierAccess ( ) ) )
m_pRowSet - > doCancelModification ( ORowSetBase : : GrantNotifierAccess ( ) ) ;
}
// -----------------------------------------------------------------------------
ORowSetNotifier : : ~ ORowSetNotifier ( )
{
2005-09-23 11:03:10 +00:00
DBG_DTOR ( ORowSetNotifier , NULL ) ;
2002-12-05 08:53:00 +00:00
}
// -----------------------------------------------------------------------------
void ORowSetNotifier : : fire ( )
{
// we're not interested in firing changes FALSE->TRUE, only TRUE->FALSE.
// (the former would be quite pathological, e.g. after a failed movement)
if ( m_bWasModified
& & ( m_bWasModified ! = m_pRowSet - > isModified ( ORowSetBase : : GrantNotifierAccess ( ) ) )
)
m_pRowSet - > fireProperty ( PROPERTY_ID_ISMODIFIED , sal_False , sal_True , ORowSetBase : : GrantNotifierAccess ( ) ) ;
if ( m_bWasNew
& & ( m_bWasNew ! = m_pRowSet - > isNew ( ORowSetBase : : GrantNotifierAccess ( ) ) )
)
m_pRowSet - > fireProperty ( PROPERTY_ID_ISNEW , sal_False , sal_True , ORowSetBase : : GrantNotifierAccess ( ) ) ;
# ifdef DBG_UTIL
m_bNotifyCalled = sal_True ;
# endif
}
2000-11-22 13:58:32 +00:00
2001-01-24 10:02:14 +00:00
} // namespace dbaccess