19b5730f6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39b5730f6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49b5730f6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59b5730f6SAndrew Rist  * distributed with this work for additional information
69b5730f6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79b5730f6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89b5730f6SAndrew Rist  * "License"); you may not use this file except in compliance
99b5730f6SAndrew Rist  * with the License.  You may obtain a copy of the License at
109b5730f6SAndrew Rist  *
119b5730f6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
129b5730f6SAndrew Rist  *
139b5730f6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149b5730f6SAndrew Rist  * software distributed under the License is distributed on an
159b5730f6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169b5730f6SAndrew Rist  * KIND, either express or implied.  See the License for the
179b5730f6SAndrew Rist  * specific language governing permissions and limitations
189b5730f6SAndrew Rist  * under the License.
199b5730f6SAndrew Rist  *
209b5730f6SAndrew Rist  *************************************************************/
219b5730f6SAndrew Rist 
229b5730f6SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
26cdf0e10cSrcweir #include "mysql/YDriver.hxx"
27cdf0e10cSrcweir #include "mysql/YCatalog.hxx"
28cdf0e10cSrcweir #include <osl/diagnose.h>
29cdf0e10cSrcweir #include <comphelper/namedvaluecollection.hxx>
30cdf0e10cSrcweir #include "connectivity/dbexception.hxx"
31cdf0e10cSrcweir #include <connectivity/dbcharset.hxx>
32cdf0e10cSrcweir #include <com/sun/star/sdbc/XDriverAccess.hpp>
33cdf0e10cSrcweir #include "TConnection.hxx"
34cdf0e10cSrcweir #include "resource/common_res.hrc"
35cdf0e10cSrcweir #include "resource/sharedresources.hxx"
36cdf0e10cSrcweir 
37cdf0e10cSrcweir //........................................................................
38cdf0e10cSrcweir namespace connectivity
39cdf0e10cSrcweir {
40cdf0e10cSrcweir //........................................................................
41cdf0e10cSrcweir 	using namespace mysql;
42cdf0e10cSrcweir 	using namespace ::com::sun::star::uno;
43cdf0e10cSrcweir 	using namespace ::com::sun::star::sdbc;
44cdf0e10cSrcweir 	using namespace ::com::sun::star::sdbcx;
45cdf0e10cSrcweir 	using namespace ::com::sun::star::beans;
46cdf0e10cSrcweir 	using namespace ::com::sun::star::lang;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir 	namespace mysql
49cdf0e10cSrcweir 	{
ODriverDelegator_CreateInstance(const Reference<::com::sun::star::lang::XMultiServiceFactory> & _rxFac)50cdf0e10cSrcweir 		Reference< XInterface >  SAL_CALL ODriverDelegator_CreateInstance(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFac) throw( Exception )
51cdf0e10cSrcweir 		{
52cdf0e10cSrcweir 			return *(new ODriverDelegator(_rxFac));
53cdf0e10cSrcweir 		}
54cdf0e10cSrcweir 	}
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 	//====================================================================
58cdf0e10cSrcweir 	//= ODriverDelegator
59cdf0e10cSrcweir 	//====================================================================
60cdf0e10cSrcweir 	//--------------------------------------------------------------------
ODriverDelegator(const Reference<XMultiServiceFactory> & _rxFactory)61cdf0e10cSrcweir 	ODriverDelegator::ODriverDelegator(const Reference< XMultiServiceFactory >& _rxFactory)
62cdf0e10cSrcweir 		: ODriverDelegator_BASE(m_aMutex)
63cdf0e10cSrcweir 		,m_xFactory(_rxFactory)
64cdf0e10cSrcweir 		,m_eDriverType(D_ODBC)
65cdf0e10cSrcweir 	{
66cdf0e10cSrcweir 	}
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 	//--------------------------------------------------------------------
~ODriverDelegator()69cdf0e10cSrcweir 	ODriverDelegator::~ODriverDelegator()
70cdf0e10cSrcweir 	{
71cdf0e10cSrcweir 		try
72cdf0e10cSrcweir 		{
73cdf0e10cSrcweir 			::comphelper::disposeComponent(m_xODBCDriver);
74cdf0e10cSrcweir             ::comphelper::disposeComponent(m_xNativeDriver);
75cdf0e10cSrcweir 			TJDBCDrivers::iterator aIter = m_aJdbcDrivers.begin();
76cdf0e10cSrcweir 			TJDBCDrivers::iterator aEnd = m_aJdbcDrivers.end();
77cdf0e10cSrcweir 			for ( ;aIter != aEnd;++aIter )
78cdf0e10cSrcweir 				::comphelper::disposeComponent(aIter->second);
79cdf0e10cSrcweir 		}
80cdf0e10cSrcweir 		catch(const Exception&)
81cdf0e10cSrcweir 		{
82cdf0e10cSrcweir 		}
83cdf0e10cSrcweir 	}
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	// --------------------------------------------------------------------------------
disposing()86cdf0e10cSrcweir 	void ODriverDelegator::disposing()
87cdf0e10cSrcweir 	{
88cdf0e10cSrcweir 		::osl::MutexGuard aGuard(m_aMutex);
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 		for (TWeakPairVector::iterator i = m_aConnections.begin(); m_aConnections.end() != i; ++i)
92cdf0e10cSrcweir 		{
93cdf0e10cSrcweir 			Reference<XInterface > xTemp = i->first.get();
94cdf0e10cSrcweir 			::comphelper::disposeComponent(xTemp);
95cdf0e10cSrcweir 		}
96cdf0e10cSrcweir 		m_aConnections.clear();
97cdf0e10cSrcweir 		TWeakPairVector().swap(m_aConnections);
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 		ODriverDelegator_BASE::disposing();
100cdf0e10cSrcweir 	}
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	namespace
103cdf0e10cSrcweir 	{
isOdbcUrl(const::rtl::OUString & _sUrl)104cdf0e10cSrcweir 		sal_Bool isOdbcUrl(const ::rtl::OUString& _sUrl)
105cdf0e10cSrcweir 		{
106cdf0e10cSrcweir 			return _sUrl.copy(0,16).equalsAscii("sdbc:mysql:odbc:");
107cdf0e10cSrcweir 		}
108cdf0e10cSrcweir         //--------------------------------------------------------------------
isNativeUrl(const::rtl::OUString & _sUrl)109cdf0e10cSrcweir         sal_Bool isNativeUrl(const ::rtl::OUString& _sUrl)
110cdf0e10cSrcweir 		{
111cdf0e10cSrcweir             return (!_sUrl.compareTo(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:mysql:mysqlc:")), sizeof("sdbc:mysql:mysqlc:")-1));
112cdf0e10cSrcweir 		}
113cdf0e10cSrcweir         //--------------------------------------------------------------------
lcl_getDriverType(const::rtl::OUString & _sUrl)114cdf0e10cSrcweir         T_DRIVERTYPE lcl_getDriverType(const ::rtl::OUString& _sUrl)
115cdf0e10cSrcweir         {
116cdf0e10cSrcweir             T_DRIVERTYPE eRet = D_JDBC;
117cdf0e10cSrcweir             if ( isOdbcUrl(_sUrl ) )
118cdf0e10cSrcweir                 eRet = D_ODBC;
119cdf0e10cSrcweir             else if ( isNativeUrl(_sUrl ) )
120cdf0e10cSrcweir                 eRet = D_NATIVE;
121cdf0e10cSrcweir             return eRet;
122cdf0e10cSrcweir         }
123cdf0e10cSrcweir 		//--------------------------------------------------------------------
transformUrl(const::rtl::OUString & _sUrl)124cdf0e10cSrcweir 		::rtl::OUString transformUrl(const ::rtl::OUString& _sUrl)
125cdf0e10cSrcweir 		{
126cdf0e10cSrcweir 			::rtl::OUString sNewUrl = _sUrl.copy(11);
127cdf0e10cSrcweir 			if ( isOdbcUrl( _sUrl ) )
128cdf0e10cSrcweir 				sNewUrl = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:")) + sNewUrl;
129cdf0e10cSrcweir             else if ( isNativeUrl( _sUrl ) )
130cdf0e10cSrcweir                 sNewUrl = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:")) + sNewUrl;
131cdf0e10cSrcweir 			else
132cdf0e10cSrcweir 			{
133cdf0e10cSrcweir 				sNewUrl = sNewUrl.copy(5);
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 				::rtl::OUString sTempUrl = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("jdbc:mysql://"));
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 				sTempUrl += sNewUrl;
138cdf0e10cSrcweir 				sNewUrl = sTempUrl;
139cdf0e10cSrcweir 			}
140cdf0e10cSrcweir 			return sNewUrl;
141cdf0e10cSrcweir 		}
142cdf0e10cSrcweir 		//--------------------------------------------------------------------
lcl_loadDriver(const Reference<XMultiServiceFactory> & _rxFactory,const::rtl::OUString & _sUrl)143cdf0e10cSrcweir 		Reference< XDriver > lcl_loadDriver(const Reference< XMultiServiceFactory >& _rxFactory,const ::rtl::OUString& _sUrl)
144cdf0e10cSrcweir 		{
145cdf0e10cSrcweir 			Reference<XDriverAccess> xDriverAccess(_rxFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbc.DriverManager")) ),UNO_QUERY);
146cdf0e10cSrcweir 			OSL_ENSURE(xDriverAccess.is(),"Could not load driver manager!");
147cdf0e10cSrcweir 			Reference< XDriver > xDriver;
148cdf0e10cSrcweir 			if ( xDriverAccess.is() )
149cdf0e10cSrcweir 				xDriver = xDriverAccess->getDriverByURL(_sUrl);
150cdf0e10cSrcweir 			return xDriver;
151cdf0e10cSrcweir 		}
152cdf0e10cSrcweir 		//--------------------------------------------------------------------
lcl_convertProperties(T_DRIVERTYPE _eType,const Sequence<PropertyValue> & info,const::rtl::OUString & _sUrl)153cdf0e10cSrcweir 		Sequence< PropertyValue > lcl_convertProperties(T_DRIVERTYPE _eType,const Sequence< PropertyValue >& info,const ::rtl::OUString& _sUrl)
154cdf0e10cSrcweir 		{
155cdf0e10cSrcweir 			::std::vector<PropertyValue> aProps;
156cdf0e10cSrcweir 			const PropertyValue* pSupported = info.getConstArray();
157cdf0e10cSrcweir 			const PropertyValue* pEnd = pSupported + info.getLength();
158cdf0e10cSrcweir 
159cdf0e10cSrcweir 			aProps.reserve(info.getLength() + 5);
160cdf0e10cSrcweir 			for (;pSupported != pEnd; ++pSupported)
161cdf0e10cSrcweir 			{
162cdf0e10cSrcweir 				aProps.push_back( *pSupported );
163cdf0e10cSrcweir 			}
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 			if ( _eType == D_ODBC )
166cdf0e10cSrcweir 			{
167cdf0e10cSrcweir 				aProps.push_back( PropertyValue(
168cdf0e10cSrcweir 									::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Silent"))
169cdf0e10cSrcweir 									,0
170cdf0e10cSrcweir 									,makeAny(sal_True)
171cdf0e10cSrcweir 									,PropertyState_DIRECT_VALUE) );
172cdf0e10cSrcweir 				aProps.push_back( PropertyValue(
173cdf0e10cSrcweir 									::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PreventGetVersionColumns"))
174cdf0e10cSrcweir 									,0
175cdf0e10cSrcweir 									,makeAny(sal_True)
176cdf0e10cSrcweir 									,PropertyState_DIRECT_VALUE) );
177cdf0e10cSrcweir 			}
178cdf0e10cSrcweir 			else if ( _eType == D_JDBC )
179cdf0e10cSrcweir 			{
180cdf0e10cSrcweir 				aProps.push_back( PropertyValue(
181cdf0e10cSrcweir 									::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JavaDriverClass"))
182cdf0e10cSrcweir 									,0
183cdf0e10cSrcweir 									,makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.mysql.jdbc.Driver")))
184cdf0e10cSrcweir 									,PropertyState_DIRECT_VALUE) );
185cdf0e10cSrcweir 			}
186cdf0e10cSrcweir             else
187cdf0e10cSrcweir             {
188cdf0e10cSrcweir                 aProps.push_back( PropertyValue(
189cdf0e10cSrcweir 									::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PublicConnectionURL"))
190cdf0e10cSrcweir 									,0
191cdf0e10cSrcweir 									,makeAny(_sUrl)
192cdf0e10cSrcweir 									,PropertyState_DIRECT_VALUE) );
193cdf0e10cSrcweir             }
194cdf0e10cSrcweir 			aProps.push_back( PropertyValue(
195cdf0e10cSrcweir 								::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsAutoRetrievingEnabled"))
196cdf0e10cSrcweir 								,0
197cdf0e10cSrcweir 								,makeAny(sal_True)
198cdf0e10cSrcweir 								,PropertyState_DIRECT_VALUE) );
199cdf0e10cSrcweir 			aProps.push_back( PropertyValue(
200cdf0e10cSrcweir 								::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutoRetrievingStatement"))
201cdf0e10cSrcweir 								,0
202cdf0e10cSrcweir 								,makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT LAST_INSERT_ID()")))
203cdf0e10cSrcweir 								,PropertyState_DIRECT_VALUE) );
204cdf0e10cSrcweir 			aProps.push_back( PropertyValue(
205cdf0e10cSrcweir 								::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParameterNameSubstitution"))
206cdf0e10cSrcweir 								,0
207cdf0e10cSrcweir 								,makeAny(sal_True)
208cdf0e10cSrcweir 								,PropertyState_DIRECT_VALUE) );
209cdf0e10cSrcweir 			PropertyValue* pProps = aProps.empty() ? 0 : &aProps[0];
210cdf0e10cSrcweir 			return Sequence< PropertyValue >(pProps, aProps.size());
211cdf0e10cSrcweir 		}
212cdf0e10cSrcweir 	}
213cdf0e10cSrcweir 	//--------------------------------------------------------------------
loadDriver(const::rtl::OUString & url,const Sequence<PropertyValue> & info)214cdf0e10cSrcweir 	Reference< XDriver > ODriverDelegator::loadDriver( const ::rtl::OUString& url, const Sequence< PropertyValue >& info )
215cdf0e10cSrcweir 	{
216cdf0e10cSrcweir 		Reference< XDriver > xDriver;
217cdf0e10cSrcweir 		const ::rtl::OUString sCuttedUrl = transformUrl(url);
218cdf0e10cSrcweir         const T_DRIVERTYPE eType = lcl_getDriverType( url );
219cdf0e10cSrcweir 		if ( eType == D_ODBC )
220cdf0e10cSrcweir 		{
221cdf0e10cSrcweir 			if ( !m_xODBCDriver.is() )
222cdf0e10cSrcweir 				m_xODBCDriver = lcl_loadDriver(m_xFactory,sCuttedUrl);
223cdf0e10cSrcweir 			xDriver = m_xODBCDriver;
224cdf0e10cSrcweir 		} // if ( bIsODBC )
225cdf0e10cSrcweir         else if ( eType == D_NATIVE )
226cdf0e10cSrcweir 		{
227cdf0e10cSrcweir 			if ( !m_xNativeDriver.is() )
228cdf0e10cSrcweir 				m_xNativeDriver = lcl_loadDriver(m_xFactory,sCuttedUrl);
229cdf0e10cSrcweir 			xDriver = m_xNativeDriver;
230cdf0e10cSrcweir 		}
231cdf0e10cSrcweir 		else
232cdf0e10cSrcweir 		{
233cdf0e10cSrcweir             ::comphelper::NamedValueCollection aSettings( info );
234cdf0e10cSrcweir             ::rtl::OUString sDriverClass(RTL_CONSTASCII_USTRINGPARAM("com.mysql.jdbc.Driver"));
235cdf0e10cSrcweir             sDriverClass = aSettings.getOrDefault( "JavaDriverClass", sDriverClass );
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 			TJDBCDrivers::iterator aFind = m_aJdbcDrivers.find(sDriverClass);
238cdf0e10cSrcweir 			if ( aFind == m_aJdbcDrivers.end() )
239cdf0e10cSrcweir 				aFind = m_aJdbcDrivers.insert(TJDBCDrivers::value_type(sDriverClass,lcl_loadDriver(m_xFactory,sCuttedUrl))).first;
240cdf0e10cSrcweir 			xDriver = aFind->second;
241cdf0e10cSrcweir 		}
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 		return xDriver;
244cdf0e10cSrcweir 	}
245cdf0e10cSrcweir 
246cdf0e10cSrcweir 	//--------------------------------------------------------------------
connect(const::rtl::OUString & url,const Sequence<PropertyValue> & info)247cdf0e10cSrcweir 	Reference< XConnection > SAL_CALL ODriverDelegator::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw (SQLException, RuntimeException)
248cdf0e10cSrcweir 	{
249cdf0e10cSrcweir 		Reference< XConnection > xConnection;
250cdf0e10cSrcweir 		if ( acceptsURL(url) )
251cdf0e10cSrcweir 		{
252cdf0e10cSrcweir 			Reference< XDriver > xDriver;
253cdf0e10cSrcweir 			xDriver = loadDriver(url,info);
254cdf0e10cSrcweir 			if ( xDriver.is() )
255cdf0e10cSrcweir 			{
256cdf0e10cSrcweir 				::rtl::OUString sCuttedUrl = transformUrl(url);
257cdf0e10cSrcweir                 const T_DRIVERTYPE eType = lcl_getDriverType( url );
258cdf0e10cSrcweir 				Sequence< PropertyValue > aConvertedProperties = lcl_convertProperties(eType,info,url);
259cdf0e10cSrcweir                 if ( eType == D_JDBC )
260cdf0e10cSrcweir                 {
261cdf0e10cSrcweir                     ::comphelper::NamedValueCollection aSettings( info );
262cdf0e10cSrcweir                     ::rtl::OUString sIanaName = aSettings.getOrDefault( "CharSet", ::rtl::OUString() );
263cdf0e10cSrcweir                     if ( sIanaName.getLength() )
264cdf0e10cSrcweir                     {
265cdf0e10cSrcweir                         ::dbtools::OCharsetMap aLookupIanaName;
266cdf0e10cSrcweir 			            ::dbtools::OCharsetMap::const_iterator aLookup = aLookupIanaName.find(sIanaName, ::dbtools::OCharsetMap::IANA());
267cdf0e10cSrcweir 			            if (aLookup != aLookupIanaName.end() )
268cdf0e10cSrcweir                         {
269cdf0e10cSrcweir                             ::rtl::OUString sAdd;
270cdf0e10cSrcweir                             if ( RTL_TEXTENCODING_UTF8 == (*aLookup).getEncoding() )
271cdf0e10cSrcweir                             {
272cdf0e10cSrcweir                                 static const ::rtl::OUString s_sCharSetOp(RTL_CONSTASCII_USTRINGPARAM("useUnicode=true&"));
273cdf0e10cSrcweir                                 if ( !sCuttedUrl.matchIgnoreAsciiCase(s_sCharSetOp) )
274cdf0e10cSrcweir                                 {
275cdf0e10cSrcweir                                     sAdd = s_sCharSetOp;
276cdf0e10cSrcweir                                 } // if ( !sCuttedUrl.matchIgnoreAsciiCase(s_sCharSetOp) )
277cdf0e10cSrcweir                             } // if ( RTL_TEXTENCODING_UTF8 == (*aLookup).getEncoding() )
278cdf0e10cSrcweir                             if ( sCuttedUrl.indexOf('?') == -1 )
279cdf0e10cSrcweir                                 sCuttedUrl += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("?"));
280cdf0e10cSrcweir                             else
281cdf0e10cSrcweir                                 sCuttedUrl += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("&"));
282cdf0e10cSrcweir                             sCuttedUrl += sAdd;
283cdf0e10cSrcweir                             sCuttedUrl += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("characterEncoding="));
284cdf0e10cSrcweir                             sCuttedUrl += sIanaName;
285cdf0e10cSrcweir                         }
286cdf0e10cSrcweir                     }
287cdf0e10cSrcweir                 } // if ( !bIsODBC )
288cdf0e10cSrcweir 
289cdf0e10cSrcweir 				xConnection = xDriver->connect( sCuttedUrl, aConvertedProperties );
290cdf0e10cSrcweir 				if ( xConnection.is() )
291cdf0e10cSrcweir 				{
292cdf0e10cSrcweir 					OMetaConnection* pMetaConnection = NULL;
293cdf0e10cSrcweir 					// now we have to set the URL to get the correct answer for metadata()->getURL()
294cdf0e10cSrcweir 					Reference< XUnoTunnel> xTunnel(xConnection,UNO_QUERY);
295cdf0e10cSrcweir 					if ( xTunnel.is() )
296cdf0e10cSrcweir 					{
297cdf0e10cSrcweir 						pMetaConnection = reinterpret_cast<OMetaConnection*>(xTunnel->getSomething( OMetaConnection::getUnoTunnelImplementationId() ));
298cdf0e10cSrcweir 						if ( pMetaConnection )
299cdf0e10cSrcweir 							pMetaConnection->setURL(url);
300cdf0e10cSrcweir 					}
301cdf0e10cSrcweir 					m_aConnections.push_back(TWeakPair(WeakReferenceHelper(xConnection),TWeakConnectionPair(WeakReferenceHelper(),pMetaConnection)));
302cdf0e10cSrcweir 				}
303cdf0e10cSrcweir 			}
304cdf0e10cSrcweir 		}
305cdf0e10cSrcweir 		return xConnection;
306cdf0e10cSrcweir 	}
307cdf0e10cSrcweir 
308cdf0e10cSrcweir 	//--------------------------------------------------------------------
acceptsURL(const::rtl::OUString & url)309cdf0e10cSrcweir 	sal_Bool SAL_CALL ODriverDelegator::acceptsURL( const ::rtl::OUString& url ) throw (SQLException, RuntimeException)
310cdf0e10cSrcweir 	{
311cdf0e10cSrcweir 		Sequence< PropertyValue > info;
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         sal_Bool bOK =  url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:odbc:" ) )
314cdf0e10cSrcweir                     ||  url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:jdbc:" ) )
315cdf0e10cSrcweir                     ||  (   url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:mysqlc:" ) )
316cdf0e10cSrcweir                         &&  loadDriver( url, info ).is()
317cdf0e10cSrcweir                         );
318cdf0e10cSrcweir 		return bOK;
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir 
321cdf0e10cSrcweir 	//--------------------------------------------------------------------
getPropertyInfo(const::rtl::OUString & url,const Sequence<PropertyValue> &)322cdf0e10cSrcweir 	Sequence< DriverPropertyInfo > SAL_CALL ODriverDelegator::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/ ) throw (SQLException, RuntimeException)
323cdf0e10cSrcweir 	{
324cdf0e10cSrcweir 		::std::vector< DriverPropertyInfo > aDriverInfo;
325cdf0e10cSrcweir 		if ( !acceptsURL(url) )
326cdf0e10cSrcweir             return Sequence< DriverPropertyInfo >();
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aBoolean(2);
329cdf0e10cSrcweir 		aBoolean[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0"));
330cdf0e10cSrcweir 		aBoolean[1] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1"));
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 		aDriverInfo.push_back(DriverPropertyInfo(
334cdf0e10cSrcweir 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet"))
335cdf0e10cSrcweir 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CharSet of the database."))
336cdf0e10cSrcweir 				,sal_False
337cdf0e10cSrcweir 				,::rtl::OUString()
338cdf0e10cSrcweir 				,Sequence< ::rtl::OUString >())
339cdf0e10cSrcweir 				);
340cdf0e10cSrcweir 		aDriverInfo.push_back(DriverPropertyInfo(
341cdf0e10cSrcweir 				::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SuppressVersionColumns"))
342cdf0e10cSrcweir 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Display version columns (when available)."))
343cdf0e10cSrcweir 				,sal_False
344cdf0e10cSrcweir 				,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0"))
345cdf0e10cSrcweir 				,aBoolean)
346cdf0e10cSrcweir 				);
347cdf0e10cSrcweir         const T_DRIVERTYPE eType = lcl_getDriverType( url );
348cdf0e10cSrcweir 		if ( eType == D_JDBC )
349cdf0e10cSrcweir 		{
350cdf0e10cSrcweir 			aDriverInfo.push_back(DriverPropertyInfo(
351cdf0e10cSrcweir 					::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JavaDriverClass"))
352cdf0e10cSrcweir 					,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("The JDBC driver class name."))
353cdf0e10cSrcweir 					,sal_True
354cdf0e10cSrcweir 					,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.mysql.jdbc.Driver"))
355cdf0e10cSrcweir 					,Sequence< ::rtl::OUString >())
356cdf0e10cSrcweir 					);
357cdf0e10cSrcweir 		}
358*e53e79e9SAriel Constenla-Haile 		else if ( eType == D_NATIVE )
359*e53e79e9SAriel Constenla-Haile         {
360*e53e79e9SAriel Constenla-Haile             aDriverInfo.push_back(DriverPropertyInfo(
361*e53e79e9SAriel Constenla-Haile                     ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LocalSocket"))
362*e53e79e9SAriel Constenla-Haile                     ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
363*e53e79e9SAriel Constenla-Haile                         "The file path of a socket to connect to a local MySQL server."))
364*e53e79e9SAriel Constenla-Haile                     ,sal_False
365*e53e79e9SAriel Constenla-Haile                     ,::rtl::OUString()
366*e53e79e9SAriel Constenla-Haile                     ,Sequence< ::rtl::OUString >())
367*e53e79e9SAriel Constenla-Haile                     );
368*e53e79e9SAriel Constenla-Haile             aDriverInfo.push_back(DriverPropertyInfo(
369*e53e79e9SAriel Constenla-Haile                     ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NamedPipe"))
370*e53e79e9SAriel Constenla-Haile                     ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
371*e53e79e9SAriel Constenla-Haile                         "The name of a pipe to connect to a local MySQL server."))
372*e53e79e9SAriel Constenla-Haile                     ,sal_False
373*e53e79e9SAriel Constenla-Haile                     ,::rtl::OUString()
374*e53e79e9SAriel Constenla-Haile                     ,Sequence< ::rtl::OUString >())
375*e53e79e9SAriel Constenla-Haile                     );
376*e53e79e9SAriel Constenla-Haile         }
377cdf0e10cSrcweir 
378cdf0e10cSrcweir         return Sequence< DriverPropertyInfo >(&aDriverInfo[0],aDriverInfo.size());
379cdf0e10cSrcweir 	}
380cdf0e10cSrcweir 
381cdf0e10cSrcweir 	//--------------------------------------------------------------------
getMajorVersion()382cdf0e10cSrcweir 	sal_Int32 SAL_CALL ODriverDelegator::getMajorVersion(  ) throw (RuntimeException)
383cdf0e10cSrcweir 	{
384cdf0e10cSrcweir 		return 1;
385cdf0e10cSrcweir 	}
386cdf0e10cSrcweir 
387cdf0e10cSrcweir 	//--------------------------------------------------------------------
getMinorVersion()388cdf0e10cSrcweir 	sal_Int32 SAL_CALL ODriverDelegator::getMinorVersion(  ) throw (RuntimeException)
389cdf0e10cSrcweir 	{
390cdf0e10cSrcweir 		return 0;
391cdf0e10cSrcweir 	}
392cdf0e10cSrcweir 
393cdf0e10cSrcweir 	//--------------------------------------------------------------------
getDataDefinitionByConnection(const Reference<XConnection> & connection)394cdf0e10cSrcweir 	Reference< XTablesSupplier > SAL_CALL ODriverDelegator::getDataDefinitionByConnection( const Reference< XConnection >& connection ) throw (SQLException, RuntimeException)
395cdf0e10cSrcweir 	{
396cdf0e10cSrcweir 		::osl::MutexGuard aGuard( m_aMutex );
397cdf0e10cSrcweir 		checkDisposed(ODriverDelegator_BASE::rBHelper.bDisposed);
398cdf0e10cSrcweir 
399cdf0e10cSrcweir 		Reference< XTablesSupplier > xTab;
400cdf0e10cSrcweir 		Reference< XUnoTunnel> xTunnel(connection,UNO_QUERY);
401cdf0e10cSrcweir 		if ( xTunnel.is() )
402cdf0e10cSrcweir 		{
403cdf0e10cSrcweir 			OMetaConnection* pConnection = reinterpret_cast<OMetaConnection*>(xTunnel->getSomething( OMetaConnection::getUnoTunnelImplementationId() ));
404cdf0e10cSrcweir 			if ( pConnection )
405cdf0e10cSrcweir 			{
406cdf0e10cSrcweir 				TWeakPairVector::iterator aEnd = m_aConnections.end();
407cdf0e10cSrcweir 				for (TWeakPairVector::iterator i = m_aConnections.begin(); aEnd != i; ++i)
408cdf0e10cSrcweir 				{
409cdf0e10cSrcweir 					if ( i->second.second == pConnection )
410cdf0e10cSrcweir 					{
411cdf0e10cSrcweir 						xTab = Reference< XTablesSupplier >(i->second.first.get().get(),UNO_QUERY);
412cdf0e10cSrcweir 						if ( !xTab.is() )
413cdf0e10cSrcweir 						{
414cdf0e10cSrcweir 							xTab = new OMySQLCatalog(connection);
415cdf0e10cSrcweir 							i->second.first = WeakReferenceHelper(xTab);
416cdf0e10cSrcweir 						}
417cdf0e10cSrcweir 						break;
418cdf0e10cSrcweir 					}
419cdf0e10cSrcweir 				}
420cdf0e10cSrcweir 			}
421cdf0e10cSrcweir         } // if ( xTunnel.is() )
422cdf0e10cSrcweir         if ( !xTab.is() )
423cdf0e10cSrcweir         {
424cdf0e10cSrcweir             TWeakPairVector::iterator aEnd = m_aConnections.end();
425cdf0e10cSrcweir             for (TWeakPairVector::iterator i = m_aConnections.begin(); aEnd != i; ++i)
426cdf0e10cSrcweir             {
427cdf0e10cSrcweir                 Reference< XConnection > xTemp(i->first.get(),UNO_QUERY);
428cdf0e10cSrcweir                 if ( xTemp == connection )
429cdf0e10cSrcweir                 {
430cdf0e10cSrcweir                     xTab = Reference< XTablesSupplier >(i->second.first.get().get(),UNO_QUERY);
431cdf0e10cSrcweir                     if ( !xTab.is() )
432cdf0e10cSrcweir                     {
433cdf0e10cSrcweir                         xTab = new OMySQLCatalog(connection);
434cdf0e10cSrcweir                         i->second.first = WeakReferenceHelper(xTab);
435cdf0e10cSrcweir                     }
436cdf0e10cSrcweir                     break;
437cdf0e10cSrcweir                 }
438cdf0e10cSrcweir             }
439cdf0e10cSrcweir         }
440cdf0e10cSrcweir 		return xTab;
441cdf0e10cSrcweir 	}
442cdf0e10cSrcweir 
443cdf0e10cSrcweir 	//--------------------------------------------------------------------
getDataDefinitionByURL(const::rtl::OUString & url,const Sequence<PropertyValue> & info)444cdf0e10cSrcweir 	Reference< XTablesSupplier > SAL_CALL ODriverDelegator::getDataDefinitionByURL( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw (SQLException, RuntimeException)
445cdf0e10cSrcweir 	{
446cdf0e10cSrcweir 		if ( ! acceptsURL(url) )
447cdf0e10cSrcweir         {
448cdf0e10cSrcweir             ::connectivity::SharedResources aResources;
449cdf0e10cSrcweir             const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR);
450cdf0e10cSrcweir             ::dbtools::throwGenericSQLException(sMessage ,*this);
451cdf0e10cSrcweir         } // if ( ! acceptsURL(url) )
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 		return getDataDefinitionByConnection(connect(url,info));
454cdf0e10cSrcweir 	}
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 	// XServiceInfo
457cdf0e10cSrcweir 	// --------------------------------------------------------------------------------
458cdf0e10cSrcweir 	//------------------------------------------------------------------------------
getImplementationName_Static()459cdf0e10cSrcweir 	rtl::OUString ODriverDelegator::getImplementationName_Static(  ) throw(RuntimeException)
460cdf0e10cSrcweir 	{
461cdf0e10cSrcweir 		return rtl::OUString::createFromAscii("org.openoffice.comp.drivers.MySQL.Driver");
462cdf0e10cSrcweir 	}
463cdf0e10cSrcweir 	//------------------------------------------------------------------------------
getSupportedServiceNames_Static()464cdf0e10cSrcweir 	Sequence< ::rtl::OUString > ODriverDelegator::getSupportedServiceNames_Static(  ) throw (RuntimeException)
465cdf0e10cSrcweir 	{
466cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aSNS( 2 );
467cdf0e10cSrcweir 		aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver");
468cdf0e10cSrcweir 		aSNS[1] = ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.Driver");
469cdf0e10cSrcweir 		return aSNS;
470cdf0e10cSrcweir 	}
471cdf0e10cSrcweir 	//------------------------------------------------------------------
getImplementationName()472cdf0e10cSrcweir 	::rtl::OUString SAL_CALL ODriverDelegator::getImplementationName(  ) throw(RuntimeException)
473cdf0e10cSrcweir 	{
474cdf0e10cSrcweir 		return getImplementationName_Static();
475cdf0e10cSrcweir 	}
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	//------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)478cdf0e10cSrcweir 	sal_Bool SAL_CALL ODriverDelegator::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
479cdf0e10cSrcweir 	{
480cdf0e10cSrcweir 		Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
481cdf0e10cSrcweir 		const ::rtl::OUString* pSupported = aSupported.getConstArray();
482cdf0e10cSrcweir 		const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
483cdf0e10cSrcweir 		for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
484cdf0e10cSrcweir 			;
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 		return pSupported != pEnd;
487cdf0e10cSrcweir 	}
488cdf0e10cSrcweir 	//------------------------------------------------------------------
getSupportedServiceNames()489cdf0e10cSrcweir 	Sequence< ::rtl::OUString > SAL_CALL ODriverDelegator::getSupportedServiceNames(  ) throw(RuntimeException)
490cdf0e10cSrcweir 	{
491cdf0e10cSrcweir 		return getSupportedServiceNames_Static();
492cdf0e10cSrcweir 	}
493cdf0e10cSrcweir 	//------------------------------------------------------------------
494cdf0e10cSrcweir //........................................................................
495cdf0e10cSrcweir }	// namespace connectivity
496cdf0e10cSrcweir //........................................................................
497