1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26 #include "connectivity/sqlparse.hxx"
27 #include "ado/APreparedStatement.hxx"
28 #include <com/sun/star/sdbc/DataType.hpp>
29 #include "ado/AResultSetMetaData.hxx"
30 #include "ado/AResultSet.hxx"
31 #include "ado/ADriver.hxx"
32 #include <com/sun/star/lang/DisposedException.hpp>
33 #include <cppuhelper/typeprovider.hxx>
34 #include <comphelper/sequence.hxx>
35 #include "connectivity/dbexception.hxx"
36 #include "connectivity/dbtools.hxx"
37 #include "resource/ado_res.hrc"
38 
39 #include <limits>
40 
41 #define CHECK_RETURN(x)													\
42 	if(!x)																\
43 		ADOS::ThrowException(*m_pConnection->getConnection(),*this);
44 
45 #ifdef max
46 #	undef max
47 #endif
48 
49 //------------------------------------------------------------------------------
50 //------------------------------------------------------------------------------
51 using namespace connectivity::ado;
52 using namespace connectivity;
53 using namespace com::sun::star::uno;
54 using namespace com::sun::star::lang;
55 using namespace com::sun::star::beans;
56 using namespace com::sun::star::sdbc;
57 using namespace com::sun::star::util;
58 
59 
60 IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.APreparedStatement","com.sun.star.sdbc.PreparedStatement");
61 
OPreparedStatement(OConnection * _pConnection,const OTypeInfoMap & _TypeInfo,const::rtl::OUString & sql)62 OPreparedStatement::OPreparedStatement( OConnection* _pConnection,const OTypeInfoMap& _TypeInfo,const ::rtl::OUString& sql)
63 	: OStatement_Base( _pConnection )
64 	,m_aTypeInfo(_TypeInfo)
65 {
66 	osl_incrementInterlockedCount( &m_refCount );
67 
68 	OSQLParser aParser(_pConnection->getDriver()->getORB());
69 	::rtl::OUString sErrorMessage;
70 	::rtl::OUString sNewSql;
71 	OSQLParseNode* pNode = aParser.parseTree(sErrorMessage,sql);
72 	if(pNode)
73 	{	// special handling for parameters
74         /* we recusive replace all occurences of ? in the statement and replace them with name like "��" */
75 		sal_Int32 nParameterCount = 0;
76 		::rtl::OUString sDefaultName = ::rtl::OUString::createFromAscii("parame");
77 		replaceParameterNodeName(pNode,sDefaultName,nParameterCount);
78 		pNode->parseNodeToStr( sNewSql, _pConnection );
79 		delete pNode;
80 	}
81 	else
82 		sNewSql = sql;
83 	CHECK_RETURN(m_Command.put_CommandText(sNewSql))
84 	CHECK_RETURN(m_Command.put_Prepared(VARIANT_TRUE))
85 	m_pParameters = m_Command.get_Parameters();
86 	m_pParameters->AddRef();
87 	m_pParameters->Refresh();
88 
89 	osl_decrementInterlockedCount( &m_refCount );
90 }
91 
92 // -------------------------------------------------------------------------
~OPreparedStatement()93 OPreparedStatement::~OPreparedStatement()
94 {
95 	if (m_pParameters)
96 	{
97 		OSL_ENSURE( sal_False, "OPreparedStatement::~OPreparedStatement: not disposed!" );
98 		m_pParameters->Release();
99 		m_pParameters = NULL;
100 	}
101 }
102 
103 // -------------------------------------------------------------------------
104 
queryInterface(const Type & rType)105 Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException)
106 {
107 	Any aRet = OStatement_Base::queryInterface(rType);
108 	return aRet.hasValue() ? aRet : ::cppu::queryInterface(	rType,
109 										static_cast< XPreparedStatement*>(this),
110 										static_cast< XParameters*>(this),
111 										static_cast< XPreparedBatchExecution*>(this),
112 										static_cast< XResultSetMetaDataSupplier*>(this));
113 }
114 // -------------------------------------------------------------------------
getTypes()115 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OPreparedStatement::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
116 {
117 	::cppu::OTypeCollection aTypes(	::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedStatement > *)0 ),
118 									::getCppuType( (const ::com::sun::star::uno::Reference< XParameters > *)0 ),
119 									::getCppuType( (const ::com::sun::star::uno::Reference< XResultSetMetaDataSupplier > *)0 ),
120 									::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedBatchExecution > *)0 ));
121 
122 	return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_Base::getTypes());
123 }
124 // -------------------------------------------------------------------------
125 
getMetaData()126 Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData(  ) throw(SQLException, RuntimeException)
127 {
128 	if(!m_xMetaData.is() && m_RecordSet.IsValid())
129 		m_xMetaData = new OResultSetMetaData(m_RecordSet);
130 	return m_xMetaData;
131 }
132 // -------------------------------------------------------------------------
disposing()133 void OPreparedStatement::disposing()
134 {
135 m_xMetaData.clear();
136 	if (m_pParameters)
137 	{
138 		m_pParameters->Release();
139 		m_pParameters = NULL;
140 	}
141 	OStatement_Base::disposing();
142 }
143 // -------------------------------------------------------------------------
144 
close()145 void SAL_CALL OPreparedStatement::close(  ) throw(SQLException, RuntimeException)
146 {
147 
148 	{
149 		::osl::MutexGuard aGuard( m_aMutex );
150 		checkDisposed(OStatement_BASE::rBHelper.bDisposed);
151 
152 	}
153 	dispose();
154 
155 }
156 // -------------------------------------------------------------------------
157 
execute()158 sal_Bool SAL_CALL OPreparedStatement::execute(  ) throw(SQLException, RuntimeException)
159 {
160 	::osl::MutexGuard aGuard( m_aMutex );
161 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
162 
163 
164 	SQLWarning	warning;
165 
166 	// Reset warnings
167 
168 	clearWarnings ();
169 
170 	// Reset the statement handle, warning and saved Resultset
171 
172 	//	reset();
173 
174 	// Call SQLExecute
175 
176 	try {
177 		ADORecordset* pSet=NULL;
178 		CHECK_RETURN(m_Command.Execute(m_RecordsAffected,m_Parameters,adCmdUnknown,&pSet))
179 		m_RecordSet = WpADORecordset(pSet);
180 	}
181 	catch (SQLWarning& ex)
182 	{
183 
184 		// Save pointer to warning and save with ResultSet
185 		// object once it is created.
186 
187 		warning = ex;
188 	}
189 	return m_RecordSet.IsValid();
190 }
191 // -------------------------------------------------------------------------
192 
executeUpdate()193 sal_Int32 SAL_CALL OPreparedStatement::executeUpdate(  ) throw(SQLException, RuntimeException)
194 {
195 	::osl::MutexGuard aGuard( m_aMutex );
196 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
197 
198 
199 	ADORecordset* pSet=NULL;
200 	CHECK_RETURN(m_Command.Execute(m_RecordsAffected,m_Parameters,adCmdUnknown,&pSet))
201 	if ( VT_ERROR == m_RecordsAffected.getType() )
202 	{
203 		ADOS::ThrowException(*m_pConnection->getConnection(),*this);
204 		// to be sure that we get the error really thrown
205 		throw SQLException();
206 	}
207 	m_RecordSet = WpADORecordset(pSet);
208 	return  static_cast<sal_Int32>(m_RecordsAffected);
209 }
210 
211 // -------------------------------------------------------------------------
setParameter(sal_Int32 parameterIndex,const DataTypeEnum & _eType,const sal_Int32 & _nSize,const OLEVariant & _Val)212 void OPreparedStatement::setParameter(sal_Int32 parameterIndex, const DataTypeEnum& _eType,
213 									  const sal_Int32& _nSize,const OLEVariant& _Val) throw(SQLException, RuntimeException)
214 {
215 	::osl::MutexGuard aGuard( m_aMutex );
216 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
217 
218 
219 	sal_Int32 nCount = 0;
220 	m_pParameters->get_Count(&nCount);
221 	if(nCount < (parameterIndex-1))
222 	{
223 		::rtl::OUString sDefaultName = ::rtl::OUString::createFromAscii("parame");
224 		sDefaultName += ::rtl::OUString::valueOf(parameterIndex);
225 		ADOParameter* pParam = m_Command.CreateParameter(sDefaultName,_eType,adParamInput,_nSize,_Val);
226 		if(pParam)
227 		{
228 			m_pParameters->Append(pParam);
229 #if OSL_DEBUG_LEVEL > 0
230 			ADOParameter* pParam = NULL;
231 			m_pParameters->get_Item(OLEVariant(sal_Int32(parameterIndex-1)),&pParam);
232 			WpADOParameter aParam(pParam);
233 			if(pParam)
234 			{
235 				DataTypeEnum eType = aParam.GetADOType();
236                 (void)eType;
237 			}
238 #endif
239 		}
240 	}
241 	else
242 	{
243 		ADOParameter* pParam = NULL;
244 		m_pParameters->get_Item(OLEVariant(sal_Int32(parameterIndex-1)),&pParam);
245 		WpADOParameter aParam(pParam);
246 		if(pParam)
247 		{
248 #if OSL_DEBUG_LEVEL > 0
249 			::rtl::OUString sParam = aParam.GetName();
250 
251 #endif // OSL_DEBUG_LEVEL
252 
253 			DataTypeEnum eType = aParam.GetADOType();
254 			if ( _eType != eType && _eType != adDBTimeStamp )
255 			{
256 				aParam.put_Type(_eType);
257 				eType = _eType;
258 				aParam.put_Size(_nSize);
259 			}
260 
261 			if ( adVarBinary == eType && aParam.GetAttributes() == adParamLong )
262 			{
263 				aParam.AppendChunk(_Val);
264 			}
265 			else
266 				CHECK_RETURN(aParam.PutValue(_Val));
267 		}
268 	}
269 	ADOS::ThrowException(*m_pConnection->getConnection(),*this);
270 }
271 // -------------------------------------------------------------------------
setString(sal_Int32 parameterIndex,const::rtl::OUString & x)272 void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException)
273 {
274     setParameter( parameterIndex, adLongVarWChar, ::std::numeric_limits< sal_Int32 >::max(), x );
275 }
276 // -------------------------------------------------------------------------
277 
getConnection()278 Reference< XConnection > SAL_CALL OPreparedStatement::getConnection(  ) throw(SQLException, RuntimeException)
279 {
280 	::osl::MutexGuard aGuard( m_aMutex );
281 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
282 
283 
284 	return (Reference< XConnection >)m_pConnection;
285 }
286 // -------------------------------------------------------------------------
287 
executeQuery()288 Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery(  ) throw(SQLException, RuntimeException)
289 {
290 	::osl::MutexGuard aGuard( m_aMutex );
291 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
292 
293 
294 	// first clear the old things
295 m_xMetaData.clear();
296 	disposeResultSet();
297 	if(m_RecordSet.IsValid())
298 		m_RecordSet.Close();
299 	m_RecordSet.clear();
300 
301 
302 	// the create the new onces
303 	m_RecordSet.Create();
304 	OLEVariant aCmd;
305 	aCmd.setIDispatch(m_Command);
306 	OLEVariant aCon;
307 	aCon.setNoArg();
308 	CHECK_RETURN(m_RecordSet.put_CacheSize(m_nFetchSize))
309 	CHECK_RETURN(m_RecordSet.put_MaxRecords(m_nMaxRows))
310 	CHECK_RETURN(m_RecordSet.Open(aCmd,aCon,m_eCursorType,m_eLockType,adOpenUnspecified))
311 	CHECK_RETURN(m_RecordSet.get_CacheSize(m_nFetchSize))
312 	CHECK_RETURN(m_RecordSet.get_MaxRecords(m_nMaxRows))
313 	CHECK_RETURN(m_RecordSet.get_CursorType(m_eCursorType))
314 	CHECK_RETURN(m_RecordSet.get_LockType(m_eLockType))
315 
316 	OResultSet* pSet = new OResultSet(m_RecordSet,this);
317 	Reference< XResultSet > xRs = pSet;
318 	pSet->construct();
319     pSet->setMetaData(getMetaData());
320 	m_xResultSet = WeakReference<XResultSet>(xRs);
321 
322 	return xRs;
323 }
324 // -------------------------------------------------------------------------
325 
setBoolean(sal_Int32 parameterIndex,sal_Bool x)326 void SAL_CALL OPreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(SQLException, RuntimeException)
327 {
328 	setParameter(parameterIndex,adBoolean,sizeof(x),x);
329 }
330 // -------------------------------------------------------------------------
331 
setByte(sal_Int32 parameterIndex,sal_Int8 x)332 void SAL_CALL OPreparedStatement::setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(SQLException, RuntimeException)
333 {
334 	setParameter(parameterIndex,adTinyInt,sizeof(x),x);
335 }
336 // -------------------------------------------------------------------------
337 
setDate(sal_Int32 parameterIndex,const Date & x)338 void SAL_CALL OPreparedStatement::setDate( sal_Int32 parameterIndex, const Date& x ) throw(SQLException, RuntimeException)
339 {
340 	setParameter(parameterIndex,adDBDate,sizeof(x),x);
341 }
342 // -------------------------------------------------------------------------
343 
344 
setTime(sal_Int32 parameterIndex,const Time & x)345 void SAL_CALL OPreparedStatement::setTime( sal_Int32 parameterIndex, const Time& x ) throw(SQLException, RuntimeException)
346 {
347 	setParameter(parameterIndex,adDBTime,sizeof(x),x);
348 }
349 // -------------------------------------------------------------------------
350 
setTimestamp(sal_Int32 parameterIndex,const DateTime & x)351 void SAL_CALL OPreparedStatement::setTimestamp( sal_Int32 parameterIndex, const DateTime& x ) throw(SQLException, RuntimeException)
352 {
353 	setParameter(parameterIndex,adDBTimeStamp,sizeof(x),x);
354 }
355 // -------------------------------------------------------------------------
356 
setDouble(sal_Int32 parameterIndex,double x)357 void SAL_CALL OPreparedStatement::setDouble( sal_Int32 parameterIndex, double x ) throw(SQLException, RuntimeException)
358 {
359 	setParameter(parameterIndex,adDouble,sizeof(x),x);
360 }
361 // -------------------------------------------------------------------------
362 
setFloat(sal_Int32 parameterIndex,float x)363 void SAL_CALL OPreparedStatement::setFloat( sal_Int32 parameterIndex, float x ) throw(SQLException, RuntimeException)
364 {
365 	setParameter(parameterIndex,adSingle,sizeof(x),x);
366 }
367 // -------------------------------------------------------------------------
368 
setInt(sal_Int32 parameterIndex,sal_Int32 x)369 void SAL_CALL OPreparedStatement::setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(SQLException, RuntimeException)
370 {
371 	setParameter(parameterIndex,adInteger,sizeof(x),x);
372 }
373 // -------------------------------------------------------------------------
374 
setLong(sal_Int32 parameterIndex,sal_Int64 x)375 void SAL_CALL OPreparedStatement::setLong( sal_Int32 parameterIndex, sal_Int64 x ) throw(SQLException, RuntimeException)
376 {
377 	setParameter(parameterIndex,adBigInt,sizeof(x),x);
378 }
379 // -------------------------------------------------------------------------
380 
setNull(sal_Int32 parameterIndex,sal_Int32)381 void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 /*sqlType*/ ) throw(SQLException, RuntimeException)
382 {
383 	OLEVariant aVal;
384 	aVal.setNull();
385 	setParameter(parameterIndex,adEmpty,0,aVal);
386 }
387 // -------------------------------------------------------------------------
388 
setClob(sal_Int32,const Reference<XClob> &)389 void SAL_CALL OPreparedStatement::setClob( sal_Int32 /*parameterIndex*/, const Reference< XClob >& /*x*/ ) throw(SQLException, RuntimeException)
390 {
391     ::dbtools::throwFeatureNotImplementedException( "XRowUpdate::setClob", *this );
392 }
393 // -------------------------------------------------------------------------
394 
setBlob(sal_Int32,const Reference<XBlob> &)395 void SAL_CALL OPreparedStatement::setBlob( sal_Int32 /*parameterIndex*/, const Reference< XBlob >& /*x*/ ) throw(SQLException, RuntimeException)
396 {
397     ::dbtools::throwFeatureNotImplementedException( "XRowUpdate::setBlob", *this );
398 }
399 // -------------------------------------------------------------------------
400 
setArray(sal_Int32,const Reference<XArray> &)401 void SAL_CALL OPreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const Reference< XArray >& /*x*/ ) throw(SQLException, RuntimeException)
402 {
403     ::dbtools::throwFeatureNotImplementedException( "XRowUpdate::setArray", *this );
404 }
405 // -------------------------------------------------------------------------
406 
setRef(sal_Int32,const Reference<XRef> &)407 void SAL_CALL OPreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const Reference< XRef >& /*x*/ ) throw(SQLException, RuntimeException)
408 {
409     ::dbtools::throwFeatureNotImplementedException( "XRowUpdate::setRef", *this );
410 }
411 // -------------------------------------------------------------------------
412 
setObjectWithInfo(sal_Int32 parameterIndex,const Any & x,sal_Int32 sqlType,sal_Int32 scale)413 void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, const Any& x, sal_Int32 sqlType, sal_Int32 scale ) throw(SQLException, RuntimeException)
414 {
415     switch(sqlType)
416 	{
417         case DataType::DECIMAL:
418         case DataType::NUMERIC:
419             setString(parameterIndex,::comphelper::getString(x));
420             break;
421         default:
422             ::dbtools::setObjectWithInfo(this,parameterIndex,x,sqlType,scale);
423             break;
424     }
425 }
426 // -------------------------------------------------------------------------
427 
setObjectNull(sal_Int32 parameterIndex,sal_Int32 sqlType,const::rtl::OUString &)428 void SAL_CALL OPreparedStatement::setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& /*typeName*/ ) throw(SQLException, RuntimeException)
429 {
430 	setNull(parameterIndex,sqlType);
431 }
432 // -------------------------------------------------------------------------
433 
setObject(sal_Int32 parameterIndex,const Any & x)434 void SAL_CALL OPreparedStatement::setObject( sal_Int32 parameterIndex, const Any& x ) throw(SQLException, RuntimeException)
435 {
436     if(!::dbtools::implSetObject(this,parameterIndex,x))
437 	{
438         const ::rtl::OUString sError( m_pConnection->getResources().getResourceStringWithSubstitution(
439                 STR_UNKNOWN_PARA_TYPE,
440                 "$position$", ::rtl::OUString::valueOf(parameterIndex)
441              ) );
442 		::dbtools::throwGenericSQLException(sError,*this);
443 	}
444 	//	setObject (parameterIndex, x, sqlType, 0);
445 }
446 // -------------------------------------------------------------------------
447 
setShort(sal_Int32 parameterIndex,sal_Int16 x)448 void SAL_CALL OPreparedStatement::setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(SQLException, RuntimeException)
449 {
450 	setParameter(parameterIndex,adSmallInt,sizeof(x),x);
451 }
452 // -------------------------------------------------------------------------
453 
setBytes(sal_Int32 parameterIndex,const Sequence<sal_Int8> & x)454 void SAL_CALL OPreparedStatement::setBytes( sal_Int32 parameterIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException)
455 {
456 	setParameter(parameterIndex,adVarBinary,sizeof(sal_Int8)*x.getLength(),x);
457 }
458 
459 // -------------------------------------------------------------------------
460 
461 
setCharacterStream(sal_Int32,const Reference<::com::sun::star::io::XInputStream> &,sal_Int32)462 void SAL_CALL OPreparedStatement::setCharacterStream( sal_Int32 /*parameterIndex*/, const Reference< ::com::sun::star::io::XInputStream >& /*x*/, sal_Int32 /*length*/ ) throw(SQLException, RuntimeException)
463 {
464     ::dbtools::throwFeatureNotImplementedException( "XParameters::setCharacterStream", *this );
465 }
466 
467 // -------------------------------------------------------------------------
468 
setBinaryStream(sal_Int32 parameterIndex,const Reference<::com::sun::star::io::XInputStream> & x,sal_Int32 length)469 void SAL_CALL OPreparedStatement::setBinaryStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
470 {
471 	if(x.is())
472 	{
473 		Sequence< sal_Int8 > aData;
474 		x->readBytes(aData,length);
475 		setBytes(parameterIndex,aData);
476 	}
477 }
478 // -------------------------------------------------------------------------
479 
clearParameters()480 void SAL_CALL OPreparedStatement::clearParameters(  ) throw(SQLException, RuntimeException)
481 {
482 	::osl::MutexGuard aGuard( m_aMutex );
483 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
484 
485 
486 	if(m_pParameters)
487 	{
488 		sal_Int32 nCount = 0;
489 		m_pParameters->get_Count(&nCount);
490 		OLEVariant aVal;
491 		aVal.setEmpty();
492 		for(sal_Int32 i=0;i<nCount;++i)
493 		{
494 			ADOParameter* pParam = NULL;
495 			m_pParameters->get_Item(OLEVariant(i),&pParam);
496 			WpADOParameter aParam(pParam);
497 			if(pParam)
498 			{
499 				::rtl::OUString sParam = aParam.GetName();
500 				CHECK_RETURN(aParam.PutValue(aVal));
501 			}
502 		}
503 			//	m_pParameters->Delete(OLEVariant(i));
504 
505 	}
506 }
507 // -------------------------------------------------------------------------
clearBatch()508 void SAL_CALL OPreparedStatement::clearBatch(  ) throw(SQLException, RuntimeException)
509 {
510 	//	clearParameters(  );
511 	//	m_aBatchList.erase();
512 }
513 // -------------------------------------------------------------------------
514 
addBatch()515 void SAL_CALL OPreparedStatement::addBatch( ) throw(SQLException, RuntimeException)
516 {
517 }
518 // -------------------------------------------------------------------------
519 
executeBatch()520 Sequence< sal_Int32 > SAL_CALL OPreparedStatement::executeBatch(  ) throw(SQLException, RuntimeException)
521 {
522 	return Sequence< sal_Int32 > ();
523 }
524 // -----------------------------------------------------------------------------
525 // -----------------------------------------------------------------------------
acquire()526 void SAL_CALL OPreparedStatement::acquire() throw()
527 {
528 	OStatement_Base::acquire();
529 }
530 // -----------------------------------------------------------------------------
release()531 void SAL_CALL OPreparedStatement::release() throw()
532 {
533 	OStatement_Base::release();
534 }
535 // -----------------------------------------------------------------------------
replaceParameterNodeName(OSQLParseNode * _pNode,const::rtl::OUString & _sDefaultName,sal_Int32 & _rParameterCount)536 void OPreparedStatement::replaceParameterNodeName(OSQLParseNode* _pNode,
537 												  const ::rtl::OUString& _sDefaultName,
538 												  sal_Int32& _rParameterCount)
539 {
540 	sal_Int32 nCount = _pNode->count();
541 	for(sal_Int32 i=0;i < nCount;++i)
542 	{
543 		OSQLParseNode* pChildNode = _pNode->getChild(i);
544 		if(SQL_ISRULE(pChildNode,parameter) && pChildNode->count() == 1)
545 		{
546 			OSQLParseNode* pNewNode = new OSQLParseNode(::rtl::OUString::createFromAscii(":") ,SQL_NODE_PUNCTUATION,0);
547 			delete pChildNode->replace(pChildNode->getChild(0),pNewNode);
548 			::rtl::OUString sParameterName = _sDefaultName;
549 			sParameterName += ::rtl::OUString::valueOf(++_rParameterCount);
550 			pChildNode->append(new OSQLParseNode( sParameterName,SQL_NODE_NAME,0));
551 		}
552 		else
553 			replaceParameterNodeName(pChildNode,_sDefaultName,_rParameterCount);
554 
555 	}
556 }
557 // -----------------------------------------------------------------------------
558 
559 
560 
561