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