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

1213 lines
41 KiB
C++
Raw Normal View History

2000-09-18 23:16:46 +00:00
/*************************************************************************
*
* $RCSfile: RowSetBase.cxx,v $
*
2001-03-27 05:42:16 +00:00
* $Revision: 1.28 $
2000-09-18 23:16:46 +00:00
*
2001-03-27 05:42:16 +00:00
* last change: $Author: oj $ $Date: 2001-03-27 06:42:16 $
2000-09-18 23:16:46 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* 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.
*
* 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.
*
* 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
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (the "License"); You may not use this file
* except in compliance with the License. You may obtain a copy of the
* License at http://www.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
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_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 _CONNECTIVITY_EMPTYMETADATA_HXX_
#include <connectivity/emptymetadata.hxx>
#endif
2000-10-24 12:17:01 +00:00
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:
virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException)
{
}
virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed > createObject(const ::rtl::OUString& _rName)
{
return ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed >();
}
virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createEmptyObject()
{
return ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >();
}
public:
OEmptyCollection(::cppu::OWeakObject& _rParent,::osl::Mutex& _rMutex) : OCollection(_rParent,sal_True,_rMutex,::std::vector< ::rtl::OUString>()){}
};
// =========================================================================
// = ORowSetBase
// =========================================================================
2000-09-18 23:16:46 +00:00
// -------------------------------------------------------------------------
ORowSetBase::ORowSetBase(::cppu::OBroadcastHelper &_rBHelper,::osl::Mutex& _rMutex)
: OPropertyContainer(_rBHelper)
, m_rMutex(_rMutex)
2000-09-18 23:16:46 +00:00
, m_rBHelper(_rBHelper)
, m_aListeners(m_rMutex)
, m_aApproveListeners(m_rMutex)
2000-09-18 23:16:46 +00:00
, m_pCache(NULL)
, m_pColumns(NULL)
, m_nRowCount(0)
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_bRowCountFinal(sal_False)
, m_bClone(sal_False)
, m_nPosition(-1)
2001-02-23 14:22:32 +00:00
, m_bIgnoreResult(sal_False)
2000-09-18 23:16:46 +00:00
{
sal_Int32 nRBT = PropertyAttribute::READONLY | PropertyAttribute::BOUND | PropertyAttribute::TRANSIENT;
registerProperty(PROPERTY_ROWCOUNT, PROPERTY_ID_ROWCOUNT, nRBT, &m_nRowCount, ::getCppuType(reinterpret_cast< sal_Int32*>(NULL)));
registerProperty(PROPERTY_ISROWCOUNTFINAL, PROPERTY_ID_ISROWCOUNTFINAL, nRBT, &m_bRowCountFinal, ::getBooleanCppuType());
}
// com::sun::star::lang::XTypeProvider
//--------------------------------------------------------------------------
Sequence< Type > ORowSetBase::getTypes() throw (RuntimeException)
{
2000-10-11 10:21:40 +00:00
return ::comphelper::concatSequences(ORowSetBase_BASE::getTypes(),OPropertyContainer::getTypes());
2000-09-18 23:16:46 +00:00
}
// com::sun::star::uno::XInterface
//--------------------------------------------------------------------------
Any ORowSetBase::queryInterface( const Type & rType ) throw (RuntimeException)
{
Any aRet = OPropertyContainer::queryInterface(rType);
2000-09-18 23:16:46 +00:00
if(!aRet.hasValue())
aRet = ORowSetBase_BASE::queryInterface(rType);
return aRet;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const
{
if(m_pCache)
{
switch(nHandle)
{
case PROPERTY_ID_ROWCOUNT:
rValue <<= m_pCache->m_nRowCount;
break;
case PROPERTY_ID_ISROWCOUNTFINAL:
rValue.setValue(&m_pCache->m_bRowCountFinal,::getCppuBooleanType());
break;
default:
OPropertyContainer::getFastPropertyValue(rValue,nHandle);
2000-09-18 23:16:46 +00:00
};
}
else
OPropertyContainer::getFastPropertyValue(rValue,nHandle);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// OComponentHelper
void SAL_CALL ORowSetBase::disposing(void)
{
MutexGuard aGuard(m_rMutex);
2000-09-18 23:16:46 +00:00
if(m_pColumns)
2000-09-29 14:23:36 +00:00
{
2000-09-18 23:16:46 +00:00
m_pColumns->disposing();
2000-10-25 06:32:52 +00:00
delete m_pColumns;
m_pColumns = NULL;
2000-09-29 14:23:36 +00:00
}
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
return (m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd()) ? (*(*m_aCurrentRow))[m_nLastColumnIndex].isNull() : sal_True;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
::rtl::OUString SAL_CALL ORowSetBase::getString( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return ::rtl::OUString();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::getBoolean( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return sal_False;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int8 SAL_CALL ORowSetBase::getByte( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return sal_Int8(0);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int16 SAL_CALL ORowSetBase::getShort( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return sal_Int16(0);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase::getInt( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return sal_Int32(0);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int64 SAL_CALL ORowSetBase::getLong( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return sal_Int64();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
float SAL_CALL ORowSetBase::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return float(0.0);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
double SAL_CALL ORowSetBase::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return double(0.0);
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Sequence< sal_Int8 > SAL_CALL ORowSetBase::getBytes( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return Sequence< sal_Int8 >();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
::com::sun::star::util::Date SAL_CALL ORowSetBase::getDate( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return ::com::sun::star::util::Date();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
::com::sun::star::util::Time SAL_CALL ORowSetBase::getTime( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return ::com::sun::star::util::Time();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
::com::sun::star::util::DateTime SAL_CALL ORowSetBase::getTimestamp( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
2000-09-29 14:23:36 +00:00
return (*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex];
return ::com::sun::star::util::DateTime();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference< ::com::sun::star::io::XInputStream > SAL_CALL ORowSetBase::getBinaryStream( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
return new ::comphelper::SequenceInputStream((*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex].getSequence());
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
if(m_aCurrentRow && m_aCurrentRow != m_pCache->getEnd())
return new ::comphelper::SequenceInputStream((*(*m_aCurrentRow))[m_nLastColumnIndex = columnIndex].getSequence());
2000-09-29 14:23:36 +00:00
return Reference< ::com::sun::star::io::XInputStream >();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Any SAL_CALL ORowSetBase::getObject( sal_Int32 columnIndex, const Reference< XNameAccess >& typeMap ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
return Any();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference< XRef > SAL_CALL ORowSetBase::getRef( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache || m_bBeforeFirst || m_bAfterLast)
2000-09-18 23:16:46 +00:00
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2001-01-24 08:52:19 +00:00
OSL_ENSURE(m_aBookmark.hasValue(),"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)
{
2001-01-22 06:38:24 +00:00
OSL_ENSURE(bookmark.hasValue(),"ORowSetBase::moveToBookmark bookmark has no value!");
if(!bookmark.hasValue())
throw FunctionSequenceException(*m_pMySelf);
2000-09-18 23:16:46 +00:00
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
notifyAllListenersCursorBeforeMove();
2001-01-22 06:38:24 +00:00
// if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
2000-10-04 13:11:52 +00:00
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
sal_Bool bRet = m_pCache->moveToBookmark(bookmark);
2000-09-29 14:23:36 +00:00
if(bRet)
{
2000-11-15 14:57:40 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False; // all false because we stand on a valid row
2000-09-29 14:23:36 +00:00
m_aBookmark = bookmark;
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-29 14:23:36 +00:00
}
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2001-01-22 06:38:24 +00:00
// if(m_bBeforeFirst)
// m_pCache->beforeFirst();
// else if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
sal_Bool bRet = m_pCache->moveRelativeToBookmark(bookmark,rows);
2000-09-29 14:23:36 +00:00
if(bRet)
{
2001-01-24 08:52:19 +00:00
m_bAfterLast = m_pCache->isAfterLast();
m_bBeforeFirst = m_pCache->isBeforeFirst(); // all false because we stand on a valid row
if(m_bAfterLast || m_bBeforeFirst)
{
m_aCurrentRow = m_pCache->getEnd();
m_aOldRow = NULL;
m_aCurrentRow.setBookmark(Any());
}
else
{
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
m_aCurrentRow.setBookmark(m_aBookmark);
notifyAllListenersCursorMoved();
firePropertyChange(aOldValues);
m_aOldRow = (*m_aCurrentRow);
}
2000-09-29 14:23:36 +00:00
}
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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
return m_pCache->compareBookmarks(first,second);
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::hasOrderedBookmarks( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
return m_pCache->hasOrderedBookmarks();
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase::hashBookmark( const Any& bookmark ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
return m_pCache->hashBookmark(bookmark);
}
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// XResultSetMetaDataSupplier
Reference< XResultSetMetaData > SAL_CALL ORowSetBase::getMetaData( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(m_pCache)
return m_pCache->getMetaData();
return new OEmptyMetaData();
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// XColumnLocate
sal_Int32 SAL_CALL ORowSetBase::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
::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)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
2000-10-17 09:19:03 +00:00
if(!m_pColumns)
2000-09-18 23:16:46 +00:00
return new OEmptyCollection(*m_pMySelf,m_aColumnsMutex);
::osl::MutexGuard aGuard( m_aColumnsMutex );
return m_pColumns;
}
// -------------------------------------------------------------------------
// XResultSet
sal_Bool SAL_CALL ORowSetBase::next( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
// if(m_bBeforeFirst)
// m_pCache->beforeFirst();
// else if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
{
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
}
2000-09-18 23:16:46 +00:00
sal_Bool bRet = m_pCache->next();
if(bRet)
{
m_bBeforeFirst = sal_False;
2000-09-29 14:23:36 +00:00
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
OSL_ENSURE(m_aCurrentRow->isValid(),"Currentrow isn't valid");
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-18 23:16:46 +00:00
}
else
2000-11-10 15:05:41 +00:00
{
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aOldRow = NULL;
m_aCurrentRow.setBookmark(Any());
m_bAfterLast = sal_True;
2000-11-10 15:05:41 +00:00
}
2000-09-29 14:23:36 +00:00
fireRowcount();
2000-09-18 23:16:46 +00:00
return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::isBeforeFirst( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
// if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
return m_bBeforeFirst;
// m_pCache->isBeforeFirst();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::isAfterLast( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-24 08:52:19 +00:00
return m_bAfterLast;
// return m_aCurrentRow == m_pCache->getEnd();
2000-09-18 23:16:46 +00:00
// if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
// return m_pCache->isAfterLast();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::isFirst( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_bBeforeFirst || m_bAfterLast) // so we can't be on the first
return sal_False;
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
if(m_aBookmark.hasValue())
m_pCache->moveToBookmark(m_aBookmark);
return m_pCache->isFirst();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::isLast( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_bBeforeFirst || m_bAfterLast) // so we can't be on the last
return sal_False;
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
if(m_aBookmark.hasValue())
m_pCache->moveToBookmark(m_aBookmark);
return m_pCache->isLast();
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::beforeFirst( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
checkInsert();
2000-09-18 23:16:46 +00:00
if(!m_bBeforeFirst)
{
sal_Bool bMoved = sal_False;
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
m_pCache->beforeFirst();
2000-09-29 14:23:36 +00:00
m_aBookmark = Any();
2000-11-10 15:05:41 +00:00
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
m_aOldRow = NULL;
2000-11-10 15:05:41 +00:00
m_bBeforeFirst = !(m_bAfterLast = sal_False);
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
}
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::afterLast( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
checkInsert();
2000-09-18 23:16:46 +00:00
if(!m_bAfterLast)
{
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
m_pCache->afterLast();
2000-09-29 14:23:36 +00:00
m_aBookmark = Any();
2000-11-10 15:05:41 +00:00
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
m_aOldRow = NULL;
2000-11-10 15:05:41 +00:00
m_bAfterLast = !(m_bBeforeFirst = sal_False);
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
fireRowcount();
2000-09-18 23:16:46 +00:00
}
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::first( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2001-01-22 06:38:24 +00:00
// if(!(m_bAfterLast || m_bBeforeFirst) && m_aBookmark.hasValue()) // set the cache to the right position
// m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False; // all false
sal_Bool bMoved = sal_False;
2000-11-15 14:57:40 +00:00
if(!isFirst() || bWasNew)
2000-09-18 23:16:46 +00:00
{
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
bMoved = sal_True;
}
sal_Bool bRet = m_pCache->first();
2000-11-15 14:57:40 +00:00
if(bRet)
2000-09-18 23:16:46 +00:00
{
2000-09-29 14:23:36 +00:00
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
OSL_ENSURE(m_aCurrentRow->isValid(),"Currentrow isn't valid");
2000-11-15 14:57:40 +00:00
if(bMoved)
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-18 23:16:46 +00:00
}
else
{
2000-11-15 14:57:40 +00:00
m_bAfterLast = m_bBeforeFirst = sal_True; // all true
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(Any());
}
2000-09-29 14:23:36 +00:00
fireRowcount();
2000-09-18 23:16:46 +00:00
return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::last( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2001-01-22 06:38:24 +00:00
// if(!(m_bAfterLast || m_bBeforeFirst) && m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False; // all false
sal_Bool bMoved = sal_False;
2000-11-15 14:57:40 +00:00
if(!isLast() || bWasNew)
2000-09-18 23:16:46 +00:00
{
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
bMoved = sal_True;
}
sal_Bool bRet = m_pCache->last();
2000-11-15 14:57:40 +00:00
if(bRet)
2000-09-18 23:16:46 +00:00
{
2000-09-29 14:23:36 +00:00
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
OSL_ENSURE(m_aCurrentRow->isValid(),"Currentrow isn't valid");
2000-11-15 14:57:40 +00:00
if(bMoved)
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-18 23:16:46 +00:00
}
else
{
2000-11-15 14:57:40 +00:00
m_bAfterLast = m_bBeforeFirst = sal_True; // all true
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aOldRow = NULL;
m_aCurrentRow.setBookmark(Any());
}
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
fireRowcount();
2000-09-18 23:16:46 +00:00
return bRet;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetBase::getRow( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_bAfterLast || m_bBeforeFirst) // we are on no valid row
return 0;
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
if(!m_bClone && m_pCache->m_bInserted)
return 0;
if(!m_aBookmark.hasValue()) // check if we are standing on a deleted row
return m_nPosition;
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
if(m_pCache->m_bAfterLast || m_pCache->m_bBeforeFirst || m_pCache->compareBookmarks(m_aBookmark,m_pCache->getBookmark()) != CompareBookmark::EQUAL)
2001-01-22 06:38:24 +00:00
m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
return m_pCache->getRow();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if((m_bAfterLast && row > 1))
return sal_False;// we are already behind the last row
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2001-01-22 06:38:24 +00:00
// if(m_bBeforeFirst)
// m_pCache->beforeFirst();
// else if(m_aBookmark.hasValue())
// {
// m_pCache->moveToBookmark(m_aBookmark);
// if(m_pCache->getRow() == row)
// return sal_True;
// }
2001-01-24 08:52:19 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False; // all false
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
sal_Bool bRet = m_pCache->absolute(row);
if(bRet)
{
2000-09-29 14:23:36 +00:00
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
OSL_ENSURE(m_aCurrentRow->isValid(),"Currentrow isn't valid");
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-18 23:16:46 +00:00
}
else
{
2000-11-10 15:05:41 +00:00
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(Any());
m_aOldRow = NULL;
2000-11-10 15:05:41 +00:00
m_bAfterLast = !(m_bBeforeFirst = m_pCache->isBeforeFirst());
2000-09-18 23:16:46 +00:00
}
2000-09-29 14:23:36 +00:00
fireRowcount();
2000-09-18 23:16:46 +00:00
return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::relative( sal_Int32 rows ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!rows)
return sal_True; // in this case do nothing
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if((m_bAfterLast && rows > 1) || (m_bBeforeFirst && rows < 0))
return sal_False;// we are already behind the last row or before the first
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2001-01-24 08:52:19 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False; // all false
2001-01-22 06:38:24 +00:00
// if(m_bBeforeFirst)
// m_pCache->beforeFirst();
// else if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
sal_Bool bRet = m_pCache->relative(rows);
if(bRet)
{
2000-09-29 14:23:36 +00:00
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
OSL_ENSURE(m_aCurrentRow->isValid(),"Currentrow isn't valid");
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-18 23:16:46 +00:00
}
else
{
2000-11-10 15:05:41 +00:00
m_aCurrentRow = m_pCache->getEnd();
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(Any());
m_aOldRow = NULL;
2000-11-10 15:05:41 +00:00
m_bAfterLast = !(m_bBeforeFirst = m_pCache->isBeforeFirst());
2000-09-18 23:16:46 +00:00
}
2000-09-29 14:23:36 +00:00
fireRowcount();
2000-09-18 23:16:46 +00:00
return bRet;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::previous( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
if(m_bBeforeFirst)
return sal_False;
2000-09-29 14:23:36 +00:00
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-29 14:23:36 +00:00
// check if we are inserting a row
sal_Bool bWasNew = m_pCache->m_bInserted || m_pCache->m_bDeleted;
2000-09-29 14:23:36 +00:00
checkInsert();
2001-01-24 08:52:19 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False; // all false
2000-09-18 23:16:46 +00:00
// move the cache back to right position
2001-01-22 06:38:24 +00:00
// if(m_bAfterLast)
// m_pCache->afterLast();
// else if(m_aBookmark.hasValue())
// m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
ORowSetMatrix::iterator aOldValues = NULL;
2001-02-23 14:22:32 +00:00
if(!bWasNew && m_aOldRow.isValid())
2001-01-22 06:38:24 +00:00
aOldValues = &m_aOldRow; // remember the old values
2000-09-18 23:16:46 +00:00
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorBeforeMove();
2000-09-18 23:16:46 +00:00
sal_Bool bRet = m_pCache->previous();
if(!(m_bBeforeFirst = m_pCache->isBeforeFirst()) && bRet)
{
2000-09-29 14:23:36 +00:00
m_aBookmark = m_pCache->getBookmark();
m_aCurrentRow = m_pCache->m_aMatrixIter;
2001-01-22 06:38:24 +00:00
m_aCurrentRow.setBookmark(m_aBookmark);
2000-09-29 14:23:36 +00:00
notifyAllListenersCursorMoved();
2000-09-18 23:16:46 +00:00
firePropertyChange(aOldValues);
2001-01-22 06:38:24 +00:00
m_aOldRow = (*m_aCurrentRow);
2000-09-18 23:16:46 +00:00
}
else
2000-11-10 15:05:41 +00:00
{
2001-01-22 06:38:24 +00:00
m_aCurrentRow= m_pCache->getEnd();
m_aCurrentRow.setBookmark(Any());
m_aOldRow = NULL;
2000-11-10 15:05:41 +00:00
m_bAfterLast = !m_bBeforeFirst;
}
2000-09-18 23:16:46 +00:00
return bRet;
}
//------------------------------------------------------------------------------
Reference< XInterface > ORowSetBase::getStatement(void) throw( SQLException, RuntimeException )
{
return NULL;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::refreshRow( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2000-09-29 14:23:36 +00:00
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
if(m_aBookmark.hasValue())
m_pCache->moveToBookmark(m_aBookmark);
2000-09-18 23:16:46 +00:00
m_pCache->refreshRow();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::rowUpdated( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
return m_pCache->rowUpdated();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::rowInserted( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
return m_pCache->rowInserted();
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetBase::rowDeleted( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
throw FunctionSequenceException(*m_pMySelf);
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
return m_pCache->rowDeleted();
}
// -------------------------------------------------------------------------
// XWarningsSupplier
Any SAL_CALL ORowSetBase::getWarnings( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
if(!m_pCache)
return Any();
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
return m_pCache->getWarnings();
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetBase::clearWarnings( ) throw(SQLException, RuntimeException)
{
if (m_rBHelper.bDisposed)
throw DisposedException();
2001-01-22 06:38:24 +00:00
::osl::MutexGuard aGuard( m_rMutex );
2000-09-18 23:16:46 +00:00
if(m_pCache)
m_pCache->clearWarnings();
}
// -------------------------------------------------------------------------
void ORowSetBase::firePropertyChange(const ORowSetMatrix::iterator& _rOldRow)
{
Reference< ::com::sun::star::lang::XUnoTunnel> xTunnel;
ORowSetRow aRow;
2001-01-24 08:52:19 +00:00
if(_rOldRow && _rOldRow != m_pCache->m_pMatrix->end() && _rOldRow->isValid())
2000-09-18 23:16:46 +00:00
aRow = *_rOldRow;
2000-10-17 09:19:03 +00:00
sal_Int32 i=0;
try
2000-09-18 23:16:46 +00:00
{
2000-10-17 09:19:03 +00:00
for(;i<m_pColumns->getCount();++i)
2000-09-18 23:16:46 +00:00
{
2001-02-14 12:18:24 +00:00
if(::cppu::extractInterface(xTunnel,m_pColumns->getByIndex(i)) && xTunnel.is())
2000-10-17 09:19:03 +00:00
{
OColumn* pColumn = (OColumn*)xTunnel->getSomething(OColumn::getUnoTunnelImplementationId());
if(pColumn)
2001-03-01 12:42:39 +00:00
{
OSL_ENSURE(!aRow.isValid() || (i+1) < sal_Int32(aRow->size()),"Index is greater than vector size!");
2000-10-17 09:19:03 +00:00
pColumn->fireValueChange(aRow.isValid() ? (*aRow)[i+1].makeAny() : Any());
2001-03-01 12:42:39 +00:00
}
2000-10-17 09:19:03 +00:00
}
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
}
2000-09-18 23:16:46 +00:00
}
// -----------------------------------------------------------------------------
} // namespace dbaccess