2000-09-18 23:16:46 +00:00
/*************************************************************************
*
* $ RCSfile : RowSetCache . cxx , v $
*
2002-10-07 12:09:48 +00:00
* $ Revision : 1.57 $
2000-09-18 23:16:46 +00:00
*
2002-10-07 12:09:48 +00:00
* last change : $ Author : oj $ $ Date : 2002 - 10 - 07 12 : 57 : 29 $
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 .
*
2000-10-04 12:34:40 +00:00
* Contributor ( s ) : _________ Ocke Janssen____________
2000-09-18 23:16:46 +00:00
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef _CONNECTIVITY_COMMONTOOLS_HXX_
# include "RowSetCache.hxx"
# endif
2000-10-11 10:21:40 +00:00
# ifndef _COMPHELPER_SEQSTREAM_HXX
# include <comphelper/seqstream.hxx>
2000-09-18 23:16:46 +00:00
# endif
2000-11-14 12:28:20 +00:00
# ifndef _COMPHELPER_UNO3_HXX_
# include <comphelper/uno3.hxx>
# endif
2000-09-18 23:16:46 +00:00
# ifndef DBACCESS_CORE_API_BOOKMARKSET_HXX
# include "BookmarkSet.hxx"
# endif
# ifndef DBACCESS_CORE_API_STATICSET_HXX
# include "StaticSet.hxx"
# endif
# ifndef DBACCESS_CORE_API_KEYSET_HXX
# include "KeySet.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
2001-03-15 07:29:16 +00:00
# ifndef _COMPHELPER_EXTRACT_HXX_
# include <comphelper/extract.hxx>
2000-09-18 23:16:46 +00:00
# endif
# ifndef _COM_SUN_STAR_SDBCX_XKEYSSUPPLIER_HPP_
# include <com/sun/star/sdbcx/XKeysSupplier.hpp>
# endif
2000-10-17 09:19:03 +00:00
# ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
# include <com/sun/star/sdbcx/XTablesSupplier.hpp>
# endif
2000-11-10 13:17:54 +00:00
# ifndef _COM_SUN_STAR_SDBCX_KEYTYPE_HPP_
# include <com/sun/star/sdbcx/KeyType.hpp>
# endif
2001-01-09 14:38:59 +00:00
# ifndef _COM_SUN_STAR_SDBC_RESULTSETCONCURRENCY_HPP_
# include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
# endif
2001-02-01 13:23:57 +00:00
# ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
# include <com/sun/star/sdbc/ColumnValue.hpp>
# endif
2000-09-18 23:16:46 +00:00
# ifndef _COM_SUN_STAR_SDBCX_PRIVILEGE_HPP_
# include <com/sun/star/sdbcx/Privilege.hpp>
# endif
# ifndef _DBACORE_DATACOLUMN_HXX_
# include "CRowSetDataColumn.hxx"
# endif
# ifndef DBACCESS_CORE_API_CROWSETCOLUMN_HXX
# include "CRowSetColumn.hxx"
# endif
2000-10-25 06:32:52 +00:00
# ifndef _DBHELPER_DBEXCEPTION_HXX_
# include <connectivity/dbexception.hxx>
# endif
2001-07-19 08:29:22 +00:00
# ifndef _CONNECTIVITY_SQLPARSE_HXX
# include <connectivity/sqlparse.hxx>
# endif
# ifndef _CONNECTIVITY_SQLNODE_HXX
# include <connectivity/sqlnode.hxx>
# endif
2000-11-15 14:57:40 +00:00
# ifndef _COMPHELPER_PROPERTY_HXX_
# include <comphelper/property.hxx>
# endif
2001-01-22 06:38:24 +00:00
# ifndef _COM_SUN_STAR_SDBCX_COMPAREBOOKMARK_HPP_
# include <com/sun/star/sdbcx/CompareBookmark.hpp>
# endif
2000-09-18 23:16:46 +00:00
2001-10-12 14:36:42 +00:00
# include <algorithm>
2000-09-18 23:16:46 +00:00
using namespace dbaccess ;
2000-10-25 06:32:52 +00:00
using namespace dbtools ;
2000-09-18 23:16:46 +00:00
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 ;
// -------------------------------------------------------------------------
ORowSetCache : : ORowSetCache ( const Reference < XResultSet > & _xRs ,
2000-10-17 09:19:03 +00:00
const Reference < XSQLQueryComposer > & _xComposer ,
2001-07-19 08:29:22 +00:00
const Reference < XMultiServiceFactory > & _xServiceFactory ,
2001-07-09 06:00:18 +00:00
const connectivity : : ORowVector < ORowSetValue > & _rParameterRow ,
2000-10-17 09:19:03 +00:00
const : : rtl : : OUString & _rUpdateTableName ,
sal_Bool & _bModified ,
sal_Bool & _bNew )
2000-09-18 23:16:46 +00:00
: m_xSet ( _xRs )
, m_nStartPos ( 0 )
, m_nEndPos ( 0 )
, m_nPosition ( 0 )
, m_nRowCount ( 0 )
, m_bBeforeFirst ( sal_True )
, m_bAfterLast ( sal_False )
, m_bRowCountFinal ( sal_False )
, m_bInserted ( sal_False )
, m_bDeleted ( sal_False )
, m_bUpdated ( sal_False )
, m_xMetaData ( Reference < XResultSetMetaDataSupplier > ( _xRs , UNO_QUERY ) - > getMetaData ( ) )
2001-07-19 08:29:22 +00:00
, m_xServiceFactory ( _xServiceFactory )
2001-01-24 08:52:19 +00:00
, m_nFetchSize ( 0 )
2000-10-17 09:19:03 +00:00
, m_bNew ( _bNew )
, m_bModified ( _bModified )
2000-09-18 23:16:46 +00:00
, m_pMatrix ( NULL )
2000-09-29 14:23:36 +00:00
, m_pInsertMatrix ( NULL )
2001-04-06 09:51:29 +00:00
, m_pCacheSet ( NULL )
2000-09-18 23:16:46 +00:00
{
// check if all keys of the updateable table are fetched
sal_Bool bAllKeysFound = sal_False ;
2001-07-19 08:29:22 +00:00
sal_Int32 nTablesCount = 0 ;
2000-09-18 23:16:46 +00:00
2001-02-01 13:23:57 +00:00
: : rtl : : OUString aUpdateTableName = _rUpdateTableName ;
Reference < XConnection > xConnection ;
2001-01-04 13:30:37 +00:00
if ( _xComposer . is ( ) )
{
2001-11-29 15:35:26 +00:00
try
{
Reference < XTablesSupplier > xTabSup ( _xComposer , UNO_QUERY ) ;
OSL_ENSURE ( xTabSup . is ( ) , " ORowSet::execute composer isn't a tablesupplier! " ) ;
Reference < XNameAccess > xTables = xTabSup - > getTables ( ) ;
2000-10-17 09:19:03 +00:00
2001-02-01 13:23:57 +00:00
2001-11-29 15:35:26 +00:00
if ( _rUpdateTableName . getLength ( ) & & xTables - > hasByName ( _rUpdateTableName ) )
xTables - > getByName ( _rUpdateTableName ) > > = m_aUpdateTable ;
else if ( xTables - > getElementNames ( ) . getLength ( ) )
{
aUpdateTableName = xTables - > getElementNames ( ) [ 0 ] ;
xTables - > getByName ( aUpdateTableName ) > > = m_aUpdateTable ;
}
Reference < XIndexAccess > xIndexAccess ( xTables , UNO_QUERY ) ;
if ( xIndexAccess . is ( ) )
nTablesCount = xIndexAccess - > getCount ( ) ;
else
nTablesCount = xTables - > getElementNames ( ) . getLength ( ) ;
2000-09-18 23:16:46 +00:00
2001-11-29 15:35:26 +00:00
if ( m_aUpdateTable . is ( ) & & nTablesCount < 3 ) // for we can't handle more than 2 tables in our keyset
2000-11-10 13:17:54 +00:00
{
2001-11-29 15:35:26 +00:00
Reference < XKeysSupplier > xKeys ( m_aUpdateTable , UNO_QUERY ) ;
if ( xKeys . is ( ) )
2000-11-10 13:17:54 +00:00
{
2001-11-29 15:35:26 +00:00
Reference < XIndexAccess > xKeyIndex = xKeys - > getKeys ( ) ;
Reference < XColumnsSupplier > xColumnsSupplier ;
// search the one and only primary key
for ( sal_Int32 i = 0 ; i < xKeyIndex - > getCount ( ) ; + + i )
2001-01-04 13:30:37 +00:00
{
2001-11-29 15:35:26 +00:00
Reference < XPropertySet > xProp ;
: : cppu : : extractInterface ( xProp , xKeyIndex - > getByIndex ( i ) ) ;
sal_Int32 nKeyType = 0 ;
xProp - > getPropertyValue ( PROPERTY_TYPE ) > > = nKeyType ;
if ( KeyType : : PRIMARY = = nKeyType )
{
xColumnsSupplier = Reference < XColumnsSupplier > ( xProp , UNO_QUERY ) ;
break ;
}
2001-01-04 13:30:37 +00:00
}
2000-11-10 13:17:54 +00:00
2001-11-29 15:35:26 +00:00
if ( xColumnsSupplier . is ( ) )
2001-02-01 13:23:57 +00:00
{
2001-11-29 15:35:26 +00:00
// first we need a connection
Reference < XStatement > xStmt ( _xRs - > getStatement ( ) , UNO_QUERY ) ;
if ( xStmt . is ( ) )
xConnection = xStmt - > getConnection ( ) ;
else
{
Reference < XPreparedStatement > xPrepStmt ( _xRs - > getStatement ( ) , UNO_QUERY ) ;
xConnection = xPrepStmt - > getConnection ( ) ;
}
OSL_ENSURE ( xConnection . is ( ) , " No connection! " ) ;
2000-09-18 23:16:46 +00:00
2001-11-29 15:35:26 +00:00
Reference < XNameAccess > xColumns = xColumnsSupplier - > getColumns ( ) ;
Reference < XColumnsSupplier > xColSup ( _xComposer , UNO_QUERY ) ;
Reference < XNameAccess > xSelColumns = xColSup - > getColumns ( ) ;
2001-02-01 13:23:57 +00:00
2001-11-29 15:35:26 +00:00
OColumnNamePos aColumnNames ( xConnection - > getMetaData ( ) - > storesMixedCaseQuotedIdentifiers ( ) ? true : false ) ;
: : dbaccess : : getColumnPositions ( xSelColumns , xColumns , aUpdateTableName , aColumnNames ) ;
bAllKeysFound = sal_Int32 ( aColumnNames . size ( ) ) = = xColumns - > getElementNames ( ) . getLength ( ) ;
}
2000-09-18 23:16:46 +00:00
}
}
}
2001-11-29 15:35:26 +00:00
catch ( Exception & )
{
}
2000-09-18 23:16:46 +00:00
}
Reference < XPropertySet > xProp ( _xRs , UNO_QUERY ) ;
2001-11-29 15:35:26 +00:00
sal_Bool bNeedKeySet = ! ( xProp - > getPropertySetInfo ( ) - > hasPropertyByName ( PROPERTY_ISBOOKMARKABLE ) & &
any2bool ( xProp - > getPropertyValue ( PROPERTY_ISBOOKMARKABLE ) ) ) ;
bNeedKeySet = bNeedKeySet | | ( xProp - > getPropertySetInfo ( ) - > hasPropertyByName ( PROPERTY_RESULTSETCONCURRENCY ) & &
: : comphelper : : getINT32 ( xProp - > getPropertyValue ( PROPERTY_RESULTSETCONCURRENCY ) ) = = ResultSetConcurrency : : READ_ONLY ) ;
2000-09-18 23:16:46 +00:00
// first check if resultset is bookmarkable
2001-11-29 15:35:26 +00:00
if ( ! bNeedKeySet )
2000-09-18 23:16:46 +00:00
{
2001-11-29 15:35:26 +00:00
try
2000-12-06 08:55:44 +00:00
{
2001-11-29 15:35:26 +00:00
m_pCacheSet = new OBookmarkSet ( ) ;
m_pCacheSet - > construct ( _xRs ) ;
// check privileges
m_nPrivileges = Privilege : : SELECT ;
if ( Reference < XResultSetUpdate > ( _xRs , UNO_QUERY ) . is ( ) ) // this interface is optional so we have to check it
2000-12-06 08:55:44 +00:00
{
2001-11-29 15:35:26 +00:00
Reference < XPropertySet > xTable ( m_aUpdateTable , UNO_QUERY ) ;
if ( xTable . is ( ) & & xTable - > getPropertySetInfo ( ) - > hasPropertyByName ( PROPERTY_PRIVILEGES ) )
{
m_nPrivileges = 0 ;
xTable - > getPropertyValue ( PROPERTY_PRIVILEGES ) > > = m_nPrivileges ;
if ( ! m_nPrivileges )
m_nPrivileges = Privilege : : SELECT ;
}
2000-12-06 08:55:44 +00:00
}
}
2001-11-29 15:35:26 +00:00
catch ( const SQLException & )
{
bNeedKeySet = sal_True ;
}
2000-09-18 23:16:46 +00:00
}
2001-11-29 15:35:26 +00:00
if ( bNeedKeySet )
2000-09-18 23:16:46 +00:00
{
2001-07-19 08:29:22 +00:00
// need to check if we could handle this select clause
bAllKeysFound = bAllKeysFound & & ( nTablesCount = = 1 | | checkJoin ( xConnection , _xComposer , aUpdateTableName ) ) ;
2001-01-22 06:38:24 +00:00
// || !(comphelper::hasProperty(PROPERTY_CANUPDATEINSERTEDROWS,xProp) && any2bool(xProp->getPropertyValue(PROPERTY_CANUPDATEINSERTEDROWS)))
2001-10-26 06:50:50 +00:00
// oj removed because keyset uses only the next// || (xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_RESULTSETTYPE) && comphelper::getINT32(xProp->getPropertyValue(PROPERTY_RESULTSETTYPE)) == ResultSetType::FORWARD_ONLY)
if ( ! bAllKeysFound )
2000-09-18 23:16:46 +00:00
{
2001-10-30 13:22:10 +00:00
m_pCacheSet = new OStaticSet ( ) ;
m_pCacheSet - > construct ( _xRs ) ;
2001-07-19 08:29:22 +00:00
m_nPrivileges = Privilege : : SELECT ;
2000-09-18 23:16:46 +00:00
}
else
{
2001-04-02 10:14:53 +00:00
OColumnNamePos aColumnNames ( xConnection - > getMetaData ( ) - > storesMixedCaseQuotedIdentifiers ( ) ? true : false ) ;
2001-02-01 13:23:57 +00:00
Reference < XColumnsSupplier > xColSup ( _xComposer , UNO_QUERY ) ;
Reference < XNameAccess > xSelColumns = xColSup - > getColumns ( ) ;
Reference < XNameAccess > xColumns = m_aUpdateTable - > getColumns ( ) ;
: : dbaccess : : getColumnPositions ( xSelColumns , xColumns , aUpdateTableName , aColumnNames ) ;
2000-10-05 13:52:16 +00:00
// check privileges
m_nPrivileges = Privilege : : SELECT ;
2001-02-01 13:23:57 +00:00
sal_Bool bNoInsert = sal_False ;
Sequence < : : rtl : : OUString > aNames ( xColumns - > getElementNames ( ) ) ;
const : : rtl : : OUString * pBegin = aNames . getConstArray ( ) ;
const : : rtl : : OUString * pEnd = pBegin + aNames . getLength ( ) ;
for ( ; pBegin ! = pEnd ; + + pBegin )
{
Reference < XPropertySet > xColumn ;
2001-02-14 12:18:24 +00:00
: : cppu : : extractInterface ( xColumn , xColumns - > getByName ( * pBegin ) ) ;
2001-02-01 13:23:57 +00:00
OSL_ENSURE ( xColumn . is ( ) , " Column in table is null! " ) ;
if ( xColumn . is ( ) )
{
sal_Int32 nNullable = 0 ;
xColumn - > getPropertyValue ( PROPERTY_ISNULLABLE ) > > = nNullable ;
if ( nNullable = = ColumnValue : : NO_NULLS & & aColumnNames . find ( * pBegin ) = = aColumnNames . end ( ) )
{ // we found a column where null is not allowed so we can't insert new values
bNoInsert = sal_True ;
break ; // one column is enough
}
}
}
2001-10-30 13:22:10 +00:00
OKeySet * pKeySet = new OKeySet ( m_aUpdateTable , aUpdateTableName , _xComposer ) ;
2001-07-19 08:29:22 +00:00
try
2000-12-06 08:55:44 +00:00
{
2001-10-30 13:22:10 +00:00
pKeySet - > construct ( _xRs ) ;
2001-07-19 08:29:22 +00:00
// now we need to set the extern parameters because the select stmt could contain a :var1
pKeySet - > setExternParameters ( _rParameterRow ) ;
m_pCacheSet = pKeySet ;
if ( Reference < XResultSetUpdate > ( _xRs , UNO_QUERY ) . is ( ) ) // this interface is optional so we have to check it
2000-12-06 08:55:44 +00:00
{
2001-07-19 08:29:22 +00:00
Reference < XPropertySet > xTable ( m_aUpdateTable , UNO_QUERY ) ;
if ( xTable . is ( ) & & xTable - > getPropertySetInfo ( ) - > hasPropertyByName ( PROPERTY_PRIVILEGES ) )
{
m_nPrivileges = 0 ;
xTable - > getPropertyValue ( PROPERTY_PRIVILEGES ) > > = m_nPrivileges ;
if ( ! m_nPrivileges )
m_nPrivileges = Privilege : : SELECT ;
}
2000-12-06 08:55:44 +00:00
}
2001-07-19 08:29:22 +00:00
if ( bNoInsert )
m_nPrivileges | = ~ Privilege : : INSERT ; // remove the insert privilege
}
catch ( const SQLException & )
{
// we couldn't create a keyset here so we have to create a static cache
if ( m_pCacheSet )
delete m_pCacheSet ;
2001-10-30 13:22:10 +00:00
m_pCacheSet = new OStaticSet ( ) ;
m_pCacheSet - > construct ( _xRs ) ;
2001-07-19 08:29:22 +00:00
m_nPrivileges = Privilege : : SELECT ;
2000-12-06 08:55:44 +00:00
}
2000-09-18 23:16:46 +00:00
}
}
2001-01-09 14:38:59 +00:00
// last check
2001-10-26 06:50:50 +00:00
if ( ! bAllKeysFound & & xProp - > getPropertySetInfo ( ) - > hasPropertyByName ( PROPERTY_RESULTSETCONCURRENCY ) & &
2001-01-09 14:38:59 +00:00
: : comphelper : : getINT32 ( xProp - > getPropertyValue ( PROPERTY_RESULTSETCONCURRENCY ) ) = = ResultSetConcurrency : : READ_ONLY )
m_nPrivileges = Privilege : : SELECT ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
ORowSetCache : : ~ ORowSetCache ( )
{
2000-09-29 14:23:36 +00:00
delete m_pCacheSet ;
2000-12-12 11:20:31 +00:00
m_pCacheSet = NULL ;
2000-09-18 23:16:46 +00:00
if ( m_pMatrix )
{
m_pMatrix - > clear ( ) ;
delete m_pMatrix ;
}
2000-09-29 14:23:36 +00:00
if ( m_pInsertMatrix )
{
m_pInsertMatrix - > clear ( ) ;
delete m_pInsertMatrix ;
}
2001-02-01 13:23:57 +00:00
m_xSet = WeakReference < XResultSet > ( ) ;
2000-11-03 13:42:50 +00:00
m_xMetaData = NULL ;
m_aUpdateTable = NULL ;
2000-09-18 23:16:46 +00:00
}
2002-04-16 06:48:57 +00:00
2000-09-18 23:16:46 +00:00
// -------------------------------------------------------------------------
void ORowSetCache : : setMaxRowSize ( sal_Int32 _nSize )
{
2001-01-24 08:52:19 +00:00
if ( _nSize = = m_nFetchSize )
return ;
2000-09-18 23:16:46 +00:00
m_nFetchSize = _nSize ;
if ( ! m_pMatrix )
2001-01-24 08:52:19 +00:00
{
2000-09-18 23:16:46 +00:00
m_pMatrix = new ORowSetMatrix ( _nSize ) ;
2001-01-24 08:52:19 +00:00
m_aMatrixIter = m_pMatrix - > end ( ) ;
m_aMatrixEnd = m_pMatrix - > end ( ) ;
m_pInsertMatrix = new ORowSetMatrix ( 1 ) ; // a little bit overkill but ??? :-)
m_aInsertRow = m_pInsertMatrix - > end ( ) ;
}
2000-09-18 23:16:46 +00:00
else
{
2001-01-24 08:52:19 +00:00
// now correct the iterator in our iterator vector
: : std : : vector < sal_Int32 > aPositions ;
2001-04-05 13:14:41 +00:00
: : std : : map < sal_Int32 , sal_Bool > aCacheIterToChange ;
// first get the positions where they stand now
2001-01-24 08:52:19 +00:00
ORowSetCacheMap : : iterator aCacheIter = m_aCacheIterators . begin ( ) ;
for ( ; aCacheIter ! = m_aCacheIterators . end ( ) ; + + aCacheIter )
{
2001-04-05 13:14:41 +00:00
aCacheIterToChange [ aCacheIter - > first ] = sal_False ;
2001-01-24 08:52:19 +00:00
if ( ! aCacheIter - > second . aIterator )
continue ;
if ( aCacheIter - > second . aIterator ! = m_aInsertRow & & ! m_bInserted & & ! m_bModified )
{
sal_Int16 nDist = ( aCacheIter - > second . aIterator - m_pMatrix - > begin ( ) ) ;
aPositions . push_back ( nDist ) ;
2001-04-05 13:14:41 +00:00
aCacheIterToChange [ aCacheIter - > first ] = sal_True ;
2001-01-24 08:52:19 +00:00
}
}
sal_Int32 nKeyPos = ( m_aMatrixIter - m_pMatrix - > begin ( ) ) ;
2000-09-18 23:16:46 +00:00
m_pMatrix - > resize ( _nSize ) ;
2001-01-24 08:52:19 +00:00
m_aMatrixIter = m_pMatrix - > begin ( ) + nKeyPos ;
m_aMatrixEnd = m_pMatrix - > end ( ) ;
2001-04-05 13:14:41 +00:00
// now adjust their positions because a resize invalid all iterators
: : std : : vector < sal_Int32 > : : const_iterator aIter = aPositions . begin ( ) ;
: : std : : map < sal_Int32 , sal_Bool > : : const_iterator aPosChangeIter = aCacheIterToChange . begin ( ) ;
for ( aCacheIter = m_aCacheIterators . begin ( ) ;
aPosChangeIter ! = aCacheIterToChange . end ( ) ;
+ + aPosChangeIter , + + aCacheIter )
2001-01-24 08:52:19 +00:00
{
2001-04-05 13:14:41 +00:00
if ( aPosChangeIter - > second )
2001-01-24 08:52:19 +00:00
aCacheIter - > second . aIterator = m_pMatrix - > begin ( ) + * aIter + + ;
}
}
if ( ! m_nPosition )
{
sal_Int32 nNewSt = 1 ;
fillMatrix ( nNewSt , _nSize + 1 ) ;
m_nStartPos = 0 ;
m_nEndPos = _nSize ;
2000-09-18 23:16:46 +00:00
}
}
// -------------------------------------------------------------------------
// OComponentHelper
void SAL_CALL ORowSetCache : : disposing ( void )
{
}
// -------------------------------------------------------------------------
// ::com::sun::star::lang::XEventListener
void SAL_CALL ORowSetCache : : disposing ( const : : com : : sun : : star : : lang : : EventObject & Source ) throw ( RuntimeException )
{
}
// -------------------------------------------------------------------------
// XCloseable
void SAL_CALL ORowSetCache : : close ( ) throw ( SQLException , RuntimeException )
{
}
// -------------------------------------------------------------------------
// XResultSetMetaDataSupplier
Reference < XResultSetMetaData > SAL_CALL ORowSetCache : : getMetaData ( ) throw ( SQLException , RuntimeException )
{
return m_xMetaData ;
}
// -------------------------------------------------------------------------
// ::com::sun::star::sdbcx::XColumnsSupplier
Reference < : : com : : sun : : star : : container : : XNameAccess > SAL_CALL ORowSetCache : : getColumns ( ) throw ( RuntimeException )
{
return Reference < : : com : : sun : : star : : container : : XNameAccess > ( ) ;
}
// -------------------------------------------------------------------------
// XRow
sal_Bool SAL_CALL ORowSetCache : : wasNull ( ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( m_aMatrixIter ! = m_pMatrix - > end ( ) , " Iterator is equal end() " ) ;
2000-09-18 23:16:46 +00:00
return ( * ( * m_aMatrixIter ) ) [ m_nLastColumnIndex ] . isNull ( ) ;
}
2001-06-26 09:30:55 +00:00
// -----------------------------------------------------------------------------
ORowSetValue ORowSetCache : : getValue ( sal_Int32 columnIndex )
2000-09-18 23:16:46 +00:00
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( m_aMatrixIter ! = m_pMatrix - > end ( ) , " Iterator is equal end() " ) ;
2000-09-18 23:16:46 +00:00
m_nLastColumnIndex = columnIndex ;
2000-09-29 14:23:36 +00:00
return ( * ( * m_aMatrixIter ) ) [ m_nLastColumnIndex ] ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2001-06-26 09:30:55 +00:00
: : rtl : : OUString SAL_CALL ORowSetCache : : getString ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return getValue ( columnIndex ) ;
}
// -------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
sal_Bool SAL_CALL ORowSetCache : : getBoolean ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int8 SAL_CALL ORowSetCache : : getByte ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int16 SAL_CALL ORowSetCache : : getShort ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetCache : : getInt ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Int64 SAL_CALL ORowSetCache : : getLong ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
float SAL_CALL ORowSetCache : : getFloat ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
double SAL_CALL ORowSetCache : : getDouble ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Sequence < sal_Int8 > SAL_CALL ORowSetCache : : getBytes ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : Date SAL_CALL ORowSetCache : : getDate ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : Time SAL_CALL ORowSetCache : : getTime ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : DateTime SAL_CALL ORowSetCache : : getTimestamp ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return getValue ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference < : : com : : sun : : star : : io : : XInputStream > SAL_CALL ORowSetCache : : getBinaryStream ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( m_aMatrixIter ! = m_pMatrix - > end ( ) , " Iterator is equal end() " ) ;
2000-09-18 23:16:46 +00:00
m_nLastColumnIndex = columnIndex ;
2000-10-11 10:21:40 +00:00
return new : : comphelper : : SequenceInputStream ( ( * ( * m_aMatrixIter ) ) [ m_nLastColumnIndex ] . getSequence ( ) ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference < : : com : : sun : : star : : io : : XInputStream > SAL_CALL ORowSetCache : : getCharacterStream ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( m_aMatrixIter ! = m_pMatrix - > end ( ) , " Iterator is equal end() " ) ;
2000-09-18 23:16:46 +00:00
m_nLastColumnIndex = columnIndex ;
2000-10-11 10:21:40 +00:00
return new : : comphelper : : SequenceInputStream ( ( * ( * m_aMatrixIter ) ) [ m_nLastColumnIndex ] . getSequence ( ) ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Any SAL_CALL ORowSetCache : : getObject ( sal_Int32 columnIndex , const Reference < : : com : : sun : : star : : container : : XNameAccess > & typeMap ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
return Any ( ) ;
}
// -------------------------------------------------------------------------
Reference < XRef > SAL_CALL ORowSetCache : : getRef ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
return Reference < XRef > ( ) ;
}
// -------------------------------------------------------------------------
Reference < XBlob > SAL_CALL ORowSetCache : : getBlob ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
return Reference < XBlob > ( ) ;
}
// -------------------------------------------------------------------------
Reference < XClob > SAL_CALL ORowSetCache : : getClob ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
return Reference < XClob > ( ) ;
}
// -------------------------------------------------------------------------
Reference < XArray > SAL_CALL ORowSetCache : : getArray ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
return Reference < XArray > ( ) ;
}
// -------------------------------------------------------------------------
// ::com::sun::star::sdbcx::XRowLocate
Any SAL_CALL ORowSetCache : : getBookmark ( ) throw ( SQLException , RuntimeException )
{
if ( m_bAfterLast )
2001-04-19 06:14:49 +00:00
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
2000-09-18 23:16:46 +00:00
2001-01-24 08:52:19 +00:00
if ( m_aMatrixIter = = m_pMatrix - > end ( ) | | ! ( * m_aMatrixIter ) . isValid ( ) )
{
return Any ( ) ; // this is allowed here because the rowset knowns what it is doing
}
2001-01-22 06:38:24 +00:00
2000-09-18 23:16:46 +00:00
switch ( ( * ( * m_aMatrixIter ) ) [ 0 ] . getTypeKind ( ) )
{
case DataType : : TINYINT :
case DataType : : SMALLINT :
case DataType : : INTEGER :
return makeAny ( ( sal_Int32 ) ( * ( * m_aMatrixIter ) ) [ 0 ] ) ;
break ;
default :
if ( ( * ( * m_aMatrixIter ) ) [ 0 ] . isNull ( ) )
( * ( * m_aMatrixIter ) ) [ 0 ] = m_pCacheSet - > getBookmark ( * m_aMatrixIter ) ;
return ( * ( * m_aMatrixIter ) ) [ 0 ] . getAny ( ) ;
}
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : moveToBookmark ( const Any & bookmark ) throw ( SQLException , RuntimeException )
{
2000-09-29 14:23:36 +00:00
// if(m_bInserted)
// m_bInserted = sal_False;
2000-09-18 23:16:46 +00:00
2002-08-08 06:07:42 +00:00
if ( m_pCacheSet - > moveToBookmark ( bookmark ) )
2000-09-18 23:16:46 +00:00
{
2000-12-06 08:55:44 +00:00
m_bDeleted = m_bBeforeFirst = sal_False ;
2000-09-18 23:16:46 +00:00
m_nPosition = m_pCacheSet - > getRow ( ) ;
2001-06-26 09:30:55 +00:00
checkPositionFlags ( ) ;
2000-12-06 08:55:44 +00:00
if ( ! m_bAfterLast )
{
moveWindow ( ) ;
2001-06-26 09:30:55 +00:00
checkPositionFlags ( ) ;
2000-12-06 08:55:44 +00:00
if ( ! m_bAfterLast )
2001-11-29 15:35:26 +00:00
m_aMatrixIter = calcPosition ( ) ;
2000-12-06 08:55:44 +00:00
else
m_aMatrixIter = m_pMatrix - > end ( ) ;
}
else
m_aMatrixIter = m_pMatrix - > end ( ) ;
2000-09-18 23:16:46 +00:00
}
2001-06-22 12:08:06 +00:00
else
return sal_False ;
2000-09-29 14:23:36 +00:00
2000-09-18 23:16:46 +00:00
return m_aMatrixIter ! = m_pMatrix - > end ( ) & & ( * m_aMatrixIter ) . isValid ( ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : moveRelativeToBookmark ( const Any & bookmark , sal_Int32 rows ) throw ( SQLException , RuntimeException )
{
sal_Bool bRet ;
if ( bRet = moveToBookmark ( bookmark ) )
{
m_nPosition = m_pCacheSet - > getRow ( ) + rows ;
absolute ( m_nPosition ) ;
// for(sal_Int32 i=0;i<rows && m_aMatrixIter != m_pMatrix->end();++i,++m_aMatrixIter) ;
bRet = m_aMatrixIter ! = m_pMatrix - > end ( ) & & ( * m_aMatrixIter ) . isValid ( ) ;
}
2000-09-29 14:23:36 +00:00
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetCache : : compareBookmarks ( const Any & first , const Any & second ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
return ( ! first . hasValue ( ) | | ! second . hasValue ( ) ) ? CompareBookmark : : NOT_COMPARABLE : m_pCacheSet - > compareBookmarks ( first , second ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : hasOrderedBookmarks ( ) throw ( SQLException , RuntimeException )
{
return m_pCacheSet - > hasOrderedBookmarks ( ) ;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetCache : : hashBookmark ( const Any & bookmark ) throw ( SQLException , RuntimeException )
{
2001-02-14 12:18:24 +00:00
return m_pCacheSet - > hashBookmark ( bookmark ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// XRowUpdate
void SAL_CALL ORowSetCache : : updateNull ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
updateValue ( columnIndex , ORowSetValue ( ) ) ;
2000-09-18 23:16:46 +00:00
}
2001-06-26 09:30:55 +00:00
// -----------------------------------------------------------------------------
void ORowSetCache : : updateValue ( sal_Int32 columnIndex , const ORowSetValue & x )
2000-09-18 23:16:46 +00:00
{
2001-06-26 09:30:55 +00:00
checkUpdateConditions ( columnIndex ) ;
2000-09-18 23:16:46 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
2000-09-29 14:23:36 +00:00
( * ( * m_aInsertRow ) ) [ columnIndex ] . setBound ( sal_True ) ;
( * ( * m_aInsertRow ) ) [ columnIndex ] = x ;
( * ( * m_aInsertRow ) ) [ columnIndex ] . setModified ( ) ;
2000-09-18 23:16:46 +00:00
m_bModified = sal_True ;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : updateBinaryStream ( sal_Int32 columnIndex , const Reference < : : com : : sun : : star : : io : : XInputStream > & x , sal_Int32 length ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
checkUpdateConditions ( columnIndex ) ;
2001-04-02 10:14:53 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
Sequence < sal_Int8 > aSeq ;
if ( x . is ( ) )
x - > readSomeBytes ( aSeq , length ) ;
2001-06-26 09:30:55 +00:00
updateValue ( columnIndex , aSeq ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : updateCharacterStream ( sal_Int32 columnIndex , const Reference < : : com : : sun : : star : : io : : XInputStream > & x , sal_Int32 length ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
checkUpdateConditions ( columnIndex ) ;
2001-04-02 10:14:53 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
Sequence < sal_Int8 > aSeq ;
if ( x . is ( ) )
x - > readSomeBytes ( aSeq , length ) ;
2001-06-26 09:30:55 +00:00
updateValue ( columnIndex , aSeq ) ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : updateObject ( sal_Int32 columnIndex , const Any & x ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
checkUpdateConditions ( columnIndex ) ;
2001-04-02 10:14:53 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
( * ( * m_aInsertRow ) ) [ columnIndex ] . setBound ( sal_True ) ;
( * ( * m_aInsertRow ) ) [ columnIndex ] = x ;
( * ( * m_aInsertRow ) ) [ columnIndex ] . setModified ( ) ;
m_bModified = sal_True ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : updateNumericObject ( sal_Int32 columnIndex , const Any & x , sal_Int32 scale ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
checkUpdateConditions ( columnIndex ) ;
2001-04-02 10:14:53 +00:00
: : osl : : MutexGuard aGuard ( m_aColumnsMutex ) ;
( * ( * m_aInsertRow ) ) [ columnIndex ] . setBound ( sal_True ) ;
( * ( * m_aInsertRow ) ) [ columnIndex ] = x ;
( * ( * m_aInsertRow ) ) [ columnIndex ] . setModified ( ) ;
m_bModified = sal_True ;
2001-06-26 08:32:05 +00:00
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// XResultSet
sal_Bool SAL_CALL ORowSetCache : : next ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-06-26 09:30:55 +00:00
if ( ! isAfterLast ( ) )
2000-09-18 23:16:46 +00:00
{
2001-06-26 09:30:55 +00:00
m_bBeforeFirst = sal_False ;
+ + m_nPosition ;
// after we increment the position we have to check if we are already after the last row
checkPositionFlags ( ) ;
if ( ! m_bAfterLast )
2001-01-26 14:18:17 +00:00
{
2001-06-26 09:30:55 +00:00
moveWindow ( ) ;
OSL_ENSURE ( ( ( m_nPosition - m_nStartPos ) - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-11-29 15:35:26 +00:00
m_aMatrixIter = calcPosition ( ) ;
2001-06-26 09:30:55 +00:00
checkPositionFlags ( ) ;
2001-01-26 14:18:17 +00:00
}
}
2000-09-18 23:16:46 +00:00
return ! m_bAfterLast ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : isBeforeFirst ( ) throw ( SQLException , RuntimeException )
{
// return !m_nPosition;
2001-06-26 09:30:55 +00:00
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2000-09-18 23:16:46 +00:00
return m_bBeforeFirst ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : isAfterLast ( ) throw ( SQLException , RuntimeException )
{
// return m_pCacheSet->isAfterLast();
2001-01-22 06:38:24 +00:00
// return m_bRowCountFinal ? m_bAfterLast : m_pCacheSet->isAfterLast();
2001-06-26 09:30:55 +00:00
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-01-22 06:38:24 +00:00
return m_bAfterLast ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : isFirst ( ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2000-09-18 23:16:46 +00:00
return m_nPosition = = 1 ; // ask resultset for
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : isLast ( ) throw ( SQLException , RuntimeException )
{
2001-01-22 06:38:24 +00:00
// return m_bRowCountFinal ? (m_nPosition==m_nRowCount) : m_pCacheSet->isLast();
2001-06-26 09:30:55 +00:00
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
return m_nPosition = = m_nRowCount ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : beforeFirst ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-06-26 09:30:55 +00:00
if ( ! m_bBeforeFirst )
{
2001-07-12 06:56:32 +00:00
m_bAfterLast = sal_False ;
2001-06-26 09:30:55 +00:00
m_nPosition = 0 ;
m_bBeforeFirst = sal_True ;
m_pCacheSet - > beforeFirst ( ) ;
moveWindow ( ) ;
m_aMatrixIter = m_pMatrix - > end ( ) ;
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : afterLast ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-06-26 09:30:55 +00:00
if ( ! m_bAfterLast )
{
2001-07-12 06:56:32 +00:00
m_bBeforeFirst = sal_False ;
2001-06-26 09:30:55 +00:00
m_bAfterLast = sal_True ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:30:55 +00:00
if ( ! m_bRowCountFinal )
{
m_pCacheSet - > last ( ) ;
m_bRowCountFinal = sal_True ;
m_nRowCount = m_pCacheSet - > getRow ( ) ; // + 1 removed
}
m_pCacheSet - > afterLast ( ) ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:30:55 +00:00
m_nPosition = 0 ;
m_aMatrixIter = m_pMatrix - > end ( ) ;
2000-09-18 23:16:46 +00:00
}
}
// -------------------------------------------------------------------------
2001-01-22 06:38:24 +00:00
sal_Bool ORowSetCache : : fillMatrix ( sal_Int32 & _nNewStartPos , sal_Int32 _nNewEndPos )
2000-09-18 23:16:46 +00:00
{
2001-06-26 09:30:55 +00:00
OSL_ENSURE ( _nNewStartPos ! = _nNewEndPos , " ORowSetCache::fillMatrix: StartPos and EndPos can not be equal! " ) ;
2000-11-07 12:19:27 +00:00
// fill the whole window with new data
2000-09-18 23:16:46 +00:00
ORowSetMatrix : : iterator aIter = m_pMatrix - > begin ( ) ;
2000-11-07 12:19:27 +00:00
sal_Bool bCheck = m_pCacheSet - > absolute ( _nNewStartPos ) ; // -1 no need to
2001-01-24 08:52:19 +00:00
sal_Int32 i = _nNewStartPos ;
for ( ; i < _nNewEndPos ; + + i , + + aIter )
2000-09-18 23:16:46 +00:00
{
if ( bCheck )
{
if ( ! aIter - > isValid ( ) )
* aIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
2000-12-14 10:41:19 +00:00
m_pCacheSet - > fillValueRow ( * aIter , i ) ;
2000-09-18 23:16:46 +00:00
}
else
{ // there are no more rows found so we can fetch some before start
if ( ! m_bRowCountFinal )
{
2001-01-24 08:52:19 +00:00
if ( m_pCacheSet - > previous ( ) ) // because we stand after the last row
m_nRowCount = m_pCacheSet - > getRow ( ) ; // here we have the row count
if ( ! m_nRowCount )
m_nRowCount = i - 1 ; // it can be that getRow return zero
2000-09-18 23:16:46 +00:00
m_bRowCountFinal = sal_True ;
}
2001-01-24 08:52:19 +00:00
if ( m_nRowCount > m_nFetchSize )
2000-09-18 23:16:46 +00:00
{
2001-01-24 08:52:19 +00:00
ORowSetMatrix : : iterator aEnd = aIter ;
sal_Int32 nPos = m_nRowCount - m_nFetchSize + 1 ;
_nNewStartPos = nPos ;
bCheck = m_pCacheSet - > absolute ( _nNewStartPos ) ;
for ( ; bCheck & & aIter ! = m_pMatrix - > end ( ) ; + + aIter )
2000-09-18 23:16:46 +00:00
{
2001-01-24 08:52:19 +00:00
if ( bCheck )
{
if ( ! aIter - > isValid ( ) )
* aIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
m_pCacheSet - > fillValueRow ( * aIter , nPos + + ) ;
}
bCheck = m_pCacheSet - > next ( ) ;
2000-09-18 23:16:46 +00:00
}
2001-01-24 08:52:19 +00:00
if ( aIter ! = aEnd )
: : std : : rotate ( m_pMatrix - > begin ( ) , aEnd , m_pMatrix - > end ( ) ) ;
2000-09-18 23:16:46 +00:00
}
break ;
}
bCheck = m_pCacheSet - > next ( ) ;
}
2001-01-22 06:38:24 +00:00
// m_nStartPos = _nNewStartPos;
2000-11-07 12:19:27 +00:00
// we have to read one row forward to enshure that we know when we are on last row
// but only when we don't know it already
if ( ! m_bRowCountFinal )
{
if ( ! m_pCacheSet - > next ( ) )
{
if ( m_pCacheSet - > previous ( ) ) // because we stand after the last row
m_nRowCount = m_pCacheSet - > getRow ( ) ; // here we have the row count
m_bRowCountFinal = sal_True ;
}
2001-01-24 08:52:19 +00:00
else
2001-10-12 14:36:42 +00:00
m_nRowCount = std : : max ( i , m_nRowCount ) ;
2001-01-24 08:52:19 +00:00
2000-11-07 12:19:27 +00:00
}
2000-09-18 23:16:46 +00:00
return bCheck ;
}
// -------------------------------------------------------------------------
sal_Bool ORowSetCache : : moveWindow ( )
{
sal_Bool bRet = sal_True ;
2001-04-02 10:14:53 +00:00
sal_Int32 nDiff = ( sal_Int32 ) ( m_nFetchSize * 0.5 - 0.5 ) ;
2001-01-24 08:52:19 +00:00
sal_Int32 nNewStartPos = ( m_nPosition - nDiff ) ;
2000-09-18 23:16:46 +00:00
// sal_Int32 nNewEndPos = (m_nPosition+m_nFetchSize*0.5);
sal_Int32 nNewEndPos = nNewStartPos + m_nFetchSize ;
if ( m_nPosition < = m_nStartPos )
{ // the window is behind the new start pos
if ( ! m_nStartPos )
return sal_False ;
// the new position should be the nPos - nFetchSize/2
2001-01-24 08:52:19 +00:00
if ( nNewEndPos > m_nStartPos )
2000-09-18 23:16:46 +00:00
{ // but the two regions are overlapping
// fill the rows behind the new end
ORowSetMatrix : : iterator aEnd ; // the iterator we need for rotate
ORowSetMatrix : : iterator aIter ; // the iterator we fill with new values
sal_Bool bCheck = sal_True ;
if ( nNewStartPos < 1 )
{
bCheck = m_pCacheSet - > first ( ) ;
2000-12-14 10:41:19 +00:00
// aEnd = m_pMatrix->begin() + (sal_Int32)(m_nFetchSize*0.5);
2001-04-02 10:14:53 +00:00
OSL_ENSURE ( ( nNewEndPos - m_nStartPos - nNewStartPos ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2000-12-14 10:41:19 +00:00
aEnd = m_pMatrix - > begin ( ) + nNewEndPos - m_nStartPos - nNewStartPos ;
2000-09-18 23:16:46 +00:00
aIter = aEnd ;
2000-12-14 10:41:19 +00:00
m_nStartPos = 0 ;
2000-09-18 23:16:46 +00:00
}
else
{
2001-04-02 10:14:53 +00:00
OSL_ENSURE ( ( nNewEndPos - m_nStartPos - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-01-24 08:52:19 +00:00
aEnd = m_pMatrix - > begin ( ) + ( nNewEndPos - m_nStartPos ) - 1 ;
aIter = m_pMatrix - > begin ( ) + ( nNewEndPos - m_nStartPos ) - 1 ;
bCheck = m_pCacheSet - > absolute ( nNewStartPos ) ;
m_nStartPos = nNewStartPos - 1 ;
2000-09-18 23:16:46 +00:00
}
if ( bCheck )
{
2000-11-14 12:28:20 +00:00
sal_Int32 nPos = m_nStartPos + 1 ;
2000-09-18 23:16:46 +00:00
for ( ; aIter ! = m_pMatrix - > end ( ) & & bCheck ; )
{
if ( ! aIter - > isValid ( ) )
* aIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
2000-11-14 12:28:20 +00:00
m_pCacheSet - > fillValueRow ( * aIter + + , nPos + + ) ;
2000-09-18 23:16:46 +00:00
bCheck = m_pCacheSet - > next ( ) ;
}
: : std : : rotate ( m_pMatrix - > begin ( ) , aEnd , m_pMatrix - > end ( ) ) ;
2001-01-22 06:38:24 +00:00
// now correct the iterator in our iterator vector
2001-06-26 09:30:55 +00:00
// rotateCacheIterator(aEnd-m_pMatrix->begin()); //can't be used because they decrement and here we need to increment
2001-01-24 08:52:19 +00:00
sal_Int16 _nDist = aEnd - m_pMatrix - > begin ( ) ;
ORowSetCacheMap : : iterator aCacheIter = m_aCacheIterators . begin ( ) ;
for ( ; aCacheIter ! = m_aCacheIterators . end ( ) ; + + aCacheIter )
{
2001-06-26 09:30:55 +00:00
if ( aCacheIter - > second . aIterator & & aCacheIter - > second . aIterator ! = m_aInsertRow & & ! m_bInserted & & ! m_bModified )
2001-01-24 08:52:19 +00:00
{
sal_Int16 nDist = ( aCacheIter - > second . aIterator - m_pMatrix - > begin ( ) ) ;
if ( nDist > _nDist )
{
aCacheIter - > second . aIterator = NULL ;
}
else
aCacheIter - > second . aIterator + = _nDist ;
}
}
2000-09-18 23:16:46 +00:00
}
else
{ // normaly this should never happen
2001-01-24 08:52:19 +00:00
OSL_ENSURE ( 0 , " What the hell is happen here! " ) ;
2000-09-18 23:16:46 +00:00
return sal_False ;
}
}
else
{ // no rows can be reused so fill again
if ( nNewStartPos < 1 ) // special case
{
m_nStartPos = 0 ;
2000-12-14 10:41:19 +00:00
m_pCacheSet - > beforeFirst ( ) ;
2000-09-18 23:16:46 +00:00
sal_Bool bCheck ;
ORowSetMatrix : : iterator aIter = m_pMatrix - > begin ( ) ;
for ( sal_Int32 i = 0 ; i < m_nFetchSize ; + + i , + + aIter )
{
if ( bCheck = m_pCacheSet - > next ( ) )
{
if ( ! aIter - > isValid ( ) )
* aIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
2000-12-14 10:41:19 +00:00
m_pCacheSet - > fillValueRow ( * aIter , i + 1 ) ;
2000-09-18 23:16:46 +00:00
}
else
* aIter = NULL ;
}
}
else
2001-01-22 06:38:24 +00:00
{
2001-01-24 08:52:19 +00:00
sal_Int32 nNewSt = nNewStartPos ;
2001-01-22 06:38:24 +00:00
bRet = fillMatrix ( nNewSt , nNewEndPos ) ;
m_nStartPos = nNewSt - 1 ;
rotateCacheIterator ( m_nFetchSize + 1 ) ; // forces that every iterator will be set to null
}
2000-09-18 23:16:46 +00:00
}
}
else if ( m_nPosition > m_nStartPos )
2000-11-07 12:19:27 +00:00
{ // the new start pos is above the startpos of the window
2000-09-18 23:16:46 +00:00
if ( m_nPosition < = ( m_nStartPos + m_nFetchSize ) )
{ // position in window
2001-04-02 10:14:53 +00:00
OSL_ENSURE ( ( m_nPosition - m_nStartPos - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-11-29 15:35:26 +00:00
m_aMatrixIter = calcPosition ( ) ;
2000-09-18 23:16:46 +00:00
if ( ! m_aMatrixIter - > isValid ( ) )
{
2000-11-07 12:19:27 +00:00
sal_Bool bOk ;
if ( bOk = m_pCacheSet - > absolute ( m_nPosition ) )
2000-09-18 23:16:46 +00:00
{
* m_aMatrixIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
2000-11-14 12:28:20 +00:00
m_pCacheSet - > fillValueRow ( * m_aMatrixIter , m_nPosition ) ;
2000-11-07 12:19:27 +00:00
// we have to read one row forward to enshure that we know when we are on last row
// but only when we don't know it already
2000-11-14 12:28:20 +00:00
if ( ! m_bRowCountFinal & & ( bOk = m_pCacheSet - > absolute ( m_nPosition + 1 ) ) )
2001-10-12 14:36:42 +00:00
m_nRowCount = std : : max ( sal_Int32 ( m_nPosition + 1 ) , m_nRowCount ) ;
2000-09-18 23:16:46 +00:00
}
2000-11-07 12:19:27 +00:00
if ( ! bOk )
2000-09-18 23:16:46 +00:00
{
if ( ! m_bRowCountFinal )
{
2001-06-26 09:30:55 +00:00
// because we stand after the last row
m_nRowCount = m_pCacheSet - > previous ( ) ? m_pCacheSet - > getRow ( ) : 0 ; // + 1 removed
2000-09-18 23:16:46 +00:00
m_bRowCountFinal = sal_True ;
}
}
}
}
else if ( nNewStartPos < ( m_nStartPos + m_nFetchSize ) )
{ // position behind window but the region is overlapping
// the rows from begin() to (begin + nNewStartPos - m_nStartPos) can be refilled with the new rows
// the rows behind this can be reused
ORowSetMatrix : : iterator aIter = m_pMatrix - > begin ( ) ;
2001-04-02 10:14:53 +00:00
OSL_ENSURE ( ( nNewStartPos - m_nStartPos - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-01-24 08:52:19 +00:00
ORowSetMatrix : : iterator aEnd = m_pMatrix - > begin ( ) + nNewStartPos - m_nStartPos - 1 ;
2000-10-25 06:32:52 +00:00
sal_Bool bCheck = m_pCacheSet - > absolute ( m_nStartPos + m_nFetchSize ) ;
2000-11-14 12:28:20 +00:00
sal_Int32 nPos = m_nStartPos + m_nFetchSize ;
2000-09-18 23:16:46 +00:00
for ( ; bCheck & & aIter ! = aEnd ; )
{
if ( bCheck = m_pCacheSet - > next ( ) ) // resultset stands on right position
{
if ( ! aIter - > isValid ( ) )
* aIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
2000-11-14 12:28:20 +00:00
m_pCacheSet - > fillValueRow ( * aIter + + , + + nPos ) ;
2000-09-18 23:16:46 +00:00
}
}
2001-07-24 13:20:28 +00:00
// we know that this is the current maximal rowcount here
if ( ! m_bRowCountFinal )
2001-10-12 14:36:42 +00:00
m_nRowCount = std : : max ( nPos , m_nRowCount ) ;
2000-11-07 12:19:27 +00:00
// we have to read one row forward to enshure that we know when we are on last row
// but only when we don't know it already
sal_Bool bOk = sal_True ;
if ( bCheck & & ! m_bRowCountFinal )
bOk = m_pCacheSet - > next ( ) ;
2000-09-18 23:16:46 +00:00
// bind end to front
if ( bCheck )
{ // rotate the end to the front
: : std : : rotate ( m_pMatrix - > begin ( ) , aIter , m_pMatrix - > end ( ) ) ;
2001-01-22 06:38:24 +00:00
// now correct the iterator in our iterator vector
rotateCacheIterator ( aIter - m_pMatrix - > begin ( ) ) ;
2000-09-18 23:16:46 +00:00
m_nStartPos = nNewStartPos - 1 ; // must be -1
2000-11-07 12:19:27 +00:00
// now I can say how many rows we have
if ( ! bOk )
{
m_pCacheSet - > previous ( ) ; // because we stand after the last row
2000-11-14 12:28:20 +00:00
m_nRowCount = nPos ; // here we have the row count
2000-11-07 12:19:27 +00:00
m_bRowCountFinal = sal_True ;
}
2001-07-24 13:20:28 +00:00
else if ( ! m_bRowCountFinal )
2001-10-12 14:36:42 +00:00
m_nRowCount = std : : max ( + + nPos , m_nRowCount ) ;
2000-09-18 23:16:46 +00:00
}
else
{ // the end was reached before end() so we can set the start before nNewStartPos
2000-10-25 06:32:52 +00:00
m_nStartPos + = ( aIter - m_pMatrix - > begin ( ) ) ;
2000-09-18 23:16:46 +00:00
: : std : : rotate ( m_pMatrix - > begin ( ) , aIter , m_pMatrix - > end ( ) ) ;
2001-01-22 06:38:24 +00:00
// now correct the iterator in our iterator vector
rotateCacheIterator ( aIter - m_pMatrix - > begin ( ) ) ;
2000-09-18 23:16:46 +00:00
if ( ! m_bRowCountFinal )
{
2000-11-14 12:28:20 +00:00
m_pCacheSet - > previous ( ) ; // because we stand after the last row
2001-10-12 14:36:42 +00:00
m_nRowCount = std : : max ( m_nRowCount , m_pCacheSet - > getRow ( ) ) ; // here we have the row count
2000-09-18 23:16:46 +00:00
m_bRowCountFinal = sal_True ;
}
// TODO check
2000-10-25 06:32:52 +00:00
// m_nStartPos = (nNewStartPos+m_nRowCount) - m_nFetchSize ;
if ( m_nStartPos < 0 )
m_nStartPos = 0 ;
2000-09-18 23:16:46 +00:00
}
2000-10-25 06:32:52 +00:00
// here we need only to check if the begining row is valid. If not we have to fetch it.
2000-09-18 23:16:46 +00:00
if ( ! m_pMatrix - > begin ( ) - > isValid ( ) )
{
aIter = m_pMatrix - > begin ( ) ;
2000-11-14 12:28:20 +00:00
nPos = m_nStartPos ;
bCheck = m_pCacheSet - > absolute ( m_nStartPos ) ;
2000-09-18 23:16:46 +00:00
for ( ; ! aIter - > isValid ( ) & & bCheck ; + + aIter )
{
if ( bCheck = m_pCacheSet - > next ( ) ) // resultset stands on right position
{
* aIter = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
2000-11-14 12:28:20 +00:00
m_pCacheSet - > fillValueRow ( * aIter , + + nPos ) ;
2000-09-18 23:16:46 +00:00
}
}
}
}
else // no rows can be reused so fill again
2001-01-22 06:38:24 +00:00
{
2001-01-24 08:52:19 +00:00
sal_Int32 nNewSt = nNewStartPos ;
2001-01-22 06:38:24 +00:00
bRet = fillMatrix ( nNewSt , nNewEndPos ) ;
m_nStartPos = nNewSt - 1 ;
2001-06-26 09:30:55 +00:00
rotateCacheIterator ( m_nFetchSize + 1 ) ; // forces that every iterator will be set to null
2001-01-22 06:38:24 +00:00
}
2000-09-18 23:16:46 +00:00
}
if ( ! m_bRowCountFinal )
2001-10-12 14:36:42 +00:00
m_nRowCount = std : : max ( m_nPosition , m_nRowCount ) ;
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( m_nStartPos > = 0 , " ORowSetCache::moveWindow: m_nStartPos is less than 0! " ) ;
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : first ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
// first move to the first row
// then check if the cache window is at the begining
// when not postionize the window and fill it with data
// smart moving of the window -> clear only the rows whom are out of range
sal_Bool bRet = m_pCacheSet - > first ( ) ;
if ( bRet )
{
2001-07-12 06:56:32 +00:00
m_bBeforeFirst = m_bAfterLast = sal_False ;
2000-11-14 12:28:20 +00:00
m_nPosition = 1 ;
2000-09-18 23:16:46 +00:00
moveWindow ( ) ;
2000-11-14 12:28:20 +00:00
m_aMatrixIter = m_pMatrix - > begin ( ) ;
2000-09-18 23:16:46 +00:00
}
2000-11-14 12:28:20 +00:00
else
2001-06-26 09:30:55 +00:00
{
2002-10-07 12:09:48 +00:00
OSL_ENSURE ( m_bBeforeFirst | | ( m_bNew & & m_bInserted ) , " ORowSetCache::first return false and BeforeFirst isn't true " ) ;
2000-11-14 12:28:20 +00:00
m_aMatrixIter = m_pMatrix - > end ( ) ;
2001-06-26 09:30:55 +00:00
}
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : last ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
sal_Bool bRet = m_pCacheSet - > last ( ) ;
if ( bRet )
{
m_bBeforeFirst = m_bAfterLast = sal_False ;
if ( ! m_bRowCountFinal )
{
m_bRowCountFinal = sal_True ;
m_nRowCount = m_nPosition = m_pCacheSet - > getRow ( ) ; // not + 1
}
2000-10-05 13:52:16 +00:00
m_nPosition = m_pCacheSet - > getRow ( ) ;
2000-09-18 23:16:46 +00:00
moveWindow ( ) ;
// we have to repositioning because moveWindow can modify the cache
m_pCacheSet - > last ( ) ;
2001-08-24 05:40:35 +00:00
// if(m_nPosition > m_nFetchSize)
// m_aMatrixIter = m_pMatrix->end() -1;
// else
// m_aMatrixIter = m_pMatrix->begin() + m_nPosition - 1;
OSL_ENSURE ( ( ( m_nPosition - m_nStartPos ) - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-11-29 15:35:26 +00:00
m_aMatrixIter = calcPosition ( ) ;
2000-09-18 23:16:46 +00:00
}
2000-11-14 12:28:20 +00:00
else
2001-06-26 09:30:55 +00:00
{
OSL_ENSURE ( m_bBeforeFirst , " ORowSetCache::last return false and BeforeFirst isn't true " ) ;
2000-11-14 12:28:20 +00:00
m_aMatrixIter = m_pMatrix - > end ( ) ;
2001-06-26 09:30:55 +00:00
}
2000-09-18 23:16:46 +00:00
# ifdef DEBUG
if ( bRet )
{
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( ( * m_aMatrixIter ) . isValid ( ) , " ORowSetCache::last: Row not valid! " ) ;
2000-09-18 23:16:46 +00:00
}
# endif
2000-09-29 14:23:36 +00:00
2000-09-18 23:16:46 +00:00
return bRet ;
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL ORowSetCache : : getRow ( ) throw ( SQLException , RuntimeException )
{
2001-06-26 09:30:55 +00:00
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
return ( isBeforeFirst ( ) | | isAfterLast ( ) ) ? 0 : m_nPosition ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : absolute ( sal_Int32 row ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
if ( ! row )
throw SQLException ( ) ;
if ( row < 0 )
{
2001-06-26 09:30:55 +00:00
// here we have to scroll from the last row to backward so we have to go to last row and
// and two the previous
2000-09-18 23:16:46 +00:00
if ( m_bRowCountFinal | | last ( ) )
{
2001-04-05 13:14:41 +00:00
m_nPosition = m_nRowCount + row + 1 ; // + row because row is negative and +1 because row==-1 means last row
2000-09-18 23:16:46 +00:00
if ( m_nPosition < 1 )
{
m_bBeforeFirst = sal_True ;
2001-07-12 06:56:32 +00:00
m_bAfterLast = sal_False ;
2000-09-18 23:16:46 +00:00
m_aMatrixIter = m_pMatrix - > end ( ) ;
}
else
{
m_bBeforeFirst = sal_False ;
m_bAfterLast = m_nPosition > m_nRowCount ;
moveWindow ( ) ;
2001-04-02 10:14:53 +00:00
OSL_ENSURE ( ( ( m_nPosition - m_nStartPos ) - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-11-29 15:35:26 +00:00
m_aMatrixIter = calcPosition ( ) ;
2000-09-18 23:16:46 +00:00
}
}
else
m_aMatrixIter = m_pMatrix - > end ( ) ;
}
else
{
m_nPosition = row ;
// the position flags
m_bBeforeFirst = sal_False ;
2001-06-26 09:30:55 +00:00
checkPositionFlags ( ) ;
2000-09-18 23:16:46 +00:00
if ( ! m_bAfterLast )
{
moveWindow ( ) ;
2001-06-26 09:30:55 +00:00
checkPositionFlags ( ) ;
2000-10-25 06:32:52 +00:00
if ( ! m_bAfterLast )
2001-11-29 15:35:26 +00:00
m_aMatrixIter = calcPosition ( ) ;
2000-10-25 06:32:52 +00:00
else
m_aMatrixIter = m_pMatrix - > end ( ) ;
2000-09-18 23:16:46 +00:00
}
else
m_aMatrixIter = m_pMatrix - > end ( ) ;
}
2000-09-29 14:23:36 +00:00
2000-09-18 23:16:46 +00:00
return ! ( m_bAfterLast | | m_bBeforeFirst ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : relative ( sal_Int32 rows ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-06-26 09:30:55 +00:00
sal_Bool bErg = sal_True ;
if ( rows )
{
if ( m_bBeforeFirst | | ( m_bRowCountFinal & & m_bAfterLast ) )
throw SQLException ( ) ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:30:55 +00:00
if ( m_nPosition + rows )
{
bErg = absolute ( m_nPosition + rows ) ;
2000-09-29 14:23:36 +00:00
2001-06-26 09:30:55 +00:00
bErg = bErg & & ! isAfterLast ( ) & & ! isBeforeFirst ( ) ;
}
else
bErg = ! ( m_bBeforeFirst = sal_True ) ;
}
return bErg ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : previous ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-06-26 09:30:55 +00:00
sal_Bool bRet = sal_False ;
if ( ! isBeforeFirst ( ) )
2000-09-18 23:16:46 +00:00
{
2001-06-26 09:30:55 +00:00
if ( m_bAfterLast ) // we stand after the last row so one before is the last row
bRet = last ( ) ;
else
{
m_bAfterLast = sal_False ;
- - m_nPosition ;
moveWindow ( ) ;
OSL_ENSURE ( ( ( m_nPosition - m_nStartPos ) - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:30:55 +00:00
checkPositionFlags ( ) ;
2000-09-18 23:16:46 +00:00
2001-06-26 09:30:55 +00:00
if ( ! m_nPosition )
{
m_bBeforeFirst = sal_True ;
m_aMatrixIter = m_pMatrix - > end ( ) ;
}
else
2001-12-19 14:16:17 +00:00
{
m_aMatrixIter = calcPosition ( ) ;
2001-06-26 09:30:55 +00:00
bRet = ( * m_aMatrixIter ) . isValid ( ) ;
2001-12-19 14:16:17 +00:00
}
2001-06-26 09:30:55 +00:00
}
}
return bRet ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : refreshRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
if ( isAfterLast ( ) )
throw SQLException ( ) ;
2001-01-22 06:38:24 +00:00
OSL_ENSURE ( m_aMatrixIter ! = m_pMatrix - > end ( ) , " refreshRow() called for invalid row! " ) ;
m_pCacheSet - > refreshRow ( ) ;
2000-11-14 12:28:20 +00:00
m_pCacheSet - > fillValueRow ( * m_aMatrixIter , m_nPosition ) ;
2002-07-11 06:02:27 +00:00
if ( m_bInserted )
{
cancelInsert ( ) ;
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : rowUpdated ( ) throw ( SQLException , RuntimeException )
{
return m_pCacheSet - > rowUpdated ( ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : rowInserted ( ) throw ( SQLException , RuntimeException )
{
return m_pCacheSet - > rowInserted ( ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL ORowSetCache : : rowDeleted ( ) throw ( SQLException , RuntimeException )
{
2000-12-06 08:55:44 +00:00
// return m_pCacheSet->rowDeleted();
return m_bDeleted ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
Reference < XInterface > SAL_CALL ORowSetCache : : getStatement ( ) throw ( SQLException , RuntimeException )
{
return m_pCacheSet - > getStatement ( ) ;
}
// -------------------------------------------------------------------------
// XResultSetUpdate
void SAL_CALL ORowSetCache : : insertRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2000-09-29 14:23:36 +00:00
if ( ! m_bInserted | | ! m_aInsertRow - > isValid ( ) )
2000-09-18 23:16:46 +00:00
throw SQLException ( ) ;
2000-09-29 14:23:36 +00:00
m_pCacheSet - > insertRow ( * m_aInsertRow , m_aUpdateTable ) ;
2000-12-06 08:55:44 +00:00
2000-09-29 14:23:36 +00:00
if ( rowInserted ( ) )
{
+ + m_nRowCount ;
2001-01-22 06:38:24 +00:00
Any aBookmark = ( * ( * m_aInsertRow ) ) [ 0 ] . makeAny ( ) ;
2000-12-06 08:55:44 +00:00
m_bAfterLast = m_bBeforeFirst = sal_False ;
2001-08-09 12:12:51 +00:00
clearInsertRow ( ) ;
2001-01-22 06:38:24 +00:00
if ( aBookmark . hasValue ( ) )
moveToBookmark ( aBookmark ) ;
else
{
2001-01-24 08:52:19 +00:00
OSL_ENSURE ( 0 , " There must be a bookmark after the row was inserted! " ) ;
2001-01-22 06:38:24 +00:00
}
2000-09-29 14:23:36 +00:00
}
m_bNew = sal_False ;
m_bModified = sal_False ;
m_bInserted = sal_False ;
2000-12-06 08:55:44 +00:00
2000-09-29 14:23:36 +00:00
}
// -------------------------------------------------------------------------
void ORowSetCache : : cancelInsert ( )
{
2000-12-06 08:55:44 +00:00
m_bNew = sal_False ;
m_bModified = sal_False ;
m_bInserted = sal_False ;
2001-06-26 09:30:55 +00:00
// clear the insertrow references -> implies that the current row of the rowset changes as well
ORowSetCacheMap : : iterator aCacheIter = m_aCacheIterators . begin ( ) ;
for ( ; aCacheIter ! = m_aCacheIterators . end ( ) ; + + aCacheIter )
{
if ( aCacheIter - > second . aIterator )
{
ORowSetMatrix : : iterator aOldIter = aCacheIter - > second . aIterator ;
if ( aOldIter = = m_aInsertRow )
aCacheIter - > second . aIterator = NULL ;
}
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : updateRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
if ( isAfterLast ( ) | | isBeforeFirst ( ) )
throw SQLException ( ) ;
2000-09-29 14:23:36 +00:00
m_pCacheSet - > updateRow ( * m_aInsertRow , * m_aMatrixIter , m_aUpdateTable ) ;
2001-08-09 12:12:51 +00:00
clearInsertRow ( ) ;
// we don't need to repositioning here refresh will do it for us
2001-01-22 06:38:24 +00:00
m_bModified = sal_False ;
refreshRow ( ) ;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : updateRow ( ORowSetMatrix : : iterator & _rUpdateRow ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
if ( isAfterLast ( ) | | isBeforeFirst ( ) )
throw SQLException ( ) ;
2001-07-23 06:54:41 +00:00
Any aBookmark = ( * ( * _rUpdateRow ) ) [ 0 ] . makeAny ( ) ;
2001-07-24 12:25:26 +00:00
OSL_ENSURE ( aBookmark . hasValue ( ) , " Bookmark must have a value! " ) ;
2002-08-08 06:07:42 +00:00
// here we don't have to reposition our CacheSet, when we try to update a row,
// the row was already fetched
2001-07-23 06:54:41 +00:00
moveToBookmark ( aBookmark ) ;
2001-01-22 06:38:24 +00:00
m_pCacheSet - > updateRow ( * _rUpdateRow , * m_aMatrixIter , m_aUpdateTable ) ;
2001-05-22 12:08:22 +00:00
// *(*m_aMatrixIter) = *(*_rUpdateRow);
// refetch the whole row
( * m_aMatrixIter ) = NULL ;
2001-07-23 06:54:41 +00:00
moveToBookmark ( aBookmark ) ;
2001-05-11 05:14:11 +00:00
2001-01-22 06:38:24 +00:00
// moveToBookmark((*(*m_aInsertRow))[0].makeAny());
2000-09-29 14:23:36 +00:00
// if(m_pCacheSet->rowUpdated())
// *m_aMatrixIter = m_aInsertRow;
2000-09-18 23:16:46 +00:00
m_bModified = sal_False ;
2001-04-05 06:51:27 +00:00
// refreshRow( );
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : deleteRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
if ( isAfterLast ( ) | | isBeforeFirst ( ) )
throw SQLException ( ) ;
// m_pCacheSet->absolute(m_nPosition);
m_pCacheSet - > deleteRow ( * m_aMatrixIter , m_aUpdateTable ) ;
2000-12-06 08:55:44 +00:00
if ( m_bDeleted = m_pCacheSet - > rowDeleted ( ) )
2000-09-18 23:16:46 +00:00
{
2000-09-29 14:23:36 +00:00
- - m_nRowCount ;
2001-04-02 10:14:53 +00:00
OSL_ENSURE ( ( ( m_nPosition - m_nStartPos ) - 1 ) < ( sal_Int32 ) m_pMatrix - > size ( ) , " Position is behind end()! " ) ;
2001-11-29 15:35:26 +00:00
ORowSetMatrix : : iterator aPos = calcPosition ( ) ;
2000-12-06 08:55:44 +00:00
( * aPos ) = NULL ;
// (*m_pMatrix)[(m_nPosition - m_nStartPos)] = NULL; // set the deleted row to NULL
for ( + + aPos ; aPos - > isValid ( ) & & aPos ! = m_pMatrix - > end ( ) ; + + aPos )
{
* ( aPos - 1 ) = * aPos ;
( * aPos ) = NULL ;
}
m_aMatrixIter = m_pMatrix - > end ( ) ;
2000-09-18 23:16:46 +00:00
- - m_nPosition ;
}
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : cancelRowUpdates ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2001-01-22 06:38:24 +00:00
m_bNew = m_bInserted = m_bModified = sal_False ;
2001-04-05 06:51:27 +00:00
if ( ! m_nPosition )
{
OSL_ENSURE ( 0 , " cancelRowUpdates:Invalid positions pos == 0 " ) ;
2001-04-19 06:14:49 +00:00
: : dbtools : : throwFunctionSequenceException ( NULL ) ;
2001-04-05 06:51:27 +00:00
}
if ( m_pCacheSet - > absolute ( m_nPosition ) )
m_pCacheSet - > fillValueRow ( * m_aMatrixIter , m_nPosition ) ;
else
{
OSL_ENSURE ( 0 , " cancelRowUpdates couldn't position right with absolute " ) ;
2001-04-19 06:14:49 +00:00
: : dbtools : : throwFunctionSequenceException ( NULL ) ;
2001-04-05 06:51:27 +00:00
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : moveToInsertRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
m_bNew = sal_True ;
m_bInserted = sal_True ;
2000-12-06 08:55:44 +00:00
m_bUpdated = m_bDeleted = m_bAfterLast = sal_False ;
2000-09-29 14:23:36 +00:00
m_aInsertRow = m_pInsertMatrix - > begin ( ) ;
if ( ! m_aInsertRow - > isValid ( ) )
* m_aInsertRow = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
// we don't unbound the bookmark column
connectivity : : ORowVector < ORowSetValue > : : iterator aIter = ( * m_aInsertRow ) - > begin ( ) + 1 ;
for ( ; aIter ! = ( * m_aInsertRow ) - > end ( ) ; + + aIter )
{
aIter - > setBound ( sal_False ) ;
2000-12-06 08:55:44 +00:00
aIter - > setModified ( sal_False ) ;
2000-09-29 14:23:36 +00:00
aIter - > setNull ( ) ;
}
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : moveToCurrentRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
2000-09-29 14:23:36 +00:00
// if(m_bInserted)
// {
// m_pCacheSet->moveToCurrentRow();
// m_bInserted = sal_False;
// }
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
// XRowSet
void SAL_CALL ORowSetCache : : execute ( ) throw ( SQLException , RuntimeException )
{
}
// -------------------------------------------------------------------------
// ::com::sun::star::util::XCancellable
void SAL_CALL ORowSetCache : : cancel ( ) throw ( RuntimeException )
{
}
// -------------------------------------------------------------------------
// ::com::sun::star::sdbcx::XDeleteRows
Sequence < sal_Int32 > SAL_CALL ORowSetCache : : deleteRows ( const Sequence < Any > & rows ) throw ( SQLException , RuntimeException )
{
2000-09-29 14:23:36 +00:00
// TODO impl. a better version which is faster than tis one
: : osl : : MutexGuard aGuard ( m_aRowCountMutex ) ;
Sequence < sal_Int32 > aRet ( rows . getLength ( ) ) ;
sal_Int32 * pRet = aRet . getArray ( ) ;
const Any * pBegin = rows . getConstArray ( ) ;
const Any * pEnd = pBegin + rows . getLength ( ) ;
sal_Int32 nOldPosition ;
for ( ; pBegin ! = pEnd ; + + pBegin , + + pRet )
{
2002-08-08 06:07:42 +00:00
// first we have to position our own and then we have to position our CacheSet again,
// it could be repositioned in the moveToBookmark call
if ( moveToBookmark ( * pBegin ) & & m_pCacheSet - > moveToBookmark ( * pBegin ) )
2000-09-29 14:23:36 +00:00
{
nOldPosition = m_nPosition ;
deleteRow ( ) ;
* pRet = ( nOldPosition ! = m_nPosition ) ? 1 : 0 ;
nOldPosition = m_nPosition ;
}
}
return aRet ;
2000-09-18 23:16:46 +00:00
}
// -------------------------------------------------------------------------
2001-01-22 06:38:24 +00:00
ORowSetCacheIterator ORowSetCache : : createIterator ( )
{
ORowSetCacheIterator_Helper aHelper ;
aHelper . aIterator = m_pMatrix - > end ( ) ;
return ORowSetCacheIterator ( m_aCacheIterators . insert ( m_aCacheIterators . begin ( ) , ORowSetCacheMap : : value_type ( m_aCacheIterators . size ( ) + 1 , aHelper ) ) , this ) ;
}
// -----------------------------------------------------------------------------
void ORowSetCache : : rotateCacheIterator ( sal_Int16 _nDist )
{
2001-06-26 09:30:55 +00:00
if ( _nDist )
2001-01-22 06:38:24 +00:00
{
2001-06-26 09:30:55 +00:00
// now correct the iterator in our iterator vector
ORowSetCacheMap : : iterator aCacheIter = m_aCacheIterators . begin ( ) ;
for ( ; aCacheIter ! = m_aCacheIterators . end ( ) ; + + aCacheIter )
2001-01-22 06:38:24 +00:00
{
2001-06-26 09:30:55 +00:00
if ( aCacheIter - > second . aIterator & & aCacheIter - > second . aIterator ! = m_aInsertRow & & ! m_bInserted & & ! m_bModified )
2001-01-22 06:38:24 +00:00
{
2001-06-26 09:30:55 +00:00
sal_Int16 nDist = ( aCacheIter - > second . aIterator - m_pMatrix - > begin ( ) ) ;
if ( nDist < _nDist )
{
aCacheIter - > second . aIterator = NULL ;
}
else
aCacheIter - > second . aIterator - = _nDist ;
2001-01-22 06:38:24 +00:00
}
}
}
}
// -----------------------------------------------------------------------------
2000-09-18 23:16:46 +00:00
// XWarningsSupplier
Any SAL_CALL ORowSetCache : : getWarnings ( ) throw ( SQLException , RuntimeException )
{
return Any ( ) ;
}
// -------------------------------------------------------------------------
void SAL_CALL ORowSetCache : : clearWarnings ( ) throw ( SQLException , RuntimeException )
{
}
// -------------------------------------------------------------------------
2001-01-22 06:38:24 +00:00
void ORowSetCache : : setUpdateIterator ( const ORowSetMatrix : : iterator & _rOriginalRow )
{
m_aInsertRow = m_pInsertMatrix - > begin ( ) ;
if ( ! m_aInsertRow - > isValid ( ) )
* m_aInsertRow = new connectivity : : ORowVector < ORowSetValue > ( m_xMetaData - > getColumnCount ( ) ) ;
( * ( * m_aInsertRow ) ) = ( * ( * _rOriginalRow ) ) ;
// we don't unbound the bookmark column
connectivity : : ORowVector < ORowSetValue > : : iterator aIter = ( * m_aInsertRow ) - > begin ( ) ;
for ( ; aIter ! = ( * m_aInsertRow ) - > end ( ) ; + + aIter )
aIter - > setModified ( sal_False ) ;
}
2001-02-01 13:23:57 +00:00
// -----------------------------------------------------------------------------
2001-06-26 09:30:55 +00:00
void ORowSetCache : : checkPositionFlags ( )
{
if ( m_bRowCountFinal )
{
m_bAfterLast = m_nPosition > m_nRowCount ;
if ( m_bAfterLast )
m_nPosition = 0 ; //m_nRowCount;
}
}
// -----------------------------------------------------------------------------
void ORowSetCache : : checkUpdateConditions ( sal_Int32 columnIndex )
{
if ( m_bAfterLast | | columnIndex > = ( sal_Int32 ) ( * m_aInsertRow ) - > size ( ) )
throwFunctionSequenceException ( m_xSet . get ( ) ) ;
}
2001-07-19 08:29:22 +00:00
// -----------------------------------------------------------------------------
sal_Bool ORowSetCache : : checkJoin ( const Reference < XConnection > & _xConnection ,
const Reference < XSQLQueryComposer > & _xComposer ,
const : : rtl : : OUString & _sUpdateTableName )
{
2001-12-07 08:58:12 +00:00
sal_Bool bOk = sal_False ;
2001-07-19 08:29:22 +00:00
: : rtl : : OUString sSql = _xComposer - > getQuery ( ) ;
: : rtl : : OUString sErrorMsg ;
: : connectivity : : OSQLParser aSqlParser ( m_xServiceFactory ) ;
: : connectivity : : OSQLParseNode * pSqlParseNode = aSqlParser . parseTree ( sErrorMsg , sSql ) ;
if ( pSqlParseNode )
{
OSQLParseNode * pTableRefCommalist = pSqlParseNode - > getByRule ( : : connectivity : : OSQLParseNode : : table_ref_commalist ) ;
OSL_ENSURE ( pTableRefCommalist , " NO tables why!? " ) ;
if ( pTableRefCommalist & & pTableRefCommalist - > count ( ) = = 1 )
{
// we found only one element so it must some kind of join here
OSQLParseNode * pJoin = pTableRefCommalist - > getByRule ( : : connectivity : : OSQLParseNode : : qualified_join ) ;
if ( pJoin )
{ // we are only intereseted in qualified joins like RIGHT or LEFT
OSQLParseNode * pJoinType = pJoin - > getChild ( 1 ) ;
OSQLParseNode * pOuterType = NULL ;
if ( SQL_ISRULE ( pJoinType , join_type ) & & pJoinType - > count ( ) = = 2 )
pOuterType = pJoinType - > getChild ( 0 ) ;
else if ( SQL_ISRULE ( pJoinType , outer_join_type ) )
pOuterType = pJoinType ;
sal_Bool bCheck = sal_False ;
sal_Bool bLeftSide = sal_False ;
if ( pOuterType )
{ // found outer join
bLeftSide = SQL_ISTOKEN ( pOuterType - > getChild ( 0 ) , LEFT ) ;
bCheck = bLeftSide | | SQL_ISTOKEN ( pOuterType - > getChild ( 0 ) , RIGHT ) ;
}
2001-12-07 08:27:32 +00:00
2001-07-19 08:29:22 +00:00
if ( bCheck )
{ // here we know that we have to check on which side our table resides
OSQLParseNode * pTableRef = pJoin - > getByRule ( : : connectivity : : OSQLParseNode : : qualified_join ) ;
if ( bLeftSide )
pTableRef = pJoin - > getChild ( 0 ) ;
else
pTableRef = pJoin - > getChild ( 3 ) ;
OSL_ENSURE ( SQL_ISRULE ( pTableRef , table_ref ) , " Must be a tableref here! " ) ;
: : rtl : : OUString sTableRange ;
if ( pTableRef - > count ( ) = = 4 )
sTableRange = pTableRef - > getChild ( 2 ) - > getTokenValue ( ) ; // Tabellenrange an Pos 2
if ( ! sTableRange . getLength ( ) )
pTableRef - > getChild ( 0 ) - > parseNodeToStr ( sTableRange , _xConnection - > getMetaData ( ) , NULL , sal_False , sal_False ) ;
bOk = sTableRange = = _sUpdateTableName ;
}
}
2000-09-18 23:16:46 +00:00
2001-07-19 08:29:22 +00:00
}
delete pSqlParseNode ;
}
return bOk ;
}
// -----------------------------------------------------------------------------
2001-08-09 12:12:51 +00:00
void ORowSetCache : : clearInsertRow ( )
{
// we don't unbound the bookmark column
connectivity : : ORowVector < ORowSetValue > : : iterator aIter = ( * m_aInsertRow ) - > begin ( ) + 1 ;
for ( ; aIter ! = ( * m_aInsertRow ) - > end ( ) ; + + aIter )
{
aIter - > setBound ( sal_False ) ;
aIter - > setModified ( sal_False ) ;
aIter - > setNull ( ) ;
}
}
// -----------------------------------------------------------------------------
2001-11-29 15:35:26 +00:00
ORowSetMatrix : : iterator ORowSetCache : : calcPosition ( ) const
{
sal_Int32 nValue = ( m_nPosition - m_nStartPos ) - 1 ;
OSL_ENSURE ( nValue > = 0 , " Position is invalid! " ) ;
return ( nValue < 0 ) ? m_pMatrix - > end ( ) : ( m_pMatrix - > begin ( ) + nValue ) ;
}
// -----------------------------------------------------------------------------