/************************************************************************* * * $RCSfile: RowSetBase.cxx,v $ * * $Revision: 1.1.1.1 $ * * last change: $Author: hr $ $Date: 2000-09-19 00:15:38 $ * * 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): _______________________________________ * * ************************************************************************/ #include "RowSetBase.hxx" #ifndef DBACCESS_CORE_API_CROWSETDATACOLUMN_HXX #include "CRowSetDataColumn.hxx" #endif #ifndef _CONNECTIVITY_SDBCX_COLLECTION_HXX_ #include #endif #ifndef DBACCESS_CORE_API_ROWSETCACHE_HXX #include "RowSetCache.hxx" #endif #ifndef _DBASHARED_STRINGCONSTANTS_HRC_ #include "stringconstants.hrc" #endif #ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ #include #endif #ifndef _CONNECTIVITY_PARSE_SQLITERATOR_HXX_ #include #endif #ifndef _DBASHARED_APITOOLS_HXX_ #include "apitools.hxx" #endif #ifndef _UTL_SEQUENCE_HXX_ #include #endif #ifndef _CPPUHELPER_EXTRACT_HXX_ #include #endif using namespace dbaccess; using namespace connectivity; 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 ::cppu; using namespace ::osl; // ------------------------------------------------------------------------- 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::ORowSetBase(::cppu::OBroadcastHelper &_rBHelper) : OSimplePropertyContainer(_rBHelper) , m_rBHelper(_rBHelper) , m_aListeners(m_aMutex) , m_aApproveListeners(m_aMutex) , m_pIterator(NULL) , m_pCache(NULL) , m_pColumns(NULL) , m_nRowCount(0) , m_bBeforeFirst(sal_False) , m_bAfterLast(sal_False) , m_bRowCountFinal(sal_False) , m_bClone(sal_False) { 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) { return ::utl::concatSequences(ORowSetBase_BASE::getTypes(),OSimplePropertyContainer::getTypes()); } // com::sun::star::uno::XInterface //-------------------------------------------------------------------------- Any ORowSetBase::queryInterface( const Type & rType ) throw (RuntimeException) { Any aRet = OSimplePropertyContainer::queryInterface(rType); 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: OSimplePropertyContainer::getFastPropertyValue(rValue,nHandle); }; } else OSimplePropertyContainer::getFastPropertyValue(rValue,nHandle); } // ------------------------------------------------------------------------- // OComponentHelper void SAL_CALL ORowSetBase::disposing(void) { if(!m_bClone) OSimplePropertyContainer::disposing(); MutexGuard aGuard(m_aMutex); if(m_pColumns) m_pColumns->disposing(); delete m_pColumns; if(!m_bClone) delete m_pIterator; m_pIterator = NULL; if(!m_bClone) delete m_pCache; m_pCache = NULL; } // ------------------------------------------------------------------------- // utl::OPropertyArrayUsageHelper ::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(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); return m_pCache->wasNull(); } // ------------------------------------------------------------------------- ::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); return m_pCache->getString(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getBoolean(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getByte(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getShort(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getInt(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getLong(columnIndex); } // ------------------------------------------------------------------------- float SAL_CALL ORowSetBase::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); return m_pCache->getFloat(columnIndex); } // ------------------------------------------------------------------------- double SAL_CALL ORowSetBase::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); return m_pCache->getDouble(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getBytes(columnIndex); } // ------------------------------------------------------------------------- ::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); return m_pCache->getDate(columnIndex); } // ------------------------------------------------------------------------- ::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); return m_pCache->getTime(columnIndex); } // ------------------------------------------------------------------------- ::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); return m_pCache->getTimestamp(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getBinaryStream(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getCharacterStream(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getObject(columnIndex,typeMap); } // ------------------------------------------------------------------------- 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); return m_pCache->getRef(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getBlob(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getClob(columnIndex); } // ------------------------------------------------------------------------- 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); return m_pCache->getArray(columnIndex); } // ------------------------------------------------------------------------- // ::com::sun::star::sdbcx::XRowLocate Any SAL_CALL ORowSetBase::getBookmark( ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); return m_pCache->getBookmark(); } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ORowSetBase::moveToBookmark( const Any& bookmark ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values sal_Bool bRet = m_pCache->moveToBookmark(bookmark); firePropertyChange(aOldValues); 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); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values sal_Bool bRet = m_pCache->moveRelativeToBookmark(bookmark,rows); firePropertyChange(aOldValues); 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 NULL; } // ------------------------------------------------------------------------- // XColumnLocate sal_Int32 SAL_CALL ORowSetBase::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pIterator) throw SQLException(); ::osl::MutexGuard aGuard( m_aColumnsMutex ); // it is possible to save some time her when we remember the names - position relation in a map return m_pColumns->findColumn(columnName); } // ------------------------------------------------------------------------- // ::com::sun::star::sdbcx::XColumnsSupplier Reference< XNameAccess > SAL_CALL ORowSetBase::getColumns( ) throw(RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pIterator) 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); NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() if(m_bBeforeFirst) m_pCache->beforeFirst(); else if(m_aBookmark.hasValue()) m_pCache->moveToBookmark(m_aBookmark); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values sal_Bool bRet = m_pCache->next(); if(bRet) { m_bBeforeFirst = sal_False; m_aBookmark = m_pCache->getBookmark(); firePropertyChange(aOldValues); NOTIFY_ALL_LISTENERS_CURSOR_MOVED() } else m_bAfterLast = sal_True; FIRE_ROWCOUNT() 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); return m_bAfterLast; // 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; 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; 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); if(!m_bBeforeFirst) { sal_Bool bMoved = sal_False; NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() m_pCache->beforeFirst(); m_aBookmark = Any(); m_bBeforeFirst = !(m_bAfterLast = sal_False); } } // ------------------------------------------------------------------------- void SAL_CALL ORowSetBase::afterLast( ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); if(!m_bAfterLast) { NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() m_pCache->afterLast(); m_bAfterLast = !(m_bBeforeFirst = sal_False); FIRE_ROWCOUNT() } } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ORowSetBase::first( ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); if(!(m_bAfterLast || m_bBeforeFirst) && m_aBookmark.hasValue()) // set the cache to the right position m_pCache->moveToBookmark(m_aBookmark); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values m_bAfterLast = m_bBeforeFirst = sal_False; // all false sal_Bool bMoved = sal_False; if(!isFirst()) { NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() bMoved = sal_True; } sal_Bool bRet = m_pCache->first(); if(bMoved && bRet) { NOTIFY_ALL_LISTENERS_CURSOR_MOVED() m_aBookmark = m_pCache->getBookmark(); firePropertyChange(aOldValues); } FIRE_ROWCOUNT() return bRet; } // ------------------------------------------------------------------------- sal_Bool SAL_CALL ORowSetBase::last( ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) throw FunctionSequenceException(*m_pMySelf); if(!(m_bAfterLast || m_bBeforeFirst) && m_aBookmark.hasValue()) m_pCache->moveToBookmark(m_aBookmark); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values m_bAfterLast = m_bBeforeFirst = sal_False; // all false sal_Bool bMoved = sal_False; if(!isLast()) { NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() bMoved = sal_True; } sal_Bool bRet = m_pCache->last(); if(bMoved && bRet) { NOTIFY_ALL_LISTENERS_CURSOR_MOVED() m_aBookmark = m_pCache->getBookmark(); firePropertyChange(aOldValues); } FIRE_ROWCOUNT() 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; if(m_aBookmark.hasValue()) m_pCache->moveToBookmark(m_aBookmark); 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 if(m_aBookmark.hasValue()) m_pCache->moveToBookmark(m_aBookmark); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() sal_Bool bRet = m_pCache->absolute(row); if(bRet) { NOTIFY_ALL_LISTENERS_CURSOR_MOVED() m_aBookmark = m_pCache->getBookmark(); firePropertyChange(aOldValues); } else { m_bAfterLast = !(m_bBeforeFirst = m_pCache->isBeforeFirst()); } FIRE_ROWCOUNT() 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 if(m_aBookmark.hasValue()) m_pCache->moveToBookmark(m_aBookmark); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() sal_Bool bRet = m_pCache->relative(rows); if(bRet) { NOTIFY_ALL_LISTENERS_CURSOR_MOVED() m_aBookmark = m_pCache->getBookmark(); firePropertyChange(aOldValues); } else { m_bAfterLast = !(m_bBeforeFirst = m_pCache->isBeforeFirst()); } FIRE_ROWCOUNT() 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; // move the cache back to right position if(m_bAfterLast) m_pCache->afterLast(); else if(m_aBookmark.hasValue()) m_pCache->moveToBookmark(m_aBookmark); ORowSetMatrix::iterator aOldValues = m_pCache->m_aMatrixIter; // remember the old values NOTIFY_ALL_LISTENERS_CURSOR_BEFOREMOVE() sal_Bool bRet = m_pCache->previous(); if(!(m_bBeforeFirst = m_pCache->isBeforeFirst()) && bRet) { NOTIFY_ALL_LISTENERS_CURSOR_MOVED() m_aBookmark = m_pCache->getBookmark(); firePropertyChange(aOldValues); } else m_bAfterLast = !m_bBeforeFirst; return bRet; } // ------------------------------------------------------------------------- void SAL_CALL ORowSetBase::addRowSetListener( const Reference< XRowSetListener >& listener ) throw(RuntimeException) { if(m_bClone) // clone shave no XRowSetListener throw SQLException(); if (m_rBHelper.bDisposed) throw DisposedException(); ::osl::MutexGuard aGuard( m_aColumnsMutex ); m_aListeners.addInterface(listener); } // ------------------------------------------------------------------------- void SAL_CALL ORowSetBase::removeRowSetListener( const Reference< XRowSetListener >& listener ) throw(RuntimeException) { if(m_bClone) // clone shave no XRowSetListener throw SQLException(); if (m_rBHelper.bDisposed) throw DisposedException(); ::osl::MutexGuard aGuard( m_aColumnsMutex ); m_aListeners.removeInterface(listener); } //------------------------------------------------------------------------------ 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); 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); 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); 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); return m_pCache->rowDeleted(); } // ------------------------------------------------------------------------- // XWarningsSupplier Any SAL_CALL ORowSetBase::getWarnings( ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(!m_pCache) return Any(); return m_pCache->getWarnings(); } // ------------------------------------------------------------------------- void SAL_CALL ORowSetBase::clearWarnings( ) throw(SQLException, RuntimeException) { if (m_rBHelper.bDisposed) throw DisposedException(); if(m_pCache) m_pCache->clearWarnings(); } // ------------------------------------------------------------------------- void ORowSetBase::firePropertyChange(const ORowSetMatrix::iterator& _rOldRow) { Reference< ::com::sun::star::lang::XUnoTunnel> xTunnel; ORowSetRow aRow; if(_rOldRow != m_pCache->m_pMatrix->end()) aRow = *_rOldRow; for(sal_Int32 i=0;igetCount();++i) { if((m_pColumns->getByIndex(i) >>= xTunnel) && xTunnel.is()) { OColumn* pColumn = (OColumn*)xTunnel->getSomething(OColumn::getUnoTunnelImplementationId()); if(pColumn) pColumn->fireValueChange(aRow.isValid() ? (*aRow)[i+1].makeAny() : Any()); } } }