summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/jdbc/Object.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/jdbc/Object.cxx')
-rw-r--r--connectivity/source/drivers/jdbc/Object.cxx269
1 files changed, 212 insertions, 57 deletions
diff --git a/connectivity/source/drivers/jdbc/Object.cxx b/connectivity/source/drivers/jdbc/Object.cxx
index b5251960a4..b8e8c87954 100644
--- a/connectivity/source/drivers/jdbc/Object.cxx
+++ b/connectivity/source/drivers/jdbc/Object.cxx
@@ -45,7 +45,7 @@
#include <com/sun/star/uno/Sequence.hxx>
#include "resource/jdbc_log.hrc"
-
+#include <rtl/logfile.hxx>
#include <comphelper/logging.hxx>
#include <memory>
@@ -112,17 +112,10 @@ void SDBThreadAttach::releaseRef()
// statische Variablen der Klasse:
jclass java_lang_Object::theClass = 0;
-jclass java_lang_Object::getMyClass()
+jclass java_lang_Object::getMyClass() const
{
if( !theClass )
- {
- SDBThreadAttach t;
-
- if( !t.pEnv ) return (jclass)NULL;
- jclass tempClass = t.pEnv->FindClass( "java/lang/Object" );
- theClass = (jclass)t.pEnv->NewGlobalRef( tempClass );
- t.pEnv->DeleteLocalRef( tempClass );
- }
+ theClass = findMyClass("java/lang/Object");
return theClass;
}
// der eigentliche Konstruktor
@@ -146,9 +139,7 @@ java_lang_Object::~java_lang_Object()
if( object )
{
SDBThreadAttach t;
- if( t.pEnv )
- t.pEnv->DeleteGlobalRef( object );
- object = NULL;
+ clearObject(*t.pEnv);
}
SDBThreadAttach::releaseRef();
}
@@ -166,65 +157,30 @@ void java_lang_Object::clearObject()
if( object )
{
SDBThreadAttach t;
- if( t.pEnv )
- t.pEnv->DeleteGlobalRef( object );
- object = NULL;
+ clearObject(*t.pEnv);
}
}
// der protected-Konstruktor fuer abgeleitete Klassen
void java_lang_Object::saveRef( JNIEnv * pXEnv, jobject myObj )
{
OSL_ENSURE( myObj, "object in c++ -> Java Wrapper" );
- if( pXEnv && myObj )
+ if( myObj )
object = pXEnv->NewGlobalRef( myObj );
}
java_lang_Class * java_lang_Object::getClass()
{
- jobject out;
SDBThreadAttach t;
- if( t.pEnv )
- {
- // temporaere Variable initialisieren
- static const char * cSignature = "()Ljava/lang/Class;";
- static const char * cMethodName = "getClass";
- // Java-Call absetzen
- static jmethodID mID = NULL;
- if ( !mID )
- mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!");
- if( mID )
- {
- out = t.pEnv->CallObjectMethodA( object, mID, NULL );
- ThrowSQLException(t.pEnv,NULL);
- return new java_lang_Class( t.pEnv, out );
- } //mID
- } //pEnv
- return NULL;
+ static jmethodID mID(NULL);
+ jobject out = callObjectMethod(t.pEnv,"getClass","()Ljava/lang/Class;", mID);
+ return out ? new java_lang_Class( t.pEnv, out ) : NULL;
}
::rtl::OUString java_lang_Object::toString() const
{
-
- SDBThreadAttach t;
- ::rtl::OUString aStr;
- if( t.pEnv )
- {
- // temporaere Variable initialisieren
- static const char * cSignature = "()Ljava/lang/String;";
- static const char * cMethodName = "toString";
- // Java-Call absetzen
- static jmethodID mID = NULL;
- if ( !mID )
- mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );OSL_ENSURE(mID,"Unknown method id!");
- if( mID )
- {
- jstring out = (jstring)t.pEnv->CallObjectMethod( object, mID);
- ThrowSQLException(t.pEnv,NULL);
- aStr = JavaString2String(t.pEnv,out);
- } //mID
- } //pEnv
- return aStr;
+ static jmethodID mID(NULL);
+ return callStringMethod("toString",mID);
}
// --------------------------------------------------------------------------------
@@ -240,14 +196,14 @@ namespace
_pEnvironment->ExceptionClear();
// we have to clear the exception here because we want to handle it itself
- if ( _pEnvironment->IsInstanceOf( jThrow, java_sql_SQLException_BASE::getMyClass() ) )
+ if ( _pEnvironment->IsInstanceOf( jThrow, java_sql_SQLException_BASE::st_getMyClass() ) )
{
::std::auto_ptr< java_sql_SQLException_BASE > pException( new java_sql_SQLException_BASE( _pEnvironment, jThrow ) );
_out_rException = SQLException( pException->getMessage(), _rxContext,
pException->getSQLState(), pException->getErrorCode(), Any() );
return true;
}
- else if ( _pEnvironment->IsInstanceOf( jThrow, java_lang_Throwable::getMyClass() ) )
+ else if ( _pEnvironment->IsInstanceOf( jThrow, java_lang_Throwable::st_getMyClass() ) )
{
::std::auto_ptr< java_lang_Throwable > pThrow( new java_lang_Throwable( _pEnvironment, jThrow ) );
::rtl::OUString sMessage = pThrow->getMessage();
@@ -283,5 +239,204 @@ void java_lang_Object::ThrowSQLException( JNIEnv* _pEnvironment, const Reference
if ( lcl_translateJNIExceptionToUNOException( _pEnvironment, _rxContext, aException ) )
throw aException;
}
+// -----------------------------------------------------------------------------
+void java_lang_Object::obtainMethodId(JNIEnv* _pEnv,const char* _pMethodName, const char* _pSignature,jmethodID& _inout_MethodID) const
+{
+ if ( !_inout_MethodID )
+ {
+ _inout_MethodID = _pEnv->GetMethodID( getMyClass(), _pMethodName, _pSignature );
+ OSL_ENSURE( _inout_MethodID, _pSignature );
+ if ( !_inout_MethodID )
+ throw SQLException();
+ } // if ( !_inout_MethodID )
+}
+// -----------------------------------------------------------------------------
+sal_Bool java_lang_Object::callBooleanMethod( const char* _pMethodName, jmethodID& _inout_MethodID ) const
+{
+ jboolean out( sal_False );
+
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callBooleanMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"()Z", _inout_MethodID);
+ // call method
+ out = t.pEnv->CallBooleanMethod( object, _inout_MethodID );
+ ThrowSQLException( t.pEnv, NULL );
+
+ return out;
+}
+// -----------------------------------------------------------------------------
+sal_Bool java_lang_Object::callBooleanMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID, sal_Int32 _nArgument ) const
+{
+ jboolean out( sal_False );
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callBooleanMethodWithIntArg: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"(I)Z", _inout_MethodID);
+ // call method
+ out = t.pEnv->CallBooleanMethod( object, _inout_MethodID, _nArgument );
+ ThrowSQLException( t.pEnv, NULL );
+
+ return out;
+}
+// -------------------------------------------------------------------------
+jobject java_lang_Object::callResultSetMethod( JNIEnv& _rEnv,const char* _pMethodName, jmethodID& _inout_MethodID ) const
+{
+ // call method
+ jobject out = callObjectMethod(&_rEnv,_pMethodName,"()Ljava/sql/ResultSet;", _inout_MethodID);
+ return out;
+}
+// -------------------------------------------------------------------------
+sal_Int32 java_lang_Object::callIntMethod( const char* _pMethodName, jmethodID& _inout_MethodID,bool _bIgnoreException ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"()I", _inout_MethodID);
+
+ // call method
+ jint out( t.pEnv->CallIntMethod( object, _inout_MethodID ) );
+ if ( _bIgnoreException )
+ isExceptionOccured(t.pEnv,sal_True);
+ else
+ ThrowSQLException( t.pEnv, NULL );
+
+ return (sal_Int32)out;
+}
+// -------------------------------------------------------------------------
+sal_Int32 java_lang_Object::callIntMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID,sal_Int32 _nArgument ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"(I)I", _inout_MethodID);
+ // call method
+ jint out( t.pEnv->CallIntMethod( object, _inout_MethodID , _nArgument) );
+ ThrowSQLException( t.pEnv, NULL );
+
+ return (sal_Int32)out;
+}
+// -------------------------------------------------------------------------
+void java_lang_Object::callVoidMethod( const char* _pMethodName, jmethodID& _inout_MethodID) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"()V", _inout_MethodID);
+
+ // call method
+ t.pEnv->CallVoidMethod( object, _inout_MethodID );
+ ThrowSQLException( t.pEnv, NULL );
+}
+// -------------------------------------------------------------------------
+void java_lang_Object::callVoidMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID, sal_Int32 _nArgument,bool _bIgnoreException ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"(I)V", _inout_MethodID);
+
+ // call method
+ t.pEnv->CallVoidMethod( object, _inout_MethodID,_nArgument );
+ if ( _bIgnoreException )
+ isExceptionOccured(t.pEnv,sal_True);
+ else
+ ThrowSQLException( t.pEnv, NULL );
+}
+// -------------------------------------------------------------------------
+void java_lang_Object::callVoidMethodWithBoolArg( const char* _pMethodName, jmethodID& _inout_MethodID, sal_Int32 _nArgument,bool _bIgnoreException ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"(Z)V", _inout_MethodID);
+ // call method
+ t.pEnv->CallVoidMethod( object, _inout_MethodID,_nArgument );
+ if ( _bIgnoreException )
+ isExceptionOccured(t.pEnv,sal_True);
+ else
+ ThrowSQLException( t.pEnv, NULL );
+}
+// -----------------------------------------------------------------------------
+::rtl::OUString java_lang_Object::callStringMethod( const char* _pMethodName, jmethodID& _inout_MethodID ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callStringMethod: no Java enviroment anymore!" );
+
+ // call method
+ jstring out = (jstring)callObjectMethod(t.pEnv,_pMethodName,"()Ljava/lang/String;", _inout_MethodID);
+ return JavaString2String( t.pEnv, out );
+}
+// -----------------------------------------------------------------------------
+jobject java_lang_Object::callObjectMethod( JNIEnv * _pEnv,const char* _pMethodName,const char* _pSignature, jmethodID& _inout_MethodID ) const
+{
+ // obtain method ID
+ obtainMethodId(_pEnv, _pMethodName,_pSignature, _inout_MethodID);
+ // call method
+ jobject out = _pEnv->CallObjectMethod( object, _inout_MethodID);
+ ThrowSQLException( _pEnv, NULL );
+ return out;
+}
+
+// -----------------------------------------------------------------------------
+jobject java_lang_Object::callObjectMethodWithIntArg( JNIEnv * _pEnv,const char* _pMethodName,const char* _pSignature, jmethodID& _inout_MethodID , sal_Int32 _nArgument) const
+{
+ obtainMethodId(_pEnv, _pMethodName,_pSignature, _inout_MethodID);
+ // call method
+ jobject out = _pEnv->CallObjectMethod( object, _inout_MethodID,_nArgument );
+ ThrowSQLException( _pEnv, NULL );
+ return out;
+}
+// -----------------------------------------------------------------------------
+::rtl::OUString java_lang_Object::callStringMethodWithIntArg( const char* _pMethodName, jmethodID& _inout_MethodID , sal_Int32 _nArgument) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callStringMethod: no Java enviroment anymore!" );
+ jstring out = (jstring)callObjectMethodWithIntArg(t.pEnv,_pMethodName,"(I)Ljava/lang/String;",_inout_MethodID,_nArgument);
+ return JavaString2String( t.pEnv, out );
+}
+// -------------------------------------------------------------------------
+void java_lang_Object::callVoidMethodWithStringArg( const char* _pMethodName, jmethodID& _inout_MethodID,const ::rtl::OUString& _nArgument ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethod: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"(Ljava/lang/String;)V", _inout_MethodID);
+
+ jstring str = convertwchar_tToJavaString(t.pEnv,_nArgument);
+ // call method
+ t.pEnv->CallVoidMethod( object, _inout_MethodID , str);
+ t.pEnv->DeleteLocalRef(str);
+ ThrowSQLException( t.pEnv, NULL );
+}
+// -------------------------------------------------------------------------
+sal_Int32 java_lang_Object::callIntMethodWithStringArg( const char* _pMethodName, jmethodID& _inout_MethodID,const ::rtl::OUString& _nArgument ) const
+{
+ SDBThreadAttach t;
+ OSL_ENSURE( t.pEnv, "java_lang_Object::callIntMethodWithStringArg: no Java enviroment anymore!" );
+ obtainMethodId(t.pEnv, _pMethodName,"(Ljava/lang/String;)I", _inout_MethodID);
+
+ //TODO: Check if the code below is needed
+ //jdbc::LocalRef< jstring > str( t.env(), convertwchar_tToJavaString( t.pEnv, sql ) );
+ //{
+ // jdbc::ContextClassLoaderScope ccl( t.env(),
+ // m_pConnection ? m_pConnection->getDriverClassLoader() : jdbc::GlobalRef< jobject >(),
+ // m_aLogger,
+ // *this
+ // );
+ jstring str = convertwchar_tToJavaString(t.pEnv,_nArgument);
+ // call method
+ jint out = t.pEnv->CallIntMethod( object, _inout_MethodID , str);
+ t.pEnv->DeleteLocalRef(str);
+ ThrowSQLException( t.pEnv, NULL );
+ return (sal_Int32)out;
+}
+// -----------------------------------------------------------------------------
+jclass java_lang_Object::findMyClass(const char* _pClassName)
+{
+ // die Klasse muss nur einmal geholt werden, daher statisch
+ SDBThreadAttach t;
+ jclass tempClass = t.pEnv->FindClass(_pClassName); OSL_ENSURE(tempClass,"Java : FindClass nicht erfolgreich!");
+ if(!tempClass)
+ {
+ t.pEnv->ExceptionDescribe();
+ t.pEnv->ExceptionClear();
+ }
+ jclass globClass = (jclass)t.pEnv->NewGlobalRef( tempClass );
+ t.pEnv->DeleteLocalRef( tempClass );
+ return globClass;
+}