Tag: cws_src680_hsqlcsv
User: fs      
Date: 2006/09/14 04:42:08

Modified:
   dba/connectivity/source/drivers/hsqldb/HConnection.cxx

Log:
 #i69526# initial implementation for the XTableUIprovider

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.5&r2=1.5.66.1
Delta lines:  +330 -109
-----------------------
--- HConnection.cxx     20 Jun 2006 01:29:36 -0000      1.5
+++ HConnection.cxx     14 Sep 2006 11:42:05 -0000      1.5.66.1
@@ -4,9 +4,9 @@
  *
  *  $RCSfile: HConnection.cxx,v $
  *
- *  $Revision: 1.5 $
+ *  $Revision: 1.5.66.1 $
  *
- *  last change: $Author: hr $ $Date: 2006/06/20 01:29:36 $
+ *  last change: $Author: fs $ $Date: 2006/09/14 11:42:05 $
  *
  *  The Contents of this file are made available subject to
  *  the terms of GNU Lesser General Public License Version 2.1.
@@ -34,25 +34,78 @@
  ************************************************************************/
 #include "hsqldb/HConnection.hxx"
 
+/** === 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
+/** === end UNO includes === **/
+
+#ifndef _CONNECTIVITY_DBTOOLS_HXX_
+#include <connectivity/dbtools.hxx>
+#endif
+
 #ifndef _COMPHELPER_SEQUENCE_HXX_
 #include <comphelper/sequence.hxx>
 #endif
 #ifndef COMPHELPER_INC_COMPHELPER_LISTENERNOTIFICATION_HXX
 #include <comphelper/listenernotification.hxx>
 #endif
+#ifndef COMPHELPER_COMPONENTCONTEXT_HXX
+#include <comphelper/componentcontext.hxx>
+#endif
+
+#ifndef TOOLS_DIAGNOSE_EX_H
+#include <tools/diagnose_ex.h>
+#endif
+
+#ifndef _RTL_USTRBUF_HXX_
+#include <rtl/ustrbuf.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;
+/** === 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::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;
+/** === end UNO using === **/
 
-namespace connectivity
+namespace connectivity { namespace hsqldb
 {
-       namespace hsqldb
-       {
         // 
=============================================================================
         // = FlushListeners
         // 
=============================================================================
@@ -75,46 +128,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
        {
@@ -133,25 +198,181 @@
                        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, "OConnectionWeakWrapper::flush: caught an 
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 ) throw (RuntimeException)
+    {
+        MethodGuard aGuard( *this );
+
+        impl_checkExistingTable_throw( _TableName );
+        if ( !impl_isTextTable_nothrow( _TableName ) )
+            return NULL;
+
+        // TODO
+        return NULL;
+    }
+
+    // -------------------------------------------------------------------
+    Reference< XInterface > SAL_CALL OHsqlConnection::getTableEditor( const 
::rtl::OUString& _TableName ) throw (IllegalArgumentException, 
WrappedTargetException, RuntimeException)
+    {
+        MethodGuard aGuard( *this );
+
+        impl_checkExistingTable_throw( _TableName );
+        if ( !impl_isTextTable_nothrow( _TableName ) )
+            return NULL;
+
+        Reference< XExecutableDialog > xEditor = 
impl_createLinkedTableEditor_throw( _TableName );
+        return xEditor.get();
+    }
+
+    // -------------------------------------------------------------------
+    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 ::rtl::OUString& 
_rTableName )
+    {
+        Reference< XExecutableDialog > xDialog;
+        try
+        {
+            ::comphelper::ComponentContext aContext( m_xORB );
+            Sequence< Any > aArguments(2);
+            aArguments[0] <<= NamedValue(
+                ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TableContainer" 
) ),
+                makeAny( impl_getTableContainer_throw() )
+            );
+            aArguments[1] <<= NamedValue(
+                ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TableName" ) ),
+                makeAny( _rTableName )
+            );
+            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 );
+    }
+
+    // -------------------------------------------------------------------
+    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 );
+            OSL_VERIFY( xTableHsqlType->next() );
+                // this should succeeed, as our precondition is that 
_rTableName denotes an
+                // existing table.
+
+            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;
+    }
 
+} } // namespace connectivity::hsqldb




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to