1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include "connectivity/sdbcx/VColumn.hxx"
29*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
30*b1cdbd2cSJim Jagielski #include "file/FPreparedStatement.hxx"
31*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/DataType.hpp>
32*b1cdbd2cSJim Jagielski #include "file/FResultSetMetaData.hxx"
33*b1cdbd2cSJim Jagielski #include <cppuhelper/typeprovider.hxx>
34*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
36*b1cdbd2cSJim Jagielski #include "connectivity/dbconversion.hxx"
37*b1cdbd2cSJim Jagielski #include "connectivity/dbexception.hxx"
38*b1cdbd2cSJim Jagielski #include "connectivity/dbtools.hxx"
39*b1cdbd2cSJim Jagielski #include "connectivity/PColumn.hxx"
40*b1cdbd2cSJim Jagielski #include "diagnose_ex.h"
41*b1cdbd2cSJim Jagielski #include <comphelper/types.hxx>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/ColumnValue.hpp>
43*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
44*b1cdbd2cSJim Jagielski #include "resource/file_res.hrc"
45*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski using namespace connectivity;
48*b1cdbd2cSJim Jagielski using namespace comphelper;
49*b1cdbd2cSJim Jagielski using namespace ::dbtools;
50*b1cdbd2cSJim Jagielski using namespace connectivity::file;
51*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
52*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
53*b1cdbd2cSJim Jagielski using namespace com::sun::star::beans;
54*b1cdbd2cSJim Jagielski using namespace com::sun::star::sdbc;
55*b1cdbd2cSJim Jagielski using namespace com::sun::star::sdbcx;
56*b1cdbd2cSJim Jagielski using namespace com::sun::star::container;
57*b1cdbd2cSJim Jagielski using namespace com::sun::star::util;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbc.driver.file.PreparedStatement","com.sun.star.sdbc.PreparedStatement");
60*b1cdbd2cSJim Jagielski 
DBG_NAME(file_OPreparedStatement)61*b1cdbd2cSJim Jagielski DBG_NAME( file_OPreparedStatement )
62*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
63*b1cdbd2cSJim Jagielski OPreparedStatement::OPreparedStatement( OConnection* _pConnection)
64*b1cdbd2cSJim Jagielski 	: OStatement_BASE2( _pConnection )
65*b1cdbd2cSJim Jagielski 	,m_pResultSet(NULL)
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::OPreparedStatement" );
68*b1cdbd2cSJim Jagielski 	DBG_CTOR( file_OPreparedStatement, NULL );
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
~OPreparedStatement()72*b1cdbd2cSJim Jagielski OPreparedStatement::~OPreparedStatement()
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::~OPreparedStatement" );
75*b1cdbd2cSJim Jagielski 	DBG_DTOR( file_OPreparedStatement, NULL );
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
disposing()79*b1cdbd2cSJim Jagielski void OPreparedStatement::disposing()
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::disposing" );
82*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard(m_aMutex);
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     clearMyResultSet();
85*b1cdbd2cSJim Jagielski     OStatement_BASE2::disposing();
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     if(m_pResultSet)
88*b1cdbd2cSJim Jagielski 	{
89*b1cdbd2cSJim Jagielski 		m_pResultSet->release();
90*b1cdbd2cSJim Jagielski 		m_pResultSet = NULL;
91*b1cdbd2cSJim Jagielski 	}
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     m_xParamColumns = NULL;
94*b1cdbd2cSJim Jagielski     m_xMetaData.clear();
95*b1cdbd2cSJim Jagielski 	if(m_aParameterRow.isValid())
96*b1cdbd2cSJim Jagielski 	{
97*b1cdbd2cSJim Jagielski 		m_aParameterRow->get().clear();
98*b1cdbd2cSJim Jagielski 		m_aParameterRow = NULL;
99*b1cdbd2cSJim Jagielski 	}
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
construct(const::rtl::OUString & sql)104*b1cdbd2cSJim Jagielski void OPreparedStatement::construct(const ::rtl::OUString& sql)  throw(SQLException, RuntimeException)
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::construct" );
107*b1cdbd2cSJim Jagielski 	OStatement_Base::construct(sql);
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 	m_aParameterRow = new OValueRefVector();
110*b1cdbd2cSJim Jagielski 	m_aParameterRow->get().push_back(new ORowSetValueDecorator(sal_Int32(0)) );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY);
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 	if ( m_aSQLIterator.getStatementType() == SQL_STATEMENT_SELECT )
115*b1cdbd2cSJim Jagielski 		m_xParamColumns = m_aSQLIterator.getParameters();
116*b1cdbd2cSJim Jagielski 	else
117*b1cdbd2cSJim Jagielski 	{
118*b1cdbd2cSJim Jagielski 		m_xParamColumns = new OSQLColumns();
119*b1cdbd2cSJim Jagielski 		// describe all parameters need for the resultset
120*b1cdbd2cSJim Jagielski 		describeParameter();
121*b1cdbd2cSJim Jagielski 	}
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	OValueRefRow aTemp;
124*b1cdbd2cSJim Jagielski 	OResultSet::setBoundedColumns(m_aEvaluateRow,aTemp,m_xParamColumns,xNames,sal_False,m_xDBMetaData,m_aColMapping);
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	m_pResultSet = createResultSet();
127*b1cdbd2cSJim Jagielski 	m_pResultSet->acquire();
128*b1cdbd2cSJim Jagielski 	m_xResultSet = Reference<XResultSet>(m_pResultSet);
129*b1cdbd2cSJim Jagielski 	initializeResultSet(m_pResultSet);
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
132*b1cdbd2cSJim Jagielski 
queryInterface(const Type & rType)133*b1cdbd2cSJim Jagielski Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException)
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::queryInterface" );
136*b1cdbd2cSJim Jagielski 	Any aRet = OStatement_BASE2::queryInterface(rType);
137*b1cdbd2cSJim Jagielski 	return aRet.hasValue() ? aRet : ::cppu::queryInterface(	rType,
138*b1cdbd2cSJim Jagielski                                         static_cast< XPreparedStatement*>(this),
139*b1cdbd2cSJim Jagielski                                         static_cast< XParameters*>(this),
140*b1cdbd2cSJim Jagielski                                         static_cast< XResultSetMetaDataSupplier*>(this));
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getTypes()143*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OPreparedStatement::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::getTypes" );
146*b1cdbd2cSJim Jagielski         ::cppu::OTypeCollection aTypes( ::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedStatement > *)0 ),
147*b1cdbd2cSJim Jagielski                                         ::getCppuType( (const ::com::sun::star::uno::Reference< XParameters > *)0 ),
148*b1cdbd2cSJim Jagielski                                         ::getCppuType( (const ::com::sun::star::uno::Reference< XResultSetMetaDataSupplier > *)0 ));
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_BASE2::getTypes());
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
153*b1cdbd2cSJim Jagielski 
getMetaData()154*b1cdbd2cSJim Jagielski Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData(  ) throw(SQLException, RuntimeException)
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::getMetaData" );
157*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
158*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	if(!m_xMetaData.is())
162*b1cdbd2cSJim Jagielski 		m_xMetaData = new OResultSetMetaData(m_aSQLIterator.getSelectColumns(),m_aSQLIterator.getTables().begin()->first,m_pTable);
163*b1cdbd2cSJim Jagielski 	return m_xMetaData;
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
166*b1cdbd2cSJim Jagielski 
close()167*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::close(  ) throw(SQLException, RuntimeException)
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::close" );
170*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
171*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	clearMyResultSet();
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
177*b1cdbd2cSJim Jagielski 
execute()178*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL OPreparedStatement::execute(  ) throw(SQLException, RuntimeException)
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::execute" );
181*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
182*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	initResultSet();
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 	return m_aSQLIterator.getStatementType() == SQL_STATEMENT_SELECT;
187*b1cdbd2cSJim Jagielski }
188*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
189*b1cdbd2cSJim Jagielski 
executeUpdate()190*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL OPreparedStatement::executeUpdate(  ) throw(SQLException, RuntimeException)
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::executeUpdate" );
193*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
194*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	initResultSet();
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 	return m_pResultSet ? m_pResultSet->getRowCountResult() : sal_Int32(0);
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
201*b1cdbd2cSJim Jagielski 
setString(sal_Int32 parameterIndex,const::rtl::OUString & x)202*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException)
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setString" );
205*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
208*b1cdbd2cSJim Jagielski 
getConnection()209*b1cdbd2cSJim Jagielski Reference< XConnection > SAL_CALL OPreparedStatement::getConnection(  ) throw(SQLException, RuntimeException)
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::getConnection" );
212*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
213*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	return (Reference< XConnection >)m_pConnection;
216*b1cdbd2cSJim Jagielski }
217*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
218*b1cdbd2cSJim Jagielski 
executeQuery()219*b1cdbd2cSJim Jagielski Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery(  ) throw(SQLException, RuntimeException)
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::executeQuery" );
222*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
223*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	return initResultSet();
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
228*b1cdbd2cSJim Jagielski 
setBoolean(sal_Int32 parameterIndex,sal_Bool x)229*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(SQLException, RuntimeException)
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setBoolean" );
232*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
233*b1cdbd2cSJim Jagielski }
234*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setByte(sal_Int32 parameterIndex,sal_Int8 x)235*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(SQLException, RuntimeException)
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setByte" );
238*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
241*b1cdbd2cSJim Jagielski 
setDate(sal_Int32 parameterIndex,const Date & aData)242*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setDate( sal_Int32 parameterIndex, const Date& aData ) throw(SQLException, RuntimeException)
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setDate" );
245*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,DBTypeConversion::toDouble(aData));
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setTime(sal_Int32 parameterIndex,const Time & aVal)248*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setTime( sal_Int32 parameterIndex, const Time& aVal ) throw(SQLException, RuntimeException)
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setTime" );
251*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,DBTypeConversion::toDouble(aVal));
252*b1cdbd2cSJim Jagielski }
253*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
254*b1cdbd2cSJim Jagielski 
setTimestamp(sal_Int32 parameterIndex,const DateTime & aVal)255*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setTimestamp( sal_Int32 parameterIndex, const DateTime& aVal ) throw(SQLException, RuntimeException)
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setTimestamp" );
258*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,DBTypeConversion::toDouble(aVal));
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
261*b1cdbd2cSJim Jagielski 
setDouble(sal_Int32 parameterIndex,double x)262*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setDouble( sal_Int32 parameterIndex, double x ) throw(SQLException, RuntimeException)
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setDouble" );
265*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
269*b1cdbd2cSJim Jagielski 
setFloat(sal_Int32 parameterIndex,float x)270*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setFloat( sal_Int32 parameterIndex, float x ) throw(SQLException, RuntimeException)
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setFloat" );
273*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
274*b1cdbd2cSJim Jagielski }
275*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
276*b1cdbd2cSJim Jagielski 
setInt(sal_Int32 parameterIndex,sal_Int32 x)277*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(SQLException, RuntimeException)
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setInt" );
280*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
283*b1cdbd2cSJim Jagielski 
setLong(sal_Int32,sal_Int64)284*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setLong( sal_Int32 /*parameterIndex*/, sal_Int64 /*aVal*/ ) throw(SQLException, RuntimeException)
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setLong" );
287*b1cdbd2cSJim Jagielski     throwFeatureNotImplementedException( "XParameters::setLong", *this );
288*b1cdbd2cSJim Jagielski }
289*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
290*b1cdbd2cSJim Jagielski 
setNull(sal_Int32 parameterIndex,sal_Int32)291*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 /*sqlType*/ ) throw(SQLException, RuntimeException)
292*b1cdbd2cSJim Jagielski {
293*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setNull" );
294*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
295*b1cdbd2cSJim Jagielski 	checkAndResizeParameters(parameterIndex);
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 	if ( m_aAssignValues.isValid() )
298*b1cdbd2cSJim Jagielski 		(m_aAssignValues->get())[m_aParameterIndexes[parameterIndex]]->setNull();
299*b1cdbd2cSJim Jagielski 	else
300*b1cdbd2cSJim Jagielski 		(m_aParameterRow->get())[parameterIndex]->setNull();
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
303*b1cdbd2cSJim Jagielski 
setClob(sal_Int32,const Reference<XClob> &)304*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setClob( sal_Int32 /*parameterIndex*/, const Reference< XClob >& /*x*/ ) throw(SQLException, RuntimeException)
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setClob" );
307*b1cdbd2cSJim Jagielski     throwFeatureNotImplementedException( "XParameters::setClob", *this );
308*b1cdbd2cSJim Jagielski }
309*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
310*b1cdbd2cSJim Jagielski 
setBlob(sal_Int32,const Reference<XBlob> &)311*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setBlob( sal_Int32 /*parameterIndex*/, const Reference< XBlob >& /*x*/ ) throw(SQLException, RuntimeException)
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setBlob" );
314*b1cdbd2cSJim Jagielski     throwFeatureNotImplementedException( "XParameters::setBlob", *this );
315*b1cdbd2cSJim Jagielski }
316*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
317*b1cdbd2cSJim Jagielski 
setArray(sal_Int32,const Reference<XArray> &)318*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const Reference< XArray >& /*x*/ ) throw(SQLException, RuntimeException)
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setArray" );
321*b1cdbd2cSJim Jagielski     throwFeatureNotImplementedException( "XParameters::setArray", *this );
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
324*b1cdbd2cSJim Jagielski 
setRef(sal_Int32,const Reference<XRef> &)325*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const Reference< XRef >& /*x*/ ) throw(SQLException, RuntimeException)
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setRef" );
328*b1cdbd2cSJim Jagielski     throwFeatureNotImplementedException( "XParameters::setRef", *this );
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
331*b1cdbd2cSJim Jagielski 
setObjectWithInfo(sal_Int32 parameterIndex,const Any & x,sal_Int32 sqlType,sal_Int32 scale)332*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, const Any& x, sal_Int32 sqlType, sal_Int32 scale ) throw(SQLException, RuntimeException)
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setObjectWithInfo" );
335*b1cdbd2cSJim Jagielski     switch(sqlType)
336*b1cdbd2cSJim Jagielski 	{
337*b1cdbd2cSJim Jagielski         case DataType::DECIMAL:
338*b1cdbd2cSJim Jagielski         case DataType::NUMERIC:
339*b1cdbd2cSJim Jagielski             setString(parameterIndex,::comphelper::getString(x));
340*b1cdbd2cSJim Jagielski             break;
341*b1cdbd2cSJim Jagielski         default:
342*b1cdbd2cSJim Jagielski             ::dbtools::setObjectWithInfo(this,parameterIndex,x,sqlType,scale);
343*b1cdbd2cSJim Jagielski             break;
344*b1cdbd2cSJim Jagielski     }
345*b1cdbd2cSJim Jagielski }
346*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
347*b1cdbd2cSJim Jagielski 
setObjectNull(sal_Int32 parameterIndex,sal_Int32 sqlType,const::rtl::OUString &)348*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& /*typeName*/ ) throw(SQLException, RuntimeException)
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setObjectNull" );
351*b1cdbd2cSJim Jagielski 	setNull(parameterIndex,sqlType);
352*b1cdbd2cSJim Jagielski }
353*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
354*b1cdbd2cSJim Jagielski 
setObject(sal_Int32 parameterIndex,const Any & x)355*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setObject( sal_Int32 parameterIndex, const Any& x ) throw(SQLException, RuntimeException)
356*b1cdbd2cSJim Jagielski {
357*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setObject" );
358*b1cdbd2cSJim Jagielski 	if(!::dbtools::implSetObject(this,parameterIndex,x))
359*b1cdbd2cSJim Jagielski 	{
360*b1cdbd2cSJim Jagielski         const ::rtl::OUString sError( m_pConnection->getResources().getResourceStringWithSubstitution(
361*b1cdbd2cSJim Jagielski                 STR_UNKNOWN_PARA_TYPE,
362*b1cdbd2cSJim Jagielski                 "$position$", ::rtl::OUString::valueOf(parameterIndex)
363*b1cdbd2cSJim Jagielski              ) );
364*b1cdbd2cSJim Jagielski 		::dbtools::throwGenericSQLException(sError,*this);
365*b1cdbd2cSJim Jagielski 	}
366*b1cdbd2cSJim Jagielski 	//	setObject (parameterIndex, x, sqlType, 0);
367*b1cdbd2cSJim Jagielski }
368*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
369*b1cdbd2cSJim Jagielski 
setShort(sal_Int32 parameterIndex,sal_Int16 x)370*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(SQLException, RuntimeException)
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setShort" );
373*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
376*b1cdbd2cSJim Jagielski 
setBytes(sal_Int32 parameterIndex,const Sequence<sal_Int8> & x)377*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setBytes( sal_Int32 parameterIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException)
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setBytes" );
380*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,x);
381*b1cdbd2cSJim Jagielski }
382*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 
setCharacterStream(sal_Int32 parameterIndex,const Reference<::com::sun::star::io::XInputStream> & x,sal_Int32 length)385*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setCharacterStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
386*b1cdbd2cSJim Jagielski {
387*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setCharacterStream" );
388*b1cdbd2cSJim Jagielski 	setBinaryStream(parameterIndex,x,length );
389*b1cdbd2cSJim Jagielski }
390*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
391*b1cdbd2cSJim Jagielski 
setBinaryStream(sal_Int32 parameterIndex,const Reference<::com::sun::star::io::XInputStream> & x,sal_Int32 length)392*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::setBinaryStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
393*b1cdbd2cSJim Jagielski {
394*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setBinaryStream" );
395*b1cdbd2cSJim Jagielski 	if(!x.is())
396*b1cdbd2cSJim Jagielski 		::dbtools::throwFunctionSequenceException(*this);
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aSeq;
399*b1cdbd2cSJim Jagielski 	x->readBytes(aSeq,length);
400*b1cdbd2cSJim Jagielski 	setParameter(parameterIndex,aSeq);
401*b1cdbd2cSJim Jagielski }
402*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
403*b1cdbd2cSJim Jagielski 
clearParameters()404*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::clearParameters(  ) throw(SQLException, RuntimeException)
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::clearParameters" );
407*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
408*b1cdbd2cSJim Jagielski 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 	m_aParameterRow->get().clear();
411*b1cdbd2cSJim Jagielski 	m_aParameterRow->get().push_back(new ORowSetValueDecorator(sal_Int32(0)) );
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
createResultSet()414*b1cdbd2cSJim Jagielski OResultSet* OPreparedStatement::createResultSet()
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::createResultSet" );
417*b1cdbd2cSJim Jagielski 	return new OResultSet(this,m_aSQLIterator);
418*b1cdbd2cSJim Jagielski }
419*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
initResultSet()420*b1cdbd2cSJim Jagielski Reference<XResultSet> OPreparedStatement::initResultSet()
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::initResultSet" );
423*b1cdbd2cSJim Jagielski 	m_pResultSet->clear();
424*b1cdbd2cSJim Jagielski 	Reference<XResultSet> xRs(m_pResultSet);
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski 	// check if we got enough paramters
427*b1cdbd2cSJim Jagielski 	if ( (m_aParameterRow.isValid() && ( m_aParameterRow->get().size() -1 ) < m_xParamColumns->get().size()) ||
428*b1cdbd2cSJim Jagielski 		 (m_xParamColumns.isValid() && !m_aParameterRow.isValid() && !m_aParameterRow->get().empty()) )
429*b1cdbd2cSJim Jagielski          m_pConnection->throwGenericSQLException(STR_INVALID_PARA_COUNT,*this);
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski     m_pResultSet->OpenImpl();
432*b1cdbd2cSJim Jagielski     m_pResultSet->setMetaData(getMetaData());
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 	return xRs;
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
acquire()437*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::acquire() throw()
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski 	OStatement_BASE2::acquire();
440*b1cdbd2cSJim Jagielski }
441*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
release()442*b1cdbd2cSJim Jagielski void SAL_CALL OPreparedStatement::release() throw()
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski 	OStatement_BASE2::release();
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
checkAndResizeParameters(sal_Int32 parameterIndex)447*b1cdbd2cSJim Jagielski void OPreparedStatement::checkAndResizeParameters(sal_Int32 parameterIndex)
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::checkAndResizeParameters" );
450*b1cdbd2cSJim Jagielski 	::connectivity::checkDisposed(OStatement_BASE::rBHelper.bDisposed);
451*b1cdbd2cSJim Jagielski 	if ( m_aAssignValues.isValid() && (parameterIndex < 1 || parameterIndex >= static_cast<sal_Int32>(m_aParameterIndexes.size())) )
452*b1cdbd2cSJim Jagielski 		throwInvalidIndexException(*this);
453*b1cdbd2cSJim Jagielski 	else if ( static_cast<sal_Int32>((m_aParameterRow->get()).size()) <= parameterIndex )
454*b1cdbd2cSJim Jagielski 	{
455*b1cdbd2cSJim Jagielski 		sal_Int32 i = m_aParameterRow->get().size();
456*b1cdbd2cSJim Jagielski 		(m_aParameterRow->get()).resize(parameterIndex+1);
457*b1cdbd2cSJim Jagielski 		for ( ;i <= parameterIndex+1; ++i )
458*b1cdbd2cSJim Jagielski 		{
459*b1cdbd2cSJim Jagielski 			if ( !(m_aParameterRow->get())[i].isValid() )
460*b1cdbd2cSJim Jagielski 				(m_aParameterRow->get())[i] = new ORowSetValueDecorator;
461*b1cdbd2cSJim Jagielski 		}
462*b1cdbd2cSJim Jagielski 	}
463*b1cdbd2cSJim Jagielski }
464*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
setParameter(sal_Int32 parameterIndex,const ORowSetValue & x)465*b1cdbd2cSJim Jagielski void OPreparedStatement::setParameter(sal_Int32 parameterIndex, const ORowSetValue& x)
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::setParameter" );
468*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
469*b1cdbd2cSJim Jagielski 	checkAndResizeParameters(parameterIndex);
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski 	if(m_aAssignValues.isValid())
472*b1cdbd2cSJim Jagielski 		*(m_aAssignValues->get())[m_aParameterIndexes[parameterIndex]] = x;
473*b1cdbd2cSJim Jagielski 	else
474*b1cdbd2cSJim Jagielski 		*((m_aParameterRow->get())[parameterIndex]) = x;
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
AddParameter(OSQLParseNode * pParameter,const Reference<XPropertySet> & _xCol)477*b1cdbd2cSJim Jagielski sal_uInt32 OPreparedStatement::AddParameter(OSQLParseNode * pParameter, const Reference<XPropertySet>& _xCol)
478*b1cdbd2cSJim Jagielski {
479*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::AddParameter" );
480*b1cdbd2cSJim Jagielski     OSL_UNUSED( pParameter );
481*b1cdbd2cSJim Jagielski 	OSL_ENSURE(SQL_ISRULE(pParameter,parameter),"OResultSet::AddParameter: Argument ist kein Parameter");
482*b1cdbd2cSJim Jagielski 	OSL_ENSURE(pParameter->count() > 0,"OResultSet: Fehler im Parse Tree");
483*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
484*b1cdbd2cSJim Jagielski 	OSQLParseNode * pMark = pParameter->getChild(0);
485*b1cdbd2cSJim Jagielski     OSL_UNUSED( pMark );
486*b1cdbd2cSJim Jagielski #endif
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 	::rtl::OUString sParameterName;
489*b1cdbd2cSJim Jagielski 	// Parameter-Column aufsetzen:
490*b1cdbd2cSJim Jagielski 	sal_Int32 eType = DataType::VARCHAR;
491*b1cdbd2cSJim Jagielski 	sal_uInt32 nPrecision = 255;
492*b1cdbd2cSJim Jagielski 	sal_Int32 nScale = 0;
493*b1cdbd2cSJim Jagielski 	sal_Int32 nNullable = ColumnValue::NULLABLE;
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 	if (_xCol.is())
496*b1cdbd2cSJim Jagielski 	{
497*b1cdbd2cSJim Jagielski 		// Typ, Precision, Scale ... der angegebenen Column verwenden,
498*b1cdbd2cSJim Jagielski 		// denn dieser Column wird der Wert zugewiesen bzw. mit dieser
499*b1cdbd2cSJim Jagielski 		// Column wird der Wert verglichen.
500*b1cdbd2cSJim Jagielski 		_xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))			>>= eType;
501*b1cdbd2cSJim Jagielski 		_xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))	>>= nPrecision;
502*b1cdbd2cSJim Jagielski 		_xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))		>>= nScale;
503*b1cdbd2cSJim Jagielski 		_xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))	>>= nNullable;
504*b1cdbd2cSJim Jagielski 		_xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))			>>= sParameterName;
505*b1cdbd2cSJim Jagielski 	}
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xParaColumn = new connectivity::parse::OParseColumn(sParameterName
508*b1cdbd2cSJim Jagielski 													,::rtl::OUString()
509*b1cdbd2cSJim Jagielski 													,::rtl::OUString()
510*b1cdbd2cSJim Jagielski                                                     ,::rtl::OUString()
511*b1cdbd2cSJim Jagielski 													,nNullable
512*b1cdbd2cSJim Jagielski 													,nPrecision
513*b1cdbd2cSJim Jagielski 													,nScale
514*b1cdbd2cSJim Jagielski 													,eType
515*b1cdbd2cSJim Jagielski 													,sal_False
516*b1cdbd2cSJim Jagielski 													,sal_False
517*b1cdbd2cSJim Jagielski 													,m_aSQLIterator.isCaseSensitive());
518*b1cdbd2cSJim Jagielski 	m_xParamColumns->get().push_back(xParaColumn);
519*b1cdbd2cSJim Jagielski 	return m_xParamColumns->get().size();
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
describeColumn(OSQLParseNode * _pParameter,OSQLParseNode * _pNode,const OSQLTable & _xTable)522*b1cdbd2cSJim Jagielski void OPreparedStatement::describeColumn(OSQLParseNode* _pParameter,OSQLParseNode* _pNode,const OSQLTable& _xTable)
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::describeColumn" );
525*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xProp;
526*b1cdbd2cSJim Jagielski 	if(SQL_ISRULE(_pNode,column_ref))
527*b1cdbd2cSJim Jagielski 	{
528*b1cdbd2cSJim Jagielski 		::rtl::OUString sColumnName,sTableRange;
529*b1cdbd2cSJim Jagielski 		m_aSQLIterator.getColumnRange(_pNode,sColumnName,sTableRange);
530*b1cdbd2cSJim Jagielski 		if ( sColumnName.getLength() )
531*b1cdbd2cSJim Jagielski 		{
532*b1cdbd2cSJim Jagielski 			Reference<XNameAccess> xNameAccess = _xTable->getColumns();
533*b1cdbd2cSJim Jagielski 			if(xNameAccess->hasByName(sColumnName))
534*b1cdbd2cSJim Jagielski 				xNameAccess->getByName(sColumnName) >>= xProp;
535*b1cdbd2cSJim Jagielski 			AddParameter(_pParameter,xProp);
536*b1cdbd2cSJim Jagielski 		}
537*b1cdbd2cSJim Jagielski 	}
538*b1cdbd2cSJim Jagielski 	//	else
539*b1cdbd2cSJim Jagielski 		//	AddParameter(_pParameter,xProp);
540*b1cdbd2cSJim Jagielski }
541*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
describeParameter()542*b1cdbd2cSJim Jagielski void OPreparedStatement::describeParameter()
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::describeParameter" );
545*b1cdbd2cSJim Jagielski 	::std::vector< OSQLParseNode*> aParseNodes;
546*b1cdbd2cSJim Jagielski 	scanParameter(m_pParseTree,aParseNodes);
547*b1cdbd2cSJim Jagielski 	if ( !aParseNodes.empty() )
548*b1cdbd2cSJim Jagielski 	{
549*b1cdbd2cSJim Jagielski 		//	m_xParamColumns = new OSQLColumns();
550*b1cdbd2cSJim Jagielski 		const OSQLTables& xTabs = m_aSQLIterator.getTables();
551*b1cdbd2cSJim Jagielski 		if( !xTabs.empty() )
552*b1cdbd2cSJim Jagielski 		{
553*b1cdbd2cSJim Jagielski 			OSQLTable xTable = xTabs.begin()->second;
554*b1cdbd2cSJim Jagielski 			::std::vector< OSQLParseNode*>::const_iterator aIter = aParseNodes.begin();
555*b1cdbd2cSJim Jagielski 			for (;aIter != aParseNodes.end();++aIter )
556*b1cdbd2cSJim Jagielski 			{
557*b1cdbd2cSJim Jagielski 				describeColumn(*aIter,(*aIter)->getParent()->getChild(0),xTable);
558*b1cdbd2cSJim Jagielski 			}
559*b1cdbd2cSJim Jagielski 		}
560*b1cdbd2cSJim Jagielski 	}
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
initializeResultSet(OResultSet * _pResult)563*b1cdbd2cSJim Jagielski void OPreparedStatement::initializeResultSet(OResultSet* _pResult)
564*b1cdbd2cSJim Jagielski {
565*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::initializeResultSet" );
566*b1cdbd2cSJim Jagielski 	OStatement_Base::initializeResultSet(_pResult);
567*b1cdbd2cSJim Jagielski 
568*b1cdbd2cSJim Jagielski 	m_pResultSet->setParameterColumns(m_xParamColumns);
569*b1cdbd2cSJim Jagielski 	m_pResultSet->setParameterRow(m_aParameterRow);
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski 	// Parameter substituieren (AssignValues und Kriterien):
572*b1cdbd2cSJim Jagielski 	if (!m_xParamColumns->get().empty())
573*b1cdbd2cSJim Jagielski 	{
574*b1cdbd2cSJim Jagielski         // Zunaechst AssignValues
575*b1cdbd2cSJim Jagielski 		sal_uInt16 nParaCount=0; // gibt die aktuelle Anzahl der bisher gesetzen Parameter an
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 		// Nach zu substituierenden Parametern suchen:
578*b1cdbd2cSJim Jagielski         size_t nCount = m_aAssignValues.isValid() ? m_aAssignValues->get().size() : 1; // 1 ist wichtig fuer die Kriterien
579*b1cdbd2cSJim Jagielski         for (size_t j = 1; j < nCount; j++)
580*b1cdbd2cSJim Jagielski 		{
581*b1cdbd2cSJim Jagielski 			sal_uInt32 nParameter = (*m_aAssignValues).getParameterIndex(j);
582*b1cdbd2cSJim Jagielski 			if (nParameter == SQL_NO_PARAMETER)
583*b1cdbd2cSJim Jagielski 				continue;	// dieser AssignValue ist kein Parameter
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 			++nParaCount; // ab hier ist der Parameter gueltig
586*b1cdbd2cSJim Jagielski 			// Parameter ersetzen. Wenn Parameter nicht verfuegbar,
587*b1cdbd2cSJim Jagielski 			//	Value auf NULL setzen.
588*b1cdbd2cSJim Jagielski 			//	(*m_aAssignValues)[j] = (*m_aParameterRow)[(sal_uInt16)nParameter];
589*b1cdbd2cSJim Jagielski 		}
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski 		if (m_aParameterRow.isValid() &&  (m_xParamColumns->get().size()+1) != m_aParameterRow->get().size() )
592*b1cdbd2cSJim Jagielski         {
593*b1cdbd2cSJim Jagielski             sal_Int32 i = m_aParameterRow->get().size();
594*b1cdbd2cSJim Jagielski             sal_Int32 nParamColumns = m_xParamColumns->get().size()+1;
595*b1cdbd2cSJim Jagielski 		    m_aParameterRow->get().resize(nParamColumns);
596*b1cdbd2cSJim Jagielski 		    for ( ;i < nParamColumns; ++i )
597*b1cdbd2cSJim Jagielski 		    {
598*b1cdbd2cSJim Jagielski 			    if ( !(m_aParameterRow->get())[i].isValid() )
599*b1cdbd2cSJim Jagielski 				    (m_aParameterRow->get())[i] = new ORowSetValueDecorator;
600*b1cdbd2cSJim Jagielski 		    }
601*b1cdbd2cSJim Jagielski 			//m_aParameterRow->resize(m_xParamColumns->size()+1);
602*b1cdbd2cSJim Jagielski         }
603*b1cdbd2cSJim Jagielski 		if (m_aParameterRow.isValid() && nParaCount < m_aParameterRow->get().size() )
604*b1cdbd2cSJim Jagielski 		{
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski 			m_pSQLAnalyzer->bindParameterRow(m_aParameterRow);
607*b1cdbd2cSJim Jagielski 		}
608*b1cdbd2cSJim Jagielski 	}
609*b1cdbd2cSJim Jagielski }
610*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
parseParamterElem(const String & _sColumnName,OSQLParseNode * pRow_Value_Constructor_Elem)611*b1cdbd2cSJim Jagielski void OPreparedStatement::parseParamterElem(const String& _sColumnName,OSQLParseNode* pRow_Value_Constructor_Elem)
612*b1cdbd2cSJim Jagielski {
613*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OPreparedStatement::parseParamterElem" );
614*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xCol;
615*b1cdbd2cSJim Jagielski 	m_xColNames->getByName(_sColumnName) >>= xCol;
616*b1cdbd2cSJim Jagielski 	sal_Int32 nParameter = -1;
617*b1cdbd2cSJim Jagielski 	if(m_xParamColumns.isValid())
618*b1cdbd2cSJim Jagielski 	{
619*b1cdbd2cSJim Jagielski 		OSQLColumns::Vector::const_iterator aIter = find(m_xParamColumns->get().begin(),m_xParamColumns->get().end(),_sColumnName,::comphelper::UStringMixEqual(m_pTable->isCaseSensitive()));
620*b1cdbd2cSJim Jagielski 		if(aIter != m_xParamColumns->get().end())
621*b1cdbd2cSJim Jagielski 			nParameter = m_xParamColumns->get().size() - (m_xParamColumns->get().end() - aIter) + 1;// +1 because the rows start at 1
622*b1cdbd2cSJim Jagielski 	}
623*b1cdbd2cSJim Jagielski 	if(nParameter == -1)
624*b1cdbd2cSJim Jagielski 		nParameter = AddParameter(pRow_Value_Constructor_Elem,xCol);
625*b1cdbd2cSJim Jagielski 	// Nr. des Parameters in der Variablen merken:
626*b1cdbd2cSJim Jagielski 	SetAssignValue(_sColumnName, String(), sal_True, nParameter);
627*b1cdbd2cSJim Jagielski }
628*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 
631