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 
27 #include "java/sql/JStatement.hxx"
28 #include "java/sql/ResultSet.hxx"
29 #include "java/sql/Connection.hxx"
30 #include "java/sql/SQLWarning.hxx"
31 #include "java/tools.hxx"
32 #include "java/ContextClassLoader.hxx"
33 #include <comphelper/property.hxx>
34 #include <com/sun/star/lang/DisposedException.hpp>
35 #include <cppuhelper/typeprovider.hxx>
36 #include <comphelper/sequence.hxx>
37 #include "TConnection.hxx"
38 #include <comphelper/types.hxx>
39 #include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
40 #include <com/sun/star/sdbc/ResultSetType.hpp>
41 #include <com/sun/star/sdbc/FetchDirection.hpp>
42 
43 #include "resource/jdbc_log.hrc"
44 
45 #include <algorithm>
46 #include <string.h>
47 
48 using namespace ::comphelper;
49 using namespace connectivity;
50 using namespace ::cppu;
51 //------------------------------------------------------------------------------
52 using namespace ::com::sun::star::uno;
53 using namespace ::com::sun::star::beans;
54 using namespace ::com::sun::star::sdbc;
55 using namespace ::com::sun::star::container;
56 using namespace ::com::sun::star::lang;
57 
58 //------------------------------------------------------------------------------
59 //**************************************************************
60 //************ Class: java.sql.Statement
61 //**************************************************************
62 
63 jclass java_sql_Statement_Base::theClass = 0;
64 
65 // -------------------------------------------------------------------------
java_sql_Statement_Base(JNIEnv * pEnv,java_sql_Connection & _rCon)66 java_sql_Statement_Base::java_sql_Statement_Base( JNIEnv * pEnv, java_sql_Connection& _rCon )
67 	:java_sql_Statement_BASE(m_aMutex)
68 	,java_lang_Object( pEnv, NULL )
69 	,OPropertySetHelper(java_sql_Statement_BASE::rBHelper)
70 	,m_pConnection( &_rCon )
71     ,m_aLogger( _rCon.getLogger(), java::sql::ConnectionLog::STATEMENT )
72 	,m_nResultSetConcurrency(ResultSetConcurrency::READ_ONLY)
73 	,m_nResultSetType(ResultSetType::FORWARD_ONLY)
74     ,m_bEscapeProcessing(sal_True)
75     ,rBHelper(java_sql_Statement_BASE::rBHelper)
76 {
77 	m_pConnection->acquire();
78 }
79 
80 //------------------------------------------------------------------------------
~java_sql_Statement_Base()81 java_sql_Statement_Base::~java_sql_Statement_Base()
82 {
83 }
84 
85 //------------------------------------------------------------------------------
disposing()86 void SAL_CALL OStatement_BASE2::disposing()
87 {
88 	::osl::MutexGuard aGuard(m_aMutex);
89 
90 	if ( object )
91 	{
92         static jmethodID mID(NULL);
93         callVoidMethod("close",mID);
94 	}
95 
96 	::comphelper::disposeComponent(m_xGeneratedStatement);
97 	if (m_pConnection)
98 		m_pConnection->release();
99 	m_pConnection = NULL;
100 
101 	dispose_ChildImpl();
102 	java_sql_Statement_Base::disposing();
103 }
104 // -------------------------------------------------------------------------
getMyClass() const105 jclass java_sql_Statement_Base::getMyClass() const
106 {
107 	// die Klasse muss nur einmal geholt werden, daher statisch
108 	if( !theClass )
109         theClass = findMyClass("java/sql/Statement");
110 	return theClass;
111 }
112 // -----------------------------------------------------------------------------
disposing(void)113 void SAL_CALL java_sql_Statement_Base::disposing(void)
114 {
115     m_aLogger.log( LogLevel::FINE, STR_LOG_CLOSING_STATEMENT );
116 	java_sql_Statement_BASE::disposing();
117 	clearObject();
118 }
119 // -------------------------------------------------------------------------
120 
release()121 void SAL_CALL OStatement_BASE2::release() throw()
122 {
123 	relase_ChildImpl();
124 }
125 
126 // -------------------------------------------------------------------------
queryInterface(const Type & rType)127 Any SAL_CALL java_sql_Statement_Base::queryInterface( const Type & rType ) throw(RuntimeException)
128 {
129 	if ( m_pConnection && !m_pConnection->isAutoRetrievingEnabled() && rType == ::getCppuType( (const Reference< XGeneratedResultSet > *)0 ) )
130 		return Any();
131 	Any aRet( java_sql_Statement_BASE::queryInterface(rType) );
132 	return aRet.hasValue() ? aRet : OPropertySetHelper::queryInterface(rType);
133 }
134 // -------------------------------------------------------------------------
getTypes()135 Sequence< Type > SAL_CALL java_sql_Statement_Base::getTypes(  ) throw(RuntimeException)
136 {
137 	::cppu::OTypeCollection aTypes(	::getCppuType( (const Reference< ::com::sun::star::beans::XMultiPropertySet > *)0 ),
138 												::getCppuType( (const Reference< ::com::sun::star::beans::XFastPropertySet > *)0 ),
139 												::getCppuType( (const Reference< ::com::sun::star::beans::XPropertySet > *)0 ));
140 
141 	Sequence< Type > aOldTypes = java_sql_Statement_BASE::getTypes();
142 	if ( m_pConnection && !m_pConnection->isAutoRetrievingEnabled() )
143 	{
144 		::std::remove(aOldTypes.getArray(),aOldTypes.getArray() + aOldTypes.getLength(),
145 						::getCppuType( (const Reference< XGeneratedResultSet > *)0 ));
146 		aOldTypes.realloc(aOldTypes.getLength() - 1);
147 	}
148 
149 	return ::comphelper::concatSequences(aTypes.getTypes(),aOldTypes);
150 }
151 // -----------------------------------------------------------------------------
getGeneratedValues()152 Reference< XResultSet > SAL_CALL java_sql_Statement_Base::getGeneratedValues(  ) throw (SQLException, RuntimeException)
153 {
154     m_aLogger.log( LogLevel::FINE, STR_LOG_GENERATED_VALUES );
155     ::osl::MutexGuard aGuard( m_aMutex );
156 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
157 
158 	jobject out(0);
159     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
160 	createStatement(t.pEnv);
161 	// temporaere Variable initialisieren
162 	try
163     {
164         static jmethodID mID(NULL);
165         out = callResultSetMethod(t.env(),"getGeneratedKeys",mID);
166     }
167     catch(const SQLException&)
168     {
169         // ignore
170     }
171 
172 	Reference< XResultSet > xRes;
173 	if ( !out )
174 	{
175 		OSL_ENSURE(	m_pConnection && m_pConnection->isAutoRetrievingEnabled(),"Illegal call here. isAutoRetrievingEnabled is false!");
176 		if ( m_pConnection )
177 		{
178 			::rtl::OUString sStmt = m_pConnection->getTransformedGeneratedStatement(m_sSqlStatement);
179 			if ( sStmt.getLength() )
180 			{
181                 m_aLogger.log( LogLevel::FINER, STR_LOG_GENERATED_VALUES_FALLBACK, sStmt );
182 				::comphelper::disposeComponent(m_xGeneratedStatement);
183 				m_xGeneratedStatement = m_pConnection->createStatement();
184 				xRes = m_xGeneratedStatement->executeQuery(sStmt);
185 			}
186 		}
187 	}
188 	else
189 		xRes = new java_sql_ResultSet( t.pEnv, out, m_aLogger,*m_pConnection, this );
190 	return xRes;
191 }
192 
193 // -------------------------------------------------------------------------
194 
cancel()195 void SAL_CALL java_sql_Statement_Base::cancel(  ) throw(RuntimeException)
196 {
197     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
198 	createStatement(t.pEnv);
199     static jmethodID mID(NULL);
200     callVoidMethod("cancel",mID);
201 }
202 // -------------------------------------------------------------------------
203 
close()204 void SAL_CALL java_sql_Statement_Base::close(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
205 {
206 	{
207 		::osl::MutexGuard aGuard( m_aMutex );
208 		if (java_sql_Statement_BASE::rBHelper.bDisposed)
209 			throw DisposedException();
210 	}
211 	dispose();
212 }
213 // -------------------------------------------------------------------------
214 
clearBatch()215 void SAL_CALL java_sql_Statement::clearBatch(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
216 {
217     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
218 	{
219 
220 		createStatement(t.pEnv);
221         static jmethodID mID(NULL);
222         callVoidMethod("clearBatch",mID);
223 	} //t.pEnv
224 }
225 // -------------------------------------------------------------------------
226 
execute(const::rtl::OUString & sql)227 sal_Bool SAL_CALL java_sql_Statement_Base::execute( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
228 {
229     m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTE_STATEMENT, sql );
230     ::osl::MutexGuard aGuard( m_aMutex );
231 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
232 
233 	jboolean out(sal_False);
234     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
235 	{
236 		createStatement(t.pEnv);
237 		m_sSqlStatement = sql;
238 		// temporaere Variable initialisieren
239 		static const char * cSignature = "(Ljava/lang/String;)Z";
240 		static const char * cMethodName = "execute";
241 		// Java-Call absetzen
242 		static jmethodID mID(NULL);
243         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
244 		// Parameter konvertieren
245         jdbc::LocalRef< jstring > str( t.env(), convertwchar_tToJavaString( t.pEnv, sql ) );
246         {
247             jdbc::ContextClassLoaderScope ccl( t.env(),
248                 m_pConnection ? m_pConnection->getDriverClassLoader() : jdbc::GlobalRef< jobject >(),
249                 m_aLogger,
250                 *this
251             );
252 
253 		    out = t.pEnv->CallBooleanMethod( object, mID, str.get() );
254 		    ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
255         }
256 	} //t.pEnv
257 	return out;
258 }
259 // -------------------------------------------------------------------------
260 
executeQuery(const::rtl::OUString & sql)261 Reference< XResultSet > SAL_CALL java_sql_Statement_Base::executeQuery( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
262 {
263     ::osl::MutexGuard aGuard( m_aMutex );
264 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
265     m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTE_QUERY, sql );
266 
267     jobject out(0);
268     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
269 
270 	{
271 		createStatement(t.pEnv);
272 		m_sSqlStatement = sql;
273 		// temporaere Variable initialisieren
274 		static const char * cSignature = "(Ljava/lang/String;)Ljava/sql/ResultSet;";
275 		static const char * cMethodName = "executeQuery";
276 		// Java-Call absetzen
277 		static jmethodID mID(NULL);
278         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
279 		// Parameter konvertieren
280         jdbc::LocalRef< jstring > str( t.env(), convertwchar_tToJavaString( t.pEnv, sql ) );
281         {
282             jdbc::ContextClassLoaderScope ccl( t.env(),
283                 m_pConnection ? m_pConnection->getDriverClassLoader() : jdbc::GlobalRef< jobject >(),
284                 m_aLogger,
285                 *this
286             );
287 
288 			out = t.pEnv->CallObjectMethod( object, mID, str.get() );
289     		ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
290         }
291 	} //t.pEnv
292 	// ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!!
293     return out==0 ? 0 : new java_sql_ResultSet( t.pEnv, out, m_aLogger, *m_pConnection,this );
294 }
295 // -------------------------------------------------------------------------
getConnection()296 Reference< XConnection > SAL_CALL java_sql_Statement_Base::getConnection(  ) throw(SQLException, RuntimeException)
297 {
298     ::osl::MutexGuard aGuard( m_aMutex );
299 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
300 	return (Reference< XConnection >)m_pConnection;
301 }
302 // -------------------------------------------------------------------------
303 
queryInterface(const Type & rType)304 Any SAL_CALL java_sql_Statement::queryInterface( const Type & rType ) throw(RuntimeException)
305 {
306 	Any aRet = ::cppu::queryInterface(rType,static_cast< XBatchExecution*> (this));
307 	return aRet.hasValue() ? aRet : java_sql_Statement_Base::queryInterface(rType);
308 }
309 // -------------------------------------------------------------------------
310 
addBatch(const::rtl::OUString & sql)311 void SAL_CALL java_sql_Statement::addBatch( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
312 {
313     ::osl::MutexGuard aGuard( m_aMutex );
314 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
315     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
316 	{
317 		createStatement(t.pEnv);
318         static jmethodID mID(NULL);
319         callVoidMethodWithStringArg("addBatch",mID,sql);
320 	} //t.pEnv
321 }
322 // -------------------------------------------------------------------------
323 
executeBatch()324 Sequence< sal_Int32 > SAL_CALL java_sql_Statement::executeBatch(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
325 {
326     ::osl::MutexGuard aGuard( m_aMutex );
327 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
328 	Sequence< sal_Int32 > aSeq;
329     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
330     createStatement(t.pEnv);
331     static jmethodID mID(NULL);
332     jintArray out = (jintArray)callObjectMethod(t.pEnv,"executeBatch","()[I", mID);
333 	if (out)
334 	{
335 		jboolean p = sal_False;
336 		aSeq.realloc(t.pEnv->GetArrayLength(out));
337 		memcpy(aSeq.getArray(),t.pEnv->GetIntArrayElements(out,&p),aSeq.getLength());
338 		t.pEnv->DeleteLocalRef(out);
339 	}
340 	return aSeq;
341 }
342 // -------------------------------------------------------------------------
343 
344 
executeUpdate(const::rtl::OUString & sql)345 sal_Int32 SAL_CALL java_sql_Statement_Base::executeUpdate( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
346 {
347     ::osl::MutexGuard aGuard( m_aMutex );
348 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
349     m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTE_UPDATE, sql );
350 
351     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
352 	createStatement(t.pEnv);
353 	m_sSqlStatement = sql;
354     static jmethodID mID(NULL);
355     return callIntMethodWithStringArg("executeUpdate",mID,sql);
356 }
357 // -------------------------------------------------------------------------
358 
getResultSet()359 Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL java_sql_Statement_Base::getResultSet(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
360 {
361     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
362 	createStatement(t.pEnv);
363     static jmethodID mID(NULL);
364     jobject out = callResultSetMethod(t.env(),"getResultSet",mID);
365 
366 	// ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!!
367 	return out==0 ? 0 : new java_sql_ResultSet( t.pEnv, out, m_aLogger, *m_pConnection,this );
368 }
369 // -------------------------------------------------------------------------
370 
getUpdateCount()371 sal_Int32 SAL_CALL java_sql_Statement_Base::getUpdateCount(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
372 {
373     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
374 	createStatement(t.pEnv);
375     static jmethodID mID(NULL);
376 	sal_Int32 out = callIntMethod("getUpdateCount",mID);
377     m_aLogger.log( LogLevel::FINER, STR_LOG_UPDATE_COUNT, (sal_Int32)out );
378 	return out;
379 }
380 // -------------------------------------------------------------------------
381 
getMoreResults()382 sal_Bool SAL_CALL java_sql_Statement_Base::getMoreResults(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
383 {
384     static jmethodID mID(NULL);
385     return callBooleanMethod( "getMoreResults", mID );
386 }
387 // -------------------------------------------------------------------------
388 
389 // -------------------------------------------------------------------------
getWarnings()390 Any SAL_CALL java_sql_Statement_Base::getWarnings(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
391 {
392 	SDBThreadAttach t;
393     createStatement(t.pEnv);
394     static jmethodID mID(NULL);
395     jobject out = callObjectMethod(t.pEnv,"getWarnings","()Ljava/sql/SQLWarning;", mID);
396 	// ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!!
397 	if( out )
398 	{
399 		java_sql_SQLWarning_BASE		warn_base( t.pEnv, out );
400 		return makeAny(
401             static_cast< starsdbc::SQLException >(
402                 java_sql_SQLWarning(warn_base,*(::cppu::OWeakObject*)this)));
403 	}
404 
405 	return Any();
406 }
407 // -------------------------------------------------------------------------
clearWarnings()408 void SAL_CALL java_sql_Statement_Base::clearWarnings(  ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
409 {
410     ::osl::MutexGuard aGuard( m_aMutex );
411 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
412 	SDBThreadAttach t;
413 
414 	{
415 		createStatement(t.pEnv);
416         static jmethodID mID(NULL);
417         callVoidMethod("clearWarnings",mID);
418 	}
419 }
420 //------------------------------------------------------------------------------
getQueryTimeOut()421 sal_Int32 java_sql_Statement_Base::getQueryTimeOut()  throw(SQLException, RuntimeException)
422 {
423     static jmethodID mID(NULL);
424     return impl_getProperty("getQueryTimeOut",mID);
425 }
426 //------------------------------------------------------------------------------
getMaxRows()427 sal_Int32 java_sql_Statement_Base::getMaxRows() throw(SQLException, RuntimeException)
428 {
429     static jmethodID mID(NULL);
430     return impl_getProperty("getMaxRows",mID);
431 }
432 //------------------------------------------------------------------------------
getResultSetConcurrency()433 sal_Int32 java_sql_Statement_Base::getResultSetConcurrency() throw(SQLException, RuntimeException)
434 {
435     static jmethodID mID(NULL);
436     return impl_getProperty("getResultSetConcurrency",mID,m_nResultSetConcurrency);
437 }
438 
439 //------------------------------------------------------------------------------
getResultSetType()440 sal_Int32 java_sql_Statement_Base::getResultSetType() throw(SQLException, RuntimeException)
441 {
442     static jmethodID mID(NULL);
443     return impl_getProperty("getResultSetType",mID,m_nResultSetType);
444 }
445 //------------------------------------------------------------------------------
impl_getProperty(const char * _pMethodName,jmethodID & _inout_MethodID,sal_Int32 _nDefault)446 sal_Int32 java_sql_Statement_Base::impl_getProperty(const char* _pMethodName, jmethodID& _inout_MethodID,sal_Int32 _nDefault)
447 {
448     sal_Int32 out = _nDefault;
449     if ( object )
450         out = callIntMethod(_pMethodName,_inout_MethodID,true);
451 
452 	return out;
453 }
454 //------------------------------------------------------------------------------
impl_getProperty(const char * _pMethodName,jmethodID & _inout_MethodID)455 sal_Int32 java_sql_Statement_Base::impl_getProperty(const char* _pMethodName, jmethodID& _inout_MethodID)
456 {
457     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
458 	createStatement(t.pEnv);
459     return callIntMethod(_pMethodName,_inout_MethodID,true);
460 }
461 
462 //------------------------------------------------------------------------------
getFetchDirection()463 sal_Int32 java_sql_Statement_Base::getFetchDirection() throw(SQLException, RuntimeException)
464 {
465     static jmethodID mID(NULL);
466     return impl_getProperty("getFetchDirection",mID);
467 }
468 //------------------------------------------------------------------------------
getFetchSize()469 sal_Int32 java_sql_Statement_Base::getFetchSize() throw(SQLException, RuntimeException)
470 {
471     static jmethodID mID(NULL);
472     return impl_getProperty("getFetchSize",mID);
473 }
474 //------------------------------------------------------------------------------
getMaxFieldSize()475 sal_Int32 java_sql_Statement_Base::getMaxFieldSize() throw(SQLException, RuntimeException)
476 {
477     static jmethodID mID(NULL);
478     return impl_getProperty("getMaxFieldSize",mID);
479 }
480 //------------------------------------------------------------------------------
getCursorName()481 ::rtl::OUString java_sql_Statement_Base::getCursorName() throw(SQLException, RuntimeException)
482 {
483     ::osl::MutexGuard aGuard( m_aMutex );
484 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
485     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
486     createStatement(t.pEnv);
487     static jmethodID mID(NULL);
488     try
489     {
490         return callStringMethod("getCursorName",mID);
491     }
492     catch(const SQLException&)
493     {
494     }
495     return ::rtl::OUString();
496 }
497 //------------------------------------------------------------------------------
setQueryTimeOut(sal_Int32 _par0)498 void java_sql_Statement_Base::setQueryTimeOut(sal_Int32 _par0) throw(SQLException, RuntimeException)
499 {
500     ::osl::MutexGuard aGuard( m_aMutex );
501 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
502     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
503     createStatement(t.pEnv);
504     static jmethodID mID(NULL);
505     callVoidMethodWithIntArg("setQueryTimeOut",mID,_par0,true);
506 }
507 
508 //------------------------------------------------------------------------------
setEscapeProcessing(sal_Bool _par0)509 void java_sql_Statement_Base::setEscapeProcessing(sal_Bool _par0) throw(SQLException, RuntimeException)
510 {
511     ::osl::MutexGuard aGuard( m_aMutex );
512 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
513     m_aLogger.log( LogLevel::FINE, STR_LOG_SET_ESCAPE_PROCESSING, _par0 );
514 
515     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
516     m_bEscapeProcessing = _par0;
517     createStatement( t.pEnv );
518     static jmethodID mID(NULL);
519     callVoidMethodWithBoolArg("setEscapeProcessing",mID,_par0,true);
520 }
521 
522 //------------------------------------------------------------------------------
setMaxRows(sal_Int32 _par0)523 void java_sql_Statement_Base::setMaxRows(sal_Int32 _par0) throw(SQLException, RuntimeException)
524 {
525     ::osl::MutexGuard aGuard( m_aMutex );
526 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
527     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
528     createStatement(t.pEnv);
529     static jmethodID mID(NULL);
530     callVoidMethodWithIntArg("setMaxRows",mID,_par0,true);
531 }
532 //------------------------------------------------------------------------------
setResultSetConcurrency(sal_Int32 _par0)533 void java_sql_Statement_Base::setResultSetConcurrency(sal_Int32 _par0) throw(SQLException, RuntimeException)
534 {
535     ::osl::MutexGuard aGuard( m_aMutex );
536 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
537     m_aLogger.log( LogLevel::FINE, STR_LOG_RESULT_SET_CONCURRENCY, (sal_Int32)_par0 );
538 	m_nResultSetConcurrency = _par0;
539 
540     clearObject();
541 }
542 //------------------------------------------------------------------------------
setResultSetType(sal_Int32 _par0)543 void java_sql_Statement_Base::setResultSetType(sal_Int32 _par0) throw(SQLException, RuntimeException)
544 {
545 	::osl::MutexGuard aGuard( m_aMutex );
546 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
547     m_aLogger.log( LogLevel::FINE, STR_LOG_RESULT_SET_TYPE, (sal_Int32)_par0 );
548 	m_nResultSetType = _par0;
549 
550     clearObject();
551 }
552 //------------------------------------------------------------------------------
setFetchDirection(sal_Int32 _par0)553 void java_sql_Statement_Base::setFetchDirection(sal_Int32 _par0) throw(SQLException, RuntimeException)
554 {
555     ::osl::MutexGuard aGuard( m_aMutex );
556 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
557     m_aLogger.log( LogLevel::FINER, STR_LOG_FETCH_DIRECTION, (sal_Int32)_par0 );
558     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
559     createStatement(t.pEnv);
560     static jmethodID mID(NULL);
561     callVoidMethodWithIntArg("setFetchDirection",mID,_par0,true);
562 }
563 //------------------------------------------------------------------------------
setFetchSize(sal_Int32 _par0)564 void java_sql_Statement_Base::setFetchSize(sal_Int32 _par0) throw(SQLException, RuntimeException)
565 {
566     ::osl::MutexGuard aGuard( m_aMutex );
567 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
568     m_aLogger.log( LogLevel::FINER, STR_LOG_FETCH_SIZE, (sal_Int32)_par0 );
569 
570     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
571     createStatement(t.pEnv);
572     static jmethodID mID(NULL);
573     callVoidMethodWithIntArg("setFetchSize",mID,_par0,true);
574 }
575 //------------------------------------------------------------------------------
setMaxFieldSize(sal_Int32 _par0)576 void java_sql_Statement_Base::setMaxFieldSize(sal_Int32 _par0) throw(SQLException, RuntimeException)
577 {
578     ::osl::MutexGuard aGuard( m_aMutex );
579 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
580     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
581     createStatement(t.pEnv);
582     static jmethodID mID(NULL);
583     callVoidMethodWithIntArg("setMaxFieldSize",mID,_par0,true);
584 }
585 //------------------------------------------------------------------------------
setCursorName(const::rtl::OUString & _par0)586 void java_sql_Statement_Base::setCursorName(const ::rtl::OUString &_par0) throw(SQLException, RuntimeException)
587 {
588     ::osl::MutexGuard aGuard( m_aMutex );
589 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
590     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
591 	{
592 		createStatement(t.pEnv);
593         static jmethodID mID(NULL);
594         callVoidMethodWithStringArg("setCursorName",mID,_par0);
595 	} //t.pEnv
596 }
597 
598 // -------------------------------------------------------------------------
createArrayHelper() const599 ::cppu::IPropertyArrayHelper* java_sql_Statement_Base::createArrayHelper( ) const
600 {
601 	Sequence< Property > aProps(10);
602 	Property* pProperties = aProps.getArray();
603 	sal_Int32 nPos = 0;
604 	DECL_PROP0(CURSORNAME,	::rtl::OUString);
605 	DECL_BOOL_PROP0(ESCAPEPROCESSING);
606 	DECL_PROP0(FETCHDIRECTION,sal_Int32);
607 	DECL_PROP0(FETCHSIZE,	sal_Int32);
608 	DECL_PROP0(MAXFIELDSIZE,sal_Int32);
609 	DECL_PROP0(MAXROWS,		sal_Int32);
610 	DECL_PROP0(QUERYTIMEOUT,sal_Int32);
611 	DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32);
612 	DECL_PROP0(RESULTSETTYPE,sal_Int32);
613 	DECL_BOOL_PROP0(USEBOOKMARKS);
614 
615 	return new ::cppu::OPropertyArrayHelper(aProps);
616 }
617 
618 // -------------------------------------------------------------------------
getInfoHelper()619 ::cppu::IPropertyArrayHelper & java_sql_Statement_Base::getInfoHelper()
620 
621 {
622 	return *const_cast<java_sql_Statement_Base*>(this)->getArrayHelper();
623 }
624 // -------------------------------------------------------------------------
convertFastPropertyValue(Any & rConvertedValue,Any & rOldValue,sal_Int32 nHandle,const Any & rValue)625 sal_Bool java_sql_Statement_Base::convertFastPropertyValue(
626 							Any & rConvertedValue,
627 							Any & rOldValue,
628 							sal_Int32 nHandle,
629 							const Any& rValue )
630 								throw (::com::sun::star::lang::IllegalArgumentException)
631 {
632 	switch(nHandle)
633 	{
634 		case PROPERTY_ID_QUERYTIMEOUT:
635 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getQueryTimeOut());
636 		case PROPERTY_ID_MAXFIELDSIZE:
637 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getMaxFieldSize());
638 		case PROPERTY_ID_MAXROWS:
639 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getMaxRows());
640 		case PROPERTY_ID_CURSORNAME:
641 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getCursorName());
642 		case PROPERTY_ID_RESULTSETCONCURRENCY:
643 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getResultSetConcurrency());
644 		case PROPERTY_ID_RESULTSETTYPE:
645 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getResultSetType());
646 		case PROPERTY_ID_FETCHDIRECTION:
647 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchDirection());
648 		case PROPERTY_ID_FETCHSIZE:
649 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchSize());
650 		case PROPERTY_ID_ESCAPEPROCESSING:
651 			return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bEscapeProcessing );
652 		case PROPERTY_ID_USEBOOKMARKS:
653 			//	return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bAsLink);
654 		default:
655 			;
656 	}
657 	return sal_False;
658 }
659 // -------------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & rValue)660 void java_sql_Statement_Base::setFastPropertyValue_NoBroadcast(
661 								sal_Int32 nHandle,
662 								const Any& rValue
663 												 )
664 												 throw (Exception)
665 {
666 	switch(nHandle)
667 	{
668 		case PROPERTY_ID_QUERYTIMEOUT:
669 			setQueryTimeOut(comphelper::getINT32(rValue));
670 			break;
671 		case PROPERTY_ID_MAXFIELDSIZE:
672 			setMaxFieldSize(comphelper::getINT32(rValue));
673 			break;
674 		case PROPERTY_ID_MAXROWS:
675 			setMaxRows(comphelper::getINT32(rValue));
676 			break;
677 		case PROPERTY_ID_CURSORNAME:
678 			setCursorName(comphelper::getString(rValue));
679 			break;
680 		case PROPERTY_ID_RESULTSETCONCURRENCY:
681 			setResultSetConcurrency(comphelper::getINT32(rValue));
682 			break;
683 		case PROPERTY_ID_RESULTSETTYPE:
684 			setResultSetType(comphelper::getINT32(rValue));
685 			break;
686 		case PROPERTY_ID_FETCHDIRECTION:
687 			setFetchDirection(comphelper::getINT32(rValue));
688 			break;
689 		case PROPERTY_ID_FETCHSIZE:
690 			setFetchSize(comphelper::getINT32(rValue));
691 			break;
692 		case PROPERTY_ID_ESCAPEPROCESSING:
693             setEscapeProcessing( ::comphelper::getBOOL( rValue ) );
694             break;
695 		case PROPERTY_ID_USEBOOKMARKS:
696 			//	return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bAsLink);
697 		default:
698 			;
699 	}
700 }
701 // -------------------------------------------------------------------------
getFastPropertyValue(Any & rValue,sal_Int32 nHandle) const702 void java_sql_Statement_Base::getFastPropertyValue(
703 								Any& rValue,
704 								sal_Int32 nHandle
705 									 ) const
706 {
707 	java_sql_Statement_Base* THIS = const_cast<java_sql_Statement_Base*>(this);
708     try
709     {
710 	    switch(nHandle)
711 	    {
712 		    case PROPERTY_ID_QUERYTIMEOUT:
713 			    rValue <<= THIS->getQueryTimeOut();
714 			    break;
715 		    case PROPERTY_ID_MAXFIELDSIZE:
716 			    rValue <<= THIS->getMaxFieldSize();
717 			    break;
718 		    case PROPERTY_ID_MAXROWS:
719 			    rValue <<= THIS->getMaxRows();
720 			    break;
721 		    case PROPERTY_ID_CURSORNAME:
722 			    rValue <<= THIS->getCursorName();
723 			    break;
724 		    case PROPERTY_ID_RESULTSETCONCURRENCY:
725 			    rValue <<= THIS->getResultSetConcurrency();
726 			    break;
727 		    case PROPERTY_ID_RESULTSETTYPE:
728 			    rValue <<= THIS->getResultSetType();
729 			    break;
730 		    case PROPERTY_ID_FETCHDIRECTION:
731 			    rValue <<= THIS->getFetchDirection();
732 			    break;
733 		    case PROPERTY_ID_FETCHSIZE:
734 			    rValue <<= THIS->getFetchSize();
735 			    break;
736 		    case PROPERTY_ID_ESCAPEPROCESSING:
737                 rValue <<= (sal_Bool)m_bEscapeProcessing;
738                 break;
739 		    case PROPERTY_ID_USEBOOKMARKS:
740 		    default:
741 			    ;
742 	    }
743     }
744     catch(const Exception&)
745     {
746     }
747 }
748 // -------------------------------------------------------------------------
749 jclass java_sql_Statement::theClass = 0;
750 
~java_sql_Statement()751 java_sql_Statement::~java_sql_Statement()
752 {}
753 
getMyClass() const754 jclass java_sql_Statement::getMyClass() const
755 {
756 	// die Klasse muss nur einmal geholt werden, daher statisch
757 	if( !theClass )
758         theClass = findMyClass("java/sql/Statement");
759 	return theClass;
760 }
761 
762 // -----------------------------------------------------------------------------
createStatement(JNIEnv * _pEnv)763 void java_sql_Statement::createStatement(JNIEnv* _pEnv)
764 {
765 	::osl::MutexGuard aGuard( m_aMutex );
766 	checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
767 
768 	if( _pEnv && !object ){
769 		// temporaere Variable initialisieren
770 		static const char * cSignature = "(II)Ljava/sql/Statement;";
771 		static const char * cMethodName = "createStatement";
772 		// Java-Call absetzen
773 		jobject out = NULL;
774 		static jmethodID mID(NULL);
775 		if ( !mID  )
776 			mID  = _pEnv->GetMethodID( m_pConnection->getMyClass(), cMethodName, cSignature );
777 		if( mID ){
778 			out = _pEnv->CallObjectMethod( m_pConnection->getJavaObject(), mID,m_nResultSetType,m_nResultSetConcurrency );
779 		} //mID
780 		else
781 		{
782 			static const char * cSignature2 = "()Ljava/sql/Statement;";
783 			static jmethodID mID2 = _pEnv->GetMethodID( m_pConnection->getMyClass(), cMethodName, cSignature2 );OSL_ENSURE(mID2,"Unknown method id!");
784 			if( mID2 ){
785 				out = _pEnv->CallObjectMethod( m_pConnection->getJavaObject(), mID2);
786 			} //mID
787 		}
788 		ThrowLoggedSQLException( m_aLogger, _pEnv, *this );
789 
790 		if ( out )
791 			object = _pEnv->NewGlobalRef( out );
792 	} //_pEnv
793 }
794 // -----------------------------------------------------------------------------
795 
796 
797 IMPLEMENT_SERVICE_INFO(java_sql_Statement,"com.sun.star.sdbcx.JStatement","com.sun.star.sdbc.Statement");
798 // -----------------------------------------------------------------------------
acquire()799 void SAL_CALL java_sql_Statement_Base::acquire() throw()
800 {
801 	java_sql_Statement_BASE::acquire();
802 }
803 // -----------------------------------------------------------------------------
release()804 void SAL_CALL java_sql_Statement_Base::release() throw()
805 {
806 	java_sql_Statement_BASE::release();
807 }
808 // -----------------------------------------------------------------------------
acquire()809 void SAL_CALL java_sql_Statement::acquire() throw()
810 {
811 	OStatement_BASE2::acquire();
812 }
813 // -----------------------------------------------------------------------------
release()814 void SAL_CALL java_sql_Statement::release() throw()
815 {
816 	OStatement_BASE2::release();
817 }
818 // -----------------------------------------------------------------------------
getPropertySetInfo()819 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL java_sql_Statement_Base::getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException)
820 {
821 	return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
822 }
823 // -----------------------------------------------------------------------------
824 
825 
826