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