xref: /AOO41X/main/connectivity/source/drivers/jdbc/PreparedStatement.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
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 "java/sql/PreparedStatement.hxx"
27 #include "java/sql/ResultSet.hxx"
28 #include "java/sql/ResultSetMetaData.hxx"
29 #include "java/sql/Connection.hxx"
30 #include "java/sql/Timestamp.hxx"
31 #include "java/math/BigDecimal.hxx"
32 #include "java/tools.hxx"
33 #include <cppuhelper/typeprovider.hxx>
34 #include <comphelper/sequence.hxx>
35 #include "connectivity/dbtools.hxx"
36 #include "connectivity/FValue.hxx"
37 #include "connectivity/dbexception.hxx"
38 #include "resource/jdbc_log.hrc"
39 #include "resource/common_res.hrc"
40 #include "resource/sharedresources.hxx"
41 #include "java/LocalRef.hxx"
42 #include <string.h>
43 
44 using namespace connectivity;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::beans;
47 using namespace ::com::sun::star::sdbc;
48 using namespace ::com::sun::star::container;
49 using namespace ::com::sun::star::lang;
50 
51 //**************************************************************
52 //************ Class: java.sql.PreparedStatement
53 //**************************************************************
54 IMPLEMENT_SERVICE_INFO(java_sql_PreparedStatement,"com.sun.star.sdbcx.JPreparedStatement","com.sun.star.sdbc.PreparedStatement");
55 
java_sql_PreparedStatement(JNIEnv * pEnv,java_sql_Connection & _rCon,const::rtl::OUString & sql)56 java_sql_PreparedStatement::java_sql_PreparedStatement( JNIEnv * pEnv, java_sql_Connection& _rCon, const ::rtl::OUString& sql )
57     : OStatement_BASE2( pEnv, _rCon )
58 {
59     m_sSqlStatement = sql;
60 }
61 // -----------------------------------------------------------------------------
62 jclass java_sql_PreparedStatement::theClass = 0;
63 
~java_sql_PreparedStatement()64 java_sql_PreparedStatement::~java_sql_PreparedStatement()
65 {
66 }
67 // -----------------------------------------------------------------------------
68 
getMyClass() const69 jclass java_sql_PreparedStatement::getMyClass() const
70 {
71     // die Klasse muss nur einmal geholt werden, daher statisch
72     if( !theClass )
73         theClass = findMyClass("java/sql/PreparedStatement");
74     return theClass;
75 }
76 // -------------------------------------------------------------------------
77 
queryInterface(const::com::sun::star::uno::Type & rType)78 ::com::sun::star::uno::Any SAL_CALL java_sql_PreparedStatement::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
79 {
80     ::com::sun::star::uno::Any aRet = OStatement_BASE2::queryInterface(rType);
81     return aRet.hasValue() ? aRet : ::cppu::queryInterface( rType,
82                                         static_cast< XPreparedStatement*>(this),
83                                         static_cast< XParameters*>(this),
84                                         static_cast< XResultSetMetaDataSupplier*>(this),
85                                         static_cast< XPreparedBatchExecution*>(this));
86 }
87 // -------------------------------------------------------------------------
getTypes()88 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL java_sql_PreparedStatement::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
89 {
90     ::cppu::OTypeCollection aTypes( ::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedStatement > *)0 ),
91                                     ::getCppuType( (const ::com::sun::star::uno::Reference< XParameters > *)0 ),
92                                     ::getCppuType( (const ::com::sun::star::uno::Reference< XResultSetMetaDataSupplier > *)0 ),
93                                     ::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedBatchExecution > *)0 ));
94 
95     return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_BASE2::getTypes());
96 }
97 // -------------------------------------------------------------------------
98 
execute()99 sal_Bool SAL_CALL java_sql_PreparedStatement::execute(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
100 {
101     m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTING_PREPARED );
102     ::osl::MutexGuard aGuard( m_aMutex );
103     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
104 
105     static jmethodID mID(NULL);
106     return callBooleanMethod( "execute", mID );
107 }
108 // -------------------------------------------------------------------------
109 
executeUpdate()110 sal_Int32 SAL_CALL java_sql_PreparedStatement::executeUpdate(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
111 {
112     ::osl::MutexGuard aGuard( m_aMutex );
113     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
114     m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTING_PREPARED_UPDATE );
115     static jmethodID mID(NULL);
116     return callIntMethod("executeUpdate",mID);
117 }
118 // -------------------------------------------------------------------------
119 
setString(sal_Int32 parameterIndex,const::rtl::OUString & x)120 void SAL_CALL java_sql_PreparedStatement::setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
121 {
122     ::osl::MutexGuard aGuard( m_aMutex );
123     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
124     m_aLogger.log( LogLevel::FINER, STR_LOG_STRING_PARAMETER, parameterIndex, x );
125 
126     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
127     {       // temporaere Variable initialisieren
128         createStatement(t.pEnv);
129         static const char * cSignature = "(ILjava/lang/String;)V";
130         static const char * cMethodName = "setString";
131         // Java-Call absetzen
132         static jmethodID mID(NULL);
133         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
134         jdbc::LocalRef< jstring > str( t.env(),convertwchar_tToJavaString(t.pEnv,x));
135         t.pEnv->CallVoidMethod( object, mID, parameterIndex,str.get());
136         // und aufraeumen
137         ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
138     } //t.pEnv
139 }
140 // -------------------------------------------------------------------------
141 
getConnection()142 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL java_sql_PreparedStatement::getConnection(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
143 {
144     return (Reference< XConnection >)m_pConnection;
145 }
146 // -------------------------------------------------------------------------
147 
executeQuery()148 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL java_sql_PreparedStatement::executeQuery(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
149 {
150     m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTING_PREPARED_QUERY );
151     ::osl::MutexGuard aGuard( m_aMutex );
152     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
153 
154     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
155     createStatement(t.pEnv);
156     static jmethodID mID(NULL);
157     jobject out = callResultSetMethod(t.env(),"executeQuery",mID);
158 
159     return out==0 ? 0 : new java_sql_ResultSet( t.pEnv, out, m_aLogger, *m_pConnection,this);
160 }
161 // -------------------------------------------------------------------------
162 
setBoolean(sal_Int32 parameterIndex,sal_Bool x)163 void SAL_CALL java_sql_PreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
164 {
165     m_aLogger.log( LogLevel::FINER, STR_LOG_BOOLEAN_PARAMETER, parameterIndex, x );
166     ::osl::MutexGuard aGuard( m_aMutex );
167     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
168 
169     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
170     createStatement(t.pEnv);
171     static jmethodID mID(NULL);
172     callVoidMethod("setBoolean", "(IZ)V", mID, parameterIndex, x);
173 }
174 // -------------------------------------------------------------------------
175 
setByte(sal_Int32 parameterIndex,sal_Int8 x)176 void SAL_CALL java_sql_PreparedStatement::setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
177 {
178     m_aLogger.log( LogLevel::FINER, STR_LOG_BYTE_PARAMETER, parameterIndex, (sal_Int32)x );
179     ::osl::MutexGuard aGuard( m_aMutex );
180     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
181 
182     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
183     createStatement(t.pEnv);
184     static jmethodID mID(NULL);
185     callVoidMethod("setByte", "(IB)V", mID, parameterIndex, x);
186 }
187 // -------------------------------------------------------------------------
188 
setDate(sal_Int32 parameterIndex,const::com::sun::star::util::Date & x)189 void SAL_CALL java_sql_PreparedStatement::setDate( sal_Int32 parameterIndex, const ::com::sun::star::util::Date& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
190 {
191     m_aLogger.log( LogLevel::FINER, STR_LOG_DATE_PARAMETER, parameterIndex, x );
192     ::osl::MutexGuard aGuard( m_aMutex );
193     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
194 
195     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
196     createStatement(t.pEnv);
197     java_sql_Date aT(x);
198     static jmethodID mID(NULL);
199     callVoidMethod("setDate", "(ILjava/sql/Date;)V", mID, parameterIndex, aT.getJavaObject());
200 }
201 // -------------------------------------------------------------------------
202 
203 
setTime(sal_Int32 parameterIndex,const::com::sun::star::util::Time & x)204 void SAL_CALL java_sql_PreparedStatement::setTime( sal_Int32 parameterIndex, const ::com::sun::star::util::Time& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
205 {
206     m_aLogger.log( LogLevel::FINER, STR_LOG_TIME_PARAMETER, parameterIndex, x );
207     ::osl::MutexGuard aGuard( m_aMutex );
208     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
209 
210     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
211     createStatement(t.pEnv);
212     java_sql_Time aT(x);
213     static jmethodID mID(NULL);
214     callVoidMethod("setTime", "(ILjava/sql/Time;)V", mID, parameterIndex, aT.getJavaObject());
215 }
216 // -------------------------------------------------------------------------
217 
setTimestamp(sal_Int32 parameterIndex,const::com::sun::star::util::DateTime & x)218 void SAL_CALL java_sql_PreparedStatement::setTimestamp( sal_Int32 parameterIndex, const ::com::sun::star::util::DateTime& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
219 {
220     m_aLogger.log( LogLevel::FINER, STR_LOG_TIMESTAMP_PARAMETER, parameterIndex, x );
221     ::osl::MutexGuard aGuard( m_aMutex );
222     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
223 
224     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
225     createStatement(t.pEnv);
226     static jmethodID mID(NULL);
227     java_sql_Timestamp aD(x);
228     callVoidMethod("setTimestamp", "(ILjava/sql/Timestamp;)V", mID, parameterIndex, aD.getJavaObject());
229 }
230 // -------------------------------------------------------------------------
setDouble(sal_Int32 parameterIndex,double x)231 void SAL_CALL java_sql_PreparedStatement::setDouble( sal_Int32 parameterIndex, double x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
232 {
233     m_aLogger.log( LogLevel::FINER, STR_LOG_DOUBLE_PARAMETER, parameterIndex, x );
234     ::osl::MutexGuard aGuard( m_aMutex );
235     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
236 
237     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
238     createStatement(t.pEnv);
239     static jmethodID mID(NULL);
240     callVoidMethod("setDouble", "(ID)V", mID, parameterIndex, x);
241 }
242 // -------------------------------------------------------------------------
243 
setFloat(sal_Int32 parameterIndex,float x)244 void SAL_CALL java_sql_PreparedStatement::setFloat( sal_Int32 parameterIndex, float x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
245 {
246     m_aLogger.log( LogLevel::FINER, STR_LOG_FLOAT_PARAMETER, parameterIndex, x );
247     ::osl::MutexGuard aGuard( m_aMutex );
248     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
249 
250     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
251     createStatement(t.pEnv);
252     static jmethodID mID(NULL);
253     callVoidMethod("setFloat", "(IF)V", mID, parameterIndex, x);
254 }
255 // -------------------------------------------------------------------------
256 
setInt(sal_Int32 parameterIndex,sal_Int32 x)257 void SAL_CALL java_sql_PreparedStatement::setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
258 {
259     m_aLogger.log( LogLevel::FINER, STR_LOG_INT_PARAMETER, parameterIndex, x );
260     ::osl::MutexGuard aGuard( m_aMutex );
261     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
262 
263     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
264     createStatement(t.pEnv);
265     static jmethodID mID(NULL);
266     callVoidMethod("setInt", "(II)V", mID, parameterIndex, x);
267 }
268 // -------------------------------------------------------------------------
269 
setLong(sal_Int32 parameterIndex,sal_Int64 x)270 void SAL_CALL java_sql_PreparedStatement::setLong( sal_Int32 parameterIndex, sal_Int64 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
271 {
272     m_aLogger.log( LogLevel::FINER, STR_LOG_LONG_PARAMETER, parameterIndex, x );
273     ::osl::MutexGuard aGuard( m_aMutex );
274     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
275 
276     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
277     createStatement(t.pEnv);
278     static jmethodID mID(NULL);
279     callVoidMethod("setLong", "(IJ)V", mID, parameterIndex, x);
280 }
281 // -------------------------------------------------------------------------
282 
setNull(sal_Int32 parameterIndex,sal_Int32 sqlType)283 void SAL_CALL java_sql_PreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
284 {
285     m_aLogger.log( LogLevel::FINER, STR_LOG_NULL_PARAMETER, parameterIndex, sqlType );
286     ::osl::MutexGuard aGuard( m_aMutex );
287     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
288 
289     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
290     createStatement(t.pEnv);
291     static jmethodID mID(NULL);
292     callVoidMethod("setNull", "(II)V", mID, parameterIndex, sqlType);
293 }
294 // -------------------------------------------------------------------------
295 
setClob(sal_Int32,const::com::sun::star::uno::Reference<::com::sun::star::sdbc::XClob> &)296 void SAL_CALL java_sql_PreparedStatement::setClob( sal_Int32 /*parameterIndex*/, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob >& /*x*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
297 {
298     ::dbtools::throwFeatureNotImplementedException( "XParameters::setClob", *this );
299 }
300 // -------------------------------------------------------------------------
301 
setBlob(sal_Int32,const::com::sun::star::uno::Reference<::com::sun::star::sdbc::XBlob> &)302 void SAL_CALL java_sql_PreparedStatement::setBlob( sal_Int32 /*parameterIndex*/, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob >& /*x*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
303 {
304     ::dbtools::throwFeatureNotImplementedException( "XParameters::setBlob", *this );
305 }
306 // -------------------------------------------------------------------------
307 
setArray(sal_Int32,const::com::sun::star::uno::Reference<::com::sun::star::sdbc::XArray> &)308 void SAL_CALL java_sql_PreparedStatement::setArray( sal_Int32 /*parameterIndex*/, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray >& /*x*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
309 {
310     ::dbtools::throwFeatureNotImplementedException( "XParameters::setArray", *this );
311 }
312 // -------------------------------------------------------------------------
313 
setRef(sal_Int32,const::com::sun::star::uno::Reference<::com::sun::star::sdbc::XRef> &)314 void SAL_CALL java_sql_PreparedStatement::setRef( sal_Int32 /*parameterIndex*/, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef >& /*x*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
315 {
316     ::dbtools::throwFeatureNotImplementedException( "XParameters::setRef", *this );
317 }
318 // -------------------------------------------------------------------------
319 
setObjectWithInfo(sal_Int32 parameterIndex,const::com::sun::star::uno::Any & x,sal_Int32 targetSqlType,sal_Int32 scale)320 void SAL_CALL java_sql_PreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
321 {
322     m_aLogger.log( LogLevel::FINER, STR_LOG_OBJECT_NULL_PARAMETER, parameterIndex );
323     ::osl::MutexGuard aGuard( m_aMutex );
324     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
325 
326     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
327     {
328         createStatement(t.pEnv);
329 
330         // temporaere Variable initialisieren
331         static const char * cSignature = "(ILjava/lang/Object;II)V";
332         static const char * cMethodName = "setObject";
333         // Java-Call absetzen
334         static jmethodID mID(NULL);
335         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
336         {
337             jobject obj = NULL;
338             double nTemp = 0.0;
339             switch(targetSqlType)
340             {
341                 case DataType::DECIMAL:
342                 case DataType::NUMERIC:
343                     {
344                         ::std::auto_ptr<java_math_BigDecimal> pBigDecimal;
345                         if ( x >>= nTemp)
346                         {
347                             pBigDecimal.reset(new java_math_BigDecimal(nTemp));
348                             //setDouble(parameterIndex,nTemp);
349                             //return;
350                         }
351                         else
352                         {
353                             ORowSetValue aValue;
354                             aValue.fill(x);
355                             const ::rtl::OUString sValue = aValue;
356                             if ( sValue.getLength() )
357                                 pBigDecimal.reset(new java_math_BigDecimal(sValue));
358                             else
359                                 pBigDecimal.reset(new java_math_BigDecimal(0.0));
360                         }
361                             //obj = convertwchar_tToJavaString(t.pEnv,::comphelper::getString(x));
362                         t.pEnv->CallVoidMethod( object, mID, parameterIndex,pBigDecimal->getJavaObject(),targetSqlType,scale);
363                         ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
364                         return;
365                     }
366                 default:
367                     obj = convertwchar_tToJavaString(t.pEnv,::comphelper::getString(x));
368                     break;
369             }
370             t.pEnv->CallVoidMethod( object, mID, parameterIndex,obj,targetSqlType,scale);
371             t.pEnv->DeleteLocalRef(obj);
372             ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
373             // und aufraeumen
374         } //mID
375     } //t.pEnv
376 }
377 // -------------------------------------------------------------------------
378 
setObjectNull(sal_Int32 parameterIndex,sal_Int32,const::rtl::OUString &)379 void SAL_CALL java_sql_PreparedStatement::setObjectNull( sal_Int32 parameterIndex, sal_Int32 /*sqlType*/, const ::rtl::OUString& /*typeName*/ ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
380 {
381     m_aLogger.log( LogLevel::FINER, STR_LOG_OBJECT_NULL_PARAMETER, parameterIndex );
382     ::osl::MutexGuard aGuard( m_aMutex );
383     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
384 
385     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
386     createStatement(t.pEnv);
387     static jmethodID mID(NULL);
388     callVoidMethod<jobject>("setObject", "(ILjava/lang/Object;)V", mID, parameterIndex, NULL);
389 }
390 // -------------------------------------------------------------------------
391 
setObject(sal_Int32 parameterIndex,const::com::sun::star::uno::Any & x)392 void SAL_CALL java_sql_PreparedStatement::setObject( sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
393 {
394     if(!::dbtools::implSetObject(this,parameterIndex,x))
395     {
396         const ::rtl::OUString sError( m_pConnection->getResources().getResourceStringWithSubstitution(
397                 STR_UNKNOWN_PARA_TYPE,
398                 "$position$", ::rtl::OUString::valueOf(parameterIndex)
399              ) );
400         ::dbtools::throwGenericSQLException(sError,*this);
401     }
402 }
403 // -------------------------------------------------------------------------
404 
setShort(sal_Int32 parameterIndex,sal_Int16 x)405 void SAL_CALL java_sql_PreparedStatement::setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
406 {
407     m_aLogger.log( LogLevel::FINER, STR_LOG_SHORT_PARAMETER, parameterIndex, x );
408     ::osl::MutexGuard aGuard( m_aMutex );
409     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
410 
411     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
412     createStatement(t.pEnv);
413     static jmethodID mID(NULL);
414     callVoidMethod("setShort", "(IS)V", mID, parameterIndex, x);
415 }
416 // -------------------------------------------------------------------------
417 
setBytes(sal_Int32 parameterIndex,const::com::sun::star::uno::Sequence<sal_Int8> & x)418 void SAL_CALL java_sql_PreparedStatement::setBytes( sal_Int32 parameterIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
419 {
420     m_aLogger.log( LogLevel::FINER, STR_LOG_BYTES_PARAMETER, parameterIndex );
421     ::osl::MutexGuard aGuard( m_aMutex );
422     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
423 
424     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
425     {
426         createStatement(t.pEnv);
427 
428         // temporaere Variable initialisieren
429         static const char * cSignature = "(I[B)V";
430         static const char * cMethodName = "setBytes";
431         // Java-Call absetzen
432         static jmethodID mID(NULL);
433         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
434         jbyteArray pByteArray = t.pEnv->NewByteArray(x.getLength());
435         t.pEnv->SetByteArrayRegion(pByteArray,0,x.getLength(),(jbyte*)x.getConstArray());
436         t.pEnv->CallVoidMethod( object, mID, parameterIndex,pByteArray);
437         t.pEnv->DeleteLocalRef(pByteArray);
438         ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
439     } //t.pEnv
440 }
441 // -------------------------------------------------------------------------
442 
setCharacterStream(sal_Int32 parameterIndex,const::com::sun::star::uno::Reference<::com::sun::star::io::XInputStream> & x,sal_Int32 length)443 void SAL_CALL java_sql_PreparedStatement::setCharacterStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
444 {
445     m_aLogger.log( LogLevel::FINER, STR_LOG_CHARSTREAM_PARAMETER, parameterIndex );
446     ::osl::MutexGuard aGuard( m_aMutex );
447     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
448 
449     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
450     {
451         createStatement(t.pEnv);
452 
453         // temporaere Variable initialisieren
454         static const char * cSignature = "(ILjava/io/InputStream;I)V";
455         static const char * cMethodName = "setCharacterStream";
456         // Java-Call absetzen
457         static jmethodID mID(NULL);
458         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
459         Sequence< sal_Int8 > aSeq;
460         if ( x.is() )
461             x->readBytes( aSeq, length );
462         sal_Int32 actualLength = aSeq.getLength();
463 
464         jvalue args2[3];
465         jbyteArray pByteArray = t.pEnv->NewByteArray( actualLength );
466         t.pEnv->SetByteArrayRegion(pByteArray,0,actualLength,(jbyte*)aSeq.getConstArray());
467         args2[0].l =  pByteArray;
468         args2[1].i =  0;
469         args2[2].i =  actualLength;
470         // temporaere Variable initialisieren
471         const char * cSignatureStream = "([BII)V";
472         // Java-Call absetzen
473         jclass aClass = t.pEnv->FindClass("java/io/CharArrayInputStream");
474         static jmethodID mID2 = NULL;
475         if ( !mID2  )
476             mID2  = t.pEnv->GetMethodID( aClass, "<init>", cSignatureStream );
477         jobject tempObj = NULL;
478         if(mID2)
479             tempObj = t.pEnv->NewObjectA( aClass, mID2, args2 );
480 
481         t.pEnv->CallVoidMethod( object, mID, parameterIndex,tempObj,actualLength);
482         // und aufraeumen
483         t.pEnv->DeleteLocalRef(pByteArray);
484         t.pEnv->DeleteLocalRef(tempObj);
485         t.pEnv->DeleteLocalRef(aClass);
486         ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
487     } //t.pEnv
488 }
489 // -------------------------------------------------------------------------
490 
setBinaryStream(sal_Int32 parameterIndex,const::com::sun::star::uno::Reference<::com::sun::star::io::XInputStream> & x,sal_Int32 length)491 void SAL_CALL java_sql_PreparedStatement::setBinaryStream( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
492 {
493     m_aLogger.log( LogLevel::FINER, STR_LOG_BINARYSTREAM_PARAMETER, parameterIndex );
494     ::osl::MutexGuard aGuard( m_aMutex );
495     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
496 
497     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
498     {
499         createStatement(t.pEnv);
500         // temporaere Variable initialisieren
501         static const char * cSignature = "(ILjava/io/InputStream;I)V";
502         static const char * cMethodName = "setBinaryStream";
503         // Java-Call absetzen
504         static jmethodID mID(NULL);
505         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
506         {
507             Sequence< sal_Int8 > aSeq;
508             if ( x.is() )
509                 x->readBytes( aSeq, length );
510             sal_Int32 actualLength = aSeq.getLength();
511 
512             jvalue args2[3];
513             jbyteArray pByteArray = t.pEnv->NewByteArray(actualLength);
514             t.pEnv->SetByteArrayRegion(pByteArray,0,actualLength,(jbyte*)aSeq.getConstArray());
515             args2[0].l =  pByteArray;
516             args2[1].i =  0;
517             args2[2].i =  (sal_Int32)actualLength;
518 
519             // temporaere Variable initialisieren
520             const char * cSignatureStream = "([BII)V";
521             // Java-Call absetzen
522             jclass aClass = t.pEnv->FindClass("java/io/ByteArrayInputStream");
523             static jmethodID mID2 = NULL;
524             if ( !mID2  )
525                 mID2  = t.pEnv->GetMethodID( aClass, "<init>", cSignatureStream );
526             jobject tempObj = NULL;
527             if(mID2)
528                 tempObj = t.pEnv->NewObjectA( aClass, mID2, args2 );
529             t.pEnv->CallVoidMethod( object, mID, parameterIndex,tempObj,(sal_Int32)actualLength);
530             // und aufraeumen
531             t.pEnv->DeleteLocalRef(pByteArray);
532             t.pEnv->DeleteLocalRef(tempObj);
533             t.pEnv->DeleteLocalRef(aClass);
534             ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
535         }
536     } //t.pEnv
537 }
538 // -------------------------------------------------------------------------
539 
clearParameters()540 void SAL_CALL java_sql_PreparedStatement::clearParameters(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
541 {
542     m_aLogger.log( LogLevel::FINER, STR_LOG_CLEAR_PARAMETERS );
543     ::osl::MutexGuard aGuard( m_aMutex );
544     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
545 
546     SDBThreadAttach t;
547     {
548         createStatement(t.pEnv);
549 
550         static jmethodID mID(NULL);
551         callVoidMethod("clearParameters",mID);
552     } //t.pEnv
553 }
554 // -------------------------------------------------------------------------
clearBatch()555 void SAL_CALL java_sql_PreparedStatement::clearBatch(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
556 {
557     ::osl::MutexGuard aGuard( m_aMutex );
558     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
559     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
560     {
561         createStatement(t.pEnv);
562         static jmethodID mID(NULL);
563         callVoidMethod("clearBatch",mID);
564     } //t.pEnv
565 }
566 // -------------------------------------------------------------------------
567 
addBatch()568 void SAL_CALL java_sql_PreparedStatement::addBatch( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
569 {
570     ::osl::MutexGuard aGuard( m_aMutex );
571     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
572     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
573     {
574         createStatement(t.pEnv);
575         static jmethodID mID(NULL);
576         callVoidMethod("addBatch",mID);
577     } //t.pEnv
578 }
579 // -------------------------------------------------------------------------
580 
executeBatch()581 ::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL java_sql_PreparedStatement::executeBatch(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
582 {
583     ::osl::MutexGuard aGuard( m_aMutex );
584     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
585     ::com::sun::star::uno::Sequence< sal_Int32 > aSeq;
586     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
587     createStatement(t.pEnv);
588     static jmethodID mID(NULL);
589     jintArray out = (jintArray)callObjectMethod(t.pEnv,"executeBatch","()[I", mID);
590     if(out)
591     {
592         jboolean p = sal_False;
593         aSeq.realloc(t.pEnv->GetArrayLength(out));
594         memcpy(aSeq.getArray(),t.pEnv->GetIntArrayElements(out,&p),aSeq.getLength());
595         t.pEnv->DeleteLocalRef(out);
596     }
597     return aSeq;
598 }
599 // -------------------------------------------------------------------------
getMetaData()600 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL java_sql_PreparedStatement::getMetaData(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
601 {
602     ::osl::MutexGuard aGuard( m_aMutex );
603     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
604     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
605     createStatement(t.pEnv);
606     static jmethodID mID(NULL);
607     jobject out = callObjectMethod(t.pEnv,"getMetaData","()Ljava/sql/ResultSetMetaData;", mID);
608 
609     return out==0 ? 0 : new java_sql_ResultSetMetaData( t.pEnv, out, m_aLogger,*m_pConnection );
610 }
611 // -----------------------------------------------------------------------------
acquire()612 void SAL_CALL java_sql_PreparedStatement::acquire() throw()
613 {
614     OStatement_BASE2::acquire();
615 }
616 // -----------------------------------------------------------------------------
release()617 void SAL_CALL java_sql_PreparedStatement::release() throw()
618 {
619     OStatement_BASE2::release();
620 }
621 // -----------------------------------------------------------------------------
createStatement(JNIEnv * _pEnv)622 void java_sql_PreparedStatement::createStatement(JNIEnv* _pEnv)
623 {
624     ::osl::MutexGuard aGuard( m_aMutex );
625     checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed);
626 
627     if( !object && _pEnv ){
628         // temporaere Variable initialisieren
629         static const char * cSignature = "(Ljava/lang/String;II)Ljava/sql/PreparedStatement;";
630         static const char * cMethodName = "prepareStatement";
631 
632         jvalue args[1];
633         // Parameter konvertieren
634         args[0].l = convertwchar_tToJavaString(_pEnv,m_sSqlStatement);
635         // Java-Call absetzen
636         jobject out = NULL;
637         static jmethodID mID(NULL);
638         if ( !mID  )
639             mID  = _pEnv->GetMethodID( m_pConnection->getMyClass(), cMethodName, cSignature );
640         if( mID )
641         {
642             out = _pEnv->CallObjectMethod( m_pConnection->getJavaObject(), mID, args[0].l ,m_nResultSetType,m_nResultSetConcurrency);
643         }
644         else
645         {
646             static const char * cSignature2 = "(Ljava/lang/String;)Ljava/sql/PreparedStatement;";
647             static jmethodID mID2 = NULL;
648             if ( !mID2)
649                 mID2  = _pEnv->GetMethodID( m_pConnection->getMyClass(), cMethodName, cSignature2 );OSL_ENSURE(mID,"Unknown method id!");
650             if ( mID2 )
651                 out = _pEnv->CallObjectMethod( m_pConnection->getJavaObject(), mID2, args[0].l );
652         }
653         _pEnv->DeleteLocalRef((jstring)args[0].l);
654         ThrowLoggedSQLException( m_aLogger, _pEnv, *this );
655         if ( out )
656             object = _pEnv->NewGlobalRef( out );
657     } //t.pEnv
658 }
659 // -----------------------------------------------------------------------------
660 
661 
662 
663