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 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 64 java_sql_PreparedStatement::~java_sql_PreparedStatement() 65 { 66 } 67 // ----------------------------------------------------------------------------- 68 69 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 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 // ------------------------------------------------------------------------- 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 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 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 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 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 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 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 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 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 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 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 // ------------------------------------------------------------------------- 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 // ------------------------------------------------------------------------- 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 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 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 // ------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 612 void SAL_CALL java_sql_PreparedStatement::acquire() throw() 613 { 614 OStatement_BASE2::acquire(); 615 } 616 // ----------------------------------------------------------------------------- 617 void SAL_CALL java_sql_PreparedStatement::release() throw() 618 { 619 OStatement_BASE2::release(); 620 } 621 // ----------------------------------------------------------------------------- 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