xref: /trunk/main/connectivity/source/drivers/mysql/YDriver.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
119b5730f6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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