Files
libreoffice/dbaccess/source/core/api/RowSetBase.cxx

1475 lines
53 KiB
C++
Raw Normal View History

2000-09-18 23:16:46 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2000-09-18 23:16:46 +00:00
*
* Copyright 2008 by Sun Microsystems, Inc.
2000-09-18 23:16:46 +00:00
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 23:16:46 +00:00
*
* $RCSfile: RowSetBase.cxx,v $
* $Revision: 1.95 $
2000-09-18 23:16:46 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 23:16:46 +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
*
* 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
*
* 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
*
************************************************************************/
// 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
#ifndef _COM_SUN_STAR_SDBC_RESULTSETCONCURRENCY_HPP_
#include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
#endif
#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
#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
#ifndef _OSL_THREAD_H_
#include <osl/thread.h>
#endif
#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;
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;
using namespace ::com::sun::star::util;
2000-09-18 23:16:46 +00:00
using namespace ::cppu;
using namespace ::osl;
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);
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)
{
}
// -----------------------------------------------------------------------------
connectivity::sdbcx::ObjectType OEmptyCollection::createObject(const ::rtl::OUString& /*_rName*/)
2001-10-12 11:02:56 +00:00
{
return connectivity::sdbcx::ObjectType();
2001-10-12 11:02:56 +00:00
}
// -----------------------------------------------------------------------------
// =========================================================================
// = ORowSetBase
// =========================================================================
DBG_NAME(ORowSetBase)
2000-09-18 23:16:46 +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
{
DBG_CTOR(ORowSetBase,NULL);
2000-09-18 23:16:46 +00:00
sal_Int32 nRBT = PropertyAttribute::READONLY | PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT;
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)
{
TDataColumns().swap(m_aDataColumns);
m_pColumns->acquire();
m_pColumns->disposing();
2001-04-20 10:44:05 +00:00
delete m_pColumns;
m_pColumns = NULL;
}
if ( m_pEmptyCollection )
delete m_pEmptyCollection;
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)
{
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)
{
Any aRet = ORowSetBase_BASE::queryInterface(rType);
2000-09-18 23:16:46 +00:00
if(!aRet.hasValue())
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:
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:
OPropertyStateContainer::getFastPropertyValue(rValue,nHandle);
2000-09-18 23:16:46 +00:00
};
}
else
OPropertyStateContainer::getFastPropertyValue(rValue,nHandle);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// OComponentHelper
void SAL_CALL ORowSetBase::disposing(void)
{
MutexGuard aGuard(*m_pMutex);
2000-09-18 23:16:46 +00:00
if ( m_pColumns )
{
TDataColumns().swap(m_aDataColumns);
2000-09-18 23:16:46 +00:00
m_pColumns->disposing();
}
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-29 14:23:36 +00:00
CWS-TOOLING: integrate CWS sb102 2008-12-11 16:18:12 +0100 sb r265332 : #i95065# cleanup, to make Windows linking work 2008-12-11 16:16:03 +0100 sb r265331 : #i95065# missing SAL_DLLPUBLIC_EXPORT 2008-12-09 17:40:28 +0100 sb r265122 : #i94469# move CJK specific configuration data to brand layer 2008-12-09 16:09:08 +0100 sb r265112 : #i96959# use PTHREAD_MUTEX_RECURSIVE on all platforms 2008-12-09 15:54:31 +0100 sb r265110 : #i95065# do not derive apphelper::LifeTimeGuard from osl::ResettableMutexGuard to avoid problems with VISIBILITY_HIDDEN=TRUE on MSC 2008-12-09 15:40:51 +0100 sb r265104 : #i95065# add VISIBILITY_HIDDEN=TRUE to connectivity/source/drivers/mozab 2008-12-09 15:36:21 +0100 sb r265102 : #i95501# updated SDK_HOME 2008-12-09 15:31:46 +0100 sb r265099 : typo (temppath vs. tmppath) 2008-12-08 11:48:08 +0100 sb r264979 : #i95065# removed spurious ExplicitCategoriesProvider.obj (ExplicitCategoriesProvider.cxx is not in this directory) 2008-12-07 19:41:07 +0100 sb r264960 : #i96994# erroneously doubled backslash caused visibility feature to be disabled for all GCC versions on Mac OS X 2008-12-06 23:54:49 +0100 sb r264948 : changes from trunk that CWS-TOOLING's rebase to DEV300:m37 (r264891) had missed, as files had been moved around on this CWS 2008-12-05 20:29:23 +0100 sb r264919 : #i85508# versions of flex apparently differ in whether input() resp. yyinput() returns zero or EOF upon end of file 2008-12-05 15:37:23 +0100 sb r264908 : #i95315# removed obsolete jut 2008-12-05 15:34:59 +0100 sb r264907 : #i95531# removed empty obsolete directories 2008-12-05 10:09:23 +0100 sb r264891 : CWS-TOOLING: rebase CWS sb102 to trunk@264807 (milestone: DEV300:m37) 2008-12-04 14:50:20 +0100 sb r264845 : #i95065# introduced VISIBILITY_HIDDEN makefile flag to reduce duplications; made additional libraries use VISIBILITY_HIDDEN=TRUE to avoid warnings with recent GCC 4 versions (had to split certain code directories to make changes that would otherwise erroneously affect multiple libraries built in the same makefile); changed connectivity::ORefVector to no longer derive from std::vector, as that caused problems with the MSC implementation of VISIBILITY_HIDDEN=TRUE; replaced uses of JNIEXPORT with SAL_DLLPUBLIC_EXPORT, as the former does not expand to visibility attributes on some platforms where the latter does 2008-12-03 11:29:38 +0100 sb r264759 : #i94583# remove unnecessary (and wrong) assertion check for rtl_getAppCommandArg return value (which is guaranteed to return osl_Process_E_None or not return at all) 2008-12-02 17:18:31 +0100 sb r264724 : #i96809# silenced GCC 4.3.2 warning 2008-12-02 13:29:34 +0100 sb r264695 : #i96797# make get_tmp_dir fail less often 2008-11-28 17:19:24 +0100 sb r264566 : #i95691# inadvertently missing from -c 264564 2008-11-28 17:07:50 +0100 sb r264564 : #i95691# only structs of exactly 1, 2, 4, or 8 bytes are returned through registers 2008-11-25 13:28:08 +0100 sb r264291 : #i96427# support for SAL_EXCEPTION_DLLPUBLIC_EXPORT (patch by np) 2008-11-21 14:45:22 +0100 sb r264140 : #i95428# added SAL_EXCEPTION_DLLPUBLIC_EXPORT and SAL_EXCEPTION_DLLPRIVATE 2008-11-19 13:19:37 +0100 sb r263984 : #i95525# removed erroneous application/octet-stream svn:mime-type properties
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
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
2001-07-30 07:53:02 +00:00
const ORowSetValue& ORowSetBase::getValue(sal_Int32 columnIndex)
2000-09-18 23:16:46 +00:00
{
checkCache();
if ( m_bBeforeFirst || m_bAfterLast )
{
OSL_ENSURE(0,"ORowSetBase::getValue: 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
}
2000-09-18 23:16:46 +00:00
if ( rowDeleted() )
{
return m_aEmptyValue;
}
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 )
{
#if OSL_DEBUG_LEVEL > 0
ORowSetMatrix::iterator aCacheEnd;
ORowSetMatrix::iterator aCurrentRow;
aCacheEnd = m_pCache->getEnd();
aCurrentRow = m_aCurrentRow;
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);
CWS-TOOLING: integrate CWS sb102 2008-12-11 16:18:12 +0100 sb r265332 : #i95065# cleanup, to make Windows linking work 2008-12-11 16:16:03 +0100 sb r265331 : #i95065# missing SAL_DLLPUBLIC_EXPORT 2008-12-09 17:40:28 +0100 sb r265122 : #i94469# move CJK specific configuration data to brand layer 2008-12-09 16:09:08 +0100 sb r265112 : #i96959# use PTHREAD_MUTEX_RECURSIVE on all platforms 2008-12-09 15:54:31 +0100 sb r265110 : #i95065# do not derive apphelper::LifeTimeGuard from osl::ResettableMutexGuard to avoid problems with VISIBILITY_HIDDEN=TRUE on MSC 2008-12-09 15:40:51 +0100 sb r265104 : #i95065# add VISIBILITY_HIDDEN=TRUE to connectivity/source/drivers/mozab 2008-12-09 15:36:21 +0100 sb r265102 : #i95501# updated SDK_HOME 2008-12-09 15:31:46 +0100 sb r265099 : typo (temppath vs. tmppath) 2008-12-08 11:48:08 +0100 sb r264979 : #i95065# removed spurious ExplicitCategoriesProvider.obj (ExplicitCategoriesProvider.cxx is not in this directory) 2008-12-07 19:41:07 +0100 sb r264960 : #i96994# erroneously doubled backslash caused visibility feature to be disabled for all GCC versions on Mac OS X 2008-12-06 23:54:49 +0100 sb r264948 : changes from trunk that CWS-TOOLING's rebase to DEV300:m37 (r264891) had missed, as files had been moved around on this CWS 2008-12-05 20:29:23 +0100 sb r264919 : #i85508# versions of flex apparently differ in whether input() resp. yyinput() returns zero or EOF upon end of file 2008-12-05 15:37:23 +0100 sb r264908 : #i95315# removed obsolete jut 2008-12-05 15:34:59 +0100 sb r264907 : #i95531# removed empty obsolete directories 2008-12-05 10:09:23 +0100 sb r264891 : CWS-TOOLING: rebase CWS sb102 to trunk@264807 (milestone: DEV300:m37) 2008-12-04 14:50:20 +0100 sb r264845 : #i95065# introduced VISIBILITY_HIDDEN makefile flag to reduce duplications; made additional libraries use VISIBILITY_HIDDEN=TRUE to avoid warnings with recent GCC 4 versions (had to split certain code directories to make changes that would otherwise erroneously affect multiple libraries built in the same makefile); changed connectivity::ORefVector to no longer derive from std::vector, as that caused problems with the MSC implementation of VISIBILITY_HIDDEN=TRUE; replaced uses of JNIEXPORT with SAL_DLLPUBLIC_EXPORT, as the former does not expand to visibility attributes on some platforms where the latter does 2008-12-03 11:29:38 +0100 sb r264759 : #i94583# remove unnecessary (and wrong) assertion check for rtl_getAppCommandArg return value (which is guaranteed to return osl_Process_E_None or not return at all) 2008-12-02 17:18:31 +0100 sb r264724 : #i96809# silenced GCC 4.3.2 warning 2008-12-02 13:29:34 +0100 sb r264695 : #i96797# make get_tmp_dir fail less often 2008-11-28 17:19:24 +0100 sb r264566 : #i95691# inadvertently missing from -c 264564 2008-11-28 17:07:50 +0100 sb r264564 : #i95691# only structs of exactly 1, 2, 4, or 8 bytes are returned through registers 2008-11-25 13:28:08 +0100 sb r264291 : #i96427# support for SAL_EXCEPTION_DLLPUBLIC_EXPORT (patch by np) 2008-11-21 14:45:22 +0100 sb r264140 : #i95428# added SAL_EXCEPTION_DLLPUBLIC_EXPORT and SAL_EXCEPTION_DLLPRIVATE 2008-11-19 13:19:37 +0100 sb r263984 : #i95525# removed erroneous application/octet-stream svn:mime-type properties
2008-12-30 13:32:01 +00:00
OSL_ENSURE(rRow.isValid() && static_cast<sal_uInt16>(columnIndex) < (rRow->get()).size(),"Invalid size of vector!");
#endif
CWS-TOOLING: integrate CWS sb102 2008-12-11 16:18:12 +0100 sb r265332 : #i95065# cleanup, to make Windows linking work 2008-12-11 16:16:03 +0100 sb r265331 : #i95065# missing SAL_DLLPUBLIC_EXPORT 2008-12-09 17:40:28 +0100 sb r265122 : #i94469# move CJK specific configuration data to brand layer 2008-12-09 16:09:08 +0100 sb r265112 : #i96959# use PTHREAD_MUTEX_RECURSIVE on all platforms 2008-12-09 15:54:31 +0100 sb r265110 : #i95065# do not derive apphelper::LifeTimeGuard from osl::ResettableMutexGuard to avoid problems with VISIBILITY_HIDDEN=TRUE on MSC 2008-12-09 15:40:51 +0100 sb r265104 : #i95065# add VISIBILITY_HIDDEN=TRUE to connectivity/source/drivers/mozab 2008-12-09 15:36:21 +0100 sb r265102 : #i95501# updated SDK_HOME 2008-12-09 15:31:46 +0100 sb r265099 : typo (temppath vs. tmppath) 2008-12-08 11:48:08 +0100 sb r264979 : #i95065# removed spurious ExplicitCategoriesProvider.obj (ExplicitCategoriesProvider.cxx is not in this directory) 2008-12-07 19:41:07 +0100 sb r264960 : #i96994# erroneously doubled backslash caused visibility feature to be disabled for all GCC versions on Mac OS X 2008-12-06 23:54:49 +0100 sb r264948 : changes from trunk that CWS-TOOLING's rebase to DEV300:m37 (r264891) had missed, as files had been moved around on this CWS 2008-12-05 20:29:23 +0100 sb r264919 : #i85508# versions of flex apparently differ in whether input() resp. yyinput() returns zero or EOF upon end of file 2008-12-05 15:37:23 +0100 sb r264908 : #i95315# removed obsolete jut 2008-12-05 15:34:59 +0100 sb r264907 : #i95531# removed empty obsolete directories 2008-12-05 10:09:23 +0100 sb r264891 : CWS-TOOLING: rebase CWS sb102 to trunk@264807 (milestone: DEV300:m37) 2008-12-04 14:50:20 +0100 sb r264845 : #i95065# introduced VISIBILITY_HIDDEN makefile flag to reduce duplications; made additional libraries use VISIBILITY_HIDDEN=TRUE to avoid warnings with recent GCC 4 versions (had to split certain code directories to make changes that would otherwise erroneously affect multiple libraries built in the same makefile); changed connectivity::ORefVector to no longer derive from std::vector, as that caused problems with the MSC implementation of VISIBILITY_HIDDEN=TRUE; replaced uses of JNIEXPORT with SAL_DLLPUBLIC_EXPORT, as the former does not expand to visibility attributes on some platforms where the latter does 2008-12-03 11:29:38 +0100 sb r264759 : #i94583# remove unnecessary (and wrong) assertion check for rtl_getAppCommandArg return value (which is guaranteed to return osl_Process_E_None or not return at all) 2008-12-02 17:18:31 +0100 sb r264724 : #i96809# silenced GCC 4.3.2 warning 2008-12-02 13:29:34 +0100 sb r264695 : #i96797# make get_tmp_dir fail less often 2008-11-28 17:19:24 +0100 sb r264566 : #i95691# inadvertently missing from -c 264564 2008-11-28 17:07:50 +0100 sb r264564 : #i95691# only structs of exactly 1, 2, 4, or 8 bytes are returned through registers 2008-11-25 13:28:08 +0100 sb r264291 : #i96427# support for SAL_EXCEPTION_DLLPUBLIC_EXPORT (patch by np) 2008-11-21 14:45:22 +0100 sb r264140 : #i95428# added SAL_EXCEPTION_DLLPUBLIC_EXPORT and SAL_EXCEPTION_DLLPRIVATE 2008-11-19 13:19:37 +0100 sb r263984 : #i95525# removed erroneous application/octet-stream svn:mime-type properties
2008-12-30 13:32:01 +00:00
return ((*m_aCurrentRow)->get())[m_nLastColumnIndex = columnIndex];
}
// we should normally never reach this
2001-07-30 07:53:02 +00:00
return m_aEmptyValue;
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ORowSetBase::getString( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::getBoolean( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int8 SAL_CALL ORowSetBase::getByte( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int16 SAL_CALL ORowSetBase::getShort( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase::getInt( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int64 SAL_CALL ORowSetBase::getLong( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
float SAL_CALL ORowSetBase::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
double SAL_CALL ORowSetBase::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
return getValue(columnIndex);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Sequence< sal_Int8 > SAL_CALL ORowSetBase::getBytes( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-29 14:23:36 +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
}
if ( rowDeleted() )
{
return NULL;
}
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
bValidCurrentRow = ( !m_aCurrentRow.isNull() && m_aCurrentRow != m_pCache->getEnd() && m_aCurrentRow->isValid() );
}
if ( bValidCurrentRow )
CWS-TOOLING: integrate CWS sb102 2008-12-11 16:18:12 +0100 sb r265332 : #i95065# cleanup, to make Windows linking work 2008-12-11 16:16:03 +0100 sb r265331 : #i95065# missing SAL_DLLPUBLIC_EXPORT 2008-12-09 17:40:28 +0100 sb r265122 : #i94469# move CJK specific configuration data to brand layer 2008-12-09 16:09:08 +0100 sb r265112 : #i96959# use PTHREAD_MUTEX_RECURSIVE on all platforms 2008-12-09 15:54:31 +0100 sb r265110 : #i95065# do not derive apphelper::LifeTimeGuard from osl::ResettableMutexGuard to avoid problems with VISIBILITY_HIDDEN=TRUE on MSC 2008-12-09 15:40:51 +0100 sb r265104 : #i95065# add VISIBILITY_HIDDEN=TRUE to connectivity/source/drivers/mozab 2008-12-09 15:36:21 +0100 sb r265102 : #i95501# updated SDK_HOME 2008-12-09 15:31:46 +0100 sb r265099 : typo (temppath vs. tmppath) 2008-12-08 11:48:08 +0100 sb r264979 : #i95065# removed spurious ExplicitCategoriesProvider.obj (ExplicitCategoriesProvider.cxx is not in this directory) 2008-12-07 19:41:07 +0100 sb r264960 : #i96994# erroneously doubled backslash caused visibility feature to be disabled for all GCC versions on Mac OS X 2008-12-06 23:54:49 +0100 sb r264948 : changes from trunk that CWS-TOOLING's rebase to DEV300:m37 (r264891) had missed, as files had been moved around on this CWS 2008-12-05 20:29:23 +0100 sb r264919 : #i85508# versions of flex apparently differ in whether input() resp. yyinput() returns zero or EOF upon end of file 2008-12-05 15:37:23 +0100 sb r264908 : #i95315# removed obsolete jut 2008-12-05 15:34:59 +0100 sb r264907 : #i95531# removed empty obsolete directories 2008-12-05 10:09:23 +0100 sb r264891 : CWS-TOOLING: rebase CWS sb102 to trunk@264807 (milestone: DEV300:m37) 2008-12-04 14:50:20 +0100 sb r264845 : #i95065# introduced VISIBILITY_HIDDEN makefile flag to reduce duplications; made additional libraries use VISIBILITY_HIDDEN=TRUE to avoid warnings with recent GCC 4 versions (had to split certain code directories to make changes that would otherwise erroneously affect multiple libraries built in the same makefile); changed connectivity::ORefVector to no longer derive from std::vector, as that caused problems with the MSC implementation of VISIBILITY_HIDDEN=TRUE; replaced uses of JNIEXPORT with SAL_DLLPUBLIC_EXPORT, as the former does not expand to visibility attributes on some platforms where the latter does 2008-12-03 11:29:38 +0100 sb r264759 : #i94583# remove unnecessary (and wrong) assertion check for rtl_getAppCommandArg return value (which is guaranteed to return osl_Process_E_None or not return at all) 2008-12-02 17:18:31 +0100 sb r264724 : #i96809# silenced GCC 4.3.2 warning 2008-12-02 13:29:34 +0100 sb r264695 : #i96797# make get_tmp_dir fail less often 2008-11-28 17:19:24 +0100 sb r264566 : #i95691# inadvertently missing from -c 264564 2008-11-28 17:07:50 +0100 sb r264564 : #i95691# only structs of exactly 1, 2, 4, or 8 bytes are returned through registers 2008-11-25 13:28:08 +0100 sb r264291 : #i96427# support for SAL_EXCEPTION_DLLPUBLIC_EXPORT (patch by np) 2008-11-21 14:45:22 +0100 sb r264140 : #i95428# added SAL_EXCEPTION_DLLPUBLIC_EXPORT and SAL_EXCEPTION_DLLPRIVATE 2008-11-19 13:19:37 +0100 sb r263984 : #i95525# removed erroneous application/octet-stream svn:mime-type properties
2008-12-30 13:32:01 +00:00
return new ::comphelper::SequenceInputStream(((*m_aCurrentRow)->get())[m_nLastColumnIndex = columnIndex].getSequence());
// 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)
{
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)
2000-09-18 23:16:46 +00:00
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-18 23:16:46 +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)
2000-09-18 23:16:46 +00:00
{
::dbtools::throwFeatureNotImplementedException( "XRow::getRef", *m_pMySelf );
return NULL;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference< XBlob > SAL_CALL ORowSetBase::getBlob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
2000-09-18 23:16:46 +00:00
{
::dbtools::throwFeatureNotImplementedException( "XRow::getBlob", *m_pMySelf );
return NULL;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference< XClob > SAL_CALL ORowSetBase::getClob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
2000-09-18 23:16:46 +00:00
{
::dbtools::throwFeatureNotImplementedException( "XRow::getClob", *m_pMySelf );
return NULL;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference< XArray > SAL_CALL ORowSetBase::getArray( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
2000-09-18 23:16:46 +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)
{
DBG_TRACE2("DBACCESS ORowSetBase::getBookmark() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
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 );
// TODO: resource
if ( rowDeleted() )
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
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)
{
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!");
::osl::ResettableMutexGuard aGuard( *m_pMutex );
if(!bookmark.hasValue() || m_nResultSetType == ResultSetType::FORWARD_ONLY)
{
if(bookmark.hasValue())
OSL_ENSURE(0,"MoveToBookmark is not possible when we are only forward");
else
OSL_ENSURE(0,"Bookmark is not valid");
throwFunctionSequenceException(*m_pMySelf);
}
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
checkCache();
2000-09-29 14:23:36 +00:00
sal_Bool bRet( notifyAllListenersCursorBeforeMove( aGuard ) );
if ( bRet )
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
2000-09-29 14:23:36 +00:00
ORowSetRow aOldValues = getOldRow(bWasNew);
2000-09-18 23:16:46 +00:00
bRet = m_pCache->moveToBookmark(bookmark);
doCancelModification( );
if(bRet)
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
}
else
{
movementFailed();
}
// - IsModified
// - IsNew
aNotifier.fire( );
2000-09-29 14:23:36 +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)
{
DBG_TRACE2("DBACCESS ORowSetBase::moveRelativeToBookmark(Any,%i) Clone = %i\n",rows,m_bClone);
::connectivity::checkDisposed(m_rBHelper.bDisposed);
2000-09-29 14:23:36 +00:00
::osl::ResettableMutexGuard aGuard( *m_pMutex );
2000-09-29 14:23:36 +00:00
checkPositioningAllowed();
sal_Bool bRet( notifyAllListenersCursorBeforeMove( aGuard ) );
if ( bRet )
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
2000-09-29 14:23:36 +00:00
ORowSetRow aOldValues = getOldRow(bWasNew);
2000-09-18 23:16:46 +00:00
bRet = m_pCache->moveRelativeToBookmark(bookmark,rows);
doCancelModification( );
if(bRet)
2001-01-24 08:52:19 +00:00
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
2001-01-24 08:52:19 +00:00
}
else
movementFailed();
// - IsModified
// - IsNew
aNotifier.fire( );
// RowCount/IsRowCountFinal
fireRowcount();
2000-09-29 14:23:36 +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)
2000-09-18 23:16:46 +00:00
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
return m_pCache->compareBookmarks(_first,_second);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::hasOrderedBookmarks( ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-18 23:16:46 +00:00
return m_pCache->hashBookmark(bookmark);
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// XResultSetMetaDataSupplier
Reference< XResultSetMetaData > SAL_CALL ORowSetBase::getMetaData( ) throw(SQLException, RuntimeException)
{
::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)
{
::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)
{
::connectivity::checkDisposed(m_rBHelper.bDisposed);
2000-09-18 23:16:46 +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
{
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)
{
DBG_TRACE2("DBACCESS ORowSetBase::next() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::osl::ResettableMutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-18 23:16:46 +00:00
sal_Bool bRet( notifyAllListenersCursorBeforeMove( aGuard ) );
if ( bRet )
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
ORowSetRow aOldValues = getOldRow(bWasNew);
2001-12-19 14:16:17 +00:00
positionCache( MOVE_FORWARD );
sal_Bool bAfterLast = m_pCache->isAfterLast();
bRet = m_pCache->next();
doCancelModification( );
if ( bRet || bAfterLast != m_pCache->isAfterLast() )
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( bRet, sal_True, aOldValues, aGuard );
OSL_ENSURE(!m_bBeforeFirst,"BeforeFirst is true. I don't know why?");
}
else
{
// moved after the last row
movementFailed();
OSL_ENSURE(m_bAfterLast,"AfterLast is false. I don't know why?");
}
// - IsModified
// - IsNew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
2000-11-10 15:05:41 +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)
{
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
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)
{
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
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
}
// -------------------------------------------------------------------------
sal_Bool ORowSetBase::isOnFirst()
{
return isFirst();
}
// -------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
sal_Bool SAL_CALL ORowSetBase::isFirst( ) throw(SQLException, RuntimeException)
{
DBG_TRACE2("DBACCESS ORowSetBase::isFirst() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-18 23:16:46 +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
DBG_TRACE2("DBACCESS ORowSetBase::isFirst() = %i Clone = %i\n",bIsFirst,m_bClone);
return bIsFirst;
2000-09-18 23:16:46 +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)
{
DBG_TRACE2("DBACCESS ORowSetBase::isLast() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
if ( m_bBeforeFirst || m_bAfterLast )
return sal_False;
if ( rowDeleted() )
CWS-TOOLING: integrate CWS cmcfixes51 2008-12-08 10:12:55 +0100 cmc r264975 : #i96203# protect with ifdefs to avoid unused symbol on mac 2008-12-05 12:23:47 +0100 cmc r264898 : CWS-TOOLING: rebase CWS cmcfixes51 to trunk@264807 (milestone: DEV300:m37) 2008-12-01 14:45:17 +0100 cmc r264606 : #i76655# ehlos apparently required 2008-11-28 17:49:30 +0100 cmc r264567 : #i96655# remove newly unused method 2008-11-28 10:41:28 +0100 cmc r264531 : #i96647# better ppc-bridges flushCode impl 2008-11-27 12:58:40 +0100 cmc r264478 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 12:32:49 +0100 cmc r264476 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 12:26:02 +0100 cmc r264475 : #i96655# redundant old table export helpers 2008-11-27 11:49:06 +0100 cmc r264473 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 11:38:35 +0100 cmc r264471 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 11:14:21 +0100 cmc r264467 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 11:06:22 +0100 cmc r264464 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:58:18 +0100 cmc r264462 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:41:44 +0100 cmc r264461 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:19:24 +0100 cmc r264460 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:13:39 +0100 cmc r264459 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:06:14 +0100 cmc r264458 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:59:54 +0100 cmc r264457 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:52:51 +0100 cmc r264456 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:48:26 +0100 cmc r264454 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:40:20 +0100 cmc r264452 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:35:26 +0100 cmc r264451 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:31:00 +0100 cmc r264450 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:24:08 +0100 cmc r264449 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 00:26:15 +0100 cmc r264443 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 00:21:01 +0100 cmc r264442 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 00:09:40 +0100 cmc r264441 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 23:51:56 +0100 cmc r264440 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 23:49:09 +0100 cmc r264439 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 18:09:54 +0100 cmc r264432 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 18:07:40 +0100 cmc r264431 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 17:28:02 +0100 cmc r264429 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 17:27:39 +0100 cmc r264428 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 17:18:36 +0100 cmc r264426 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 16:22:16 +0100 cmc r264415 : #i96624# make implicit braces and brackets explicit to avoid warnings 2008-11-26 16:00:23 +0100 cmc r264409 : #i90426# remove warnings from svtools 2008-11-26 15:59:17 +0100 cmc r264408 : #i90426# remove warnings 2008-11-26 15:47:32 +0100 cmc r264404 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:46:57 +0100 cmc r264394 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:19:50 +0100 cmc r264387 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:15:26 +0100 cmc r264386 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:11:26 +0100 cmc r264384 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 13:44:23 +0100 cmc r264380 : #i96084# comfirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 13:12:24 +0100 cmc r264372 : #i96604# silence new warnings 2008-11-26 12:35:02 +0100 cmc r264369 : #i96203# make qstarter work in 3-layer land 2008-11-26 12:33:04 +0100 cmc r264368 : #i96170# ensure gtypes are up and running
2008-12-11 07:05:03 +00:00
{
if ( !m_pCache->m_bRowCountFinal )
return sal_False;
else
return ( m_nDeletedPosition == impl_getRowCount() );
CWS-TOOLING: integrate CWS cmcfixes51 2008-12-08 10:12:55 +0100 cmc r264975 : #i96203# protect with ifdefs to avoid unused symbol on mac 2008-12-05 12:23:47 +0100 cmc r264898 : CWS-TOOLING: rebase CWS cmcfixes51 to trunk@264807 (milestone: DEV300:m37) 2008-12-01 14:45:17 +0100 cmc r264606 : #i76655# ehlos apparently required 2008-11-28 17:49:30 +0100 cmc r264567 : #i96655# remove newly unused method 2008-11-28 10:41:28 +0100 cmc r264531 : #i96647# better ppc-bridges flushCode impl 2008-11-27 12:58:40 +0100 cmc r264478 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 12:32:49 +0100 cmc r264476 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 12:26:02 +0100 cmc r264475 : #i96655# redundant old table export helpers 2008-11-27 11:49:06 +0100 cmc r264473 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 11:38:35 +0100 cmc r264471 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 11:14:21 +0100 cmc r264467 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 11:06:22 +0100 cmc r264464 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:58:18 +0100 cmc r264462 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:41:44 +0100 cmc r264461 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:19:24 +0100 cmc r264460 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:13:39 +0100 cmc r264459 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 10:06:14 +0100 cmc r264458 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:59:54 +0100 cmc r264457 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:52:51 +0100 cmc r264456 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:48:26 +0100 cmc r264454 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:40:20 +0100 cmc r264452 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:35:26 +0100 cmc r264451 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:31:00 +0100 cmc r264450 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 09:24:08 +0100 cmc r264449 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 00:26:15 +0100 cmc r264443 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 00:21:01 +0100 cmc r264442 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-27 00:09:40 +0100 cmc r264441 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 23:51:56 +0100 cmc r264440 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 23:49:09 +0100 cmc r264439 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 18:09:54 +0100 cmc r264432 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 18:07:40 +0100 cmc r264431 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 17:28:02 +0100 cmc r264429 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 17:27:39 +0100 cmc r264428 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 17:18:36 +0100 cmc r264426 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 16:22:16 +0100 cmc r264415 : #i96624# make implicit braces and brackets explicit to avoid warnings 2008-11-26 16:00:23 +0100 cmc r264409 : #i90426# remove warnings from svtools 2008-11-26 15:59:17 +0100 cmc r264408 : #i90426# remove warnings 2008-11-26 15:47:32 +0100 cmc r264404 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:46:57 +0100 cmc r264394 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:19:50 +0100 cmc r264387 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:15:26 +0100 cmc r264386 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 14:11:26 +0100 cmc r264384 : #i96084# confirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 13:44:23 +0100 cmc r264380 : #i96084# comfirm existing logic with explicit brackets to remove new gcc warnings 2008-11-26 13:12:24 +0100 cmc r264372 : #i96604# silence new warnings 2008-11-26 12:35:02 +0100 cmc r264369 : #i96203# make qstarter work in 3-layer land 2008-11-26 12:33:04 +0100 cmc r264368 : #i96170# ensure gtypes are up and running
2008-12-11 07:05:03 +00:00
}
positionCache( MOVE_NONE_REFRESH_ONLY );
sal_Bool bIsLast = m_pCache->isLast();
2000-09-18 23:16:46 +00:00
DBG_TRACE2("DBACCESS ORowSetBase::isLast() = %i Clone = %i\n",bIsLast,m_bClone);
return bIsLast;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::beforeFirst( ) throw(SQLException, RuntimeException)
{
DBG_TRACE2("DBACCESS ORowSetBase::beforeFirst() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::ResettableMutexGuard aGuard( *m_pMutex );
2000-09-29 14:23:36 +00:00
checkPositioningAllowed();
2001-12-19 14:16:17 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
2001-12-19 14:16:17 +00:00
if((bWasNew || !m_bBeforeFirst) && notifyAllListenersCursorBeforeMove(aGuard) )
2000-09-18 23:16:46 +00:00
{
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
if ( !m_bBeforeFirst )
2001-12-19 14:16:17 +00:00
{
ORowSetRow aOldValues = getOldRow(bWasNew);
m_pCache->beforeFirst();
doCancelModification( );
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
// - IsModified
// - Isnew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
}
// to be done _after_ the notifications!
m_aOldRow->clearRow();
2000-09-18 23:16:46 +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)
{
DBG_TRACE2("DBACCESS ORowSetBase::afterLast() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
2000-09-18 23:16:46 +00:00
::osl::ResettableMutexGuard aGuard( *m_pMutex );
checkPositioningAllowed();
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
2001-12-19 14:16:17 +00:00
if((bWasNew || !m_bAfterLast) && notifyAllListenersCursorBeforeMove(aGuard) )
2000-09-18 23:16:46 +00:00
{
// check if we are inserting a row
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
if(!m_bAfterLast)
{
ORowSetRow aOldValues = getOldRow(bWasNew);
m_pCache->afterLast();
doCancelModification( );
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
// - IsModified
// - Isnew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
}
2000-09-18 23:16:46 +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
}
// -----------------------------------------------------------------------------
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
{
DBG_TRACE2("DBACCESS ORowSetBase::move() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::ResettableMutexGuard aGuard( *m_pMutex );
checkPositioningAllowed();
2000-09-29 14:23:36 +00:00
sal_Bool bRet( notifyAllListenersCursorBeforeMove( aGuard ) );
if( bRet )
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
2000-09-29 14:23:36 +00:00
ORowSetRow aOldValues = getOldRow(bWasNew);
2000-09-18 23:16:46 +00:00
sal_Bool bMoved = ( bWasNew || !_aCheckFunctor(this) );
2000-09-18 23:16:46 +00:00
bRet = _aMovementFunctor(m_pCache);
doCancelModification( );
if ( bRet )
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( bMoved, sal_True, aOldValues, aGuard );
}
else
{ // first goes wrong so there is no row
movementFailed();
}
// - IsModified
// - IsNew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
}
DBG_TRACE2("DBACCESS ORowSetBase::move() = %i Clone = %i\n",bRet,m_bClone);
2000-09-18 23:16:46 +00:00
return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::first( ) throw(SQLException, RuntimeException)
{
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);
}
// -------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
sal_Bool SAL_CALL ORowSetBase::last( ) throw(SQLException, RuntimeException)
{
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)
{
DBG_TRACE2("DBACCESS ORowSetBase::getRow() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
2000-09-29 14:23:36 +00:00
sal_Int32 nPos = 0;
if ( m_bBeforeFirst )
nPos = 0;
else if ( m_bAfterLast )
nPos = impl_getRowCount() + 1;
else if ( rowDeleted() )
nPos = m_nDeletedPosition;
else if ( !m_bClone && m_pCache->m_bNew )
nPos = 0;
else
{
if ( m_pCache->isAfterLast()
|| m_pCache->isBeforeFirst()
|| ( m_pCache->compareBookmarks( m_aBookmark, m_pCache->getBookmark() ) != CompareBookmark::EQUAL )
)
{
positionCache( MOVE_NONE_REFRESH_ONLY );
}
nPos = m_pCache->getRow();
}
DBG_TRACE3("DBACCESS ORowSetBase::getRow() = %i Clone = %i ID = %i\n",nPos,m_bClone,osl_getThreadIdentifier(NULL));
return nPos;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
{
DBG_TRACE2("DBACCESS ORowSetBase::absolute(%i) Clone = %i\n",row,m_bClone);
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::ResettableMutexGuard aGuard( *m_pMutex );
checkPositioningAllowed();
2000-09-18 23:16:46 +00:00
sal_Bool bRet = ( row > 0 )
&& notifyAllListenersCursorBeforeMove( aGuard );
if ( bRet )
2000-09-18 23:16:46 +00:00
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
ORowSetRow aOldValues = getOldRow(bWasNew);
bRet = m_pCache->absolute(row);
doCancelModification( );
if(bRet)
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
}
else
{ // absolute movement goes wrong we stand left or right side of the rows
movementFailed();
}
// - IsModified
// - IsNew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
2000-09-18 23:16:46 +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)
{
DBG_TRACE2("DBACCESS ORowSetBase::relative(%i) Clone = %i\n",rows,m_bClone);
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::ResettableMutexGuard aGuard( *m_pMutex );
2000-09-18 23:16:46 +00:00
if(!rows)
return sal_True; // in this case do nothing
checkPositioningAllowed();
2000-09-18 23:16:46 +00:00
sal_Bool bRet =
( ( !m_bAfterLast || rows <= 0 )
&& ( !m_bBeforeFirst || rows >= 0 )
&& notifyAllListenersCursorBeforeMove( aGuard )
);
2000-09-18 23:16:46 +00:00
if ( bRet )
2000-09-18 23:16:46 +00:00
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
ORowSetRow aOldValues = getOldRow(bWasNew);
positionCache( rows > 0 ? MOVE_FORWARD : MOVE_BACKWARD );
bRet = m_pCache->relative(rows);
doCancelModification( );
if(bRet)
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
}
else
{
movementFailed();
}
2000-09-18 23:16:46 +00:00
// - IsModified
// - IsNew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
}
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)
{
DBG_TRACE2("DBACCESS ORowSetBase::previous() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::ResettableMutexGuard aGuard( *m_pMutex );
2000-09-18 23:16:46 +00:00
checkPositioningAllowed();
2000-09-29 14:23:36 +00:00
sal_Bool bRet = !m_bBeforeFirst
&& notifyAllListenersCursorBeforeMove(aGuard);
2000-09-29 14:23:36 +00:00
if ( bRet )
2000-09-18 23:16:46 +00:00
{
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bNew || rowDeleted();
ORowSetNotifier aNotifier( this );
// this will call cancelRowModification on the cache if necessary
ORowSetRow aOldValues = getOldRow(bWasNew);
positionCache( MOVE_BACKWARD );
bRet = m_pCache->previous();
doCancelModification( );
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)
{
// notification order
// - column values
// - cursorMoved
setCurrentRow( sal_True, sal_True, aOldValues, aGuard );
}
else
{
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
movementFailed();
}
// - IsModified
// - IsNew
aNotifier.fire();
// - RowCount/IsRowCountFinal
fireRowcount();
2000-11-10 15:05:41 +00:00
}
DBG_TRACE2("DBACCESS ORowSetBase::previous() = %i Clone = %i\n",bRet,m_bClone);
2000-09-18 23:16:46 +00:00
return bRet;
}
// -----------------------------------------------------------------------------
void ORowSetBase::setCurrentRow( sal_Bool _bMoved, sal_Bool _bDoNotify, const ORowSetRow& _rOldValues, ::osl::ResettableMutexGuard& _rGuard )
{
DBG_TRACE2("DBACCESS ORowSetBase::setCurrentRow() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
m_bBeforeFirst = m_pCache->isBeforeFirst();
m_bAfterLast = m_pCache->isAfterLast();
//m_pCache->resetInsertRow(sal_True);
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!");
m_aCurrentRow = m_pCache->m_aMatrixIter;
OSL_ENSURE(!m_aCurrentRow.isNull(),"CurrentRow is null!");
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");
OSL_ENSURE(m_aBookmark.hasValue(),"Bookmark has no value!");
2001-12-19 14:16:17 +00:00
#if OSL_DEBUG_LEVEL > 0
sal_Int32 nOldRow = m_pCache->getRow();
#endif
positionCache( MOVE_NONE_REFRESH_ONLY );
#if OSL_DEBUG_LEVEL > 0
sal_Int32 nNewRow = m_pCache->getRow();
#endif
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;
OSL_ENSURE(!m_aCurrentRow.isNull(),"CurrentRow is nul after positionCache!");
#if OSL_DEBUG_LEVEL > 0
ORowSetRow rRow = (*m_aCurrentRow);
OSL_ENSURE(rRow.isValid() ,"Invalid size of vector!");
#endif
// the cache could repositioned so we need to adjust the cache
// #104144# OJ
if ( _bMoved && m_aCurrentRow.isNull() )
{
positionCache( MOVE_NONE_REFRESH_ONLY );
m_aCurrentRow = m_pCache->m_aMatrixIter;
OSL_ENSURE(!m_aCurrentRow.isNull(),"CurrentRow is nul after positionCache!");
}
}
else
{
m_aOldRow->clearRow();
m_aCurrentRow = m_pCache->getEnd();
m_aBookmark = Any();
m_aCurrentRow.setBookmark(m_aBookmark);
}
// notification order
// - column values
if ( _bDoNotify )
firePropertyChange(_rOldValues);
// TODO: can this be done before the notifications?
if(!(m_bBeforeFirst || m_bAfterLast) && !m_aCurrentRow.isNull() && m_aCurrentRow->isValid() && m_aCurrentRow != m_pCache->getEnd())
m_aOldRow->setRow(new ORowSetValueVector(m_aCurrentRow->getBody()));
if ( _bMoved && _bDoNotify )
// - cursorMoved
notifyAllListenersCursorMoved( _rGuard );
DBG_TRACE2("DBACCESS ORowSetBase::setCurrentRow() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
}
// -----------------------------------------------------------------------------
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)
{
::connectivity::checkDisposed(m_rBHelper.bDisposed);
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
if ( rowDeleted() )
throwSQLException( "The current row is deleted", SQL_INVALID_CURSOR_STATE, Reference< XRowSet >( this ) );
if(!(m_bBeforeFirst || m_bAfterLast))
{
positionCache( MOVE_NONE_REFRESH_ONLY );
m_pCache->refreshRow();
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::rowUpdated( ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
if ( rowDeleted() )
return sal_False;
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
if ( rowDeleted() )
return sal_False;
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
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)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
Reference< XWarningsSupplier > xWarnings( m_pCache->m_xSet.get(), UNO_QUERY );
if ( xWarnings.is() )
return xWarnings->getWarnings();
return Any();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::clearWarnings( ) throw(SQLException, RuntimeException)
{
::osl::MutexGuard aGuard( *m_pMutex );
checkCache();
Reference< XWarningsSupplier > xWarnings( m_pCache->m_xSet.get(), UNO_QUERY );
if ( xWarnings.is() )
xWarnings->clearWarnings();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void ORowSetBase::firePropertyChange(const ORowSetRow& _rOldRow)
2000-09-18 23:16:46 +00:00
{
DBG_TRACE2("DBACCESS ORowSetBase::firePropertyChange() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
OSL_ENSURE(m_pColumns,"Columns can not be NULL here!");
#if OSL_DEBUG_LEVEL > 1
sal_Bool bNull;
ORowSetMatrix::iterator atest;
bNull = m_aCurrentRow.isNull();
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
CWS-TOOLING: integrate CWS sb102 2008-12-11 16:18:12 +0100 sb r265332 : #i95065# cleanup, to make Windows linking work 2008-12-11 16:16:03 +0100 sb r265331 : #i95065# missing SAL_DLLPUBLIC_EXPORT 2008-12-09 17:40:28 +0100 sb r265122 : #i94469# move CJK specific configuration data to brand layer 2008-12-09 16:09:08 +0100 sb r265112 : #i96959# use PTHREAD_MUTEX_RECURSIVE on all platforms 2008-12-09 15:54:31 +0100 sb r265110 : #i95065# do not derive apphelper::LifeTimeGuard from osl::ResettableMutexGuard to avoid problems with VISIBILITY_HIDDEN=TRUE on MSC 2008-12-09 15:40:51 +0100 sb r265104 : #i95065# add VISIBILITY_HIDDEN=TRUE to connectivity/source/drivers/mozab 2008-12-09 15:36:21 +0100 sb r265102 : #i95501# updated SDK_HOME 2008-12-09 15:31:46 +0100 sb r265099 : typo (temppath vs. tmppath) 2008-12-08 11:48:08 +0100 sb r264979 : #i95065# removed spurious ExplicitCategoriesProvider.obj (ExplicitCategoriesProvider.cxx is not in this directory) 2008-12-07 19:41:07 +0100 sb r264960 : #i96994# erroneously doubled backslash caused visibility feature to be disabled for all GCC versions on Mac OS X 2008-12-06 23:54:49 +0100 sb r264948 : changes from trunk that CWS-TOOLING's rebase to DEV300:m37 (r264891) had missed, as files had been moved around on this CWS 2008-12-05 20:29:23 +0100 sb r264919 : #i85508# versions of flex apparently differ in whether input() resp. yyinput() returns zero or EOF upon end of file 2008-12-05 15:37:23 +0100 sb r264908 : #i95315# removed obsolete jut 2008-12-05 15:34:59 +0100 sb r264907 : #i95531# removed empty obsolete directories 2008-12-05 10:09:23 +0100 sb r264891 : CWS-TOOLING: rebase CWS sb102 to trunk@264807 (milestone: DEV300:m37) 2008-12-04 14:50:20 +0100 sb r264845 : #i95065# introduced VISIBILITY_HIDDEN makefile flag to reduce duplications; made additional libraries use VISIBILITY_HIDDEN=TRUE to avoid warnings with recent GCC 4 versions (had to split certain code directories to make changes that would otherwise erroneously affect multiple libraries built in the same makefile); changed connectivity::ORefVector to no longer derive from std::vector, as that caused problems with the MSC implementation of VISIBILITY_HIDDEN=TRUE; replaced uses of JNIEXPORT with SAL_DLLPUBLIC_EXPORT, as the former does not expand to visibility attributes on some platforms where the latter does 2008-12-03 11:29:38 +0100 sb r264759 : #i94583# remove unnecessary (and wrong) assertion check for rtl_getAppCommandArg return value (which is guaranteed to return osl_Process_E_None or not return at all) 2008-12-02 17:18:31 +0100 sb r264724 : #i96809# silenced GCC 4.3.2 warning 2008-12-02 13:29:34 +0100 sb r264695 : #i96797# make get_tmp_dir fail less often 2008-11-28 17:19:24 +0100 sb r264566 : #i95691# inadvertently missing from -c 264564 2008-11-28 17:07:50 +0100 sb r264564 : #i95691# only structs of exactly 1, 2, 4, or 8 bytes are returned through registers 2008-11-25 13:28:08 +0100 sb r264291 : #i96427# support for SAL_EXCEPTION_DLLPUBLIC_EXPORT (patch by np) 2008-11-21 14:45:22 +0100 sb r264140 : #i95428# added SAL_EXCEPTION_DLLPUBLIC_EXPORT and SAL_EXCEPTION_DLLPRIVATE 2008-11-19 13:19:37 +0100 sb r263984 : #i95525# removed erroneous application/octet-stream svn:mime-type properties
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
}
DBG_TRACE2("DBACCESS ORowSetBase::firePropertyChange() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
2000-09-18 23:16:46 +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*/)
{
}
// -----------------------------------------------------------------------------
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 );
}
// -----------------------------------------------------------------------------
void ORowSetBase::positionCache( CursorMoveDirection _ePrepareForDirection )
{
DBG_TRACE2("DBACCESS ORowSetBase::positionCache() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
sal_Bool bSuccess = sal_False;
if ( m_aBookmark.hasValue() )
{
bSuccess = m_pCache->moveToBookmark( m_aBookmark );
}
else
{
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!" );
DBG_TRACE2("DBACCESS ORowSetBase::positionCache() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
}
// -----------------------------------------------------------------------------
void ORowSetBase::checkCache()
{
::connectivity::checkDisposed(m_rBHelper.bDisposed);
if(!m_pCache)
throwFunctionSequenceException(*m_pMySelf);
}
// -----------------------------------------------------------------------------
void ORowSetBase::movementFailed()
{
DBG_TRACE2("DBACCESS ORowSetBase::movementFailed() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
m_aOldRow->clearRow();
m_aCurrentRow = m_pCache->getEnd();
m_bBeforeFirst = m_pCache->isBeforeFirst();
m_bAfterLast = m_pCache->isAfterLast();
m_aBookmark = Any();
m_aCurrentRow.setBookmark(m_aBookmark);
OSL_ENSURE(m_bBeforeFirst || m_bAfterLast,"BeforeFirst or AfterLast is wrong!");
DBG_TRACE2("DBACCESS ORowSetBase::movementFailed() Clone = %i ID = %i\n",m_bClone,osl_getThreadIdentifier(NULL));
}
// -----------------------------------------------------------------------------
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;
}
// -----------------------------------------------------------------------------
void ORowSetBase::getPropertyDefaultByHandle( sal_Int32 /*_nHandle*/, Any& _rDefault ) const
{
_rDefault.clear();
}
// -----------------------------------------------------------------------------
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 );
if ( const_cast< ORowSetBase* >( this )->rowDeleted() && !m_pCache->m_bNew )
++nRowCount;
return nRowCount;
}
// =============================================================================
DBG_NAME(ORowSetNotifier)
// -----------------------------------------------------------------------------
ORowSetNotifier::ORowSetNotifier( ORowSetBase* _pRowSet )
:m_pRowSet( _pRowSet )
,m_bWasNew( sal_False )
,m_bWasModified( sal_False )
#ifdef DBG_UTIL
,m_bNotifyCalled( sal_False )
#endif
{
DBG_CTOR(ORowSetNotifier,NULL);
OSL_ENSURE( m_pRowSet, "ORowSetNotifier::ORowSetNotifier: invalid row set. This wil crash." );
// remember the "inserted" and "modified" state for later firing
m_bWasNew = m_pRowSet->isNew( ORowSetBase::GrantNotifierAccess() );
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( )
{
DBG_DTOR(ORowSetNotifier,NULL);
}
// -----------------------------------------------------------------------------
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
}
} // namespace dbaccess