From 29b323c1489d6d4e2c20a32a035cee0f63f8ec88 Mon Sep 17 00:00:00 2001 From: Kurt Zenker Date: Tue, 3 Feb 2009 16:28:45 +0000 Subject: CWS-TOOLING: integrate CWS mysql1_OOO310 2009-01-29 13:25:23 +0100 fs r267126 : #i98559# 2009-01-29 10:29:23 +0100 fs r267100 : #i98559# 2009-01-29 09:56:20 +0100 fs r267098 : do not display empty schematas in the table list in the query designer 2009-01-29 09:40:28 +0100 fs r267097 : corrected acceptsURL 2009-01-28 11:17:42 +0100 fs r267042 : display empty catalogs/schemas, if indicated by the connection settings 2009-01-28 11:14:30 +0100 fs r267040 : +displayEmptyTableFolders 2009-01-28 11:03:28 +0100 fs r267036 : mysql:mysqlc, not mysql:mysql, for the native driver 2009-01-28 10:23:53 +0100 fs r267031 : select the first catalog/schema, if the guess for the current one did not match 2009-01-28 10:22:23 +0100 fs r267030 : select the first catalog/schema, if the guess for the current one did not match 2009-01-27 15:03:29 +0100 fs r266996 : #i10000# 2009-01-27 14:56:13 +0100 fs r266992 : #i20563# better (more dedicated) UI for the MySQL native driver's properties 2009-01-27 08:20:24 +0100 oj r266953 : enable sdbcx mysql driver for mysqlc 2009-01-27 08:20:09 +0100 oj r266952 : enable sdbcx mysql driver for mysqlc --- connectivity/inc/connectivity/dbmetadata.hxx | 4 ++ connectivity/source/commontools/dbmetadata.cxx | 24 +++++++ connectivity/source/drivers/mysql/YDriver.cxx | 91 +++++++++++++++++++------- connectivity/source/inc/mysql/YDriver.hxx | 9 ++- 4 files changed, 105 insertions(+), 23 deletions(-) diff --git a/connectivity/inc/connectivity/dbmetadata.hxx b/connectivity/inc/connectivity/dbmetadata.hxx index 3321d650c7..8eb822542b 100644 --- a/connectivity/inc/connectivity/dbmetadata.hxx +++ b/connectivity/inc/connectivity/dbmetadata.hxx @@ -150,6 +150,10 @@ namespace dbtools * \return when relations are supported, otherwise */ bool supportsColumnAliasInOrderBy() const; + + /** determines whether in the application UI, empty table folders (aka catalogs/schemas) should be displayed + */ + bool displayEmptyTableFolders() const; }; //........................................................................ diff --git a/connectivity/source/commontools/dbmetadata.cxx b/connectivity/source/commontools/dbmetadata.cxx index bc57ed806f..1116e3ce2d 100644 --- a/connectivity/source/commontools/dbmetadata.cxx +++ b/connectivity/source/commontools/dbmetadata.cxx @@ -72,6 +72,7 @@ namespace dbtools using ::com::sun::star::beans::PropertyValue; using ::com::sun::star::beans::XPropertySetInfo; using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_SET_THROW; /** === end UNO using === **/ namespace BooleanComparisonMode = ::com::sun::star::sdb::BooleanComparisonMode; @@ -308,7 +309,30 @@ namespace dbtools OSL_VERIFY( setting >>= doGenerate ); return doGenerate; } + //-------------------------------------------------------------------- + bool DatabaseMetaData::displayEmptyTableFolders() const + { + bool doDisplay( true ); +#ifdef IMPLEMENTED_LATER + Any setting; + if ( lcl_getConnectionSetting( "DisplayEmptyTableFolders", *m_pImpl, setting ) ) + OSL_VERIFY( setting >>= doDisplay ); +#else + try + { + Reference< XDatabaseMetaData > xMeta( m_pImpl->xConnectionMetaData, UNO_SET_THROW ); + ::rtl::OUString sConnectionURL( xMeta->getURL() ); + doDisplay = sConnectionURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:mysqlc" ) ) == 0; + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } +#endif + return doDisplay; + } + //........................................................................ } // namespace dbtools //........................................................................ diff --git a/connectivity/source/drivers/mysql/YDriver.cxx b/connectivity/source/drivers/mysql/YDriver.cxx index 45ac900589..d3577ba691 100644 --- a/connectivity/source/drivers/mysql/YDriver.cxx +++ b/connectivity/source/drivers/mysql/YDriver.cxx @@ -68,7 +68,7 @@ namespace connectivity ODriverDelegator::ODriverDelegator(const Reference< XMultiServiceFactory >& _rxFactory) : ODriverDelegator_BASE(m_aMutex) ,m_xFactory(_rxFactory) - ,m_bUseOdbc(sal_True) + ,m_eDriverType(D_ODBC) { } @@ -78,6 +78,7 @@ namespace connectivity try { ::comphelper::disposeComponent(m_xODBCDriver); + ::comphelper::disposeComponent(m_xNativeDriver); TJDBCDrivers::iterator aIter = m_aJdbcDrivers.begin(); TJDBCDrivers::iterator aEnd = m_aJdbcDrivers.end(); for ( ;aIter != aEnd;++aIter ) @@ -112,11 +113,28 @@ namespace connectivity return _sUrl.copy(0,16).equalsAscii("sdbc:mysql:odbc:"); } //-------------------------------------------------------------------- + sal_Bool isNativeUrl(const ::rtl::OUString& _sUrl) + { + return (!_sUrl.compareTo(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:mysql:mysqlc:")), sizeof("sdbc:mysql:mysqlc:")-1)); + } + //-------------------------------------------------------------------- + T_DRIVERTYPE lcl_getDriverType(const ::rtl::OUString& _sUrl) + { + T_DRIVERTYPE eRet = D_JDBC; + if ( isOdbcUrl(_sUrl ) ) + eRet = D_ODBC; + else if ( isNativeUrl(_sUrl ) ) + eRet = D_NATIVE; + return eRet; + } + //-------------------------------------------------------------------- ::rtl::OUString transformUrl(const ::rtl::OUString& _sUrl) { ::rtl::OUString sNewUrl = _sUrl.copy(11); if ( isOdbcUrl( _sUrl ) ) sNewUrl = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:")) + sNewUrl; + else if ( isNativeUrl( _sUrl ) ) + sNewUrl = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:")) + sNewUrl; else { sNewUrl = sNewUrl.copy(5); @@ -139,7 +157,7 @@ namespace connectivity return xDriver; } //-------------------------------------------------------------------- - Sequence< PropertyValue > lcl_convertProperties(sal_Bool _bOdbc,const Sequence< PropertyValue >& info) + Sequence< PropertyValue > lcl_convertProperties(T_DRIVERTYPE _eType,const Sequence< PropertyValue >& info,const ::rtl::OUString& _sUrl) { ::std::vector aProps; const PropertyValue* pSupported = info.getConstArray(); @@ -151,7 +169,7 @@ namespace connectivity aProps.push_back( *pSupported ); } - if ( _bOdbc ) + if ( _eType == D_ODBC ) { aProps.push_back( PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Silent")) @@ -164,7 +182,7 @@ namespace connectivity ,makeAny(sal_True) ,PropertyState_DIRECT_VALUE) ); } - else + else if ( _eType == D_JDBC ) { aProps.push_back( PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JavaDriverClass")) @@ -172,6 +190,14 @@ namespace connectivity ,makeAny(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.mysql.jdbc.Driver"))) ,PropertyState_DIRECT_VALUE) ); } + else + { + aProps.push_back( PropertyValue( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NewURL")) + ,0 + ,makeAny(_sUrl) + ,PropertyState_DIRECT_VALUE) ); + } aProps.push_back( PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsAutoRetrievingEnabled")) ,0 @@ -195,20 +221,25 @@ namespace connectivity Reference< XDriver > ODriverDelegator::loadDriver( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) { Reference< XDriver > xDriver; - ::rtl::OUString sCuttedUrl = transformUrl(url); - sal_Bool bIsODBC = isOdbcUrl( url ); - if ( bIsODBC ) + const ::rtl::OUString sCuttedUrl = transformUrl(url); + const T_DRIVERTYPE eType = lcl_getDriverType( url ); + if ( eType == D_ODBC ) { if ( !m_xODBCDriver.is() ) m_xODBCDriver = lcl_loadDriver(m_xFactory,sCuttedUrl); xDriver = m_xODBCDriver; + } // if ( bIsODBC ) + else if ( eType == D_NATIVE ) + { + if ( !m_xNativeDriver.is() ) + m_xNativeDriver = lcl_loadDriver(m_xFactory,sCuttedUrl); + xDriver = m_xNativeDriver; } else { ::comphelper::NamedValueCollection aSettings( info ); ::rtl::OUString sDriverClass(RTL_CONSTASCII_USTRINGPARAM("com.mysql.jdbc.Driver")); sDriverClass = aSettings.getOrDefault( "JavaDriverClass", sDriverClass ); - ::rtl::OUString sCharSet = aSettings.getOrDefault( "CharSet", ::rtl::OUString() ); TJDBCDrivers::iterator aFind = m_aJdbcDrivers.find(sDriverClass); if ( aFind == m_aJdbcDrivers.end() ) @@ -230,9 +261,9 @@ namespace connectivity if ( xDriver.is() ) { ::rtl::OUString sCuttedUrl = transformUrl(url); - const sal_Bool bIsODBC = isOdbcUrl( url ); - Sequence< PropertyValue > aConvertedProperties = lcl_convertProperties(bIsODBC,info); - if ( !bIsODBC ) + const T_DRIVERTYPE eType = lcl_getDriverType( url ); + Sequence< PropertyValue > aConvertedProperties = lcl_convertProperties(eType,info,url); + if ( eType == D_JDBC ) { ::comphelper::NamedValueCollection aSettings( info ); ::rtl::OUString sIanaName = aSettings.getOrDefault( "CharSet", ::rtl::OUString() ); @@ -284,14 +315,13 @@ namespace connectivity //-------------------------------------------------------------------- sal_Bool SAL_CALL ODriverDelegator::acceptsURL( const ::rtl::OUString& url ) throw (SQLException, RuntimeException) { - sal_Bool bOK = sal_False; - if ( url.getLength() >= 16 ) - { - ::rtl::OUString sPrefix = url.copy(0,16); - bOK = sPrefix.equalsAscii("sdbc:mysql:odbc:"); - if ( !bOK ) - bOK = sPrefix.equalsAscii("sdbc:mysql:jdbc:"); - } + Sequence< PropertyValue > info; + + sal_Bool bOK = url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:odbc:" ) ) + || url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:jdbc:" ) ) + || ( url.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "sdbc:mysql:mysqlc:" ) ) + && loadDriver( url, info ).is() + ); return bOK; } @@ -302,8 +332,6 @@ namespace connectivity if ( !acceptsURL(url) ) return Sequence< DriverPropertyInfo >(); - sal_Bool bIsODBC = isOdbcUrl( url ); - Sequence< ::rtl::OUString > aBoolean(2); aBoolean[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0")); aBoolean[1] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1")); @@ -323,7 +351,8 @@ namespace connectivity ,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0")) ,aBoolean) ); - if ( !bIsODBC ) + const T_DRIVERTYPE eType = lcl_getDriverType( url ); + if ( eType == D_JDBC ) { aDriverInfo.push_back(DriverPropertyInfo( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("JavaDriverClass")) @@ -377,6 +406,24 @@ namespace connectivity } } } + } // if ( xTunnel.is() ) + if ( !xTab.is() ) + { + TWeakPairVector::iterator aEnd = m_aConnections.end(); + for (TWeakPairVector::iterator i = m_aConnections.begin(); aEnd != i; ++i) + { + Reference< XConnection > xTemp(i->first.get(),UNO_QUERY); + if ( xTemp == connection ) + { + xTab = Reference< XTablesSupplier >(i->second.first.get().get(),UNO_QUERY); + if ( !xTab.is() ) + { + xTab = new OMySQLCatalog(connection); + i->second.first = WeakReferenceHelper(xTab); + } + break; + } + } } return xTab; } diff --git a/connectivity/source/inc/mysql/YDriver.hxx b/connectivity/source/inc/mysql/YDriver.hxx index f9f921edce..45d2fb8ab8 100644 --- a/connectivity/source/inc/mysql/YDriver.hxx +++ b/connectivity/source/inc/mysql/YDriver.hxx @@ -59,6 +59,12 @@ namespace connectivity typedef ::std::pair< ::com::sun::star::uno::WeakReferenceHelper,TWeakConnectionPair> TWeakPair; typedef ::std::vector< TWeakPair > TWeakPairVector; DECLARE_STL_USTRINGACCESS_MAP(::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver >,TJDBCDrivers); + typedef enum + { + D_ODBC, + D_JDBC, + D_NATIVE + } T_DRIVERTYPE; /** delegates all calls to the orignal driver and extend the existing one with the SDBCX layer. @@ -72,9 +78,10 @@ namespace connectivity // of all the Connection objects // for this Driver ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver > m_xODBCDriver; + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver > m_xNativeDriver; ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xFactory; ::rtl::OUString m_sOldDriverClass; - sal_Bool m_bUseOdbc; + T_DRIVERTYPE m_eDriverType; /** load the driver we want to delegate. The m_xODBCDriver or m_xDBCDriver may be if the driver could not be loaded. -- cgit v1.2.3