User: kz Date: 2006/12/13 08:13:46 Modified: dba/connectivity/source/commontools/dbmetadata.cxx
Log: INTEGRATION: CWS dba22ui (1.4.20); FILE MERGED 2006/12/05 15:02:43 fs 1.4.20.2: copying the fix for #i72252# from CWS dba22b to dba22ui - intended for the latter, but wrongly checked in into the former 2006/12/05 09:46:53 fs 1.4.20.1: copying the fix for #i72252# from CWS dba22b to dba22ui - intended for the latter, but wrongly checked in into the former File Changes: Directory: /dba/connectivity/source/commontools/ ================================================ File [changed]: dbmetadata.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/commontools/dbmetadata.cxx?r1=1.4&r2=1.5 Delta lines: +79 -19 --------------------- --- dbmetadata.cxx 17 Sep 2006 02:02:44 -0000 1.4 +++ dbmetadata.cxx 13 Dec 2006 16:13:43 -0000 1.5 @@ -56,11 +56,18 @@ #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ #include <com/sun/star/beans/PropertyValue.hpp> #endif +#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSETINFO_HPP_ +#include <com/sun/star/beans/XPropertySetInfo.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA2_HPP_ +#include <com/sun/star/sdbc/XDatabaseMetaData2.hpp> +#endif /** === end UNO includes === **/ -#ifndef TOOLS_DIAGNOSE_EX_H #include <tools/diagnose_ex.h> -#endif +#include <comphelper/namedvaluecollection.hxx> + +#include <boost/optional.hpp> //........................................................................ namespace dbtools @@ -72,6 +79,7 @@ using ::com::sun::star::sdbc::XConnection; using ::com::sun::star::sdbc::XConnection; using ::com::sun::star::sdbc::XDatabaseMetaData; + using ::com::sun::star::sdbc::XDatabaseMetaData2; using ::com::sun::star::lang::IllegalArgumentException; using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::Any; @@ -80,6 +88,8 @@ using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::uno::Sequence; using ::com::sun::star::beans::PropertyValue; + using ::com::sun::star::beans::XPropertySetInfo; + using ::com::sun::star::uno::UNO_QUERY; /** === end UNO using === **/ //==================================================================== @@ -89,11 +99,15 @@ { Reference< XConnection > xConnection; Reference< XDatabaseMetaData > xConnectionMetaData; + + ::boost::optional< ::rtl::OUString > sCachedIdentifierQuoteString; + ::boost::optional< ::rtl::OUString > sCachedCatalogSeparator; }; //-------------------------------------------------------------------- namespace { + //................................................................ static void lcl_construct( DatabaseMetaData_Impl& _metaDataImpl, const Reference< XConnection >& _connection ) { _metaDataImpl.xConnection = _connection; @@ -105,32 +119,36 @@ throw IllegalArgumentException(); } - static void lcl_checkConnected( DatabaseMetaData_Impl& _metaDataImpl ) + //................................................................ + static void lcl_checkConnected( const DatabaseMetaData_Impl& _metaDataImpl ) { - if ( !_metaDataImpl.xConnection.is() ) + if ( !_metaDataImpl.xConnection.is() || !_metaDataImpl.xConnectionMetaData.is() ) throwSQLException( "not connected", SQL_CONNECTION_DOES_NOT_EXIST, NULL ); } - static bool lcl_getDataSourceSetting( const sal_Char* _asciiName, const DatabaseMetaData_Impl& _metaData, Any& _out_setting ) + //................................................................ + static bool lcl_getConnectionSettings( const sal_Char* _asciiName, const DatabaseMetaData_Impl& _metaData, Any& _out_setting ) { try { - Reference< XChild > connectionAsChild( _metaData.xConnection, UNO_QUERY_THROW ); - Reference< XPropertySet > dataSource( connectionAsChild->getParent(), UNO_QUERY_THROW ); - - Sequence< PropertyValue > dataSourceSettings; - OSL_VERIFY( dataSource->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Info" ) ) ) >>= dataSourceSettings ); - - const PropertyValue* setting( dataSourceSettings.getConstArray() ); - const PropertyValue* settingEnd( setting + dataSourceSettings.getLength() ); - for ( ; setting != settingEnd; ++setting ) - { - if ( setting->Name.equalsAscii( _asciiName ) ) + Reference< XChild > xConnectionAsChild( _metaData.xConnection, UNO_QUERY ); + if ( xConnectionAsChild.is() ) { - _out_setting = setting->Value; - return true; - } + Reference< XPropertySet > xDataSource( xConnectionAsChild->getParent(), UNO_QUERY_THROW ); + Reference< XPropertySet > xDataSourceSettings( + xDataSource->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Settings" ) ) ), + UNO_QUERY_THROW ); + + _out_setting = xDataSourceSettings->getPropertyValue( ::rtl::OUString::createFromAscii( _asciiName ) ); + } + else + { + Reference< XDatabaseMetaData2 > xExtendedMetaData( _metaData.xConnectionMetaData, UNO_QUERY_THROW ); + ::comphelper::NamedValueCollection aSettings( xExtendedMetaData->getConnectionInfo() ); + _out_setting = aSettings.get( _asciiName ); + return _out_setting.hasValue(); } + return true; } catch( const Exception& ) { @@ -138,6 +156,24 @@ } return false; } + + //................................................................ + static const ::rtl::OUString& lcl_getConnectionStringSetting( + const DatabaseMetaData_Impl& _metaData, ::boost::optional< ::rtl::OUString >& _cachedSetting, + ::rtl::OUString (SAL_CALL XDatabaseMetaData::*_getter)() ) + { + lcl_checkConnected( _metaData ); + + if ( !_cachedSetting ) + { + try + { + _cachedSetting.reset( (_metaData.xConnectionMetaData.get()->*_getter)() ); + } + catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } + } + return *_cachedSetting; + } } //==================================================================== @@ -204,13 +240,37 @@ } //-------------------------------------------------------------------- + const ::rtl::OUString& SAL_CALL DatabaseMetaData::getIdentifierQuoteString() const + { + return lcl_getConnectionStringSetting( *m_pImpl, m_pImpl->sCachedIdentifierQuoteString, &XDatabaseMetaData::getIdentifierQuoteString ); + } + + //-------------------------------------------------------------------- + const ::rtl::OUString& SAL_CALL DatabaseMetaData::getCatalogSeparator() const + { + return lcl_getConnectionStringSetting( *m_pImpl, m_pImpl->sCachedCatalogSeparator, &XDatabaseMetaData::getCatalogSeparator ); + } + + //-------------------------------------------------------------------- bool SAL_CALL DatabaseMetaData::restrictIdentifiersToSQL92() const { + lcl_checkConnected( *m_pImpl ); + bool restrict( false ); Any setting; - if ( lcl_getDataSourceSetting( "EnableSQL92Check", *m_pImpl, setting ) ) + if ( lcl_getConnectionSettings( "EnableSQL92Check", *m_pImpl, setting ) ) OSL_VERIFY( setting >>= restrict ); return restrict; + } + + //-------------------------------------------------------------------- + bool SAL_CALL DatabaseMetaData::generateASBeforeCorrelationName() const + { + bool doGenerate( true ); + Any setting; + if ( lcl_getConnectionSettings( "GenerateASBeforeCorrelationName", *m_pImpl, setting ) ) + OSL_VERIFY( setting >>= doGenerate ); + return doGenerate; } //........................................................................ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
