1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "java/sql/Connection.hxx"
28*b1cdbd2cSJim Jagielski #include "java/lang/Class.hxx"
29*b1cdbd2cSJim Jagielski #include "java/tools.hxx"
30*b1cdbd2cSJim Jagielski #include "java/ContextClassLoader.hxx"
31*b1cdbd2cSJim Jagielski #include "java/sql/DatabaseMetaData.hxx"
32*b1cdbd2cSJim Jagielski #include "java/sql/JStatement.hxx"
33*b1cdbd2cSJim Jagielski #include "java/sql/Driver.hxx"
34*b1cdbd2cSJim Jagielski #include "java/sql/PreparedStatement.hxx"
35*b1cdbd2cSJim Jagielski #include "java/sql/CallableStatement.hxx"
36*b1cdbd2cSJim Jagielski #include "java/sql/SQLWarning.hxx"
37*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/SQLWarning.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/SQLWarning.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/NamedValue.hpp>
41*b1cdbd2cSJim Jagielski #include "connectivity/sqlparse.hxx"
42*b1cdbd2cSJim Jagielski #include "connectivity/dbexception.hxx"
43*b1cdbd2cSJim Jagielski #include "java/util/Property.hxx"
44*b1cdbd2cSJim Jagielski #include "java/LocalRef.hxx"
45*b1cdbd2cSJim Jagielski #include "resource/jdbc_log.hrc"
46*b1cdbd2cSJim Jagielski #include "com/sun/star/uno/XComponentContext.hpp"
47*b1cdbd2cSJim Jagielski #include "jvmaccess/classpath.hxx"
48*b1cdbd2cSJim Jagielski #include <comphelper/namedvaluecollection.hxx>
49*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
50*b1cdbd2cSJim Jagielski #include <jni.h>
51*b1cdbd2cSJim Jagielski #include "resource/common_res.hrc"
52*b1cdbd2cSJim Jagielski #include <unotools/confignode.hxx>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <list>
55*b1cdbd2cSJim Jagielski #include <memory>
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski using namespace connectivity;
58*b1cdbd2cSJim Jagielski using namespace connectivity::jdbc;
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
61*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
62*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
63*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski namespace {
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski struct ClassMapEntry {
ClassMapEntry__anon2ca26e380111::ClassMapEntry68*b1cdbd2cSJim Jagielski     ClassMapEntry(
69*b1cdbd2cSJim Jagielski         rtl::OUString const & theClassPath, rtl::OUString const & theClassName):
70*b1cdbd2cSJim Jagielski         classPath(theClassPath), className(theClassName), classLoader(NULL),
71*b1cdbd2cSJim Jagielski         classObject(NULL) {}
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     rtl::OUString classPath;
74*b1cdbd2cSJim Jagielski     rtl::OUString className;
75*b1cdbd2cSJim Jagielski     jweak classLoader;
76*b1cdbd2cSJim Jagielski     jweak classObject;
77*b1cdbd2cSJim Jagielski };
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski typedef std::list< ClassMapEntry > ClassMap;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski struct ClassMapData {
82*b1cdbd2cSJim Jagielski     osl::Mutex mutex;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     ClassMap map;
85*b1cdbd2cSJim Jagielski };
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski struct ClassMapDataInit {
operator ()__anon2ca26e380111::ClassMapDataInit88*b1cdbd2cSJim Jagielski     ClassMapData * operator()() {
89*b1cdbd2cSJim Jagielski         static ClassMapData instance;
90*b1cdbd2cSJim Jagielski         return &instance;
91*b1cdbd2cSJim Jagielski     }
92*b1cdbd2cSJim Jagielski };
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski template < typename T >
getLocalFromWeakRef(jweak & _weak,LocalRef<T> & _inout_local)95*b1cdbd2cSJim Jagielski bool getLocalFromWeakRef( jweak& _weak, LocalRef< T >& _inout_local )
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski     _inout_local.set( static_cast< T >( _inout_local.env().NewLocalRef( _weak ) ) );
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski     if ( !_inout_local.is() )
100*b1cdbd2cSJim Jagielski     {
101*b1cdbd2cSJim Jagielski         if ( _inout_local.env().ExceptionCheck())
102*b1cdbd2cSJim Jagielski         {
103*b1cdbd2cSJim Jagielski             return false;
104*b1cdbd2cSJim Jagielski         }
105*b1cdbd2cSJim Jagielski         else if ( _weak != NULL )
106*b1cdbd2cSJim Jagielski         {
107*b1cdbd2cSJim Jagielski             _inout_local.env().DeleteWeakGlobalRef( _weak );
108*b1cdbd2cSJim Jagielski             _weak = NULL;
109*b1cdbd2cSJim Jagielski         }
110*b1cdbd2cSJim Jagielski     }
111*b1cdbd2cSJim Jagielski     return true;
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski // Load a class.  A map from pairs of (classPath, name) to pairs of weak Java
115*b1cdbd2cSJim Jagielski // references to (ClassLoader, Class) is maintained, so that a class is only
116*b1cdbd2cSJim Jagielski // loaded once.
117*b1cdbd2cSJim Jagielski //
118*b1cdbd2cSJim Jagielski // It may happen that the weak reference to the ClassLoader becomes null while
119*b1cdbd2cSJim Jagielski // the reference to the Class remains non-null (in case the Class was actually
120*b1cdbd2cSJim Jagielski // loaded by some parent of the ClassLoader), in which case the ClassLoader is
121*b1cdbd2cSJim Jagielski // resurrected (which cannot cause any classes to be loaded multiple times, as
122*b1cdbd2cSJim Jagielski // the ClassLoader is no longer reachable, so no classes it has ever loaded are
123*b1cdbd2cSJim Jagielski // still reachable).
124*b1cdbd2cSJim Jagielski //
125*b1cdbd2cSJim Jagielski // Similarly, it may happen that the weak reference to the Class becomes null
126*b1cdbd2cSJim Jagielski // while the reference to the ClassLoader remains non-null, in which case the
127*b1cdbd2cSJim Jagielski // Class is simply re-loaded.
128*b1cdbd2cSJim Jagielski //
129*b1cdbd2cSJim Jagielski // This code is close to the implementation of jvmaccess::ClassPath::loadClass
130*b1cdbd2cSJim Jagielski // in jvmaccess/classpath.hxx, but not close enough to avoid the duplication.
131*b1cdbd2cSJim Jagielski //
132*b1cdbd2cSJim Jagielski // If false is returned, a (still pending) JNI exception occurred.
loadClass(Reference<XComponentContext> const & context,JNIEnv & environment,rtl::OUString const & classPath,rtl::OUString const & name,LocalRef<jobject> * classLoaderPtr,LocalRef<jclass> * classPtr)133*b1cdbd2cSJim Jagielski bool loadClass(
134*b1cdbd2cSJim Jagielski     Reference< XComponentContext > const & context, JNIEnv& environment,
135*b1cdbd2cSJim Jagielski     rtl::OUString const & classPath, rtl::OUString const & name,
136*b1cdbd2cSJim Jagielski     LocalRef< jobject > * classLoaderPtr, LocalRef< jclass > * classPtr)
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski     OSL_ASSERT(classLoaderPtr != NULL);
139*b1cdbd2cSJim Jagielski     // For any jweak entries still present in the map upon destruction,
140*b1cdbd2cSJim Jagielski     // DeleteWeakGlobalRef is not called (which is a leak):
141*b1cdbd2cSJim Jagielski     ClassMapData * d =
142*b1cdbd2cSJim Jagielski         rtl_Instance< ClassMapData, ClassMapDataInit, osl::MutexGuard,
143*b1cdbd2cSJim Jagielski         osl::GetGlobalMutex >::create(
144*b1cdbd2cSJim Jagielski             ClassMapDataInit(), osl::GetGlobalMutex());
145*b1cdbd2cSJim Jagielski     osl::MutexGuard g(d->mutex);
146*b1cdbd2cSJim Jagielski     ClassMap::iterator i(d->map.begin());
147*b1cdbd2cSJim Jagielski     LocalRef< jobject > cloader(environment);
148*b1cdbd2cSJim Jagielski     LocalRef< jclass > cl(environment);
149*b1cdbd2cSJim Jagielski     // Prune dangling weak references from the list while searching for a match,
150*b1cdbd2cSJim Jagielski     // so that the list cannot grow unbounded:
151*b1cdbd2cSJim Jagielski     for (; i != d->map.end();)
152*b1cdbd2cSJim Jagielski     {
153*b1cdbd2cSJim Jagielski         LocalRef< jobject > classLoader( environment );
154*b1cdbd2cSJim Jagielski         if ( !getLocalFromWeakRef( i->classLoader, classLoader ) )
155*b1cdbd2cSJim Jagielski             return false;
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski         LocalRef< jclass > classObject( environment );
158*b1cdbd2cSJim Jagielski         if ( !getLocalFromWeakRef( i->classObject, classObject ) )
159*b1cdbd2cSJim Jagielski             return false;
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski         if ( !classLoader.is() && !classObject.is() )
162*b1cdbd2cSJim Jagielski         {
163*b1cdbd2cSJim Jagielski             i = d->map.erase(i);
164*b1cdbd2cSJim Jagielski         }
165*b1cdbd2cSJim Jagielski         else if ( i->classPath == classPath && i->className == name )
166*b1cdbd2cSJim Jagielski         {
167*b1cdbd2cSJim Jagielski             cloader.set( classLoader.release() );
168*b1cdbd2cSJim Jagielski             cl.set( classObject.release() );
169*b1cdbd2cSJim Jagielski             break;
170*b1cdbd2cSJim Jagielski         }
171*b1cdbd2cSJim Jagielski         else
172*b1cdbd2cSJim Jagielski         {
173*b1cdbd2cSJim Jagielski             ++i;
174*b1cdbd2cSJim Jagielski         }
175*b1cdbd2cSJim Jagielski     }
176*b1cdbd2cSJim Jagielski     if ( !cloader.is() || !cl.is() )
177*b1cdbd2cSJim Jagielski     {
178*b1cdbd2cSJim Jagielski         if ( i == d->map.end() )
179*b1cdbd2cSJim Jagielski         {
180*b1cdbd2cSJim Jagielski             // Push a new ClassMapEntry (which can potentially fail) before
181*b1cdbd2cSJim Jagielski             // loading the class, so that it never happens that a class is
182*b1cdbd2cSJim Jagielski             // loaded but not added to the map (which could have effects on the
183*b1cdbd2cSJim Jagielski             // JVM that are not easily undone).  If the pushed ClassMapEntry is
184*b1cdbd2cSJim Jagielski             // not used after all (return false, etc.) it will be pruned on next
185*b1cdbd2cSJim Jagielski             // call because its classLoader/classObject are null:
186*b1cdbd2cSJim Jagielski             d->map.push_front( ClassMapEntry( classPath, name ) );
187*b1cdbd2cSJim Jagielski             i = d->map.begin();
188*b1cdbd2cSJim Jagielski         }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski         LocalRef< jclass > clClass( environment );
191*b1cdbd2cSJim Jagielski         clClass.set( environment.FindClass( "java/net/URLClassLoader" ) );
192*b1cdbd2cSJim Jagielski         if ( !clClass.is() )
193*b1cdbd2cSJim Jagielski             return false;
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski         jweak wcloader = NULL;
196*b1cdbd2cSJim Jagielski         if (!cloader.is())
197*b1cdbd2cSJim Jagielski         {
198*b1cdbd2cSJim Jagielski             jmethodID ctorLoader( environment.GetMethodID( clClass.get(), "<init>", "([Ljava/net/URL;)V" ) );
199*b1cdbd2cSJim Jagielski             if (ctorLoader == NULL)
200*b1cdbd2cSJim Jagielski                 return false;
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski             LocalRef< jobjectArray > arr( environment );
203*b1cdbd2cSJim Jagielski             arr.set( jvmaccess::ClassPath::translateToUrls( context, &environment, classPath ) );
204*b1cdbd2cSJim Jagielski             if ( !arr.is() )
205*b1cdbd2cSJim Jagielski                 return false;
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski             jvalue arg;
208*b1cdbd2cSJim Jagielski             arg.l = arr.get();
209*b1cdbd2cSJim Jagielski             cloader.set( environment.NewObjectA( clClass.get(), ctorLoader, &arg ) );
210*b1cdbd2cSJim Jagielski             if ( !cloader.is() )
211*b1cdbd2cSJim Jagielski                 return false;
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski             wcloader = environment.NewWeakGlobalRef( cloader.get() );
214*b1cdbd2cSJim Jagielski             if ( wcloader == NULL )
215*b1cdbd2cSJim Jagielski                 return false;
216*b1cdbd2cSJim Jagielski         }
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski         jweak wcl = NULL;
219*b1cdbd2cSJim Jagielski         if ( !cl.is() )
220*b1cdbd2cSJim Jagielski         {
221*b1cdbd2cSJim Jagielski             jmethodID methLoadClass( environment.GetMethodID( clClass.get(), "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;" ) );
222*b1cdbd2cSJim Jagielski             if ( methLoadClass == NULL )
223*b1cdbd2cSJim Jagielski                 return false;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski             LocalRef< jstring > str( environment );
226*b1cdbd2cSJim Jagielski             str.set( convertwchar_tToJavaString( &environment, name ) );
227*b1cdbd2cSJim Jagielski             if ( !str.is() )
228*b1cdbd2cSJim Jagielski                 return false;
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski             jvalue arg;
231*b1cdbd2cSJim Jagielski             arg.l = str.get();
232*b1cdbd2cSJim Jagielski             cl.set( static_cast< jclass >( environment.CallObjectMethodA( cloader.get(), methLoadClass, &arg ) ) );
233*b1cdbd2cSJim Jagielski             if ( !cl.is() )
234*b1cdbd2cSJim Jagielski                 return false;
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski             wcl = environment.NewWeakGlobalRef( cl.get() );
237*b1cdbd2cSJim Jagielski             if ( wcl == NULL )
238*b1cdbd2cSJim Jagielski                 return false;
239*b1cdbd2cSJim Jagielski         }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski         if ( wcloader != NULL)
242*b1cdbd2cSJim Jagielski         {
243*b1cdbd2cSJim Jagielski             i->classLoader = wcloader;
244*b1cdbd2cSJim Jagielski         }
245*b1cdbd2cSJim Jagielski         if ( wcl != NULL )
246*b1cdbd2cSJim Jagielski         {
247*b1cdbd2cSJim Jagielski             i->classObject = wcl;
248*b1cdbd2cSJim Jagielski         }
249*b1cdbd2cSJim Jagielski     }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski     classLoaderPtr->set( cloader.release() );
252*b1cdbd2cSJim Jagielski     classPtr->set( cl.release() );
253*b1cdbd2cSJim Jagielski     return true;
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
259*b1cdbd2cSJim Jagielski IMPLEMENT_SERVICE_INFO(java_sql_Connection,"com.sun.star.sdbcx.JConnection","com.sun.star.sdbc.Connection");
260*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
261*b1cdbd2cSJim Jagielski //**************************************************************
262*b1cdbd2cSJim Jagielski //************ Class: java.sql.Connection
263*b1cdbd2cSJim Jagielski //**************************************************************
264*b1cdbd2cSJim Jagielski jclass java_sql_Connection::theClass = 0;
265*b1cdbd2cSJim Jagielski 
java_sql_Connection(const java_sql_Driver & _rDriver)266*b1cdbd2cSJim Jagielski java_sql_Connection::java_sql_Connection( const java_sql_Driver& _rDriver )
267*b1cdbd2cSJim Jagielski     :java_lang_Object( _rDriver.getContext().getLegacyServiceFactory() )
268*b1cdbd2cSJim Jagielski     ,OSubComponent<java_sql_Connection, java_sql_Connection_BASE>((::cppu::OWeakObject*)(&_rDriver), this)
269*b1cdbd2cSJim Jagielski     ,m_pDriver( &_rDriver )
270*b1cdbd2cSJim Jagielski     ,m_pDriverobject(NULL)
271*b1cdbd2cSJim Jagielski     ,m_pDriverClassLoader()
272*b1cdbd2cSJim Jagielski     ,m_Driver_theClass(NULL)
273*b1cdbd2cSJim Jagielski     ,m_aLogger( _rDriver.getLogger() )
274*b1cdbd2cSJim Jagielski     ,m_bParameterSubstitution(sal_False)
275*b1cdbd2cSJim Jagielski     ,m_bIgnoreDriverPrivileges(sal_True)
276*b1cdbd2cSJim Jagielski     ,m_bIgnoreCurrency(sal_False)
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
~java_sql_Connection()280*b1cdbd2cSJim Jagielski java_sql_Connection::~java_sql_Connection()
281*b1cdbd2cSJim Jagielski {
282*b1cdbd2cSJim Jagielski 	::rtl::Reference< jvmaccess::VirtualMachine > xTest = java_lang_Object::getVM();
283*b1cdbd2cSJim Jagielski 	if ( xTest.is() )
284*b1cdbd2cSJim Jagielski 	{
285*b1cdbd2cSJim Jagielski 		SDBThreadAttach t;
286*b1cdbd2cSJim Jagielski         clearObject(*t.pEnv);
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 		{
289*b1cdbd2cSJim Jagielski 			if ( m_pDriverobject )
290*b1cdbd2cSJim Jagielski 				t.pEnv->DeleteGlobalRef( m_pDriverobject );
291*b1cdbd2cSJim Jagielski 			m_pDriverobject = NULL;
292*b1cdbd2cSJim Jagielski 			if ( m_Driver_theClass )
293*b1cdbd2cSJim Jagielski 				t.pEnv->DeleteGlobalRef( m_Driver_theClass );
294*b1cdbd2cSJim Jagielski 			m_Driver_theClass = NULL;
295*b1cdbd2cSJim Jagielski 		}
296*b1cdbd2cSJim Jagielski 		t.releaseRef();
297*b1cdbd2cSJim Jagielski 	}
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
release()300*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::release() throw()
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski 	relase_ChildImpl();
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
disposing()305*b1cdbd2cSJim Jagielski void java_sql_Connection::disposing()
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard(m_aMutex);
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::INFO, STR_LOG_SHUTDOWN_CONNECTION );
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski     dispose_ChildImpl();
312*b1cdbd2cSJim Jagielski 	java_sql_Connection_BASE::disposing();
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 	if ( object )
315*b1cdbd2cSJim Jagielski 	{
316*b1cdbd2cSJim Jagielski         static jmethodID mID(NULL);
317*b1cdbd2cSJim Jagielski         callVoidMethod("close",mID);
318*b1cdbd2cSJim Jagielski 	}
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getMyClass() const321*b1cdbd2cSJim Jagielski jclass java_sql_Connection::getMyClass() const
322*b1cdbd2cSJim Jagielski {
323*b1cdbd2cSJim Jagielski 	// die Klasse muss nur einmal geholt werden, daher statisch
324*b1cdbd2cSJim Jagielski 	if( !theClass )
325*b1cdbd2cSJim Jagielski         theClass = findMyClass("java/sql/Connection");
326*b1cdbd2cSJim Jagielski 	return theClass;
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getCatalog()330*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL java_sql_Connection::getCatalog(  ) throw(SQLException, RuntimeException)
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
333*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
336*b1cdbd2cSJim Jagielski     return callStringMethod("getCatalog",mID);
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getMetaData()339*b1cdbd2cSJim Jagielski Reference< XDatabaseMetaData > SAL_CALL java_sql_Connection::getMetaData(  ) throw(SQLException, RuntimeException)
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
342*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 	Reference< XDatabaseMetaData > xMetaData = m_xMetaData;
346*b1cdbd2cSJim Jagielski 	if(!xMetaData.is())
347*b1cdbd2cSJim Jagielski 	{
348*b1cdbd2cSJim Jagielski         SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
349*b1cdbd2cSJim Jagielski         static jmethodID mID(NULL);
350*b1cdbd2cSJim Jagielski         jobject out = callObjectMethod(t.pEnv,"getMetaData","()Ljava/sql/DatabaseMetaData;", mID);
351*b1cdbd2cSJim Jagielski 		if(out)
352*b1cdbd2cSJim Jagielski 		{
353*b1cdbd2cSJim Jagielski 			xMetaData = new java_sql_DatabaseMetaData( t.pEnv, out, *this );
354*b1cdbd2cSJim Jagielski 			m_xMetaData = xMetaData;
355*b1cdbd2cSJim Jagielski 		}
356*b1cdbd2cSJim Jagielski 	}
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 	return xMetaData;
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
close()361*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::close(  ) throw(SQLException, RuntimeException)
362*b1cdbd2cSJim Jagielski {
363*b1cdbd2cSJim Jagielski 	dispose();
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
commit()366*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::commit(  ) throw(SQLException, RuntimeException)
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
369*b1cdbd2cSJim Jagielski     callVoidMethod("commit",mID);
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
isClosed()372*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL java_sql_Connection::isClosed(  ) throw(SQLException, RuntimeException)
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
377*b1cdbd2cSJim Jagielski     return callBooleanMethod( "isClosed", mID ) && java_sql_Connection_BASE::rBHelper.bDisposed;
378*b1cdbd2cSJim Jagielski }
379*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
isReadOnly()380*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL java_sql_Connection::isReadOnly(  ) throw(SQLException, RuntimeException)
381*b1cdbd2cSJim Jagielski {
382*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
383*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
384*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
385*b1cdbd2cSJim Jagielski     return callBooleanMethod( "isReadOnly", mID );
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setCatalog(const::rtl::OUString & catalog)388*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::setCatalog( const ::rtl::OUString& catalog ) throw(SQLException, RuntimeException)
389*b1cdbd2cSJim Jagielski {
390*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
391*b1cdbd2cSJim Jagielski     callVoidMethodWithStringArg("setCatalog",mID,catalog);
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
rollback()394*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::rollback(  ) throw(SQLException, RuntimeException)
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
397*b1cdbd2cSJim Jagielski     callVoidMethod("rollback",mID);
398*b1cdbd2cSJim Jagielski }
399*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getAutoCommit()400*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL java_sql_Connection::getAutoCommit(  ) throw(SQLException, RuntimeException)
401*b1cdbd2cSJim Jagielski {
402*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
403*b1cdbd2cSJim Jagielski     return callBooleanMethod( "getAutoCommit", mID );
404*b1cdbd2cSJim Jagielski }
405*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setReadOnly(sal_Bool readOnly)406*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::setReadOnly( sal_Bool readOnly ) throw(SQLException, RuntimeException)
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
409*b1cdbd2cSJim Jagielski     callVoidMethodWithBoolArg("setReadOnly",mID,readOnly);
410*b1cdbd2cSJim Jagielski }
411*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setAutoCommit(sal_Bool autoCommit)412*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::setAutoCommit( sal_Bool autoCommit ) throw(SQLException, RuntimeException)
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
415*b1cdbd2cSJim Jagielski     callVoidMethodWithBoolArg("setAutoCommit",mID,autoCommit);
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getTypeMap()418*b1cdbd2cSJim Jagielski Reference< ::com::sun::star::container::XNameAccess > SAL_CALL java_sql_Connection::getTypeMap(  ) throw(SQLException, RuntimeException)
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
421*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
424*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
425*b1cdbd2cSJim Jagielski     /*jobject out = */callObjectMethod(t.pEnv,"getTypeMap","()Ljava/util/Map;", mID);
426*b1cdbd2cSJim Jagielski 	// ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!!
427*b1cdbd2cSJim Jagielski 	return 0;// ? 0 : Map2XNameAccess( t.pEnv, out );
428*b1cdbd2cSJim Jagielski }
429*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setTypeMap(const Reference<::com::sun::star::container::XNameAccess> &)430*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& /*typeMap*/ ) throw(SQLException, RuntimeException)
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
433*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski     ::dbtools::throwFeatureNotImplementedException( "XConnection::setTypeMap", *this );
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getTransactionIsolation()439*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL java_sql_Connection::getTransactionIsolation(  ) throw(SQLException, RuntimeException)
440*b1cdbd2cSJim Jagielski {
441*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
442*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
445*b1cdbd2cSJim Jagielski 	return callIntMethod("getTransactionIsolation",mID);
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
setTransactionIsolation(sal_Int32 level)448*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::setTransactionIsolation( sal_Int32 level ) throw(SQLException, RuntimeException)
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
451*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
454*b1cdbd2cSJim Jagielski     callVoidMethodWithIntArg("setTransactionIsolation",mID,level);
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
createStatement()457*b1cdbd2cSJim Jagielski Reference< XStatement > SAL_CALL java_sql_Connection::createStatement(  ) throw(SQLException, RuntimeException)
458*b1cdbd2cSJim Jagielski {
459*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
460*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
461*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINE, STR_LOG_CREATE_STATEMENT );
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski 	SDBThreadAttach t;
464*b1cdbd2cSJim Jagielski     java_sql_Statement* pStatement = new java_sql_Statement( t.pEnv, *this );
465*b1cdbd2cSJim Jagielski 	Reference< XStatement > xStmt = pStatement;
466*b1cdbd2cSJim Jagielski 	m_aStatements.push_back( WeakReferenceHelper( xStmt ) );
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINE, STR_LOG_CREATED_STATEMENT_ID, pStatement->getStatementObjectID() );
469*b1cdbd2cSJim Jagielski     return xStmt;
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
transFormPreparedStatement(const::rtl::OUString & _sSQL)472*b1cdbd2cSJim Jagielski ::rtl::OUString java_sql_Connection::transFormPreparedStatement(const ::rtl::OUString& _sSQL)
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski 	::rtl::OUString sSqlStatement = _sSQL;
475*b1cdbd2cSJim Jagielski 	if ( m_bParameterSubstitution )
476*b1cdbd2cSJim Jagielski 	{
477*b1cdbd2cSJim Jagielski 		try
478*b1cdbd2cSJim Jagielski 		{
479*b1cdbd2cSJim Jagielski 			OSQLParser aParser( m_pDriver->getContext().getLegacyServiceFactory() );
480*b1cdbd2cSJim Jagielski 			::rtl::OUString sErrorMessage;
481*b1cdbd2cSJim Jagielski 			::rtl::OUString sNewSql;
482*b1cdbd2cSJim Jagielski 			OSQLParseNode* pNode = aParser.parseTree(sErrorMessage,_sSQL);
483*b1cdbd2cSJim Jagielski 			if(pNode)
484*b1cdbd2cSJim Jagielski 			{	// special handling for parameters
485*b1cdbd2cSJim Jagielski 				OSQLParseNode::substituteParameterNames(pNode);
486*b1cdbd2cSJim Jagielski 				pNode->parseNodeToStr( sNewSql, this );
487*b1cdbd2cSJim Jagielski 				delete pNode;
488*b1cdbd2cSJim Jagielski 				sSqlStatement = sNewSql;
489*b1cdbd2cSJim Jagielski 			}
490*b1cdbd2cSJim Jagielski 		}
491*b1cdbd2cSJim Jagielski 		catch(const Exception&)
492*b1cdbd2cSJim Jagielski 		{
493*b1cdbd2cSJim Jagielski 		}
494*b1cdbd2cSJim Jagielski 	}
495*b1cdbd2cSJim Jagielski 	return sSqlStatement;
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
prepareStatement(const::rtl::OUString & sql)498*b1cdbd2cSJim Jagielski Reference< XPreparedStatement > SAL_CALL java_sql_Connection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
499*b1cdbd2cSJim Jagielski {
500*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
501*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
502*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINE, STR_LOG_PREPARE_STATEMENT, sql );
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski     SDBThreadAttach t;
505*b1cdbd2cSJim Jagielski 	::rtl::OUString sSqlStatement = sql;
506*b1cdbd2cSJim Jagielski 	sSqlStatement = transFormPreparedStatement( sSqlStatement );
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski     java_sql_PreparedStatement* pStatement = new java_sql_PreparedStatement( t.pEnv, *this, sSqlStatement );
509*b1cdbd2cSJim Jagielski 	Reference< XPreparedStatement > xReturn( pStatement );
510*b1cdbd2cSJim Jagielski 	m_aStatements.push_back(WeakReferenceHelper(xReturn));
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINE, STR_LOG_PREPARED_STATEMENT_ID, pStatement->getStatementObjectID() );
513*b1cdbd2cSJim Jagielski 	return xReturn;
514*b1cdbd2cSJim Jagielski }
515*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
prepareCall(const::rtl::OUString & sql)516*b1cdbd2cSJim Jagielski Reference< XPreparedStatement > SAL_CALL java_sql_Connection::prepareCall( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
519*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
520*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINE, STR_LOG_PREPARE_CALL, sql );
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski 	SDBThreadAttach t;
523*b1cdbd2cSJim Jagielski 	::rtl::OUString sSqlStatement = sql;
524*b1cdbd2cSJim Jagielski 	sSqlStatement = transFormPreparedStatement( sSqlStatement );
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski     java_sql_CallableStatement* pStatement = new java_sql_CallableStatement( t.pEnv, *this, sSqlStatement );
527*b1cdbd2cSJim Jagielski 	Reference< XPreparedStatement > xStmt( pStatement );
528*b1cdbd2cSJim Jagielski 	m_aStatements.push_back(WeakReferenceHelper(xStmt));
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINE, STR_LOG_PREPARED_CALL_ID, pStatement->getStatementObjectID() );
531*b1cdbd2cSJim Jagielski     return xStmt;
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
nativeSQL(const::rtl::OUString & sql)534*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL java_sql_Connection::nativeSQL( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
535*b1cdbd2cSJim Jagielski {
536*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
537*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski 	::rtl::OUString aStr;
540*b1cdbd2cSJim Jagielski     SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!");
541*b1cdbd2cSJim Jagielski 	{
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski 		// temporaere Variable initialisieren
544*b1cdbd2cSJim Jagielski 		static const char * cSignature = "(Ljava/lang/String;)Ljava/lang/String;";
545*b1cdbd2cSJim Jagielski 		static const char * cMethodName = "nativeSQL";
546*b1cdbd2cSJim Jagielski 		// Java-Call absetzen
547*b1cdbd2cSJim Jagielski 		static jmethodID mID(NULL);
548*b1cdbd2cSJim Jagielski         obtainMethodId(t.pEnv, cMethodName,cSignature, mID);
549*b1cdbd2cSJim Jagielski 		// Parameter konvertieren
550*b1cdbd2cSJim Jagielski 		jdbc::LocalRef< jstring > str( t.env(),convertwchar_tToJavaString(t.pEnv,sql));
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski 		jobject out = t.pEnv->CallObjectMethod( object, mID, str.get() );
553*b1cdbd2cSJim Jagielski 		aStr = JavaString2String(t.pEnv, (jstring)out );
554*b1cdbd2cSJim Jagielski 		ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
555*b1cdbd2cSJim Jagielski 	} //t.pEnv
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski     m_aLogger.log( LogLevel::FINER, STR_LOG_NATIVE_SQL, sql, aStr );
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 	return aStr;
560*b1cdbd2cSJim Jagielski }
561*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
clearWarnings()562*b1cdbd2cSJim Jagielski void SAL_CALL java_sql_Connection::clearWarnings(  ) throw(SQLException, RuntimeException)
563*b1cdbd2cSJim Jagielski {
564*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
565*b1cdbd2cSJim Jagielski     callVoidMethod("clearWarnings",mID);
566*b1cdbd2cSJim Jagielski }
567*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
getWarnings()568*b1cdbd2cSJim Jagielski Any SAL_CALL java_sql_Connection::getWarnings(  ) throw(SQLException, RuntimeException)
569*b1cdbd2cSJim Jagielski {
570*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
571*b1cdbd2cSJim Jagielski 	checkDisposed(java_sql_Connection_BASE::rBHelper.bDisposed);
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 	SDBThreadAttach t;
574*b1cdbd2cSJim Jagielski     static jmethodID mID(NULL);
575*b1cdbd2cSJim Jagielski     jobject out = callObjectMethod(t.pEnv,"getWarnings","()Ljava/sql/SQLWarning;", mID);
576*b1cdbd2cSJim Jagielski 	// ACHTUNG: der Aufrufer wird Eigentuemer des zurueckgelieferten Zeigers !!!
577*b1cdbd2cSJim Jagielski 	if( out )
578*b1cdbd2cSJim Jagielski 	{
579*b1cdbd2cSJim Jagielski 		java_sql_SQLWarning_BASE		warn_base(t.pEnv, out);
580*b1cdbd2cSJim Jagielski         SQLException aAsException( static_cast< starsdbc::SQLException >( java_sql_SQLWarning( warn_base, *this ) ) );
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski         // translate to warning
583*b1cdbd2cSJim Jagielski         SQLWarning aWarning;
584*b1cdbd2cSJim Jagielski         aWarning.Context = aAsException.Context;
585*b1cdbd2cSJim Jagielski         aWarning.Message = aAsException.Message;
586*b1cdbd2cSJim Jagielski         aWarning.SQLState = aAsException.SQLState;
587*b1cdbd2cSJim Jagielski         aWarning.ErrorCode = aAsException.ErrorCode;
588*b1cdbd2cSJim Jagielski         aWarning.NextException = aAsException.NextException;
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski 		return makeAny( aWarning );
591*b1cdbd2cSJim Jagielski 	}
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski 	return Any();
594*b1cdbd2cSJim Jagielski }
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
597*b1cdbd2cSJim Jagielski namespace
598*b1cdbd2cSJim Jagielski {
lcl_getDriverLoadErrorMessage(const::connectivity::SharedResources & _aResource,const::rtl::OUString & _rDriverClass,const::rtl::OUString & _rDriverClassPath)599*b1cdbd2cSJim Jagielski     ::rtl::OUString lcl_getDriverLoadErrorMessage( const ::connectivity::SharedResources& _aResource,const ::rtl::OUString& _rDriverClass, const ::rtl::OUString& _rDriverClassPath )
600*b1cdbd2cSJim Jagielski     {
601*b1cdbd2cSJim Jagielski         ::rtl::OUString sError1( _aResource.getResourceStringWithSubstitution(
602*b1cdbd2cSJim Jagielski                 STR_NO_CLASSNAME,
603*b1cdbd2cSJim Jagielski                 "$classname$", _rDriverClass
604*b1cdbd2cSJim Jagielski              ) );
605*b1cdbd2cSJim Jagielski         if ( _rDriverClassPath.getLength() )
606*b1cdbd2cSJim Jagielski         {
607*b1cdbd2cSJim Jagielski             const ::rtl::OUString sError2( _aResource.getResourceStringWithSubstitution(
608*b1cdbd2cSJim Jagielski                 STR_NO_CLASSNAME_PATH,
609*b1cdbd2cSJim Jagielski                 "$classpath$", _rDriverClassPath
610*b1cdbd2cSJim Jagielski              ) );
611*b1cdbd2cSJim Jagielski             sError1 += sError2;
612*b1cdbd2cSJim Jagielski         } // if ( _rDriverClassPath.getLength() )
613*b1cdbd2cSJim Jagielski         return sError1;
614*b1cdbd2cSJim Jagielski     }
615*b1cdbd2cSJim Jagielski }
616*b1cdbd2cSJim Jagielski 
617*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
618*b1cdbd2cSJim Jagielski namespace
619*b1cdbd2cSJim Jagielski {
lcl_setSystemProperties_nothrow(const java::sql::ConnectionLog & _rLogger,JNIEnv & _rEnv,const Sequence<NamedValue> & _rSystemProperties)620*b1cdbd2cSJim Jagielski     bool lcl_setSystemProperties_nothrow( const java::sql::ConnectionLog& _rLogger,
621*b1cdbd2cSJim Jagielski         JNIEnv& _rEnv, const Sequence< NamedValue >& _rSystemProperties )
622*b1cdbd2cSJim Jagielski     {
623*b1cdbd2cSJim Jagielski         if ( _rSystemProperties.getLength() == 0 )
624*b1cdbd2cSJim Jagielski             // nothing to do
625*b1cdbd2cSJim Jagielski             return true;
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski         LocalRef< jclass > systemClass( _rEnv );
628*b1cdbd2cSJim Jagielski         jmethodID nSetPropertyMethodID = 0;
629*b1cdbd2cSJim Jagielski         // retrieve the java.lang.System class
630*b1cdbd2cSJim Jagielski         systemClass.set( _rEnv.FindClass( "java/lang/System" ) );
631*b1cdbd2cSJim Jagielski         if ( systemClass.is() )
632*b1cdbd2cSJim Jagielski         {
633*b1cdbd2cSJim Jagielski             nSetPropertyMethodID = _rEnv.GetStaticMethodID(
634*b1cdbd2cSJim Jagielski                 systemClass.get(), "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" );
635*b1cdbd2cSJim Jagielski         }
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski         if ( nSetPropertyMethodID == 0 )
638*b1cdbd2cSJim Jagielski             return false;
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski         for (   const NamedValue* pSystemProp = _rSystemProperties.getConstArray();
641*b1cdbd2cSJim Jagielski                 pSystemProp != _rSystemProperties.getConstArray() + _rSystemProperties.getLength();
642*b1cdbd2cSJim Jagielski                 ++pSystemProp
643*b1cdbd2cSJim Jagielski             )
644*b1cdbd2cSJim Jagielski         {
645*b1cdbd2cSJim Jagielski             ::rtl::OUString sValue;
646*b1cdbd2cSJim Jagielski             OSL_VERIFY( pSystemProp->Value >>= sValue );
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski             _rLogger.log( LogLevel::FINER, STR_LOG_SETTING_SYSTEM_PROPERTY, pSystemProp->Name, sValue );
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski             LocalRef< jstring > jName( _rEnv, convertwchar_tToJavaString( &_rEnv, pSystemProp->Name ) );
651*b1cdbd2cSJim Jagielski             LocalRef< jstring > jValue( _rEnv, convertwchar_tToJavaString( &_rEnv, sValue ) );
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski             _rEnv.CallStaticObjectMethod( systemClass.get(), nSetPropertyMethodID, jName.get(), jValue.get() );
654*b1cdbd2cSJim Jagielski             LocalRef< jthrowable > throwable( _rEnv, _rEnv.ExceptionOccurred() );
655*b1cdbd2cSJim Jagielski             if ( throwable.is() )
656*b1cdbd2cSJim Jagielski                 return false;
657*b1cdbd2cSJim Jagielski         }
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski         return true;
660*b1cdbd2cSJim Jagielski     }
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
loadDriverFromProperties(const::rtl::OUString & _sDriverClass,const::rtl::OUString & _sDriverClassPath,const Sequence<NamedValue> & _rSystemProperties)664*b1cdbd2cSJim Jagielski void java_sql_Connection::loadDriverFromProperties( const ::rtl::OUString& _sDriverClass, const ::rtl::OUString& _sDriverClassPath,
665*b1cdbd2cSJim Jagielski     const Sequence< NamedValue >& _rSystemProperties )
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski     // contains the statement which should be used when query for automatically generated values
668*b1cdbd2cSJim Jagielski 	::rtl::OUString		sGeneratedValueStatement;
669*b1cdbd2cSJim Jagielski     // set to <TRUE/> when we should allow to query for generated values
670*b1cdbd2cSJim Jagielski 	sal_Bool			bAutoRetrievingEnabled = sal_False;
671*b1cdbd2cSJim Jagielski 
672*b1cdbd2cSJim Jagielski     // first try if the jdbc driver is alraedy registered at the driver manager
673*b1cdbd2cSJim Jagielski     SDBThreadAttach t;
674*b1cdbd2cSJim Jagielski 	try
675*b1cdbd2cSJim Jagielski 	{
676*b1cdbd2cSJim Jagielski         if ( !object )
677*b1cdbd2cSJim Jagielski         {
678*b1cdbd2cSJim Jagielski             if ( !lcl_setSystemProperties_nothrow( getLogger(), *t.pEnv, _rSystemProperties ) )
679*b1cdbd2cSJim Jagielski                 ThrowLoggedSQLException( getLogger(), t.pEnv, *this );
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski             m_pDriverClassLoader.reset();
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski             // here I try to find the class for jdbc driver
684*b1cdbd2cSJim Jagielski             java_sql_SQLException_BASE::st_getMyClass();
685*b1cdbd2cSJim Jagielski             java_lang_Throwable::st_getMyClass();
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski             if ( !_sDriverClass.getLength() )
688*b1cdbd2cSJim Jagielski             {
689*b1cdbd2cSJim Jagielski                 m_aLogger.log( LogLevel::SEVERE, STR_LOG_NO_DRIVER_CLASS );
690*b1cdbd2cSJim Jagielski                 ::dbtools::throwGenericSQLException(
691*b1cdbd2cSJim Jagielski                     lcl_getDriverLoadErrorMessage( getResources(),_sDriverClass, _sDriverClassPath ),
692*b1cdbd2cSJim Jagielski                     *this
693*b1cdbd2cSJim Jagielski                 );
694*b1cdbd2cSJim Jagielski             }
695*b1cdbd2cSJim Jagielski             else
696*b1cdbd2cSJim Jagielski             {
697*b1cdbd2cSJim Jagielski                 m_aLogger.log( LogLevel::INFO, STR_LOG_LOADING_DRIVER, _sDriverClass );
698*b1cdbd2cSJim Jagielski                 // the driver manager holds the class of the driver for later use
699*b1cdbd2cSJim Jagielski                 ::std::auto_ptr< java_lang_Class > pDrvClass;
700*b1cdbd2cSJim Jagielski                 if ( !_sDriverClassPath.getLength() )
701*b1cdbd2cSJim Jagielski                 {
702*b1cdbd2cSJim Jagielski 					// if forName didn't find the class it will throw an exception
703*b1cdbd2cSJim Jagielski 					pDrvClass = ::std::auto_ptr< java_lang_Class >(java_lang_Class::forName(_sDriverClass));
704*b1cdbd2cSJim Jagielski                 }
705*b1cdbd2cSJim Jagielski                 else
706*b1cdbd2cSJim Jagielski                 {
707*b1cdbd2cSJim Jagielski                     LocalRef< jclass > driverClass(t.env());
708*b1cdbd2cSJim Jagielski                     LocalRef< jobject > driverClassLoader(t.env());
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski                     loadClass(
711*b1cdbd2cSJim Jagielski                         m_pDriver->getContext().getUNOContext(),
712*b1cdbd2cSJim Jagielski                         t.env(), _sDriverClassPath, _sDriverClass, &driverClassLoader, &driverClass );
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski                     m_pDriverClassLoader.set( driverClassLoader );
715*b1cdbd2cSJim Jagielski                     pDrvClass.reset( new java_lang_Class( t.pEnv, driverClass.release() ) );
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski                     ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
718*b1cdbd2cSJim Jagielski                 }
719*b1cdbd2cSJim Jagielski                 if ( pDrvClass.get() )
720*b1cdbd2cSJim Jagielski                 {
721*b1cdbd2cSJim Jagielski                     LocalRef< jobject > driverObject( t.env() );
722*b1cdbd2cSJim Jagielski                     driverObject.set( pDrvClass->newInstanceObject() );
723*b1cdbd2cSJim Jagielski                     ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
724*b1cdbd2cSJim Jagielski                     m_pDriverobject = driverObject.release();
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski                     if( t.pEnv && m_pDriverobject )
727*b1cdbd2cSJim Jagielski                         m_pDriverobject = t.pEnv->NewGlobalRef( m_pDriverobject );
728*b1cdbd2cSJim Jagielski 
729*b1cdbd2cSJim Jagielski                     {
730*b1cdbd2cSJim Jagielski                         jclass tempClass = t.pEnv->GetObjectClass(m_pDriverobject);
731*b1cdbd2cSJim Jagielski                         if ( m_pDriverobject )
732*b1cdbd2cSJim Jagielski                         {
733*b1cdbd2cSJim Jagielski                             m_Driver_theClass = (jclass)t.pEnv->NewGlobalRef( tempClass );
734*b1cdbd2cSJim Jagielski                             t.pEnv->DeleteLocalRef( tempClass );
735*b1cdbd2cSJim Jagielski                         }
736*b1cdbd2cSJim Jagielski                     }
737*b1cdbd2cSJim Jagielski                 }
738*b1cdbd2cSJim Jagielski                 m_aLogger.log( LogLevel::INFO, STR_LOG_CONN_SUCCESS );
739*b1cdbd2cSJim Jagielski             }
740*b1cdbd2cSJim Jagielski         }
741*b1cdbd2cSJim Jagielski 	}
742*b1cdbd2cSJim Jagielski     catch( const SQLException& e )
743*b1cdbd2cSJim Jagielski 	{
744*b1cdbd2cSJim Jagielski 		throw SQLException(
745*b1cdbd2cSJim Jagielski             lcl_getDriverLoadErrorMessage( getResources(),_sDriverClass, _sDriverClassPath ),
746*b1cdbd2cSJim Jagielski             *this,
747*b1cdbd2cSJim Jagielski             ::rtl::OUString(),
748*b1cdbd2cSJim Jagielski             1000,
749*b1cdbd2cSJim Jagielski             makeAny(e)
750*b1cdbd2cSJim Jagielski         );
751*b1cdbd2cSJim Jagielski 	}
752*b1cdbd2cSJim Jagielski 	catch( Exception& )
753*b1cdbd2cSJim Jagielski 	{
754*b1cdbd2cSJim Jagielski 		::dbtools::throwGenericSQLException(
755*b1cdbd2cSJim Jagielski             lcl_getDriverLoadErrorMessage( getResources(),_sDriverClass, _sDriverClassPath ),
756*b1cdbd2cSJim Jagielski             *this
757*b1cdbd2cSJim Jagielski         );
758*b1cdbd2cSJim Jagielski 	}
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski 	enableAutoRetrievingEnabled( bAutoRetrievingEnabled );
761*b1cdbd2cSJim Jagielski 	setAutoRetrievingStatement( sGeneratedValueStatement );
762*b1cdbd2cSJim Jagielski }
763*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
impl_getJavaDriverClassPath_nothrow(const::rtl::OUString & _sDriverClass)764*b1cdbd2cSJim Jagielski ::rtl::OUString java_sql_Connection::impl_getJavaDriverClassPath_nothrow(const ::rtl::OUString& _sDriverClass)
765*b1cdbd2cSJim Jagielski {
766*b1cdbd2cSJim Jagielski     static const ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.DataAccess/JDBC/DriverClassPaths"));
767*b1cdbd2cSJim Jagielski     ::utl::OConfigurationTreeRoot aNamesRoot = ::utl::OConfigurationTreeRoot::createWithServiceFactory(
768*b1cdbd2cSJim Jagielski         m_pDriver->getContext().getLegacyServiceFactory(), s_sNodeName, -1, ::utl::OConfigurationTreeRoot::CM_READONLY);
769*b1cdbd2cSJim Jagielski     ::rtl::OUString sURL;
770*b1cdbd2cSJim Jagielski     if ( aNamesRoot.isValid() && aNamesRoot.hasByName( _sDriverClass ) )
771*b1cdbd2cSJim Jagielski     {
772*b1cdbd2cSJim Jagielski         ::utl::OConfigurationNode aRegisterObj = aNamesRoot.openNode( _sDriverClass );
773*b1cdbd2cSJim Jagielski         OSL_VERIFY( aRegisterObj.getNodeValue( "Path" ) >>= sURL );
774*b1cdbd2cSJim Jagielski     }
775*b1cdbd2cSJim Jagielski     return sURL;
776*b1cdbd2cSJim Jagielski }
777*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
construct(const::rtl::OUString & url,const Sequence<PropertyValue> & info)778*b1cdbd2cSJim Jagielski sal_Bool java_sql_Connection::construct(const ::rtl::OUString& url,
779*b1cdbd2cSJim Jagielski 									const Sequence< PropertyValue >& info)
780*b1cdbd2cSJim Jagielski {
781*b1cdbd2cSJim Jagielski 	{ // initialize the java vm
782*b1cdbd2cSJim Jagielski 		::rtl::Reference< jvmaccess::VirtualMachine > xTest = java_lang_Object::getVM(getORB());
783*b1cdbd2cSJim Jagielski 		if ( !xTest.is() )
784*b1cdbd2cSJim Jagielski             throwGenericSQLException(STR_NO_JAVA,*this);
785*b1cdbd2cSJim Jagielski 	}
786*b1cdbd2cSJim Jagielski 	SDBThreadAttach t;
787*b1cdbd2cSJim Jagielski 	t.addRef();		 // will be released in dtor
788*b1cdbd2cSJim Jagielski 	if ( !t.pEnv )
789*b1cdbd2cSJim Jagielski 		throwGenericSQLException(STR_NO_JAVA,*this);
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 	::rtl::OUString		sGeneratedValueStatement; // contains the statement which should be used when query for automatically generated values
792*b1cdbd2cSJim Jagielski 	sal_Bool			bAutoRetrievingEnabled = sal_False; // set to <TRUE/> when we should allow to query for generated values
793*b1cdbd2cSJim Jagielski     ::rtl::OUString sDriverClassPath,sDriverClass;
794*b1cdbd2cSJim Jagielski     Sequence< NamedValue > aSystemProperties;
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski     ::comphelper::NamedValueCollection aSettings( info );
797*b1cdbd2cSJim Jagielski     sDriverClass = aSettings.getOrDefault( "JavaDriverClass", sDriverClass );
798*b1cdbd2cSJim Jagielski     sDriverClassPath = aSettings.getOrDefault( "JavaDriverClassPath", sDriverClassPath);
799*b1cdbd2cSJim Jagielski     if ( !sDriverClassPath.getLength() )
800*b1cdbd2cSJim Jagielski         sDriverClassPath = impl_getJavaDriverClassPath_nothrow(sDriverClass);
801*b1cdbd2cSJim Jagielski     bAutoRetrievingEnabled = aSettings.getOrDefault( "IsAutoRetrievingEnabled", bAutoRetrievingEnabled );
802*b1cdbd2cSJim Jagielski     sGeneratedValueStatement = aSettings.getOrDefault( "AutoRetrievingStatement", sGeneratedValueStatement );
803*b1cdbd2cSJim Jagielski     m_bParameterSubstitution = aSettings.getOrDefault( "ParameterNameSubstitution", m_bParameterSubstitution );
804*b1cdbd2cSJim Jagielski     m_bIgnoreDriverPrivileges = aSettings.getOrDefault( "IgnoreDriverPrivileges", m_bIgnoreDriverPrivileges );
805*b1cdbd2cSJim Jagielski     m_bIgnoreCurrency = aSettings.getOrDefault( "IgnoreCurrency", m_bIgnoreCurrency );
806*b1cdbd2cSJim Jagielski     aSystemProperties = aSettings.getOrDefault( "SystemProperties", aSystemProperties );
807*b1cdbd2cSJim Jagielski     m_aCatalogRestriction = aSettings.getOrDefault( "ImplicitCatalogRestriction", Any() );
808*b1cdbd2cSJim Jagielski     m_aSchemaRestriction = aSettings.getOrDefault( "ImplicitSchemaRestriction", Any() );
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski     loadDriverFromProperties( sDriverClass, sDriverClassPath, aSystemProperties );
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski 	enableAutoRetrievingEnabled(bAutoRetrievingEnabled);
813*b1cdbd2cSJim Jagielski 	setAutoRetrievingStatement(sGeneratedValueStatement);
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski 	if ( t.pEnv && m_Driver_theClass && m_pDriverobject )
816*b1cdbd2cSJim Jagielski 	{
817*b1cdbd2cSJim Jagielski 		// temporaere Variable initialisieren
818*b1cdbd2cSJim Jagielski 		static const char * cSignature = "(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;";
819*b1cdbd2cSJim Jagielski 		static const char * cMethodName = "connect";
820*b1cdbd2cSJim Jagielski 		// Java-Call absetzen
821*b1cdbd2cSJim Jagielski 		jmethodID mID = NULL;
822*b1cdbd2cSJim Jagielski         if ( !mID  )
823*b1cdbd2cSJim Jagielski             mID  = t.pEnv->GetMethodID( m_Driver_theClass, cMethodName, cSignature );
824*b1cdbd2cSJim Jagielski         if ( mID )
825*b1cdbd2cSJim Jagielski 		{
826*b1cdbd2cSJim Jagielski 			jvalue args[2];
827*b1cdbd2cSJim Jagielski 			// Parameter konvertieren
828*b1cdbd2cSJim Jagielski 			args[0].l = convertwchar_tToJavaString(t.pEnv,url);
829*b1cdbd2cSJim Jagielski 			java_util_Properties* pProps = createStringPropertyArray(info);
830*b1cdbd2cSJim Jagielski 			args[1].l = pProps->getJavaObject();
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski             LocalRef< jobject > ensureDelete( t.env(), args[0].l );
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski             jobject out = NULL;
835*b1cdbd2cSJim Jagielski             // In some cases (e.g.,
836*b1cdbd2cSJim Jagielski             // connectivity/source/drivers/hsqldb/HDriver.cxx:1.24
837*b1cdbd2cSJim Jagielski             // l. 249) the JavaDriverClassPath contains multiple jars,
838*b1cdbd2cSJim Jagielski             // as creating the JavaDriverClass instance requires
839*b1cdbd2cSJim Jagielski             // (reflective) access to those other jars.  Now, if the
840*b1cdbd2cSJim Jagielski             // JavaDriverClass is actually loaded by some parent class
841*b1cdbd2cSJim Jagielski             // loader (e.g., because its jar is also on the global
842*b1cdbd2cSJim Jagielski             // class path), it would still not have access to the
843*b1cdbd2cSJim Jagielski             // additional jars on the JavaDriverClassPath.  Hence, the
844*b1cdbd2cSJim Jagielski             // JavaDriverClassPath class loader is pushed as context
845*b1cdbd2cSJim Jagielski             // class loader around the JavaDriverClass instance
846*b1cdbd2cSJim Jagielski             // creation:
847*b1cdbd2cSJim Jagielski             // #i82222# / 2007-10-15
848*b1cdbd2cSJim Jagielski             {
849*b1cdbd2cSJim Jagielski                 ContextClassLoaderScope ccl( t.env(), getDriverClassLoader(), getLogger(), *this );
850*b1cdbd2cSJim Jagielski                 out = t.pEnv->CallObjectMethod( m_pDriverobject, mID, args[0].l,args[1].l );
851*b1cdbd2cSJim Jagielski                 delete pProps, pProps = NULL;
852*b1cdbd2cSJim Jagielski                 ThrowLoggedSQLException( m_aLogger, t.pEnv, *this );
853*b1cdbd2cSJim Jagielski             }
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski             if ( !out )
856*b1cdbd2cSJim Jagielski                 m_aLogger.log( LogLevel::SEVERE, STR_LOG_NO_SYSTEM_CONNECTION );
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski 			if ( out )
859*b1cdbd2cSJim Jagielski 				object = t.pEnv->NewGlobalRef( out );
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski             if ( object )
862*b1cdbd2cSJim Jagielski                 m_aLogger.log( LogLevel::INFO, STR_LOG_GOT_JDBC_CONNECTION, url );
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski             m_aConnectionInfo = info;
865*b1cdbd2cSJim Jagielski 		} //mID
866*b1cdbd2cSJim Jagielski 	} //t.pEnv
867*b1cdbd2cSJim Jagielski 	 return object != NULL;
868*b1cdbd2cSJim Jagielski }
869*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
870