User: kz Date: 2006/10/05 06:39:49 Modified: dba/connectivity/source/drivers/hsqldb/HConnection.cxx
Log: INTEGRATION: CWS hsqlcsvstage1 (1.6.2); FILE MERGED 2006/09/21 06:56:31 fs 1.6.2.3: table editor not yet implemented in this CWS 2006/09/20 19:19:44 fs 1.6.2.2: #i10000# 2006/09/20 11:06:19 fs 1.6.2.1: #i69696#, being stage 1 of issue #i69526#: merging changes from CWS hsqlcsv herein File Changes: Directory: /dba/connectivity/source/drivers/hsqldb/ =================================================== File [changed]: HConnection.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/hsqldb/HConnection.cxx?r1=1.7&r2=1.8 Delta lines: +402 -105 ----------------------- --- HConnection.cxx 25 Sep 2006 09:42:19 -0000 1.7 +++ HConnection.cxx 5 Oct 2006 13:39:47 -0000 1.8 @@ -35,7 +35,44 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" + +#ifndef CONNECTIVITY_HSQLDB_CONNECTION_HXX #include "hsqldb/HConnection.hxx" +#endif +#ifndef CONNECTIVITY_HSQLUI_HRC +#include "hsqlui.hrc" +#endif + +/** === begin UNO includes === **/ +#ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_ +#include <com/sun/star/beans/NamedValue.hpp> +#endif +#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ +#include <com/sun/star/container/XNameAccess.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBCX_XDATADEFINITIONSUPPLIER_HPP_ +#include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp> +#endif +#ifndef _COM_SUN_STAR_LANG_SERVICENOTREGISTEREDEXCEPTION_HPP_ +#include <com/sun/star/lang/ServiceNotRegisteredException.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_ +#include <com/sun/star/sdbc/XRow.hpp> +#endif +#ifndef _COM_SUN_STAR_GRAPHIC_XGRAPHICPROVIDER_HPP_ +#include <com/sun/star/graphic/XGraphicProvider.hpp> +#endif +#ifndef _COM_SUN_STAR_GRAPHIC_GRAPHICCOLORMODE_HPP_ +#include <com/sun/star/graphic/GraphicColorMode.hpp> +#endif +#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ +#include <com/sun/star/beans/PropertyValue.hpp> +#endif +/** === end UNO includes === **/ + +#ifndef _CONNECTIVITY_DBTOOLS_HXX_ +#include <connectivity/dbtools.hxx> +#endif #ifndef _COMPHELPER_SEQUENCE_HXX_ #include <comphelper/sequence.hxx> @@ -43,19 +80,58 @@ #ifndef COMPHELPER_INC_COMPHELPER_LISTENERNOTIFICATION_HXX #include <comphelper/listenernotification.hxx> #endif +#ifndef COMPHELPER_COMPONENTCONTEXT_HXX +#include <comphelper/componentcontext.hxx> +#endif -using namespace connectivity::hsqldb; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::sdbc; -using namespace ::com::sun::star::sdbcx; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::util; +#ifndef _CPPUHELPER_EXC_HLP_HXX_ +#include <cppuhelper/exc_hlp.hxx> +#endif + +#ifndef TOOLS_DIAGNOSE_EX_H +#include <tools/diagnose_ex.h> +#endif -namespace connectivity +#ifndef _RTL_USTRBUF_HXX_ +#include <rtl/ustrbuf.hxx> +#endif + +/** === begin UNO using === **/ +using ::com::sun::star::util::XFlushListener; +using ::com::sun::star::lang::EventObject; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::uno::RuntimeException; +using ::com::sun::star::uno::UNO_QUERY; +using ::com::sun::star::uno::UNO_QUERY_THROW; +using ::com::sun::star::sdbc::XStatement; +using ::com::sun::star::sdbc::XConnection; +using ::com::sun::star::sdbcx::XDataDefinitionSupplier; +using ::com::sun::star::sdbcx::XTablesSupplier; +using ::com::sun::star::container::XNameAccess; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::beans::NamedValue; +using ::com::sun::star::lang::WrappedTargetException; +using ::com::sun::star::lang::ServiceNotRegisteredException; +using ::com::sun::star::sdbc::XDriver; +using ::com::sun::star::lang::XMultiServiceFactory; +using ::com::sun::star::graphic::XGraphic; +using ::com::sun::star::graphic::XGraphicProvider; +using ::com::sun::star::uno::XInterface; +using ::com::sun::star::lang::IllegalArgumentException; +using ::com::sun::star::ui::dialogs::XExecutableDialog; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::makeAny; +using ::com::sun::star::sdbc::XResultSet; +using ::com::sun::star::sdbc::XDatabaseMetaData; +using ::com::sun::star::sdbc::XRow; +using ::com::sun::star::sdb::application::XDatabaseDocumentUI; +using ::com::sun::star::beans::PropertyValue; +/** === end UNO using === **/ +namespace GraphicColorMode = ::com::sun::star::graphic::GraphicColorMode; + +namespace connectivity { namespace hsqldb { - namespace hsqldb - { // ============================================================================= // = FlushListeners // ============================================================================= @@ -78,46 +154,58 @@ _rxListener->flushed( _rEvent ); return true; // continue notifying the other listeners, if any } - } -} -// ============================================================================= -// = OConnectionWeakWrapper -// ============================================================================= -// ----------------------------------------------------------------------------- -void SAL_CALL OConnectionWeakWrapper::disposing(void) -{ - m_pFlushListeners->disposing( EventObject( *this ) ); - OConnectionWeakWrapper_BASE::disposing(); + // ============================================================================= + // = OHsqlConnection + // ============================================================================= + // ----------------------------------------------------------------------------- + void SAL_CALL OHsqlConnection::disposing(void) + { + m_aFlushListeners.disposeAndClear( EventObject( *this ) ); + OHsqlConnection_BASE::disposing(); OConnectionWrapper::disposing(); -} -// ----------------------------------------------------------------------------- -OConnectionWeakWrapper::OConnectionWeakWrapper( + } + // ----------------------------------------------------------------------------- + OHsqlConnection::OHsqlConnection( const Reference< XDriver > _rxDriver, const Reference< XConnection >& _xConnection ,const Reference< XMultiServiceFactory>& _xORB ) - :OConnectionWeakWrapper_BASE( m_aMutex ) - ,m_pFlushListeners( new FlushListeners( m_aMutex ) ) -{ + :OHsqlConnection_BASE( m_aMutex ) + ,m_aFlushListeners( m_aMutex ) + ,m_xDriver( _rxDriver ) + ,m_xORB( _xORB ) + { setDelegation(_xConnection,_xORB,m_refCount); -} -// ----------------------------------------------------------------------------- -OConnectionWeakWrapper::~OConnectionWeakWrapper() -{ - if ( !OConnectionWeakWrapper_BASE::rBHelper.bDisposed ) + } + // ----------------------------------------------------------------------------- + OHsqlConnection::~OHsqlConnection() + { + if ( !OHsqlConnection_BASE::rBHelper.bDisposed ) { osl_incrementInterlockedCount( &m_refCount ); dispose(); } -} -// ----------------------------------------------------------------------------- -IMPLEMENT_FORWARD_XINTERFACE2(OConnectionWeakWrapper,OConnectionWeakWrapper_BASE,OConnectionWrapper) -IMPLEMENT_SERVICE_INFO(OConnectionWeakWrapper, "com.sun.star.sdbc.drivers.hsqldb.OConnectionWeakWrapper", "com.sun.star.sdbc.Connection") -IMPLEMENT_FORWARD_XTYPEPROVIDER2(OConnectionWeakWrapper,OConnectionWeakWrapper_BASE,OConnectionWrapper) -// XFlushable -//-------------------------------------------------------------------- -void SAL_CALL OConnectionWeakWrapper::flush( ) throw (RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(rBHelper.bDisposed); + } + // ----------------------------------------------------------------------------- + IMPLEMENT_FORWARD_XINTERFACE2(OHsqlConnection,OHsqlConnection_BASE,OConnectionWrapper) + IMPLEMENT_SERVICE_INFO(OHsqlConnection, "com.sun.star.sdbc.drivers.hsqldb.OHsqlConnection", "com.sun.star.sdbc.Connection") + IMPLEMENT_FORWARD_XTYPEPROVIDER2(OHsqlConnection,OHsqlConnection_BASE,OConnectionWrapper) + + //-------------------------------------------------------------------- + ::osl::Mutex& OHsqlConnection::getMutex() const + { + return m_aMutex; + } + + //-------------------------------------------------------------------- + void OHsqlConnection::checkDisposed() const + { + ::connectivity::checkDisposed( rBHelper.bDisposed ); + } + + // XFlushable + //-------------------------------------------------------------------- + void SAL_CALL OHsqlConnection::flush( ) throw (RuntimeException) + { + MethodGuard aGuard( *this ); try { @@ -136,24 +224,233 @@ Reference< XStatement > xStmt( m_xConnection->createStatement(), UNO_QUERY_THROW ); xStmt->execute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CHECKPOINT" ) ) ); } - m_pFlushListeners->notify( EventObject( *this ) ); + + EventObject aFlushedEvent( *this ); + m_aFlushListeners.notifyEach( &XFlushListener::flushed, aFlushedEvent ); } catch(::com::sun::star::uno::Exception&) { + OSL_ENSURE( false, "OHsqlConnection::flush: caught an exception!" ); + } } -} -//-------------------------------------------------------------------- -void SAL_CALL OConnectionWeakWrapper::addFlushListener( const Reference< XFlushListener >& l ) throw (RuntimeException) -{ - m_pFlushListeners->addTypedListener( l ); -} + //-------------------------------------------------------------------- + void SAL_CALL OHsqlConnection::addFlushListener( const Reference< XFlushListener >& l ) throw (RuntimeException) + { + MethodGuard aGuard( *this ); + m_aFlushListeners.addInterface( l ); + } -//-------------------------------------------------------------------- -void SAL_CALL OConnectionWeakWrapper::removeFlushListener( const Reference< XFlushListener >& l ) throw (RuntimeException) -{ - m_pFlushListeners->removeTypedListener( l ); -} + //-------------------------------------------------------------------- + void SAL_CALL OHsqlConnection::removeFlushListener( const Reference< XFlushListener >& l ) throw (RuntimeException) + { + MethodGuard aGuard( *this ); + m_aFlushListeners.removeInterface( l ); + } + + // ------------------------------------------------------------------- + Reference< XGraphic > SAL_CALL OHsqlConnection::getTableIcon( const ::rtl::OUString& _TableName, ::sal_Int32 _ColorMode ) throw (RuntimeException) + { + MethodGuard aGuard( *this ); + + impl_checkExistingTable_throw( _TableName ); + if ( !impl_isTextTable_nothrow( _TableName ) ) + return NULL; -// ----------------------------------------------------------------------------- + return impl_getTextTableIcon_nothrow( _ColorMode ); + } + + // ------------------------------------------------------------------- + Reference< XInterface > SAL_CALL OHsqlConnection::getTableEditor( const Reference< XDatabaseDocumentUI >& _DocumentUI, const ::rtl::OUString& _TableName ) throw (IllegalArgumentException, WrappedTargetException, RuntimeException) + { + MethodGuard aGuard( *this ); + + impl_checkExistingTable_throw( _TableName ); + if ( !impl_isTextTable_nothrow( _TableName ) ) + return NULL; + + if ( !_DocumentUI.is() ) + throw IllegalArgumentException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "The provided DocumentUI is not allowed to be NULL." ) ), + *this, + 0 + ); + // TODO: resource + +// Reference< XExecutableDialog > xEditor = impl_createLinkedTableEditor_throw( _DocumentUI, _TableName ); +// return xEditor.get(); + return NULL; + // editor not yet implemented in this CWS + } + + // ------------------------------------------------------------------- + Reference< XNameAccess > OHsqlConnection::impl_getTableContainer_throw() + { + Reference< XNameAccess > xTables; + try + { + Reference< XConnection > xMe( *this, UNO_QUERY ); + Reference< XDataDefinitionSupplier > xDefinitionsSupp( m_xDriver, UNO_QUERY_THROW ); + Reference< XTablesSupplier > xTablesSupp( xDefinitionsSupp->getDataDefinitionByConnection( xMe ), UNO_QUERY_THROW ); + xTables.set( xTablesSupp->getTables(), UNO_QUERY_THROW ); + } + catch( const RuntimeException& ) { throw; } + catch( const Exception& ) + { + throw WrappedTargetException( ::rtl::OUString::createFromAscii( "error while obtaining the connection's table container" ), + *this, ::cppu::getCaughtException() ); + // TODO: resource + } + + OSL_POSTCOND( xTables.is(), "OHsqlConnection::impl_getTableContainer_throw: post condition not met!" ); + return xTables; + } + + // ------------------------------------------------------------------- + Reference< XExecutableDialog > OHsqlConnection::impl_createLinkedTableEditor_throw( const Reference< XDatabaseDocumentUI >& _rxDocumentUI, const ::rtl::OUString& _rTableName ) + { + OSL_PRECOND( _rxDocumentUI.is(), "OHsqlConnection::impl_createLinkedTableEditor_throw: illegal document UI!" ); + Reference< XExecutableDialog > xDialog; + try + { + ::comphelper::ComponentContext aContext( m_xORB ); + Sequence< Any > aArguments(3); + aArguments[0] <<= NamedValue( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TableContainer" ) ), + makeAny( impl_getTableContainer_throw() ) + ); + aArguments[1] <<= NamedValue( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TableName" ) ), + makeAny( _rTableName ) + ); + aArguments[2] <<= NamedValue( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ParentWindow" ) ), + makeAny( _rxDocumentUI->getApplicationMainWindow() ) + ); + + aContext.createComponentWithArguments( "com.sun.star.sdb.hsql.LinkedTableEditor", aArguments, xDialog ); + if ( !xDialog.is() ) + throw ServiceNotRegisteredException( ::rtl::OUString::createFromAscii( "com.sun.star.sdb.hsql.LinkedTableEditor" ), *this ); + } + catch( const RuntimeException& ) { throw; } + catch( const Exception& ) + { + throw WrappedTargetException( ::rtl::OUString::createFromAscii( "error while creating the table editor dialog" ), + *this, ::cppu::getCaughtException() ); + // TODO: resource + } + return xDialog; + } + + // ------------------------------------------------------------------- + void OHsqlConnection::impl_checkExistingTable_throw( const ::rtl::OUString& _rTableName ) + { + bool bDoesExist = false; + try + { + Reference< XNameAccess > xTables( impl_getTableContainer_throw(), UNO_QUERY_THROW ); + if ( xTables.is() ) + bDoesExist = xTables->hasByName( _rTableName ); + } + catch( const Exception& ) + { + // that's a serious error in impl_getTableContainer_throw, or hasByName, however, we're only + // allowed to throw an IllegalArgumentException ourself + DBG_UNHANDLED_EXCEPTION(); + } + + if ( !bDoesExist ) + throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "There is no table named " ) ) + _rTableName, + *this, 0 ); + // TODO: resource + } + + // ------------------------------------------------------------------- + bool OHsqlConnection::impl_isTextTable_nothrow( const ::rtl::OUString& _rTableName ) + { + bool bIsTextTable = false; + try + { + Reference< XConnection > xMe( *this, UNO_QUERY_THROW ); + + // split the fully qualified name + Reference< XDatabaseMetaData > xMetaData( xMe->getMetaData(), UNO_QUERY_THROW ); + ::rtl::OUString sCatalog, sSchema, sName; + ::dbtools::qualifiedNameComponents( xMetaData, _rTableName, sCatalog, sSchema, sName, ::dbtools::eComplete ); + + // get the table information + ::rtl::OUStringBuffer sSQL; + sSQL.appendAscii( "SELECT HSQLDB_TYPE FROM INFORMATION_SCHEMA.SYSTEM_TABLES" ); + sSQL.appendAscii( " WHERE " ); + if ( sCatalog.getLength() ) + { + sSQL.appendAscii( "TABLE_CAT = '" ); + sSQL.append ( sCatalog ); + sSQL.appendAscii( "' AND " ); + } + if ( sSchema.getLength() ) + { + sSQL.appendAscii( "' TABLE_SCHEM = '" ); + sSQL.append ( sSchema ); + sSQL.appendAscii( "' AND " ); + } + sSQL.appendAscii( "TABLE_NAME = '" ); + sSQL.append ( sName ); + sSQL.appendAscii( "' AND TABLE_TYPE = '" ); + sSQL.appendAscii( "TABLE'" ); + + Reference< XStatement > xStatement( xMe->createStatement(), UNO_QUERY_THROW ); + Reference< XResultSet > xTableHsqlType( xStatement->executeQuery( sSQL.makeStringAndClear() ), UNO_QUERY_THROW ); + + if ( xTableHsqlType->next() ) // might not succeed in case of VIEWs + { + Reference< XRow > xValueAccess( xTableHsqlType, UNO_QUERY_THROW ); + ::rtl::OUString sTableType = xValueAccess->getString( 1 ); + bIsTextTable = sTableType.equalsAscii( "TEXT" ); + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + + return bIsTextTable; + } + + // ------------------------------------------------------------------- + Reference< XGraphic > OHsqlConnection::impl_getTextTableIcon_nothrow( ::sal_Int32 _ColorMode ) + { + Reference< XGraphic > xGraphic; + try + { + // create a graphic provider + Reference< XGraphicProvider > xProvider; + if ( m_xORB.is() ) + xProvider.set( m_xORB->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.graphic.GraphicProvider" ) ) ), UNO_QUERY_THROW ); + + // assemble the image URL + ::rtl::OUStringBuffer aImageURL; + aImageURL.appendAscii( "private:graphicrepository/" ); // load the graphic from the global graphic repository + aImageURL.appendAscii( "database/" ); // the relative path within the images.zip + if ( _ColorMode == GraphicColorMode::NORMAL ) + aImageURL.appendAscii( LINKED_TEXT_TABLE_IMAGE_RESOURCE ); + else + aImageURL.appendAscii( LINKED_TEXT_TABLE_IMAGE_RESOURCE_HC ); + // the name of the graphic to use + ::rtl::OUString sImageURL( aImageURL.makeStringAndClear() ); + + // ask the provider to obtain a graphic + Sequence< PropertyValue > aMediaProperties( 1 ); + aMediaProperties[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ); + aMediaProperties[0].Value <<= sImageURL; + xGraphic = xProvider->queryGraphic( aMediaProperties ); + OSL_ENSURE( xGraphic.is(), "OHsqlConnection::impl_getTextTableIcon_nothrow: the provider did not give us a graphic object!" ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return xGraphic; + } +} } // namespace connectivity::hsqldb --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
