2000-09-18 23:16:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* $RCSfile: RowSetBase.cxx,v $
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2006-04-19 12:18:30 +00:00
|
|
|
* $Revision: 1.85 $
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2006-04-19 12:18:30 +00:00
|
|
|
* last change: $Author: hr $ $Date: 2006-04-19 13:18:30 $
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* The Contents of this file are made available subject to
|
|
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* This library 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 for more details.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2005-09-08 09:01:01 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
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
|
2001-01-24 10:02:14 +00:00
|
|
|
#ifndef _CONNECTIVITY_EMPTYMETADATA_HXX_
|
|
|
|
#include <connectivity/emptymetadata.hxx>
|
|
|
|
#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)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2005-03-10 15:31:23 +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
|
|
|
// -------------------------------------------------------------------------
|
2001-11-15 09:42:42 +00:00
|
|
|
ORowSetBase::ORowSetBase(::cppu::OBroadcastHelper &_rBHelper,::osl::Mutex* _pMutex)
|
2004-08-02 14:00:45 +00:00
|
|
|
: OPropertyStateContainer(_rBHelper)
|
2001-11-15 09:42:42 +00:00
|
|
|
, m_pMutex(_pMutex)
|
2000-09-18 23:16:46 +00:00
|
|
|
, m_rBHelper(_rBHelper)
|
|
|
|
, m_pCache(NULL)
|
|
|
|
, m_pColumns(NULL)
|
2000-09-29 14:23:36 +00:00
|
|
|
, m_bBeforeFirst(sal_True) // changed from sal_False
|
2000-09-18 23:16:46 +00:00
|
|
|
, m_bAfterLast(sal_False)
|
|
|
|
, m_bClone(sal_False)
|
2006-01-25 14:10:18 +00:00
|
|
|
, m_nDeletedPosition(-1)
|
2001-02-23 14:22:32 +00:00
|
|
|
, m_bIgnoreResult(sal_False)
|
2001-08-01 12:12:44 +00:00
|
|
|
, m_nLastColumnIndex(-1)
|
2002-01-18 17:24:07 +00:00
|
|
|
, m_pEmptyCollection( NULL )
|
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
|
|
|
|
2005-09-05 07:57:38 +00:00
|
|
|
return ((m_nLastColumnIndex != -1) && !m_aCurrentRow.isNull() && m_aCurrentRow != m_pCache->getEnd() && m_aCurrentRow->isValid()) ? (*(*m_aCurrentRow))[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
|
|
|
{
|
2006-02-06 15:54:07 +00:00
|
|
|
DBG_TRACE2("DBACCESS ORowSetBase::getValue() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
|
|
|
|
|
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 );
|
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
|
|
|
{
|
|
|
|
DBG_TRACE2("DBACCESS ORowSetBase::getValue() Clone = %i rowDeleted() ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
|
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
|
2002-12-05 08:53:00 +00:00
|
|
|
ORowSetMatrix::iterator aCacheEnd = m_pCache->getEnd();
|
|
|
|
ORowSetMatrix::iterator aCurrentRow = m_aCurrentRow;
|
|
|
|
#endif
|
2005-09-05 07:57:38 +00:00
|
|
|
OSL_ENSURE(!m_aCurrentRow.isNull() && m_aCurrentRow <= m_pCache->getEnd(),"Invalid iterator set for currentrow!");
|
2001-07-30 07:53:02 +00:00
|
|
|
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
|
2002-11-13 05:56:59 +00:00
|
|
|
}
|
2001-07-12 06:56:32 +00:00
|
|
|
|
2006-02-06 15:54:07 +00:00
|
|
|
DBG_TRACE2("DBACCESS ORowSetBase::getValue() Clone = %i EmptyValue ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
|
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
|
|
|
|
2006-02-06 15:54:07 +00:00
|
|
|
|
2005-09-05 07:57:38 +00:00
|
|
|
if( !m_aCurrentRow.isNull() && m_aCurrentRow != m_pCache->getEnd())
|
2000-10-18 15:32:08 +00:00
|
|
|
return new ::comphelper::SequenceInputStream((*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex].getSequence());
|
2001-07-12 06:56:32 +00:00
|
|
|
else
|
|
|
|
{
|
2005-09-05 07:57:38 +00:00
|
|
|
if(!m_aCurrentRow.isNull())
|
2006-01-25 14:10:18 +00:00
|
|
|
OSL_ENSURE((m_bBeforeFirst || m_bAfterLast),"ORowSetBase::getBinaryStream: we don't stand on a valid row! Row is equal to end of matrix");
|
2001-07-12 06:56:32 +00:00
|
|
|
else
|
2001-07-12 11:14:47 +00:00
|
|
|
{
|
2006-01-25 14:10:18 +00:00
|
|
|
if ( rowDeleted() )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
positionCache( MOVE_NONE_REFRESH_ONLY );
|
2001-07-12 11:14:47 +00:00
|
|
|
m_aCurrentRow = m_pCache->m_aMatrixIter;
|
|
|
|
|
2006-01-25 14:10:18 +00:00
|
|
|
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
|
|
|
return getBinaryStream(columnIndex);
|
|
|
|
}
|
2001-07-12 06:56:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
Any SAL_CALL ORowSetBase::getObject( sal_Int32 columnIndex, const Reference< XNameAccess >& typeMap ) 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
|
|
|
|
2006-04-19 12:18:30 +00:00
|
|
|
return getValue(columnIndex).makeAny();
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
Reference< XRef > SAL_CALL ORowSetBase::getRef( 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-18 23:16:46 +00:00
|
|
|
|
2000-09-29 14:23:36 +00:00
|
|
|
return Reference< XRef >();
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
Reference< XBlob > SAL_CALL ORowSetBase::getBlob( 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-18 23:16:46 +00:00
|
|
|
|
2000-09-29 14:23:36 +00:00
|
|
|
return Reference< XBlob >();
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
Reference< XClob > SAL_CALL ORowSetBase::getClob( 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
|
|
|
|
|
|
|
return Reference< XClob >();
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
Reference< XArray > SAL_CALL ORowSetBase::getArray( 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
|
|
|
|
|
|
|
return Reference< XArray >();
|
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 );
|
|
|
|
|
|
|
|
if ( rowDeleted() )
|
|
|
|
throwSQLException( "The current row is deleted, and this doesn't have a bookmark.", SQL_INVALID_CURSOR_POSITION, *m_pMySelf );
|
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
|
|
|
|
2001-04-06 09:19:13 +00:00
|
|
|
sal_Bool bRet;
|
2002-08-13 10:13:00 +00:00
|
|
|
if(bRet = notifyAllListenersCursorBeforeMove(aGuard))
|
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();
|
|
|
|
|
2001-04-06 09:19:13 +00:00
|
|
|
sal_Bool bRet;
|
2002-08-13 10:13:00 +00:00
|
|
|
if(bRet = notifyAllListenersCursorBeforeMove(aGuard))
|
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;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
sal_Int32 SAL_CALL ORowSetBase::compareBookmarks( const Any& first, const Any& second ) 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->compareBookmarks(first,second);
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
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();
|
|
|
|
else
|
|
|
|
xMeta = new OEmptyMetaData();
|
|
|
|
|
|
|
|
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
|
|
|
|
2001-04-06 09:19:13 +00:00
|
|
|
sal_Bool bRet;
|
2002-08-13 10:13:00 +00:00
|
|
|
if(bRet = notifyAllListenersCursorBeforeMove(aGuard))
|
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() )
|
|
|
|
if ( !m_pCache->m_bRowCountFinal )
|
|
|
|
return sal_False;
|
|
|
|
else
|
|
|
|
return ( m_nDeletedPosition == impl_getRowCount() );
|
|
|
|
|
|
|
|
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
|
|
|
|
2001-04-06 09:19:13 +00:00
|
|
|
sal_Bool bRet;
|
2002-08-13 10:13:00 +00:00
|
|
|
if(bRet = notifyAllListenersCursorBeforeMove(aGuard) )
|
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-01-25 14:10:18 +00:00
|
|
|
sal_Bool bRet = row > 0;
|
2002-08-13 10:13:00 +00:00
|
|
|
if ( bRet && (bRet = 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
|
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-01-25 14:10:18 +00:00
|
|
|
sal_Bool bRet =!((m_bAfterLast && rows > 0) || (m_bBeforeFirst && rows < 0)); // we are already behind the last row or before the first
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2000-09-29 14:23:36 +00:00
|
|
|
|
2002-08-13 10:13:00 +00:00
|
|
|
if(bRet && (bRet = 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
|
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
|
|
|
|
2001-06-26 09:12:41 +00:00
|
|
|
sal_Bool bRet = !m_bBeforeFirst;
|
2000-09-29 14:23:36 +00:00
|
|
|
|
2002-08-13 10:13:00 +00:00
|
|
|
if(bRet && (bRet = 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
|
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
|
|
|
|
2003-04-28 14:47:43 +00:00
|
|
|
sal_Int32 nOldRow = m_pCache->getRow();
|
2006-01-25 14:10:18 +00:00
|
|
|
positionCache( MOVE_NONE_REFRESH_ONLY );
|
2003-04-28 14:47:43 +00:00
|
|
|
sal_Int32 nNewRow = m_pCache->getRow();
|
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!");
|
2001-06-26 09:12:41 +00:00
|
|
|
|
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
|
2002-10-11 10:08:33 +00:00
|
|
|
sal_Bool bNull = m_aCurrentRow.isNull();
|
|
|
|
ORowSetMatrix::iterator atest = m_aCurrentRow;
|
|
|
|
#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
|
2002-12-05 13:10:11 +00:00
|
|
|
(*aIter)->fireValueChange(_rOldRow.isValid() ? (*_rOldRow)[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
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
sal_Bool ORowSetBase::isModification( )
|
|
|
|
{
|
2006-02-06 15:54:07 +00:00
|
|
|
return m_pCache && m_pCache->m_bNew;
|
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
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
Any ORowSetBase::getPropertyDefaultByHandle( sal_Int32 _nHandle ) const
|
|
|
|
{
|
|
|
|
return Any();
|
|
|
|
}
|
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 );
|
|
|
|
OSL_ENSURE( m_aBookmark.hasValue(), "ORowSetBase::onDeleteRow: Bookmark isn't valid!" );
|
|
|
|
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
|