2000-09-18 15:18:56 +00:00
/*************************************************************************
*
* $ RCSfile : FResultSet . cxx , v $
*
2002-01-16 07:44:56 +00:00
* $ Revision : 1.80 $
2000-09-18 15:18:56 +00:00
*
2002-01-16 07:44:56 +00:00
* last change : $ Author : fs $ $ Date : 2002 - 01 - 16 08 : 44 : 56 $
2000-09-18 15:18:56 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc . , October , 2000
*
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2000 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 ( the " License " ) ; You may not use this file
* except in compliance with the License . You may obtain a copy of the
* License at http : //www.openoffice.org/license.html.
*
* Software provided under this License is provided on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , EITHER EXPRESSED OR IMPLIED , INCLUDING ,
* WITHOUT LIMITATION , WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS ,
* MERCHANTABLE , FIT FOR A PARTICULAR PURPOSE , OR NON - INFRINGING .
* See the License for the specific provisions governing your rights and
* obligations concerning the Software .
*
* The Initial Developer of the Original Code is : Sun Microsystems , Inc .
*
* Copyright : 2000 by Sun Microsystems , Inc .
*
* All Rights Reserved .
*
* Contributor ( s ) : _______________________________________
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-10-30 10:00:36 +00:00
# include <limits> // included here to prevent problems if compiling with C52
2000-11-17 10:25:24 +00:00
# ifdef GCC
2000-11-14 11:57:56 +00:00
# include <iostream>
# endif
2000-10-05 13:40:11 +00:00
# ifndef _CONNECTIVITY_SDBCX_COLUMN_HXX_
# include "connectivity/sdbcx/VColumn.hxx"
# endif
2000-09-18 15:18:56 +00:00
# ifndef _CONNECTIVITY_FILE_ORESULTSET_HXX_
# include "file/FResultSet.hxx"
# endif
# ifndef _CONNECTIVITY_FILE_ORESULTSETMETADATA_HXX_
# include "file/FResultSetMetaData.hxx"
# endif
# ifndef _COM_SUN_STAR_SQLC_DATATYPE_HPP_
# include <com/sun/star/sdbc/DataType.hpp>
# endif
# ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
# include <com/sun/star/sdbc/ColumnValue.hpp>
# endif
2000-10-09 11:34:19 +00:00
# ifndef _COMPHELPER_PROPERTY_HXX_
# include <comphelper/property.hxx>
2000-09-18 15:18:56 +00:00
# endif
# ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
# include <com/sun/star/lang/DisposedException.hpp>
# endif
# ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
# include <com/sun/star/beans/PropertyAttribute.hpp>
# endif
# ifndef _COM_SUN_STAR_CONTAINER_XINDEXACCESS_HPP_
# include <com/sun/star/container/XIndexAccess.hpp>
# endif
2000-10-09 11:34:19 +00:00
# ifndef _COMPHELPER_SEQUENCE_HXX_
# include <comphelper/sequence.hxx>
2000-09-18 15:18:56 +00:00
# endif
# ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
# include <cppuhelper/typeprovider.hxx>
# endif
2000-12-14 12:17:53 +00:00
# ifndef _DBHELPER_DBCONVERSION_HXX_
# include "connectivity/dbconversion.hxx"
2000-09-18 15:18:56 +00:00
# endif
2001-07-30 07:53:02 +00:00
# ifndef _CONNECTIVITY_DBTOOLS_HXX_
# include "connectivity/dbtools.hxx"
# endif
2000-11-03 13:21:22 +00:00
# ifndef _CPPUHELPER_PROPSHLP_HXX
# include <cppuhelper/propshlp.hxx>
# endif
2000-09-18 15:18:56 +00:00
# ifndef _ITERATOR_
# include <iterator>
# endif
2000-10-19 10:56:36 +00:00
# ifndef _TOOLS_DEBUG_HXX
# include <tools/debug.hxx>
# endif
2000-11-20 08:57:42 +00:00
# ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_
# include <com/sun/star/sdbc/ResultSetType.hpp>
# endif
# ifndef _COM_SUN_STAR_SDBC_FETCHDIRECTION_HPP_
# include <com/sun/star/sdbc/FetchDirection.hpp>
# endif
# ifndef _COM_SUN_STAR_SDBC_RESULTSETCONCURRENCY_HPP_
# include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
# endif
2001-05-07 09:37:54 +00:00
# ifndef _COM_SUN_STAR_SDBCX_XINDEXESSUPPLIER_HPP_
# include <com/sun/star/sdbcx/XIndexesSupplier.hpp>
# endif
2000-11-20 08:57:42 +00:00
2000-11-14 11:57:56 +00:00
# include <algorithm>
2001-03-15 08:02:28 +00:00
# ifndef _COMPHELPER_EXTRACT_HXX_
# include <comphelper/extract.hxx>
2001-02-13 14:02:28 +00:00
# endif
2001-04-02 08:18:37 +00:00
# ifndef _DBHELPER_DBEXCEPTION_HXX_
# include "connectivity/dbexception.hxx"
# endif
2001-05-18 07:51:34 +00:00
# ifndef _COMPHELPER_TYPES_HXX_
# include <comphelper/types.hxx>
# endif
2001-02-13 14:02:28 +00:00
2001-08-24 05:19:41 +00:00
2001-05-18 07:51:34 +00:00
using namespace : : comphelper ;
2000-09-18 15:18:56 +00:00
using namespace connectivity ;
using namespace connectivity : : file ;
2001-05-18 07:51:34 +00:00
using namespace : : cppu ;
2001-05-14 10:55:19 +00:00
using namespace dbtools ;
2000-09-18 15:18:56 +00:00
using namespace com : : sun : : star : : uno ;
using namespace com : : sun : : star : : lang ;
using namespace com : : sun : : star : : beans ;
using namespace com : : sun : : star : : sdbc ;
using namespace com : : sun : : star : : sdbcx ;
using namespace com : : sun : : star : : container ;
// Maximale Anzahl von Rows, die mit ORDER BY sortiert durchlaufen werden koennen:
# if defined (WIN)
# define MAX_KEYSET_SIZE 0x3ff0 // Etwas weniger als ein Segment, damit
// noch Platz fuer Memory Debug-Informationen
# else
# define MAX_KEYSET_SIZE 0x40000 // 256K
# endif
//------------------------------------------------------------------------------
IMPLEMENT_SERVICE_INFO ( OResultSet , " com.sun.star.sdbcx.drivers.file.ResultSet " , " com.sun.star.sdbc.ResultSet " ) ;
2002-01-16 07:44:56 +00:00
DBG_NAME ( file_OResultSet )
2000-09-18 15:18:56 +00:00
// -------------------------------------------------------------------------
OResultSet : : OResultSet ( OStatement_Base * pStmt , OSQLParseTreeIterator & _aSQLIterator ) : OResultSet_BASE ( m_aMutex )
2000-10-05 07:38:52 +00:00
, : : comphelper : : OPropertyContainer ( OResultSet_BASE : : rBHelper )
2000-09-18 15:18:56 +00:00
, m_aStatement ( ( OWeakObject * ) pStmt )
, m_nRowPos ( - 1 )
, m_bLastRecord ( sal_False )
, m_bEOF ( sal_False )
, m_xDBMetaData ( pStmt - > getConnection ( ) - > getMetaData ( ) )
, m_xMetaData ( NULL )
, m_aSQLIterator ( _aSQLIterator )
, m_pTable ( NULL )
, m_nRowCountResult ( - 1 )
, m_nFilePos ( 0 )
, m_nLastVisitedPos ( - 1 )
, m_pParseTree ( pStmt - > getParseTree ( ) )
, m_pFileSet ( NULL )
, m_pEvaluationKeySet ( NULL )
, m_pSortIndex ( NULL )
, m_aAssignValues ( NULL )
2000-09-29 15:02:10 +00:00
, m_bInserted ( sal_False )
, m_bRowUpdated ( sal_False )
, m_bRowInserted ( sal_False )
, m_bRowDeleted ( sal_False )
2000-11-20 08:57:42 +00:00
, m_nFetchSize ( 0 )
, m_nResultSetType ( ResultSetType : : SCROLL_INSENSITIVE )
, m_nResultSetConcurrency ( ResultSetConcurrency : : UPDATABLE )
, m_nFetchDirection ( FetchDirection : : FORWARD )
2001-02-05 11:26:42 +00:00
, m_nTextEncoding ( pStmt - > getOwnConnection ( ) - > getTextEncoding ( ) )
2001-05-10 13:31:14 +00:00
, m_nCurrentPosition ( 0 )
2001-06-28 11:22:36 +00:00
, m_bShowDeleted ( pStmt - > getOwnConnection ( ) - > showDeleted ( ) )
2001-08-24 05:19:41 +00:00
, m_pSQLAnalyzer ( NULL )
2001-10-26 06:45:13 +00:00
, m_aSkipDeletedSet ( this )
2000-09-18 15:18:56 +00:00
{
2002-01-16 07:44:56 +00:00
DBG_CTOR ( file_OResultSet , NULL ) ;
2000-09-18 15:18:56 +00:00
osl_incrementInterlockedCount ( & m_refCount ) ;
2001-01-09 14:37:39 +00:00
m_nResultSetConcurrency = isCount ( ) ? ResultSetConcurrency : : READ_ONLY : ResultSetConcurrency : : UPDATABLE ;
2000-09-18 15:18:56 +00:00
construct ( ) ;
osl_decrementInterlockedCount ( & m_refCount ) ;
}
// -------------------------------------------------------------------------
OResultSet : : ~ OResultSet ( )
{
2001-08-24 05:19:41 +00:00
osl_incrementInterlockedCount ( & m_refCount ) ;
disposing ( ) ;
2002-01-16 07:44:56 +00:00
DBG_DTOR ( file_OResultSet , NULL ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void OResultSet : : construct ( )
{
2001-05-14 10:55:19 +00:00
registerProperty ( OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_FETCHSIZE ) , PROPERTY_ID_FETCHSIZE , 0 , & m_nFetchSize , : : getCppuType ( reinterpret_cast < sal_Int32 * > ( NULL ) ) ) ;
registerProperty ( OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_RESULTSETTYPE ) , PROPERTY_ID_RESULTSETTYPE , PropertyAttribute : : READONLY , & m_nResultSetType , : : getCppuType ( reinterpret_cast < sal_Int32 * > ( NULL ) ) ) ;
registerProperty ( OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_FETCHDIRECTION ) , PROPERTY_ID_FETCHDIRECTION , 0 , & m_nFetchDirection , : : getCppuType ( reinterpret_cast < sal_Int32 * > ( NULL ) ) ) ;
registerProperty ( OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_RESULTSETCONCURRENCY ) , PROPERTY_ID_RESULTSETCONCURRENCY , PropertyAttribute : : READONLY , & m_nResultSetConcurrency , : : getCppuType ( reinterpret_cast < sal_Int32 * > ( NULL ) ) ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void OResultSet : : disposing ( void )
{
OPropertySetHelper : : disposing ( ) ;
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
m_aStatement = NULL ;
m_xMetaData = NULL ;
m_pParseTree = NULL ;
2000-11-03 13:21:22 +00:00
m_xColNames = NULL ;
m_xColumns = NULL ;
m_xParamColumns = NULL ;
2001-08-24 05:19:41 +00:00
m_xColsIdx = NULL ;
2000-11-03 13:21:22 +00:00
2000-09-18 15:18:56 +00:00
if ( m_pTable )
{
m_pTable - > release ( ) ;
m_pTable = NULL ;
}
2001-08-24 05:19:41 +00:00
clear ( ) ;
}
// -----------------------------------------------------------------------------
void OResultSet : : clear ( )
{
2001-08-29 11:21:08 +00:00
m_pFileSet = NULL ;
2000-09-18 15:18:56 +00:00
DELETEZ ( m_pSortIndex ) ;
2000-11-03 13:21:22 +00:00
if ( m_aInsertRow . isValid ( ) )
2000-10-17 08:05:49 +00:00
m_aInsertRow - > clear ( ) ;
2001-05-10 13:31:14 +00:00
2001-10-26 06:45:13 +00:00
m_aSkipDeletedSet . clear ( ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
Any SAL_CALL OResultSet : : queryInterface ( const Type & rType ) throw ( RuntimeException )
{
Any aRet = OPropertySetHelper : : queryInterface ( rType ) ;
2001-08-24 05:19:41 +00:00
return aRet . hasValue ( ) ? aRet : OResultSet_BASE : : queryInterface ( rType ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
2001-06-27 09:02:11 +00:00
Sequence < Type > SAL_CALL OResultSet : : getTypes ( ) throw ( RuntimeException )
2000-09-18 15:18:56 +00:00
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-06-27 09:02:11 +00:00
OTypeCollection aTypes ( : : getCppuType ( ( const Reference < : : com : : sun : : star : : beans : : XMultiPropertySet > * ) 0 ) ,
: : getCppuType ( ( const Reference < : : com : : sun : : star : : beans : : XPropertySet > * ) 0 ) ,
: : getCppuType ( ( const Reference < : : com : : sun : : star : : beans : : XPropertySet > * ) 0 ) ) ;
2000-09-18 15:18:56 +00:00
2000-10-09 11:34:19 +00:00
return : : comphelper : : concatSequences ( aTypes . getTypes ( ) , OResultSet_BASE : : getTypes ( ) ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL OResultSet : : findColumn ( const : : rtl : : OUString & columnName ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
Reference < XResultSetMetaData > xMeta = getMetaData ( ) ;
sal_Int32 nLen = xMeta - > getColumnCount ( ) ;
sal_Int32 i = 1 ;
for ( ; i < = nLen ; + + i )
2001-05-17 05:46:55 +00:00
if ( xMeta - > isCaseSensitive ( i ) ? columnName = = xMeta - > getColumnName ( i ) :
columnName . equalsIgnoreAsciiCase ( xMeta - > getColumnName ( i ) ) )
2000-09-18 15:18:56 +00:00
break ;
return i ;
}
2001-05-23 08:18:28 +00:00
// -----------------------------------------------------------------------------
2001-07-30 07:53:02 +00:00
const ORowSetValue & OResultSet : : getValue ( sal_Int32 columnIndex ) throw ( : : com : : sun : : star : : sdbc : : SQLException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
checkIndex ( columnIndex ) ;
columnIndex = mapColumn ( columnIndex ) ;
m_bWasNull = ( * m_aRow ) [ columnIndex ] . isNull ( ) ;
return ( * m_aRow ) [ columnIndex ] ;
}
// -----------------------------------------------------------------------------
2001-05-23 08:18:28 +00:00
void OResultSet : : checkIndex ( sal_Int32 columnIndex ) throw ( : : com : : sun : : star : : sdbc : : SQLException )
{
if ( columnIndex < = 0 | | columnIndex > ( sal_Int32 ) m_xColumns - > size ( ) )
: : dbtools : : throwInvalidIndexException ( * this ) ;
}
2000-09-18 15:18:56 +00:00
// -------------------------------------------------------------------------
Reference < : : com : : sun : : star : : io : : XInputStream > SAL_CALL OResultSet : : getBinaryStream ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
Reference < : : com : : sun : : star : : io : : XInputStream > SAL_CALL OResultSet : : getCharacterStream ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : getBoolean ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Int8 SAL_CALL OResultSet : : getByte ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
Sequence < sal_Int8 > SAL_CALL OResultSet : : getBytes ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : Date SAL_CALL OResultSet : : getDate ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
double SAL_CALL OResultSet : : getDouble ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
float SAL_CALL OResultSet : : getFloat ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL OResultSet : : getInt ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Int32 SAL_CALL OResultSet : : getRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-08-27 08:13:35 +00:00
OSL_ENSURE ( ( m_bShowDeleted | | ! m_aRow - > isDeleted ( ) ) , " getRow called for deleted row " ) ;
2001-10-26 06:45:13 +00:00
return m_aSkipDeletedSet . getMappedPosition ( ( * m_aRow ) [ 0 ] ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Int64 SAL_CALL OResultSet : : getLong ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return sal_Int64 ( ) ;
}
// -------------------------------------------------------------------------
Reference < XResultSetMetaData > SAL_CALL OResultSet : : getMetaData ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
if ( ! m_xMetaData . is ( ) )
2000-11-20 08:57:42 +00:00
m_xMetaData = new OResultSetMetaData ( m_xColumns , m_aSQLIterator . getTables ( ) . begin ( ) - > first , m_pTable ) ;
2000-09-18 15:18:56 +00:00
return m_xMetaData ;
}
// -------------------------------------------------------------------------
Reference < XArray > SAL_CALL OResultSet : : getArray ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
Reference < XClob > SAL_CALL OResultSet : : getClob ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
Reference < XBlob > SAL_CALL OResultSet : : getBlob ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
Reference < XRef > SAL_CALL OResultSet : : getRef ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
return NULL ;
}
// -------------------------------------------------------------------------
Any SAL_CALL OResultSet : : getObject ( sal_Int32 columnIndex , const Reference < : : com : : sun : : star : : container : : XNameAccess > & typeMap ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) . makeAny ( ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Int16 SAL_CALL OResultSet : : getShort ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
: : rtl : : OUString SAL_CALL OResultSet : : getString ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : Time SAL_CALL OResultSet : : getTime ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
: : com : : sun : : star : : util : : DateTime SAL_CALL OResultSet : : getTimestamp ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
return getValue ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : isAfterLast ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2001-04-02 08:09:29 +00:00
return m_nRowPos = = sal_Int32 ( m_pFileSet - > size ( ) ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : isFirst ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2001-04-04 13:26:18 +00:00
return m_nRowPos = = 0 ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : isLast ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2001-04-02 08:09:29 +00:00
return m_nRowPos = = sal_Int32 ( m_pFileSet - > size ( ) - 1 ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : beforeFirst ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
if ( first ( ) )
previous ( ) ;
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : afterLast ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
if ( last ( ) )
next ( ) ;
m_bEOF = sal_True ;
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : close ( ) throw ( SQLException , RuntimeException )
{
2001-08-24 05:19:41 +00:00
// {
// ::osl::MutexGuard aGuard( m_aMutex );
// checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
//
// }
// dispose();
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
clear ( ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : first ( ) throw ( SQLException , RuntimeException )
{
2001-08-24 05:19:41 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
return m_pTable ? m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : FIRST , 1 , sal_True ) : sal_False ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : last ( ) throw ( SQLException , RuntimeException )
{
// here I know definitely that I stand on the last record
2001-08-24 05:19:41 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
return m_pTable ? m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : LAST , 1 , sal_True ) : sal_False ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : absolute ( sal_Int32 row ) throw ( SQLException , RuntimeException )
{
2001-08-24 05:19:41 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
return m_pTable ? m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : ABSOLUTE , row , sal_True ) : sal_False ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : relative ( sal_Int32 row ) throw ( SQLException , RuntimeException )
{
2001-08-24 05:19:41 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
return m_pTable ? m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : RELATIVE , row , sal_True ) : sal_False ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : previous ( ) throw ( SQLException , RuntimeException )
{
2001-08-24 05:19:41 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
return m_pTable ? m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : PRIOR , 0 , sal_True ) : sal_False ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
Reference < XInterface > SAL_CALL OResultSet : : getStatement ( ) throw ( SQLException , RuntimeException )
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-29 15:02:10 +00:00
2000-09-18 15:18:56 +00:00
return m_aStatement . get ( ) ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : rowDeleted ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2000-09-29 15:02:10 +00:00
return m_bRowDeleted ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : rowInserted ( ) throw ( SQLException , RuntimeException )
{ : : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2000-09-29 15:02:10 +00:00
return m_bRowInserted ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : rowUpdated ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2000-09-29 15:02:10 +00:00
return m_bRowUpdated ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : isBeforeFirst ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
2001-04-04 13:26:18 +00:00
return m_nRowPos = = - 1 ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool OResultSet : : evaluate ( )
{
2001-05-07 09:37:54 +00:00
OSL_ENSURE ( m_pSQLAnalyzer , " OResultSet::evaluate: Analyzer isn't set! " ) ;
2000-09-18 15:18:56 +00:00
sal_Bool bRet = sal_True ;
2001-05-07 09:37:54 +00:00
while ( ! m_pSQLAnalyzer - > evaluateRestriction ( ) )
2000-09-18 15:18:56 +00:00
{
if ( m_pEvaluationKeySet )
{
if ( m_aEvaluateIter = = m_pEvaluationKeySet - > end ( ) )
return sal_False ;
2001-10-26 06:45:13 +00:00
bRet = m_pTable - > seekRow ( IResultSetHelper : : BOOKMARK , ( * m_aEvaluateIter ) , m_nRowPos ) ;
2000-09-18 15:18:56 +00:00
+ + m_aEvaluateIter ;
}
else
2001-10-26 06:45:13 +00:00
bRet = m_pTable - > seekRow ( IResultSetHelper : : NEXT , 1 , m_nRowPos ) ;
2000-09-18 15:18:56 +00:00
if ( bRet )
{
if ( m_pEvaluationKeySet )
{
2000-11-27 06:59:12 +00:00
bRet = m_pTable - > fetchRow ( m_aEvaluateRow , m_pTable - > getTableColumns ( ) . getBody ( ) , sal_True , sal_True ) ;
2000-09-18 15:18:56 +00:00
evaluate ( ) ;
}
else
2000-11-27 06:59:12 +00:00
bRet = m_pTable - > fetchRow ( m_aRow , m_xColumns . getBody ( ) , sal_False , sal_True ) ;
2000-09-18 15:18:56 +00:00
}
}
return bRet ;
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : next ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-10-26 06:45:13 +00:00
return m_pTable ? m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : NEXT , 1 , sal_True ) : sal_False ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
sal_Bool SAL_CALL OResultSet : : wasNull ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
return m_bWasNull ;
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : cancel ( ) throw ( RuntimeException )
{
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : clearWarnings ( ) throw ( SQLException , RuntimeException )
{
}
// -------------------------------------------------------------------------
Any SAL_CALL OResultSet : : getWarnings ( ) throw ( SQLException , RuntimeException )
{
return Any ( ) ;
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : insertRow ( ) throw ( SQLException , RuntimeException )
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-29 15:02:10 +00:00
2001-11-15 14:20:06 +00:00
if ( ! m_bInserted | | ! m_pTable )
2001-05-17 05:46:55 +00:00
throwFunctionSequenceException ( * this ) ;
2000-09-29 15:02:10 +00:00
2001-03-02 12:45:45 +00:00
// we know that we append new rows at the end
// so we have to know where the end is
2001-10-26 06:45:13 +00:00
m_aSkipDeletedSet . skipDeleted ( IResultSetHelper : : LAST , 1 , sal_False ) ;
2000-09-29 15:02:10 +00:00
m_bRowInserted = m_pTable - > InsertRow ( m_aInsertRow . getBody ( ) , TRUE , Reference < XIndexAccess > ( m_xColNames , UNO_QUERY ) ) ;
2001-08-29 11:21:08 +00:00
if ( m_bRowInserted & & m_pFileSet . isValid ( ) )
2000-09-29 15:02:10 +00:00
{
sal_Int32 nPos = ( * m_aInsertRow ) [ 0 ] ;
m_pFileSet - > push_back ( nPos ) ;
2001-08-27 08:13:35 +00:00
( * m_aInsertRow ) [ 0 ] = sal_Int32 ( m_pFileSet - > size ( ) ) ;
2001-08-09 12:12:51 +00:00
clearInsertRow ( ) ;
2001-08-10 07:11:09 +00:00
2001-10-26 06:45:13 +00:00
m_aSkipDeletedSet . insertNewPosition ( ( * m_aRow ) [ 0 ] ) ;
2000-09-29 15:02:10 +00:00
}
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateRow ( ) throw ( SQLException , RuntimeException )
{
2001-05-10 13:31:14 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
if ( ! m_pTable | | m_pTable - > isReadOnly ( ) )
2001-05-14 10:55:19 +00:00
throw SQLException ( : : rtl : : OUString : : createFromAscii ( " Table is readonly! " ) , * this , OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_HY0000 ) , 1000 , Any ( ) ) ;
2000-09-29 15:02:10 +00:00
m_bRowUpdated = m_pTable - > UpdateRow ( m_aInsertRow . getBody ( ) , m_aRow , Reference < XIndexAccess > ( m_xColNames , UNO_QUERY ) ) ;
2000-10-10 05:06:55 +00:00
( * m_aInsertRow ) [ 0 ] = ( sal_Int32 ) ( * m_aRow ) [ 0 ] ;
2001-01-22 06:17:49 +00:00
2001-08-09 12:12:51 +00:00
clearInsertRow ( ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
2001-05-10 13:31:14 +00:00
void SAL_CALL OResultSet : : deleteRow ( ) throw ( SQLException , RuntimeException )
2000-09-18 15:18:56 +00:00
{
2001-05-10 13:31:14 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-05-10 13:31:14 +00:00
2001-11-15 14:20:06 +00:00
if ( ! m_pTable | | m_pTable - > isReadOnly ( ) )
2001-05-14 10:55:19 +00:00
throw SQLException ( : : rtl : : OUString : : createFromAscii ( " Table is readonly! " ) , * this , OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_HY0000 ) , 1000 , Any ( ) ) ;
2001-06-28 11:22:36 +00:00
if ( m_bShowDeleted )
throw SQLException ( : : rtl : : OUString : : createFromAscii ( " Row could not be deleted. The option \" Display inactive records \" is set! " ) , * this , OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_HY0000 ) , 1000 , Any ( ) ) ;
if ( m_aRow - > isDeleted ( ) )
throw SQLException ( : : rtl : : OUString : : createFromAscii ( " Row was already deleted! " ) , * this , OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_HY0000 ) , 1000 , Any ( ) ) ;
2000-10-10 05:06:55 +00:00
sal_Int32 nPos = ( sal_Int32 ) ( * m_aRow ) [ 0 ] ;
2000-09-29 15:02:10 +00:00
m_bRowDeleted = m_pTable - > DeleteRow ( m_xColumns . getBody ( ) ) ;
2001-08-29 11:21:08 +00:00
if ( m_bRowDeleted & & m_pFileSet . isValid ( ) )
2000-09-29 15:02:10 +00:00
{
m_aRow - > setDeleted ( sal_True ) ;
2001-05-10 13:31:14 +00:00
// don't touch the m_pFileSet member here
2001-10-26 06:45:13 +00:00
m_aSkipDeletedSet . deletePosition ( nPos ) ;
2000-09-29 15:02:10 +00:00
}
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : cancelRowUpdates ( ) throw ( SQLException , RuntimeException )
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-29 15:02:10 +00:00
m_bInserted = sal_False ;
m_bRowUpdated = sal_False ;
m_bRowInserted = sal_False ;
m_bRowDeleted = sal_False ;
if ( m_aInsertRow . isValid ( ) )
{
OValueVector : : iterator aIter = m_aInsertRow - > begin ( ) + 1 ;
for ( ; aIter ! = m_aInsertRow - > end ( ) ; + + aIter )
2000-11-15 15:02:00 +00:00
{
2000-09-29 15:02:10 +00:00
aIter - > setBound ( sal_False ) ;
2000-11-15 15:02:00 +00:00
aIter - > setNull ( ) ;
}
2000-09-29 15:02:10 +00:00
}
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : moveToInsertRow ( ) throw ( SQLException , RuntimeException )
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-11-15 14:20:06 +00:00
if ( ! m_pTable | | m_pTable - > isReadOnly ( ) )
2001-05-14 10:55:19 +00:00
throw SQLException ( : : rtl : : OUString : : createFromAscii ( " Table is readonly! " ) , * this , OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_HY0000 ) , 1000 , Any ( ) ) ;
2000-09-29 15:02:10 +00:00
m_bInserted = sal_True ;
OValueVector : : iterator aIter = m_aInsertRow - > begin ( ) + 1 ;
for ( ; aIter ! = m_aInsertRow - > end ( ) ; + + aIter )
2000-11-15 15:02:00 +00:00
{
2000-09-29 15:02:10 +00:00
aIter - > setBound ( sal_False ) ;
2000-11-15 15:02:00 +00:00
aIter - > setNull ( ) ;
}
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : moveToCurrentRow ( ) throw ( SQLException , RuntimeException )
{
}
// -------------------------------------------------------------------------
2001-07-30 07:53:02 +00:00
void OResultSet : : updateValue ( sal_Int32 columnIndex , const ORowSetValue & x ) throw ( SQLException , RuntimeException )
2000-09-18 15:18:56 +00:00
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-05-23 08:18:28 +00:00
checkIndex ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
columnIndex = mapColumn ( columnIndex ) ;
2000-09-29 15:02:10 +00:00
( * m_aInsertRow ) [ columnIndex ] . setBound ( sal_True ) ;
2001-07-30 07:53:02 +00:00
( * m_aInsertRow ) [ columnIndex ] = x ;
2000-09-18 15:18:56 +00:00
}
2001-07-30 07:53:02 +00:00
// -----------------------------------------------------------------------------
2000-09-18 15:18:56 +00:00
2001-07-30 07:53:02 +00:00
void SAL_CALL OResultSet : : updateNull ( sal_Int32 columnIndex ) throw ( SQLException , RuntimeException )
2000-09-18 15:18:56 +00:00
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-05-23 08:18:28 +00:00
checkIndex ( columnIndex ) ;
2000-09-18 15:18:56 +00:00
columnIndex = mapColumn ( columnIndex ) ;
2000-09-29 15:02:10 +00:00
( * m_aInsertRow ) [ columnIndex ] . setBound ( sal_True ) ;
2001-07-30 07:53:02 +00:00
( * m_aInsertRow ) [ columnIndex ] . setNull ( ) ;
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateBoolean ( sal_Int32 columnIndex , sal_Bool x ) throw ( SQLException , RuntimeException )
{
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateByte ( sal_Int32 columnIndex , sal_Int8 x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateShort ( sal_Int32 columnIndex , sal_Int16 x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateInt ( sal_Int32 columnIndex , sal_Int32 x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateLong ( sal_Int32 columnIndex , sal_Int64 x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
: : dbtools : : throwFunctionSequenceException ( * this ) ;
2000-09-18 15:18:56 +00:00
}
// -----------------------------------------------------------------------
void SAL_CALL OResultSet : : updateFloat ( sal_Int32 columnIndex , float x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateDouble ( sal_Int32 columnIndex , double x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateString ( sal_Int32 columnIndex , const : : rtl : : OUString & x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateBytes ( sal_Int32 columnIndex , const Sequence < sal_Int8 > & x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateDate ( sal_Int32 columnIndex , const : : com : : sun : : star : : util : : Date & x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateTime ( sal_Int32 columnIndex , const : : com : : sun : : star : : util : : Time & x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateTimestamp ( sal_Int32 columnIndex , const : : com : : sun : : star : : util : : DateTime & x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , x ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateBinaryStream ( sal_Int32 columnIndex , const Reference < : : com : : sun : : star : : io : : XInputStream > & x , sal_Int32 length ) throw ( SQLException , RuntimeException )
{
2000-09-29 15:02:10 +00:00
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2001-04-02 08:18:37 +00:00
if ( ! x . is ( ) )
2001-04-19 06:14:49 +00:00
: : dbtools : : throwFunctionSequenceException ( * this ) ;
2000-09-29 15:02:10 +00:00
2000-11-15 15:02:00 +00:00
Sequence < sal_Int8 > aSeq ;
x - > readSomeBytes ( aSeq , length ) ;
2001-07-30 07:53:02 +00:00
updateValue ( columnIndex , aSeq ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateCharacterStream ( sal_Int32 columnIndex , const Reference < : : com : : sun : : star : : io : : XInputStream > & x , sal_Int32 length ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
updateBinaryStream ( columnIndex , x , length ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : refreshRow ( ) throw ( SQLException , RuntimeException )
{
: : osl : : MutexGuard aGuard ( m_aMutex ) ;
2001-05-17 05:46:55 +00:00
checkDisposed ( OResultSet_BASE : : rBHelper . bDisposed ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateObject ( sal_Int32 columnIndex , const Any & x ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
if ( ! : : dbtools : : implUpdateObject ( this , columnIndex , x ) )
throw SQLException ( ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
void SAL_CALL OResultSet : : updateNumericObject ( sal_Int32 columnIndex , const Any & x , sal_Int32 scale ) throw ( SQLException , RuntimeException )
{
2001-07-30 07:53:02 +00:00
if ( ! : : dbtools : : implUpdateObject ( this , columnIndex , x ) )
throw SQLException ( ) ;
2000-09-18 15:18:56 +00:00
}
// -------------------------------------------------------------------------
IPropertyArrayHelper * OResultSet : : createArrayHelper ( ) const
{
2000-09-29 15:02:10 +00:00
Sequence < Property > aProps ;
2000-09-18 15:18:56 +00:00
describeProperties ( aProps ) ;
return new : : cppu : : OPropertyArrayHelper ( aProps ) ;
}
// -------------------------------------------------------------------------
IPropertyArrayHelper & OResultSet : : getInfoHelper ( )
{
return * const_cast < OResultSet * > ( this ) - > getArrayHelper ( ) ;
}
//------------------------------------------------------------------
2001-10-26 06:45:13 +00:00
BOOL OResultSet : : ExecuteRow ( IResultSetHelper : : Movement eFirstCursorPosition ,
2000-09-18 15:18:56 +00:00
INT32 nFirstOffset ,
BOOL bRebind ,
BOOL bEvaluate ,
BOOL bRetrieveData )
{
2001-05-07 09:37:54 +00:00
OSL_ENSURE ( m_pSQLAnalyzer , " OResultSet::ExecuteRow: Analyzer isn't set! " ) ;
2000-09-18 15:18:56 +00:00
// Fuer weitere Fetch-Operationen werden diese Angaben ggf. veraendert ...
2001-10-26 06:45:13 +00:00
IResultSetHelper : : Movement eCursorPosition = eFirstCursorPosition ;
2000-09-18 15:18:56 +00:00
INT32 nOffset = nFirstOffset ;
UINT32 nLoopCount = 0 ;
again :
// protect from reading over the end when someboby is inserting while we are reading
// this method works only for dBase at the moment !!!!
2001-10-26 06:45:13 +00:00
if ( eCursorPosition = = IResultSetHelper : : NEXT & & m_nFilePos = = m_nLastVisitedPos )
2000-09-18 15:18:56 +00:00
{
return sal_False ;
}
2001-11-15 14:20:06 +00:00
if ( ! m_pTable | | ! m_pTable - > seekRow ( eCursorPosition , nOffset , m_nFilePos ) )
2000-09-18 15:18:56 +00:00
{
return sal_False ;
}
if ( ! bEvaluate ) // Laeuft keine Auswertung, dann nur Ergebniszeile fuellen
{
2000-11-27 06:59:12 +00:00
m_pTable - > fetchRow ( m_aRow , m_pTable - > getTableColumns ( ) . getBody ( ) , sal_True , bRetrieveData ) ;
2000-09-18 15:18:56 +00:00
// if (bShowDeleted && m_aRow->isDeleted())
// m_aRow->setState(ROW_DELETED);
}
else
{
2001-08-24 05:19:41 +00:00
m_pTable - > fetchRow ( m_aEvaluateRow , m_pTable - > getTableColumns ( ) . getBody ( ) , sal_True , bRetrieveData | | m_pSQLAnalyzer - > hasRestriction ( ) ) ;
2000-09-18 15:18:56 +00:00
2001-06-28 11:22:36 +00:00
if ( ( ! m_bShowDeleted & & m_aEvaluateRow - > isDeleted ( ) ) | |
2001-05-07 09:37:54 +00:00
( m_pSQLAnalyzer - > hasRestriction ( ) & & //!bShowDeleted && m_aEvaluateRow->isDeleted() ||// keine Anzeige von geloeschten S<> tzen
! m_pSQLAnalyzer - > evaluateRestriction ( ) ) ) // Auswerten der Bedingungen
2000-09-18 15:18:56 +00:00
{ // naechsten Satz auswerten
// aktuelle Zeile loeschen im Keyset
if ( m_pEvaluationKeySet )
{
+ + m_aEvaluateIter ;
if ( m_pEvaluationKeySet - > end ( ) ! = m_aEvaluateIter )
nOffset = ( * m_aEvaluateIter ) ;
else
{
return sal_False ;
}
}
2001-08-29 11:21:08 +00:00
else if ( m_pFileSet . isValid ( ) )
2000-09-18 15:18:56 +00:00
{
2001-02-21 09:06:46 +00:00
OSL_ENSURE ( //!m_pFileSet->IsFrozen() &&
2001-10-26 06:45:13 +00:00
eCursorPosition = = IResultSetHelper : : NEXT , " Falsche CursorPosition! " ) ;
eCursorPosition = IResultSetHelper : : NEXT ;
2000-09-18 15:18:56 +00:00
nOffset = 1 ;
}
2001-10-26 06:45:13 +00:00
else if ( eCursorPosition = = IResultSetHelper : : FIRST | |
eCursorPosition = = IResultSetHelper : : NEXT | |
eCursorPosition = = IResultSetHelper : : ABSOLUTE )
2000-09-18 15:18:56 +00:00
{
2001-10-26 06:45:13 +00:00
eCursorPosition = IResultSetHelper : : NEXT ;
2000-09-18 15:18:56 +00:00
nOffset = 1 ;
}
2001-10-26 06:45:13 +00:00
else if ( eCursorPosition = = IResultSetHelper : : LAST | |
eCursorPosition = = IResultSetHelper : : PRIOR )
2000-09-18 15:18:56 +00:00
{
2001-10-26 06:45:13 +00:00
eCursorPosition = IResultSetHelper : : PRIOR ;
2000-09-18 15:18:56 +00:00
nOffset = 1 ;
}
2001-10-26 06:45:13 +00:00
else if ( eCursorPosition = = IResultSetHelper : : RELATIVE )
2000-09-18 15:18:56 +00:00
{
2001-10-26 06:45:13 +00:00
eCursorPosition = ( nOffset > = 0 ) ? IResultSetHelper : : NEXT : IResultSetHelper : : PRIOR ;
2000-09-18 15:18:56 +00:00
}
else
{
// aStatus.Set(SQL_STAT_NO_DATA_FOUND);
return sal_False ;
}
// Nochmal probieren ...
goto again ;
}
}
// Evaluate darf nur gesetzt sein,
// wenn der Keyset weiter aufgebaut werden soll
2001-01-09 14:37:39 +00:00
if ( m_aSQLIterator . getStatementType ( ) = = SQL_STATEMENT_SELECT & & ! isCount ( ) & &
2001-08-29 11:21:08 +00:00
( m_pFileSet . isValid ( ) | | m_pSortIndex ) & & bEvaluate )
2000-09-18 15:18:56 +00:00
{
if ( m_pSortIndex )
{
2001-08-29 11:21:08 +00:00
OKeyValue * pKeyValue = GetOrderbyKeyValue ( m_aEvaluateRow ) ;
2001-10-30 13:23:24 +00:00
m_pSortIndex - > AddKeyValue ( pKeyValue ) ;
2000-09-18 15:18:56 +00:00
}
2001-08-29 11:21:08 +00:00
else if ( m_pFileSet . isValid ( ) )
2000-09-18 15:18:56 +00:00
{
2001-02-21 09:06:46 +00:00
// OSL_ENSURE(!m_pFileSet->IsFrozen() , "Falsche CursorPosition!");
2000-09-18 15:18:56 +00:00
sal_uInt32 nBookmarkValue = Abs ( ( sal_Int32 ) ( * m_aEvaluateRow ) [ 0 ] ) ;
m_pFileSet - > push_back ( nBookmarkValue ) ;
}
}
else if ( m_aSQLIterator . getStatementType ( ) = = SQL_STATEMENT_UPDATE )
{
sal_Bool bOK = sal_True ;
if ( bEvaluate )
{
// jetzt die eigentliche Ergebniszeile Lesen
2000-11-27 06:59:12 +00:00
bOK = m_pTable - > fetchRow ( m_aEvaluateRow , m_pTable - > getTableColumns ( ) . getBody ( ) , sal_True , TRUE ) ;
2000-09-18 15:18:56 +00:00
}
if ( bOK )
{
// Nur die zu aendernden Werte uebergeben:
if ( ! m_pTable - > UpdateRow ( m_aAssignValues . getBody ( ) , m_aEvaluateRow , Reference < XIndexAccess > ( m_xColNames , UNO_QUERY ) ) )
return sal_False ;
}
}
else if ( m_aSQLIterator . getStatementType ( ) = = SQL_STATEMENT_DELETE )
{
sal_Bool bOK = sal_True ;
if ( bEvaluate )
{
2000-11-27 06:59:12 +00:00
bOK = m_pTable - > fetchRow ( m_aEvaluateRow , m_pTable - > getTableColumns ( ) . getBody ( ) , sal_True , TRUE ) ;
2000-09-18 15:18:56 +00:00
}
if ( bOK )
{
if ( ! m_pTable - > DeleteRow ( m_xColumns . getBody ( ) ) )
return sal_False ;
}
}
return sal_True ;
}
//-------------------------------------------------------------------
2001-10-26 06:45:13 +00:00
BOOL OResultSet : : Move ( IResultSetHelper : : Movement eCursorPosition , INT32 nOffset , BOOL bRetrieveData )
2000-09-18 15:18:56 +00:00
{
2000-09-29 15:02:10 +00:00
//IgnoreDeletedRows:
//
2000-09-18 15:18:56 +00:00
INT32 nTempPos = m_nRowPos ;
// exclusiver zugriff auf die Tabelle
// NAMESPACE_VOS(OGuard)* pGuard = m_pTable->Lock();
2001-01-09 14:37:39 +00:00
if ( m_aSQLIterator . getStatementType ( ) = = SQL_STATEMENT_SELECT & &
! isCount ( ) )
2000-09-18 15:18:56 +00:00
{
2001-08-29 11:21:08 +00:00
if ( ! m_pFileSet . isValid ( ) ) // kein Index verfuegbar
2000-09-18 15:18:56 +00:00
{
// Normales FETCH
ExecuteRow ( eCursorPosition , nOffset , TRUE , FALSE , bRetrieveData ) ;
2001-05-10 13:31:14 +00:00
// now set the bookmark for outside this is the logical pos and not the file pos
( * m_aRow - > begin ( ) ) = sal_Int32 ( m_nRowPos + 1 ) ;
2000-09-18 15:18:56 +00:00
}
else
{
switch ( eCursorPosition )
{
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : NEXT :
2001-08-27 08:13:35 +00:00
+ + m_nRowPos ;
2000-09-18 15:18:56 +00:00
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : PRIOR :
2000-09-18 15:18:56 +00:00
if ( m_nRowPos > = 0 )
2001-08-27 08:13:35 +00:00
- - m_nRowPos ;
2000-09-18 15:18:56 +00:00
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : FIRST :
2000-09-18 15:18:56 +00:00
m_nRowPos = 0 ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : LAST :
2001-02-21 09:06:46 +00:00
// OSL_ENSURE(IsRowCountFinal(), "Fehler im Keyset!"); // mu<6D> eingefroren sein, sonst Fehler beim SQLCursor
2000-09-18 15:18:56 +00:00
m_nRowPos = m_pFileSet - > size ( ) - 1 ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : RELATIVE :
2000-09-18 15:18:56 +00:00
m_nRowPos + = nOffset ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : ABSOLUTE :
case IResultSetHelper : : BOOKMARK :
2001-08-27 08:13:35 +00:00
m_nRowPos = nOffset - 1 ;
2000-09-18 15:18:56 +00:00
break ;
}
// OffRange?
// Der FileCursor ist au<61> erhalb des gueltigen Bereichs, wenn
// a.) m_nRowPos < 1
// b.) Ein KeySet besteht und m_nRowPos > m_pFileSet->size()
2001-10-26 06:45:13 +00:00
if ( m_nRowPos < 0 | | ( m_pFileSet - > isFrozen ( ) & & eCursorPosition ! = IResultSetHelper : : BOOKMARK & & m_nRowPos > = ( INT32 ) m_pFileSet - > size ( ) ) ) // && m_pFileSet->IsFrozen()
2000-09-18 15:18:56 +00:00
{
// aStatus.Set(SQL_STAT_NO_DATA_FOUND);
goto Error ;
}
else
{
if ( m_nRowPos < ( INT32 ) m_pFileSet - > size ( ) )
{
// Fetch ueber Index
2001-10-26 06:45:13 +00:00
ExecuteRow ( IResultSetHelper : : BOOKMARK , ( * m_pFileSet ) [ m_nRowPos ] , TRUE , FALSE , bRetrieveData ) ;
2000-09-18 15:18:56 +00:00
// now set the bookmark for outside
2001-05-10 13:31:14 +00:00
( * m_aRow - > begin ( ) ) = sal_Int32 ( m_nRowPos + 1 ) ;
2000-09-18 15:18:56 +00:00
}
else // Index mu<6D> weiter aufgebaut werden
{
// Zunaechst auf die letzte bekannte Zeile setzen
2001-08-27 08:13:35 +00:00
if ( ! m_pFileSet - > empty ( ) )
2000-09-18 15:18:56 +00:00
{
m_aFileSetIter = m_pFileSet - > end ( ) - 1 ;
// m_pFileSet->SeekPos(m_pFileSet->size()-1);
2001-10-26 06:45:13 +00:00
m_pTable - > seekRow ( IResultSetHelper : : BOOKMARK , * m_aFileSetIter , m_nFilePos ) ;
2000-09-18 15:18:56 +00:00
}
sal_Bool bOK = sal_True ;
// Ermitteln der Anzahl weiterer Fetches
while ( bOK & & m_nRowPos > = ( INT32 ) m_pFileSet - > size ( ) )
{
if ( m_pEvaluationKeySet )
{
if ( m_nRowPos > = ( INT32 ) m_pEvaluationKeySet - > size ( ) )
return sal_False ;
// aStatus.Set(SQL_STAT_NO_DATA_FOUND);
else if ( m_nRowPos = = 0 )
{
m_aEvaluateIter = m_pEvaluationKeySet - > begin ( ) ;
2001-10-26 06:45:13 +00:00
bOK = ExecuteRow ( IResultSetHelper : : BOOKMARK , * m_aEvaluateIter , FALSE , TRUE , bRetrieveData ) ;
2000-09-18 15:18:56 +00:00
}
else
{
+ + m_aEvaluateIter ;
2001-10-26 06:45:13 +00:00
bOK = ExecuteRow ( IResultSetHelper : : BOOKMARK , * m_aEvaluateIter , FALSE , TRUE , bRetrieveData ) ;
2000-09-18 15:18:56 +00:00
}
}
else
2001-10-26 06:45:13 +00:00
bOK = ExecuteRow ( IResultSetHelper : : NEXT , 1 , FALSE , TRUE , FALSE ) ; //bRetrieveData);
2000-09-18 15:18:56 +00:00
}
if ( bOK )
{
// jetzt nochmal die Ergebnisse lesen
2000-11-27 06:59:12 +00:00
m_pTable - > fetchRow ( m_aRow , m_pTable - > getTableColumns ( ) . getBody ( ) , sal_True , bRetrieveData ) ;
2000-09-18 15:18:56 +00:00
// now set the bookmark for outside
( * m_aRow - > begin ( ) ) = sal_Int32 ( m_nRowPos + 1 ) ;
}
else if ( ! m_pFileSet - > isFrozen ( ) ) // keinen gueltigen Satz gefunden
{
//m_pFileSet->Freeze();
m_pFileSet - > setFrozen ( ) ;
2001-08-24 05:19:41 +00:00
// DELETEZ(m_pEvaluationKeySet);
m_pEvaluationKeySet = NULL ;
2000-09-18 15:18:56 +00:00
// aStatus.Set(SQL_STAT_NO_DATA_FOUND);
goto Error ;
}
}
}
}
}
2001-01-09 14:37:39 +00:00
else if ( m_aSQLIterator . getStatementType ( ) = = SQL_STATEMENT_SELECT & & isCount ( ) )
2000-09-18 15:18:56 +00:00
{
// Fetch des COUNT(*)
switch ( eCursorPosition )
{
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : NEXT :
2001-08-27 08:13:35 +00:00
+ + m_nRowPos ;
2000-09-18 15:18:56 +00:00
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : PRIOR :
2001-08-27 08:13:35 +00:00
- - m_nRowPos ;
2000-09-18 15:18:56 +00:00
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : FIRST :
2000-09-18 15:18:56 +00:00
m_nRowPos = 0 ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : LAST :
2000-09-18 15:18:56 +00:00
m_nRowPos = 0 ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : RELATIVE :
2000-09-18 15:18:56 +00:00
m_nRowPos + = nOffset ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : ABSOLUTE :
case IResultSetHelper : : BOOKMARK :
2000-09-18 15:18:56 +00:00
m_nRowPos = nOffset - 1 ;
break ;
}
if ( m_nRowPos = = 0 )
{
// COUNT(*) in Ergebnisrow packen
// (muss die erste und einzige Variable in der Row sein)
2001-02-19 07:08:32 +00:00
if ( m_aRow - > size ( ) > = 2 )
2000-09-18 15:18:56 +00:00
{
( * m_aRow ) [ 1 ] = m_nRowCountResult ;
( * m_aRow ) [ 0 ] = sal_Int32 ( 1 ) ;
2001-01-09 14:37:39 +00:00
( * m_aRow ) [ 1 ] . setBound ( sal_True ) ;
2000-09-18 15:18:56 +00:00
}
}
else
{
2001-01-09 14:37:39 +00:00
m_bEOF = sal_True ;
m_nRowPos = 1 ;
return sal_False ;
2000-09-18 15:18:56 +00:00
}
}
else
// Fetch nur bei SELECT moeglich!
return sal_False ;
return sal_True ;
Error :
// steht der Cursor vor dem ersten Satz
// dann wird die position beibehalten
if ( nTempPos = = - 1 )
m_nRowPos = nTempPos ;
else
{
switch ( eCursorPosition )
{
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : PRIOR :
case IResultSetHelper : : FIRST :
2000-09-18 15:18:56 +00:00
m_nRowPos = - 1 ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : LAST :
case IResultSetHelper : : NEXT :
case IResultSetHelper : : ABSOLUTE :
case IResultSetHelper : : RELATIVE :
2000-09-18 15:18:56 +00:00
if ( nOffset > 0 )
2001-08-29 11:21:08 +00:00
m_nRowPos = ( m_pFileSet . isValid ( ) ) ? m_pFileSet - > size ( ) : - 1 ;
2000-09-18 15:18:56 +00:00
else if ( nOffset < 0 )
m_nRowPos = - 1 ;
break ;
2001-10-26 06:45:13 +00:00
case IResultSetHelper : : BOOKMARK :
2000-09-18 15:18:56 +00:00
m_nRowPos = nTempPos ; // vorherige Position
}
}
// delete pGuard;
// rMode = (!bShowDeleted && aStatus.IsSuccessful() && m_aRow->isDeleted()) ? // keine Anzeige von gel<65> schten S<> tzen
// OCursor::SQL_MOD_INVALID : OCursor::SQL_MOD_NONE;
return sal_False ;
}
// -------------------------------------------------------------------------
BOOL OResultSet : : OpenImpl ( )
{
2001-08-24 05:19:41 +00:00
OSL_ENSURE ( m_pSQLAnalyzer , " No analyzer set with setSqlAnalyzer! " ) ;
if ( ! m_pTable )
{
const OSQLTables & xTabs = m_aSQLIterator . getTables ( ) ;
if ( ( xTabs . begin ( ) = = xTabs . end ( ) ) | | ! xTabs . begin ( ) - > second . is ( ) )
throwGenericSQLException ( : : rtl : : OUString : : createFromAscii ( " The statement is invalid. " ) ,
static_cast < XWeak * > ( this ) ,
makeAny ( m_aSQLIterator . getWarning ( ) )
) ;
OSQLTable xTable = xTabs . begin ( ) - > second ;
m_xColumns = m_aSQLIterator . getSelectColumns ( ) ;
m_xColNames = xTable - > getColumns ( ) ;
m_xColsIdx = Reference < XIndexAccess > ( m_xColNames , UNO_QUERY ) ;
doTableSpecials ( xTable ) ;
2001-11-15 14:20:06 +00:00
Reference < XComponent > xComp ( xTable , UNO_QUERY ) ;
if ( xComp . is ( ) )
xComp - > addEventListener ( this ) ;
2001-08-24 05:19:41 +00:00
}
2000-09-18 15:18:56 +00:00
2001-09-19 10:03:04 +00:00
m_pTable - > refreshHeader ( ) ;
2001-08-24 05:19:41 +00:00
sal_Int32 nColumnCount = m_xColsIdx - > getCount ( ) ;
2000-09-18 15:18:56 +00:00
2001-08-24 05:19:41 +00:00
initializeRow ( m_aRow , nColumnCount ) ;
initializeRow ( m_aEvaluateRow , nColumnCount ) ;
initializeRow ( m_aInsertRow , nColumnCount ) ;
2000-09-18 15:18:56 +00:00
2001-06-27 09:02:11 +00:00
2001-04-12 11:40:19 +00:00
m_nResultSetConcurrency = ( m_pTable - > isReadOnly ( ) | | isCount ( ) ) ? ResultSetConcurrency : : READ_ONLY : ResultSetConcurrency : : UPDATABLE ;
2000-09-18 15:18:56 +00:00
2001-08-24 05:19:41 +00:00
// if(m_aParameterRow.isValid())
// m_xParamColumns->reserve(m_aParameterRow->size());
2000-09-18 15:18:56 +00:00
2001-08-24 05:19:41 +00:00
// sal_Int32 i=0;
2000-09-18 15:18:56 +00:00
2001-08-24 05:19:41 +00:00
// // Parameter substituieren (AssignValues und Kriterien):
// if (m_xParamColumns.isValid() && !m_xParamColumns->empty())
// {
// // Zun<75> chst AssignValues
// USHORT nParaCount=0; // gibt die aktuelle Anzahl der bisher gesetzen Parameter an
//
// // Nach zu substituierenden Parametern suchen:
// UINT16 nCount = m_aAssignValues.isValid() ? m_aAssignValues->size() : 1; // 1 ist wichtig f<> r die Kriterien
// for (UINT16 j = 1; j < nCount; j++)
// {
// UINT32 nParameter = (*m_aAssignValues).getParameterIndex(j);
// if (nParameter == SQL_NO_PARAMETER)
// continue; // dieser AssignValue ist kein Parameter
//
// ++nParaCount; // ab hier ist der Parameter gueltig
// // Parameter ersetzen. Wenn Parameter nicht verfuegbar,
// // Value auf NULL setzen.
// (*m_aAssignValues)[j] = (*m_aParameterRow)[(UINT16)nParameter];
// }
//
// if (m_aParameterRow.isValid() && nParaCount < m_aParameterRow->size())
// {
// // setBoundedColumns(m_aEvaluateRow,m_xParamColumns,xNames,sal_False);
// m_pSQLAnalyzer->bindParameterRow(m_aParameterRow);
// }
// }
2000-09-18 15:18:56 +00:00
// Neuen Index aufbauen:
2001-08-29 11:21:08 +00:00
m_pFileSet = NULL ;
2001-08-24 05:19:41 +00:00
// DELETEZ(m_pEvaluationKeySet);
2000-09-18 15:18:56 +00:00
// Row zur Auswertung binden, wenn Preprocessing erfolg, dann bereits ein Keyset
2001-08-24 05:19:41 +00:00
// m_pEvaluationKeySet = m_pSQLAnalyzer->bindResultRow(m_aEvaluateRow); // Werte im Code des Compilers setzen
2000-09-18 15:18:56 +00:00
// (Verbindung zur ResultRow herstellen)
2001-08-24 05:19:41 +00:00
2000-09-18 15:18:56 +00:00
// An den Anfang positionieren
m_nRowPos = - 1 ;
m_nFilePos = 0 ;
m_nRowCountResult = - 1 ;
// exclusiver zugriff auf die Tabelle
// NAMESPACE_VOS(OGuard)* pGuard = pTable->Lock();
m_nLastVisitedPos = m_pTable - > getCurrentLastPos ( ) ;
UINT32 nLoopCount = 0 ;
switch ( m_aSQLIterator . getStatementType ( ) )
{
case SQL_STATEMENT_SELECT :
{
2001-01-09 14:37:39 +00:00
if ( isCount ( ) )
2000-09-18 15:18:56 +00:00
{
2001-12-10 10:18:38 +00:00
if ( m_xColumns - > size ( ) > 1 )
throw throwGenericSQLException ( : : rtl : : OUString : : createFromAscii ( " Count can only be used as single column! " ) , * this ) ;
2001-01-09 14:37:39 +00:00
m_nRowCountResult = 0 ;
// Vorlaeufig einfach ueber alle Datensaetze iterieren und
// dabei die Aktionen bearbeiten (bzw. einfach nur zaehlen):
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
sal_Bool bOK = sal_True ;
if ( m_pEvaluationKeySet )
{
m_aEvaluateIter = m_pEvaluationKeySet - > begin ( ) ;
bOK = m_aEvaluateIter = = m_pEvaluationKeySet - > end ( ) ;
}
while ( bOK )
{
if ( m_pEvaluationKeySet )
2001-10-26 06:45:13 +00:00
ExecuteRow ( IResultSetHelper : : BOOKMARK , ( * m_aEvaluateIter ) , FALSE , TRUE ) ;
2001-01-09 14:37:39 +00:00
else
2001-10-26 06:45:13 +00:00
bOK = ExecuteRow ( IResultSetHelper : : NEXT , 1 , FALSE , TRUE ) ;
2001-01-09 14:37:39 +00:00
if ( bOK )
{
m_nRowCountResult + + ;
if ( m_pEvaluationKeySet )
{
+ + m_aEvaluateIter ;
bOK = m_aEvaluateIter = = m_pEvaluationKeySet - > end ( ) ;
}
}
}
// Ergebnis von COUNT(*) in m_nRowCountResult merken.
// nRowCount, also die Anzahl der Rows in der Ergebnismenge, ist bei dieser
// Anfrage = 1!
2001-08-24 05:19:41 +00:00
m_pEvaluationKeySet = NULL ;
// DELETEZ(m_pEvaluationKeySet);
2000-09-18 15:18:56 +00:00
}
}
2001-01-09 14:37:39 +00:00
else
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
INT32 nMaxRowCount = m_pTable - > getCurrentLastPos ( ) ;
BOOL bDistinct = FALSE ;
BOOL bWasSorted = FALSE ;
OSQLParseNode * pDistinct = m_pParseTree - > getChild ( 1 ) ;
if ( pDistinct & & pDistinct - > getTokenID ( ) = = SQL_TOKEN_DISTINCT )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
if ( ! IsSorted ( ) )
2000-09-18 15:18:56 +00:00
{
2001-08-29 11:21:08 +00:00
m_aOrderbyColumnNumber . push_back ( m_aColMapping [ 1 ] ) ;
m_aOrderbyAscending . push_back ( SQL_DESC ) ;
2001-01-09 14:37:39 +00:00
}
else
bWasSorted = TRUE ;
bDistinct = TRUE ;
}
2001-08-29 11:21:08 +00:00
OSortIndex : : TKeyTypeVector eKeyType ( m_aOrderbyColumnNumber . size ( ) ) ;
2001-03-01 10:01:24 +00:00
OValueVector : : iterator aRowIter = m_aRow - > begin ( ) + 1 ;
2001-08-29 11:21:08 +00:00
: : std : : vector < sal_Int32 > : : iterator aOrderByIter = m_aOrderbyColumnNumber . begin ( ) ;
for ( : : std : : vector < sal_Int16 > : : size_type i = 0 ; aOrderByIter ! = m_aOrderbyColumnNumber . end ( ) ; + + aOrderByIter , + + i )
2001-01-09 14:37:39 +00:00
{
2001-08-29 11:21:08 +00:00
OSL_ENSURE ( ( sal_Int32 ) m_aRow - > size ( ) > * aOrderByIter , " Invalid Index " ) ;
switch ( ( m_aRow - > begin ( ) + * aOrderByIter ) - > getTypeKind ( ) )
2001-01-09 14:37:39 +00:00
{
2001-08-29 11:21:08 +00:00
case DataType : : CHAR :
case DataType : : VARCHAR :
eKeyType [ i ] = SQL_ORDERBYKEY_STRING ;
break ;
case DataType : : OTHER :
case DataType : : TINYINT :
case DataType : : SMALLINT :
case DataType : : INTEGER :
case DataType : : DECIMAL :
case DataType : : NUMERIC :
case DataType : : REAL :
case DataType : : DOUBLE :
case DataType : : DATE :
case DataType : : TIME :
case DataType : : TIMESTAMP :
case DataType : : BIT :
eKeyType [ i ] = SQL_ORDERBYKEY_DOUBLE ;
break ;
// Andere Typen sind nicht implementiert (und damit immer FALSE)
default :
eKeyType [ i ] = SQL_ORDERBYKEY_NONE ;
OSL_ASSERT ( " OFILECursor::Execute: Datentyp nicht implementiert " ) ;
break ;
2000-09-18 15:18:56 +00:00
}
2001-08-29 11:21:08 +00:00
( * m_aEvaluateRow ) [ * aOrderByIter ] . setBound ( sal_True ) ;
2000-09-18 15:18:56 +00:00
}
2001-01-09 14:37:39 +00:00
// Nur wenn Sortierung gewuenscht, ueber alle Datensaetze iterieren und
// dabei den "Key", nach dem sortiert werden soll, in den Index eintragen:
if ( IsSorted ( ) )
2000-09-18 15:18:56 +00:00
{
2001-08-29 11:21:08 +00:00
if ( ! m_pSQLAnalyzer - > hasRestriction ( ) & & m_aOrderbyColumnNumber . size ( ) = = 1 )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
// Ist nur ein Feld fuer die Sortierung angegeben
// Und diese Feld ist indiziert, dann den Index ausnutzen
2001-08-24 05:19:41 +00:00
Reference < XIndexesSupplier > xIndexSup ;
m_pTable - > queryInterface ( : : getCppuType ( ( const Reference < XIndexesSupplier > * ) 0 ) ) > > = xIndexSup ;
// Reference<XIndexesSupplier> xIndexSup(m_pTable,UNO_QUERY);
2001-01-09 14:37:39 +00:00
Reference < XIndexAccess > xIndexes ;
if ( xIndexSup . is ( ) )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
xIndexes = Reference < XIndexAccess > ( xIndexSup - > getIndexes ( ) , UNO_QUERY ) ;
Reference < XPropertySet > xColProp ;
2001-08-24 05:19:41 +00:00
if ( m_aOrderbyColumnNumber [ 0 ] < xIndexes - > getCount ( ) )
2000-09-18 15:18:56 +00:00
{
2001-08-24 05:19:41 +00:00
: : cppu : : extractInterface ( xColProp , xIndexes - > getByIndex ( m_aOrderbyColumnNumber [ 0 ] ) ) ;
2001-01-09 14:37:39 +00:00
// iterate through the indexes to find the matching column
for ( sal_Int32 i = 0 ; i < xIndexes - > getCount ( ) ; + + i )
2000-12-14 12:17:53 +00:00
{
2001-01-09 14:37:39 +00:00
Reference < XColumnsSupplier > xIndex ;
2001-02-13 14:02:28 +00:00
: : cppu : : extractInterface ( xIndex , xIndexes - > getByIndex ( i ) ) ;
2001-01-09 14:37:39 +00:00
Reference < XNameAccess > xIndexCols = xIndex - > getColumns ( ) ;
2001-05-18 07:51:34 +00:00
if ( xIndexCols - > hasByName ( comphelper : : getString ( xColProp - > getPropertyValue ( OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_NAME ) ) ) ) )
2001-01-09 14:37:39 +00:00
{
m_pFileSet = new OKeySet ( ) ;
if ( fillIndexValues ( xIndex ) )
goto DISTINCT ;
}
2000-12-14 12:17:53 +00:00
}
2000-09-18 15:18:56 +00:00
}
}
}
2001-08-29 11:21:08 +00:00
m_pSortIndex = new OSortIndex ( eKeyType , m_aOrderbyAscending ) ;
2000-09-18 15:18:56 +00:00
2001-01-09 14:37:39 +00:00
sal_Bool bOK = sal_True ;
2000-09-18 15:18:56 +00:00
if ( m_pEvaluationKeySet )
{
2001-01-09 14:37:39 +00:00
if ( m_pEvaluationKeySet - > size ( ) )
m_aEvaluateIter = m_pEvaluationKeySet - > begin ( ) ;
2000-09-18 15:18:56 +00:00
2001-01-09 14:37:39 +00:00
}
while ( bOK )
{
if ( m_pEvaluationKeySet )
{
2001-10-26 06:45:13 +00:00
ExecuteRow ( IResultSetHelper : : BOOKMARK , ( * m_aEvaluateIter ) , FALSE , TRUE ) ;
2001-01-09 14:37:39 +00:00
+ + m_aEvaluateIter ;
bOK = m_aEvaluateIter = = m_pEvaluationKeySet - > end ( ) ;
}
else
2001-10-26 06:45:13 +00:00
bOK = ExecuteRow ( IResultSetHelper : : NEXT , 1 , FALSE , TRUE ) ;
2001-01-09 14:37:39 +00:00
}
2000-09-18 15:18:56 +00:00
2001-01-09 14:37:39 +00:00
// Sortiertes Keyset erzeugen
2001-08-24 05:19:41 +00:00
// DELETEZ(m_pEvaluationKeySet);
m_pEvaluationKeySet = NULL ;
2001-08-29 11:21:08 +00:00
m_pFileSet = NULL ;
2001-01-09 14:37:39 +00:00
m_pFileSet = m_pSortIndex - > CreateKeySet ( ) ;
// if(!bDistinct)
// SetRowCount(pFileSet->count());
DELETEZ ( m_pSortIndex ) ;
// Nun kann ueber den Index sortiert zugegriffen werden.
}
2000-09-18 15:18:56 +00:00
2001-08-29 11:21:08 +00:00
if ( ! m_pFileSet . isValid ( ) )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
m_pFileSet = new OKeySet ( ) ;
2001-05-07 09:37:54 +00:00
if ( ! m_pSQLAnalyzer - > hasRestriction ( ) )
2001-01-09 14:37:39 +00:00
// jetzt kann das Keyset schon gefuellt werden!
// Aber Achtung: es wird davon ausgegangen, das die FilePositionen als Folge 1..n
// abgelegt werden!
{
2001-08-24 05:19:41 +00:00
if ( m_pTable - > getCurrentLastPos ( ) > 0 )
m_pFileSet - > reserve ( m_pTable - > getCurrentLastPos ( ) ) ;
2001-01-09 14:37:39 +00:00
for ( sal_Int32 i = 0 ; i < m_pTable - > getCurrentLastPos ( ) ; i + + )
m_pFileSet - > push_back ( i + 1 ) ;
}
2000-09-18 15:18:56 +00:00
}
2001-08-29 11:21:08 +00:00
OSL_ENSURE ( m_pFileSet . isValid ( ) , " Kein KeySet vorhanden! :-( " ) ;
DISTINCT : if ( bDistinct & & m_pFileSet . isValid ( ) ) // sicher ist sicher
2000-09-18 15:18:56 +00:00
{
2001-01-26 06:06:23 +00:00
OValueRow aSearchRow = new OValueVector ( m_aRow - > size ( ) ) ;
2001-02-14 06:22:50 +00:00
OValueVector : : iterator aRowIter = m_aRow - > begin ( ) ;
OValueVector : : iterator aSearchIter = aSearchRow - > begin ( ) ;
for ( + + aRowIter , + + aSearchIter ; // the first column is the bookmark column
aRowIter ! = m_aRow - > end ( ) ;
+ + aRowIter , + + aSearchIter )
aSearchIter - > setBound ( aRowIter - > isBound ( ) ) ;
2001-08-24 05:19:41 +00:00
2001-01-09 14:37:39 +00:00
INT32 nPos ;
UINT16 nMaxRow = m_pFileSet - > size ( ) ;
if ( nMaxRow )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
# if DEBUG
INT32 nFound = 0 ;
# endif
2001-08-13 06:36:59 +00:00
: : std : : vector < sal_Int16 > nWasAllwaysFound ( nMaxRow , 0 ) ;
2001-01-09 14:37:39 +00:00
INT32 nPrev_i ;
for ( INT32 j = nMaxRow - 1 ; j > = 0 ; j - - )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
nPos = ( * m_pFileSet ) [ j ] ; // aktuell zu l<> schender Key
if ( ! nWasAllwaysFound [ j ] & & nPos ) // nur falls noch nicht nach dieser Row gesucht wurde
2000-09-18 15:18:56 +00:00
{
2001-10-26 06:45:13 +00:00
ExecuteRow ( IResultSetHelper : : BOOKMARK , nPos , TRUE , FALSE ) ;
2001-01-26 06:06:23 +00:00
* aSearchRow = * m_aRow ;
2001-01-09 14:37:39 +00:00
// jetzt den Rest nach doppelten durchsuchen
INT32 nKey ;
nPrev_i = j ;
for ( INT32 i = j - 1 ; i > = 0 ; i - - )
2000-09-18 15:18:56 +00:00
{
2001-01-09 14:37:39 +00:00
nKey = ( * m_pFileSet ) [ i ] ;
2001-10-26 06:45:13 +00:00
ExecuteRow ( IResultSetHelper : : BOOKMARK , nKey , TRUE , FALSE ) ;
2001-02-14 06:22:50 +00:00
if ( ! nWasAllwaysFound [ i ] )
2001-01-09 14:37:39 +00:00
{
2001-02-14 06:22:50 +00:00
OValueVector : : iterator aRowIter = m_aRow - > begin ( ) ;
OValueVector : : iterator aSearchIter = aSearchRow - > begin ( ) ;
for ( + + aRowIter , + + aSearchIter ; // the first column is the bookmark column
aRowIter ! = m_aRow - > end ( ) ;
+ + aRowIter , + + aSearchIter )
{
if ( aRowIter - > isBound ( ) & & ! ( * aRowIter = = * aSearchIter ) )
break ;
}
if ( aRowIter = = m_aRow - > end ( ) )
{
// gefunden
// Key an der Stelle 0 setzen.
( * m_pFileSet ) [ nPrev_i ] = 0 ;
// und altes i merken
nPrev_i = i ;
nPos = nKey ; // auf naechste g<> ltige Position setzen
2001-08-13 06:36:59 +00:00
nWasAllwaysFound [ i ] = 1 ;
2001-02-14 06:22:50 +00:00
}
2001-01-09 14:37:39 +00:00
}
2000-09-18 15:18:56 +00:00
}
}
2001-01-09 14:37:39 +00:00
# if DEBUG
else
nFound + + ;
# endif
}
2001-08-13 06:36:59 +00:00
m_pFileSet - > erase ( : : std : : remove_if ( m_pFileSet - > begin ( ) , m_pFileSet - > end ( ) ,
: : std : : bind2nd ( : : std : : equal_to < sal_Int32 > ( ) , 0 ) )
, m_pFileSet - > end ( ) ) ;
2001-01-09 14:37:39 +00:00
if ( ! bWasSorted )
{
2001-08-29 11:21:08 +00:00
m_aOrderbyColumnNumber . clear ( ) ;
m_aOrderbyAscending . clear ( ) ;
2001-01-09 14:37:39 +00:00
sort ( m_pFileSet - > begin ( ) , m_pFileSet - > end ( ) ) ;
2000-09-18 15:18:56 +00:00
}
}
2001-01-09 14:37:39 +00:00
// SetRowCount(m_pFileSet->count());
2000-09-18 15:18:56 +00:00
}
}
} break ;
case SQL_STATEMENT_SELECT_COUNT :
case SQL_STATEMENT_UPDATE :
case SQL_STATEMENT_DELETE :
// waehrend der Bearbeitung die Anzahl der bearbeiteten Rows zaehlen:
m_nRowCountResult = 0 ;
// Vorlaeufig einfach ueber alle Datensaetze iterieren und
// dabei die Aktionen bearbeiten (bzw. einfach nur zaehlen):
{
sal_Bool bOK = sal_True ;
if ( m_pEvaluationKeySet )
{
m_aEvaluateIter = m_pEvaluationKeySet - > begin ( ) ;
bOK = m_aEvaluateIter = = m_pEvaluationKeySet - > end ( ) ;
}
while ( bOK )
{
if ( m_pEvaluationKeySet )
2001-10-26 06:45:13 +00:00
ExecuteRow ( IResultSetHelper : : BOOKMARK , ( * m_aEvaluateIter ) , FALSE , TRUE ) ;
2000-09-18 15:18:56 +00:00
else
2001-10-26 06:45:13 +00:00
bOK = ExecuteRow ( IResultSetHelper : : NEXT , 1 , FALSE , TRUE ) ;
2000-09-18 15:18:56 +00:00
if ( bOK )
{
m_nRowCountResult + + ;
if ( m_pEvaluationKeySet )
{
+ + m_aEvaluateIter ;
bOK = m_aEvaluateIter = = m_pEvaluationKeySet - > end ( ) ;
}
}
}
// Ergebnis von COUNT(*) in nRowCountResult merken.
// nRowCount, also die Anzahl der Rows in der Ergebnismenge, ist bei dieser
// Anfrage = 1!
2001-08-24 05:19:41 +00:00
// DELETEZ(m_pEvaluationKeySet);
m_pEvaluationKeySet = NULL ;
2000-09-18 15:18:56 +00:00
}
// SetRowCount(1);
break ;
case SQL_STATEMENT_INSERT :
m_nRowCountResult = 0 ;
2001-08-24 05:19:41 +00:00
OSL_ENSURE ( m_aAssignValues . isValid ( ) , " No assign values set! " ) ;
if ( ! m_pTable - > InsertRow ( m_aAssignValues . getBody ( ) , TRUE , m_xColsIdx ) )
2000-09-18 15:18:56 +00:00
{
m_nFilePos = 0 ;
return sal_False ;
}
m_nRowCountResult = 1 ;
break ;
}
// FilePos zuruecksetzen
m_nFilePos = 0 ;
return sal_True ;
}
//--------------------------------------------------------------------------
Sequence < sal_Int8 > OResultSet : : getUnoTunnelImplementationId ( )
{
static : : cppu : : OImplementationId * pId = 0 ;
if ( ! pId )
{
: : osl : : MutexGuard aGuard ( : : osl : : Mutex : : getGlobalMutex ( ) ) ;
if ( ! pId )
{
static : : cppu : : OImplementationId aId ;
pId = & aId ;
}
}
return pId - > getImplementationId ( ) ;
}
// com::sun::star::lang::XUnoTunnel
//------------------------------------------------------------------
sal_Int64 OResultSet : : getSomething ( const Sequence < sal_Int8 > & rId ) throw ( RuntimeException )
{
2001-08-24 05:19:41 +00:00
return ( rId . getLength ( ) = = 16 & & 0 = = rtl_compareMemory ( getUnoTunnelImplementationId ( ) . getConstArray ( ) , rId . getConstArray ( ) , 16 ) )
?
( sal_Int64 ) this
:
0 ;
2000-09-18 15:18:56 +00:00
}
2001-01-09 14:37:39 +00:00
// -----------------------------------------------------------------------------
2001-03-01 10:01:24 +00:00
void OResultSet : : setBoundedColumns ( const OValueRow & _rRow ,
const : : vos : : ORef < connectivity : : OSQLColumns > & _rxColumns ,
const Reference < XIndexAccess > & _xNames ,
2001-08-24 05:19:41 +00:00
sal_Bool _bSetColumnMapping ,
const Reference < XDatabaseMetaData > & _xMetaData ,
: : std : : vector < sal_Int32 > & _rColMapping )
2001-03-01 10:01:24 +00:00
{
2001-08-24 05:19:41 +00:00
: : comphelper : : UStringMixEqual aCase ( _xMetaData - > storesMixedCaseQuotedIdentifiers ( ) ) ;
2001-03-01 10:01:24 +00:00
Reference < XPropertySet > xTableColumn ;
: : rtl : : OUString sTableColumnName , sSelectColumnRealName ;
2001-08-24 05:19:41 +00:00
const : : rtl : : OUString sName = OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_NAME ) ;
const : : rtl : : OUString sRealName = OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_REALNAME ) ;
const : : rtl : : OUString sType = OMetaConnection : : getPropMap ( ) . getNameByIndex ( PROPERTY_ID_TYPE ) ;
2001-03-01 10:01:24 +00:00
OValueVector : : iterator aRowIter = _rRow - > begin ( ) + 1 ;
for ( sal_Int32 i = 0 ; // the first column is the bookmark column
aRowIter ! = _rRow - > end ( ) ;
+ + i , + + aRowIter
)
{
try
{
// get the table column and it's name
_xNames - > getByIndex ( i ) > > = xTableColumn ;
OSL_ENSURE ( xTableColumn . is ( ) , " OResultSet::OpenImpl: invalid table column! " ) ;
if ( xTableColumn . is ( ) )
2001-08-24 05:19:41 +00:00
xTableColumn - > getPropertyValue ( sName ) > > = sTableColumnName ;
2001-03-01 10:01:24 +00:00
else
sTableColumnName = : : rtl : : OUString ( ) ;
// look if we have such a select column
// TODO: would like to have a O(log n) search here ...
for ( OSQLColumns : : iterator aIter = _rxColumns - > begin ( ) ;
aIter ! = _rxColumns - > end ( ) ;
+ + aIter
)
{
2001-08-24 05:19:41 +00:00
if ( ( * aIter ) - > getPropertySetInfo ( ) - > hasPropertyByName ( sRealName ) )
( * aIter ) - > getPropertyValue ( sRealName ) > > = sSelectColumnRealName ;
2001-03-01 10:01:24 +00:00
else
2001-08-24 05:19:41 +00:00
( * aIter ) - > getPropertyValue ( sName ) > > = sSelectColumnRealName ;
2001-03-01 10:01:24 +00:00
if ( aCase ( sTableColumnName , sSelectColumnRealName ) )
{
if ( _bSetColumnMapping )
{
2001-08-24 05:19:41 +00:00
sal_Int32 nSelectColumnPos = aIter - _rxColumns - > begin ( ) + 1 ;
2001-03-01 10:01:24 +00:00
// the getXXX methods are 1-based ...
sal_Int32 nTableColumnPos = i + 1 ;
// get first table column is the bookmark column ...
2001-08-24 05:19:41 +00:00
_rColMapping [ nSelectColumnPos ] = nTableColumnPos ;
2001-03-01 10:01:24 +00:00
}
2000-09-18 15:18:56 +00:00
2001-03-01 10:01:24 +00:00
aRowIter - > setBound ( sal_True ) ;
sal_Int32 nType = DataType : : OTHER ;
if ( xTableColumn . is ( ) )
2001-08-24 05:19:41 +00:00
xTableColumn - > getPropertyValue ( sType ) > > = nType ;
2001-03-01 10:01:24 +00:00
aRowIter - > setTypeKind ( nType ) ;
}
}
}
catch ( Exception & )
{
OSL_ENSURE ( sal_False , " OResultSet::OpenImpl: caught an Exception! " ) ;
}
}
}
// -----------------------------------------------------------------------------
2001-04-30 09:16:19 +00:00
// -----------------------------------------------------------------------------
2001-10-17 16:11:11 +00:00
void SAL_CALL OResultSet : : acquire ( ) throw ( )
2001-04-30 09:16:19 +00:00
{
OResultSet_BASE : : acquire ( ) ;
}
// -----------------------------------------------------------------------------
2001-10-17 16:11:11 +00:00
void SAL_CALL OResultSet : : release ( ) throw ( )
2001-04-30 09:16:19 +00:00
{
OResultSet_BASE : : release ( ) ;
}
// -----------------------------------------------------------------------------
2001-06-27 09:02:11 +00:00
Reference < : : com : : sun : : star : : beans : : XPropertySetInfo > SAL_CALL OResultSet : : getPropertySetInfo ( ) throw ( RuntimeException )
2001-04-30 09:16:19 +00:00
{
return : : cppu : : OPropertySetHelper : : createPropertySetInfo ( getInfoHelper ( ) ) ;
}
// -----------------------------------------------------------------------------
2001-06-27 09:02:11 +00:00
void OResultSet : : doTableSpecials ( const OSQLTable & _xTable )
{
Reference < : : com : : sun : : star : : lang : : XUnoTunnel > xTunnel ( _xTable , UNO_QUERY ) ;
if ( xTunnel . is ( ) )
{
m_pTable = ( OFileTable * ) xTunnel - > getSomething ( OFileTable : : getUnoTunnelImplementationId ( ) ) ;
if ( m_pTable )
m_pTable - > acquire ( ) ;
}
}
// -----------------------------------------------------------------------------
2001-08-09 12:12:51 +00:00
void OResultSet : : clearInsertRow ( )
{
2001-08-10 07:11:09 +00:00
m_aRow - > setDeleted ( sal_False ) ; // set to false here because this is the new row
2001-08-09 12:12:51 +00:00
OValueVector : : iterator aIter = m_aInsertRow - > begin ( ) ;
for ( sal_Int32 nPos = 0 ; aIter ! = m_aInsertRow - > end ( ) ; + + aIter , + + nPos )
{
2001-08-10 07:11:09 +00:00
if ( aIter - > isBound ( ) )
2001-08-09 12:12:51 +00:00
{
( * m_aRow ) [ nPos ] = ( * aIter ) ;
}
2001-08-10 07:11:09 +00:00
aIter - > setBound ( nPos = = 0 ) ;
2001-08-09 12:12:51 +00:00
aIter - > setModified ( sal_False ) ;
aIter - > setNull ( ) ;
}
}
// -----------------------------------------------------------------------------
2001-08-24 05:19:41 +00:00
void OResultSet : : initializeRow ( OValueRow & _rRow , sal_Int32 _nColumnCount )
{
if ( ! _rRow . isValid ( ) )
{
_rRow = new OValueVector ( _nColumnCount ) ;
( * _rRow ) [ 0 ] . setBound ( sal_True ) ;
: : std : : for_each ( _rRow - > begin ( ) + 1 , _rRow - > end ( ) , TSetBound ( sal_False ) ) ;
}
}
// -----------------------------------------------------------------------------
2001-10-26 06:45:13 +00:00
sal_Bool OResultSet : : fillIndexValues ( const Reference < XColumnsSupplier > & _xIndex )
2001-08-24 05:19:41 +00:00
{
return sal_False ;
}
// -----------------------------------------------------------------------------
2001-10-26 06:45:13 +00:00
sal_Bool OResultSet : : move ( IResultSetHelper : : Movement _eCursorPosition , sal_Int32 _nOffset , sal_Bool _bRetrieveData )
{
return Move ( _eCursorPosition , _nOffset , _bRetrieveData ) ;
}
// -----------------------------------------------------------------------------
sal_Int32 OResultSet : : getDriverPos ( ) const
{
return ( * m_aRow ) [ 0 ] ;
}
// -----------------------------------------------------------------------------
sal_Bool OResultSet : : deletedVisible ( ) const
{
return m_bShowDeleted ;
}
// -----------------------------------------------------------------------------
sal_Bool OResultSet : : isRowDeleted ( ) const
{
return m_aRow - > isDeleted ( ) ;
}
// -----------------------------------------------------------------------------
2001-11-15 14:20:06 +00:00
void SAL_CALL OResultSet : : disposing ( const EventObject & Source ) throw ( RuntimeException )
{
// Reference<XInterface> xInt = m_pTable;
Reference < XPropertySet > xProp = m_pTable ;
if ( m_pTable & & Source . Source = = xProp )
{
m_pTable - > release ( ) ;
m_pTable = NULL ;
}
}
// -----------------------------------------------------------------------------