LCOV - code coverage report
Current view: top level - dbaccess/source/core/dataaccess - connection.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 191 392 48.7 %
Date: 2012-08-25 Functions: 26 59 44.1 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 265 1049 25.3 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*
       3                 :            :  * This file is part of the LibreOffice project.
       4                 :            :  *
       5                 :            :  * This Source Code Form is subject to the terms of the Mozilla Public
       6                 :            :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7                 :            :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8                 :            :  *
       9                 :            :  * This file incorporates work covered by the following license notice:
      10                 :            :  *
      11                 :            :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12                 :            :  *   contributor license agreements. See the NOTICE file distributed
      13                 :            :  *   with this work for additional information regarding copyright
      14                 :            :  *   ownership. The ASF licenses this file to you under the Apache
      15                 :            :  *   License, Version 2.0 (the "License"); you may not use this file
      16                 :            :  *   except in compliance with the License. You may obtain a copy of
      17                 :            :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18                 :            :  */
      19                 :            : 
      20                 :            : 
      21                 :            : #include "connection.hxx"
      22                 :            : #include "dbastrings.hrc"
      23                 :            : #include "datasource.hxx"
      24                 :            : #include "core_resource.hrc"
      25                 :            : #include "core_resource.hxx"
      26                 :            : #include "statement.hxx"
      27                 :            : #include "preparedstatement.hxx"
      28                 :            : #include "callablestatement.hxx"
      29                 :            : #include "ContainerMediator.hxx"
      30                 :            : #include "SingleSelectQueryComposer.hxx"
      31                 :            : #include "querycomposer.hxx"
      32                 :            : #include "sdbcoretools.hxx"
      33                 :            : 
      34                 :            : #include <com/sun/star/sdb/CommandType.hpp>
      35                 :            : #include <com/sun/star/sdbc/XDriverAccess.hpp>
      36                 :            : #include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp>
      37                 :            : #include <com/sun/star/reflection/XProxyFactory.hpp>
      38                 :            : #include <com/sun/star/beans/NamedValue.hpp>
      39                 :            : #include <connectivity/dbtools.hxx>
      40                 :            : #include <connectivity/dbmetadata.hxx>
      41                 :            : #include <connectivity/dbexception.hxx>
      42                 :            : #include <tools/debug.hxx>
      43                 :            : #include <tools/diagnose_ex.h>
      44                 :            : #include <osl/diagnose.h>
      45                 :            : #include <comphelper/extract.hxx>
      46                 :            : #include <comphelper/uno3.hxx>
      47                 :            : #include <comphelper/sequence.hxx>
      48                 :            : #include <cppuhelper/typeprovider.hxx>
      49                 :            : #include <rtl/logfile.hxx>
      50                 :            : 
      51                 :            : using namespace ::com::sun::star::uno;
      52                 :            : using namespace ::com::sun::star::lang;
      53                 :            : using namespace ::com::sun::star::util;
      54                 :            : using namespace ::com::sun::star::sdb;
      55                 :            : using namespace ::com::sun::star::sdb::application;
      56                 :            : using namespace ::com::sun::star::sdbc;
      57                 :            : using namespace ::com::sun::star::sdbcx;
      58                 :            : using namespace ::com::sun::star::beans;
      59                 :            : using namespace ::com::sun::star::reflection;
      60                 :            : using namespace ::com::sun::star::container;
      61                 :            : using namespace ::com::sun::star::graphic;
      62                 :            : using namespace ::osl;
      63                 :            : using namespace ::comphelper;
      64                 :            : using namespace ::cppu;
      65                 :            : using namespace ::dbtools;
      66                 :            : 
      67                 :            : using ::com::sun::star::sdb::tools::XTableName;
      68                 :            : using ::com::sun::star::sdb::tools::XObjectNames;
      69                 :            : using ::com::sun::star::sdb::tools::XDataSourceMetaData;
      70                 :            : 
      71                 :            : namespace dbaccess
      72                 :            : {
      73                 :            : 
      74                 :            : //==========================================================================
      75                 :            : // XServiceInfo
      76                 :          0 : rtl::OUString OConnection::getImplementationName(  ) throw(RuntimeException)
      77                 :            : {
      78                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getImplementationName" );
      79                 :          0 :     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.dbaccess.Connection"));
      80                 :            : }
      81                 :            : 
      82                 :          0 : sal_Bool OConnection::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException)
      83                 :            : {
      84                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::supportsService" );
      85 [ #  # ][ #  # ]:          0 :     return findValue(getSupportedServiceNames(), _rServiceName, sal_True).getLength() != 0;
      86                 :            : }
      87                 :            : 
      88                 :          0 : Sequence< ::rtl::OUString > OConnection::getSupportedServiceNames(  ) throw (RuntimeException)
      89                 :            : {
      90                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getSupportedServiceNames" );
      91                 :          0 :     Sequence< ::rtl::OUString > aSupported = OConnectionWrapper::getSupportedServiceNames();
      92                 :            : 
      93 [ #  # ][ #  # ]:          0 :     if ( 0 == findValue( aSupported, SERVICE_SDB_CONNECTION, sal_True ).getLength() )
         [ #  # ][ #  # ]
      94                 :            :     {
      95                 :          0 :         sal_Int32 nLen = aSupported.getLength();
      96         [ #  # ]:          0 :         aSupported.realloc( nLen + 1 );
      97 [ #  # ][ #  # ]:          0 :         aSupported[ nLen ] = SERVICE_SDB_CONNECTION;
      98                 :            :     }
      99                 :            : 
     100                 :          0 :     return aSupported;
     101                 :            : }
     102                 :            : 
     103                 :            : // XCloseable
     104                 :          4 : void OConnection::close(void) throw( SQLException, RuntimeException )
     105                 :            : {
     106                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::close" );
     107                 :            :     // being closed is the same as being disposed
     108                 :          4 :     dispose();
     109                 :          4 : }
     110                 :            : 
     111                 :          0 : sal_Bool OConnection::isClosed(void) throw( SQLException, RuntimeException )
     112                 :            : {
     113                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::isClosed" );
     114         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     115         [ #  # ]:          0 :     return !m_xMasterConnection.is();
     116                 :            : }
     117                 :            : 
     118                 :            : // XConnection
     119                 :         22 : Reference< XStatement >  OConnection::createStatement(void) throw( SQLException, RuntimeException )
     120                 :            : {
     121                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::createStatement" );
     122         [ +  - ]:         22 :     MutexGuard aGuard(m_aMutex);
     123         [ +  - ]:         22 :     checkDisposed();
     124                 :            : 
     125                 :         22 :     Reference< XStatement > xStatement;
     126 [ +  - ][ +  - ]:         22 :     Reference< XStatement > xMasterStatement = m_xMasterConnection->createStatement();
     127         [ +  - ]:         22 :     if ( xMasterStatement.is() )
     128                 :            :     {
     129 [ +  - ][ +  - ]:         22 :         xStatement = new OStatement(this, xMasterStatement);
         [ +  - ][ +  - ]
     130 [ +  - ][ +  - ]:         22 :         m_aStatements.push_back(WeakReferenceHelper(xStatement));
                 [ +  - ]
     131                 :            :     }
     132         [ +  - ]:         22 :     return xStatement;
     133                 :            : }
     134                 :        110 : Reference< XPreparedStatement >  OConnection::prepareStatement(const rtl::OUString& sql) throw( SQLException, RuntimeException )
     135                 :            : {
     136                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::prepareStatement" );
     137         [ +  - ]:        110 :     MutexGuard aGuard(m_aMutex);
     138         [ +  - ]:        110 :     checkDisposed();
     139                 :            : 
     140                 :            :     // TODO convert the SQL to SQL the driver understands
     141                 :        110 :     Reference< XPreparedStatement > xStatement;
     142 [ +  + ][ +  - ]:        110 :     Reference< XPreparedStatement > xMasterStatement = m_xMasterConnection->prepareStatement(sql);
     143         [ +  - ]:         88 :     if ( xMasterStatement.is() )
     144                 :            :     {
     145 [ +  - ][ +  - ]:         88 :         xStatement = new OPreparedStatement(this, xMasterStatement);
         [ +  - ][ +  - ]
     146 [ +  - ][ +  - ]:         88 :         m_aStatements.push_back(WeakReferenceHelper(xStatement));
                 [ +  - ]
     147                 :            :     }
     148         [ +  - ]:        110 :     return xStatement;
     149                 :            : }
     150                 :            : 
     151                 :          0 : Reference< XPreparedStatement >  OConnection::prepareCall(const rtl::OUString& sql) throw( SQLException, RuntimeException )
     152                 :            : {
     153                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::prepareCall" );
     154         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     155         [ #  # ]:          0 :     checkDisposed();
     156                 :            : 
     157                 :          0 :     Reference< XPreparedStatement > xStatement;
     158 [ #  # ][ #  # ]:          0 :     Reference< XPreparedStatement > xMasterStatement = m_xMasterConnection->prepareCall(sql);
     159         [ #  # ]:          0 :     if ( xMasterStatement.is() )
     160                 :            :     {
     161 [ #  # ][ #  # ]:          0 :         xStatement = new OCallableStatement(this, xMasterStatement);
         [ #  # ][ #  # ]
     162 [ #  # ][ #  # ]:          0 :         m_aStatements.push_back(WeakReferenceHelper(xStatement));
                 [ #  # ]
     163                 :            :     }
     164         [ #  # ]:          0 :     return xStatement;
     165                 :            : }
     166                 :            : 
     167                 :          0 : rtl::OUString OConnection::nativeSQL(const rtl::OUString& sql) throw( SQLException, RuntimeException )
     168                 :            : {
     169                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::nativeSQL" );
     170         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     171         [ #  # ]:          0 :     checkDisposed();
     172 [ #  # ][ #  # ]:          0 :     return m_xMasterConnection->nativeSQL(sql);
                 [ #  # ]
     173                 :            : }
     174                 :            : 
     175                 :          0 : void OConnection::setAutoCommit(sal_Bool autoCommit) throw( SQLException, RuntimeException )
     176                 :            : {
     177                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::setAutoCommit" );
     178         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     179         [ #  # ]:          0 :     checkDisposed();
     180 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->setAutoCommit(autoCommit);
                 [ #  # ]
     181                 :          0 : }
     182                 :            : 
     183                 :          0 : sal_Bool OConnection::getAutoCommit(void) throw( SQLException, RuntimeException )
     184                 :            : {
     185                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getAutoCommit" );
     186         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     187         [ #  # ]:          0 :     checkDisposed();
     188 [ #  # ][ #  # ]:          0 :     return m_xMasterConnection->getAutoCommit();
                 [ #  # ]
     189                 :            : }
     190                 :            : 
     191                 :          0 : void OConnection::commit(void) throw( SQLException, RuntimeException )
     192                 :            : {
     193                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::commit" );
     194         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     195         [ #  # ]:          0 :     checkDisposed();
     196 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->commit();
                 [ #  # ]
     197                 :          0 : }
     198                 :            : 
     199                 :          0 : void OConnection::rollback(void) throw( SQLException, RuntimeException )
     200                 :            : {
     201                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::rollback" );
     202         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     203         [ #  # ]:          0 :     checkDisposed();
     204 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->rollback();
                 [ #  # ]
     205                 :          0 : }
     206                 :            : 
     207                 :       4338 : Reference< XDatabaseMetaData >  OConnection::getMetaData(void) throw( SQLException, RuntimeException )
     208                 :            : {
     209                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getMetaData" );
     210         [ +  - ]:       4338 :     MutexGuard aGuard(m_aMutex);
     211         [ +  - ]:       4338 :     checkDisposed();
     212 [ +  - ][ +  - ]:       4338 :     return m_xMasterConnection->getMetaData();
                 [ +  - ]
     213                 :            : }
     214                 :            : 
     215                 :          0 : void OConnection::setReadOnly(sal_Bool readOnly) throw( SQLException, RuntimeException )
     216                 :            : {
     217                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::setReadOnly" );
     218         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     219         [ #  # ]:          0 :     checkDisposed();
     220 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->setReadOnly(readOnly);
                 [ #  # ]
     221                 :          0 : }
     222                 :            : 
     223                 :          0 : sal_Bool OConnection::isReadOnly(void) throw( SQLException, RuntimeException )
     224                 :            : {
     225                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::isReadOnly" );
     226         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     227         [ #  # ]:          0 :     checkDisposed();
     228 [ #  # ][ #  # ]:          0 :     return m_xMasterConnection->isReadOnly();
                 [ #  # ]
     229                 :            : }
     230                 :            : 
     231                 :          0 : void OConnection::setCatalog(const rtl::OUString& catalog) throw( SQLException, RuntimeException )
     232                 :            : {
     233                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::setCatalog" );
     234         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     235         [ #  # ]:          0 :     checkDisposed();
     236 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->setCatalog(catalog);
                 [ #  # ]
     237                 :          0 : }
     238                 :            : 
     239                 :          0 : rtl::OUString OConnection::getCatalog(void) throw( SQLException, RuntimeException )
     240                 :            : {
     241                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getCatalog" );
     242         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     243         [ #  # ]:          0 :     checkDisposed();
     244 [ #  # ][ #  # ]:          0 :     return m_xMasterConnection->getCatalog();
                 [ #  # ]
     245                 :            : }
     246                 :            : 
     247                 :          0 : void OConnection::setTransactionIsolation(sal_Int32 level) throw( SQLException, RuntimeException )
     248                 :            : {
     249                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::setTransactionIsolation" );
     250         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     251         [ #  # ]:          0 :     checkDisposed();
     252 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->setTransactionIsolation(level);
                 [ #  # ]
     253                 :          0 : }
     254                 :            : 
     255                 :          0 : sal_Int32 OConnection::getTransactionIsolation(void) throw( SQLException, RuntimeException )
     256                 :            : {
     257                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getTransactionIsolation" );
     258         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     259         [ #  # ]:          0 :     checkDisposed();
     260 [ #  # ][ #  # ]:          0 :     return m_xMasterConnection->getTransactionIsolation();
                 [ #  # ]
     261                 :            : }
     262                 :            : 
     263                 :          0 : Reference< XNameAccess >  OConnection::getTypeMap(void) throw( SQLException, RuntimeException )
     264                 :            : {
     265                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getTypeMap" );
     266         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     267         [ #  # ]:          0 :     checkDisposed();
     268 [ #  # ][ #  # ]:          0 :     return m_xMasterConnection->getTypeMap();
                 [ #  # ]
     269                 :            : }
     270                 :            : 
     271                 :          0 : void OConnection::setTypeMap(const Reference< XNameAccess > & typeMap) throw( SQLException, RuntimeException )
     272                 :            : {
     273                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::setTypeMap" );
     274         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     275         [ #  # ]:          0 :     checkDisposed();
     276 [ #  # ][ #  # ]:          0 :     m_xMasterConnection->setTypeMap(typeMap);
                 [ #  # ]
     277                 :          0 : }
     278                 :            : //==========================================================================
     279                 :            : //= OConnection
     280                 :            : //==========================================================================
     281                 :            : DBG_NAME(OConnection)
     282                 :            : 
     283                 :         56 : OConnection::OConnection(ODatabaseSource& _rDB
     284                 :            :                          , Reference< XConnection >& _rxMaster
     285                 :            :                          , const Reference< XMultiServiceFactory >& _rxORB)
     286                 :            :             :OSubComponent(m_aMutex, static_cast< OWeakObject* >(&_rDB))
     287                 :            :                 // as the queries reroute their refcounting to us, this m_aMutex is okey. If the queries
     288                 :            :                 // container would do it's own refcounting, it would have to aquire m_pMutex
     289                 :            :                 // same for tables
     290                 :         56 :             ,m_aTableFilter(_rDB.m_pImpl->m_aTableFilter)
     291                 :         56 :             ,m_aTableTypeFilter(_rDB.m_pImpl->m_aTableTypeFilter)
     292                 :            :             ,m_aContext( _rxORB )
     293                 :            :             ,m_xMasterConnection(_rxMaster)
     294                 :            :             ,m_pTables(NULL)
     295                 :            :             ,m_pViews(NULL)
     296                 :            :             ,m_aWarnings( Reference< XWarningsSupplier >( _rxMaster, UNO_QUERY ) )
     297                 :            :             ,m_nInAppend(0)
     298                 :            :             ,m_bSupportsViews(sal_False)
     299                 :            :             ,m_bSupportsUsers(sal_False)
     300 [ +  - ][ +  - ]:        168 :             ,m_bSupportsGroups(sal_False)
         [ +  - ][ +  - ]
           [ +  -  +  -  
           +  - ][ +  - ]
         [ +  - ][ +  - ]
                 [ +  - ]
     301                 :            : {
     302                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::OConnection" );
     303                 :            :     DBG_CTOR(OConnection,NULL);
     304         [ +  - ]:         56 :     osl_incrementInterlockedCount(&m_refCount);
     305                 :            : 
     306                 :            :     try
     307                 :            :     {
     308                 :            :         Reference< XProxyFactory > xProxyFactory(
     309 [ +  - ][ +  - ]:         56 :                 _rxORB->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.reflection.ProxyFactory"))),UNO_QUERY);
         [ +  - ][ +  - ]
     310 [ +  - ][ +  - ]:         56 :         Reference<XAggregation> xAgg = xProxyFactory->createProxy(_rxMaster.get());
         [ +  - ][ +  - ]
     311         [ +  - ]:         56 :         setDelegation(xAgg,m_refCount);
     312         [ #  # ]:         56 :         OSL_ENSURE(m_xConnection.is(), "OConnection::OConnection : invalid master connection !");
     313                 :            :     }
     314         [ #  # ]:          0 :     catch(const Exception&)
     315                 :            :     {
     316                 :            :         DBG_UNHANDLED_EXCEPTION();
     317                 :            :     }
     318                 :            : 
     319 [ +  - ][ +  - ]:         56 :     m_xTableUIProvider = m_xTableUIProvider.query( m_xMasterConnection );
     320                 :            : 
     321                 :            :     try
     322                 :            :     {
     323 [ +  - ][ +  - ]:         56 :         m_xQueries = new OQueryContainer(Reference< XNameContainer >(_rDB.getQueryDefinitions( ),UNO_QUERY), this,_rxORB, &m_aWarnings);
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     324                 :            : 
     325                 :         56 :         sal_Bool bCase = sal_True;
     326                 :         56 :         Reference<XDatabaseMetaData> xMeta;
     327                 :            :         try
     328                 :            :         {
     329 [ +  - ][ #  # ]:         56 :             xMeta = getMetaData();
                 [ +  - ]
     330 [ +  - ][ +  - ]:         56 :             bCase = xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers();
         [ +  - ][ +  - ]
     331                 :            :         }
     332         [ #  # ]:          0 :         catch(const SQLException&)
     333                 :            :         {
     334                 :            :         }
     335 [ +  - ][ +  - ]:         56 :         Reference< XNameContainer > xTableDefinitions(_rDB.getTables(),UNO_QUERY);
     336 [ +  - ][ +  - ]:         56 :         m_pTables = new OTableContainer( *this, m_aMutex, this, bCase, xTableDefinitions, this, &m_aWarnings,m_nInAppend );
                 [ +  - ]
     337                 :            : 
     338                 :            :         // check if we supports types
     339         [ +  - ]:         56 :         if ( xMeta.is() )
     340                 :            :         {
     341 [ +  - ][ +  - ]:         56 :             Reference<XResultSet> xRes = xMeta->getTableTypes();
     342         [ +  - ]:         56 :             if(xRes.is())
     343                 :            :             {
     344         [ +  - ]:         56 :                 ::rtl::OUString sView(RTL_CONSTASCII_USTRINGPARAM("VIEW"));
     345         [ +  - ]:         56 :                 Reference<XRow> xRow(xRes,UNO_QUERY);
     346 [ +  - ][ +  - ]:        112 :                 while(xRes->next())
                 [ +  + ]
     347                 :            :                 {
     348 [ +  - ][ +  - ]:         56 :                     ::rtl::OUString sValue = xRow->getString(1);
     349 [ +  - ][ +  - ]:         56 :                     if( !xRow->wasNull() && sValue == sView)
         [ +  - ][ -  + ]
                 [ -  + ]
     350                 :            :                     {
     351                 :         56 :                         m_bSupportsViews = sal_True;
     352                 :            :                         break;
     353                 :            :                     }
     354         [ +  - ]:        112 :                 }
     355                 :            :             }
     356                 :            :             // some dbs don't support this type so we should ask if a XViewsSupplier is supported
     357         [ +  - ]:         56 :             if(!m_bSupportsViews)
     358                 :            :             {
     359 [ +  - ][ +  - ]:         56 :                 Reference< XViewsSupplier > xMaster(getMasterTables(),UNO_QUERY);
     360                 :            : 
     361 [ #  # ][ #  # ]:         56 :                 if (xMaster.is() && xMaster->getViews().is())
         [ #  # ][ -  + ]
           [ -  +  #  # ]
                 [ -  + ]
     362                 :         56 :                     m_bSupportsViews = sal_True;
     363                 :            :             }
     364         [ -  + ]:         56 :             if(m_bSupportsViews)
     365                 :            :             {
     366 [ #  # ][ #  # ]:          0 :                 m_pViews = new OViewContainer(*this, m_aMutex, this, bCase,this,&m_aWarnings,m_nInAppend);
                 [ #  # ]
     367 [ #  # ][ #  # ]:          0 :                 m_pViews->addContainerListener(m_pTables);
                 [ #  # ]
     368 [ #  # ][ #  # ]:          0 :                 m_pTables->addContainerListener(m_pViews);
                 [ #  # ]
     369                 :            :             }
     370 [ +  - ][ +  - ]:         56 :             m_bSupportsUsers = Reference< XUsersSupplier> (getMasterTables(),UNO_QUERY).is();
     371 [ +  - ][ +  - ]:         56 :             m_bSupportsGroups = Reference< XGroupsSupplier> (getMasterTables(),UNO_QUERY).is();
     372                 :            : 
     373         [ +  - ]:         56 :             impl_checkTableQueryNames_nothrow();
     374         [ #  # ]:         56 :         }
     375                 :            :     }
     376         [ #  # ]:          0 :     catch(const Exception& )
     377                 :            :     {
     378                 :            :         DBG_UNHANDLED_EXCEPTION();
     379                 :            :     }
     380         [ +  - ]:         56 :     osl_decrementInterlockedCount( &m_refCount );
     381                 :         56 : }
     382                 :            : 
     383 [ +  - ][ +  - ]:         56 : OConnection::~OConnection()
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     384                 :            : {
     385 [ +  - ][ +  - ]:         56 :     delete m_pTables;
     386 [ -  + ][ #  # ]:         56 :     delete m_pViews;
     387                 :            :     DBG_DTOR(OConnection,NULL);
     388         [ -  + ]:        112 : }
     389                 :            : 
     390                 :            : // XWarningsSupplier
     391                 :          4 : Any SAL_CALL OConnection::getWarnings() throw(SQLException, RuntimeException)
     392                 :            : {
     393                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getWarnings" );
     394         [ +  - ]:          4 :     MutexGuard aGuard(m_aMutex);
     395         [ +  - ]:          4 :     checkDisposed();
     396 [ +  - ][ +  - ]:          4 :     return m_aWarnings.getWarnings();
     397                 :            : }
     398                 :            : 
     399                 :          4 : void SAL_CALL OConnection::clearWarnings(  ) throw(SQLException, RuntimeException)
     400                 :            : {
     401                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::clearWarnings" );
     402         [ +  - ]:          4 :     MutexGuard aGuard(m_aMutex);
     403         [ +  - ]:          4 :     checkDisposed();
     404 [ +  - ][ +  - ]:          4 :     m_aWarnings.clearWarnings();
     405                 :          4 : }
     406                 :            : 
     407                 :            : namespace
     408                 :            : {
     409                 :            :     struct CompareTypeByName : public ::std::binary_function< Type, Type, bool >
     410                 :            :     {
     411                 :        368 :         bool operator() ( const Type& _rLHS, const Type& _rRHS ) const
     412                 :            :         {
     413                 :        368 :             return _rLHS.getTypeName() < _rRHS.getTypeName();
     414                 :            :         }
     415                 :            :     };
     416                 :            :     typedef ::std::set< Type, CompareTypeByName > TypeBag;
     417                 :            : 
     418                 :          6 :     void lcl_copyTypes( TypeBag& _out_rTypes, const Sequence< Type >& _rTypes )
     419                 :            :     {
     420                 :          6 :         ::std::copy( _rTypes.getConstArray(), _rTypes.getConstArray() + _rTypes.getLength(),
     421         [ +  - ]:         12 :             ::std::insert_iterator< TypeBag >( _out_rTypes, _out_rTypes.begin() ) );
     422                 :          6 :     }
     423                 :            : }
     424                 :            : 
     425                 :            : // com::sun::star::lang::XTypeProvider
     426                 :          2 : Sequence< Type > OConnection::getTypes() throw (RuntimeException)
     427                 :            : {
     428                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getTypes" );
     429         [ +  - ]:          2 :     TypeBag aNormalizedTypes;
     430                 :            : 
     431 [ +  - ][ +  - ]:          2 :     lcl_copyTypes( aNormalizedTypes, OSubComponent::getTypes() );
                 [ +  - ]
     432 [ +  - ][ +  - ]:          2 :     lcl_copyTypes( aNormalizedTypes, OConnection_Base::getTypes() );
                 [ +  - ]
     433 [ +  - ][ +  - ]:          2 :     lcl_copyTypes( aNormalizedTypes, ::connectivity::OConnectionWrapper::getTypes() );
                 [ +  - ]
     434                 :            : 
     435         [ +  - ]:          2 :     if ( !m_bSupportsViews )
     436 [ +  - ][ +  - ]:          2 :         aNormalizedTypes.erase( XViewsSupplier::static_type() );
     437         [ +  - ]:          2 :     if ( !m_bSupportsUsers )
     438 [ +  - ][ +  - ]:          2 :         aNormalizedTypes.erase( XUsersSupplier::static_type() );
     439         [ +  - ]:          2 :     if ( !m_bSupportsGroups )
     440 [ +  - ][ +  - ]:          2 :         aNormalizedTypes.erase( XGroupsSupplier::static_type() );
     441                 :            : 
     442         [ +  - ]:          2 :     Sequence< Type > aSupportedTypes( aNormalizedTypes.size() );
     443 [ +  - ][ +  - ]:          2 :     ::std::copy( aNormalizedTypes.begin(), aNormalizedTypes.end(), aSupportedTypes.getArray() );
     444                 :          2 :     return aSupportedTypes;
     445                 :            : }
     446                 :            : 
     447                 :          0 : Sequence< sal_Int8 > OConnection::getImplementationId() throw (RuntimeException)
     448                 :            : {
     449                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getImplementationId" );
     450                 :          0 :     return getUnoTunnelImplementationId();
     451                 :            : }
     452                 :            : 
     453                 :            : // com::sun::star::uno::XInterface
     454                 :       2192 : Any OConnection::queryInterface( const Type & rType ) throw (RuntimeException)
     455                 :            : {
     456 [ +  - ][ +  - ]:       2192 :     if ( !m_bSupportsViews && rType.equals( XViewsSupplier::static_type() ) )
         [ +  + ][ +  + ]
     457                 :          4 :         return Any();
     458 [ +  - ][ +  - ]:       2188 :     else if ( !m_bSupportsUsers && rType.equals( XUsersSupplier::static_type() ) )
         [ -  + ][ -  + ]
     459                 :          0 :         return Any();
     460 [ +  - ][ +  - ]:       2188 :     else if ( !m_bSupportsGroups && rType.equals( XGroupsSupplier::static_type() ) )
         [ -  + ][ -  + ]
     461                 :          0 :         return Any();
     462         [ +  - ]:       2188 :     Any aReturn = OSubComponent::queryInterface( rType );
     463         [ +  + ]:       2188 :     if (!aReturn.hasValue())
     464                 :            :     {
     465         [ +  - ]:       1008 :         aReturn = OConnection_Base::queryInterface( rType );
     466         [ +  + ]:       1008 :         if (!aReturn.hasValue())
     467         [ +  - ]:        260 :             aReturn = OConnectionWrapper::queryInterface( rType );
     468                 :            :     }
     469                 :       2192 :     return aReturn;
     470                 :            : }
     471                 :            : 
     472                 :      39636 : void OConnection::acquire() throw ()
     473                 :            : {
     474                 :            :     // include this one when you want to see who calls it (call graph)
     475                 :      39636 :     OSubComponent::acquire();
     476                 :      39636 : }
     477                 :            : 
     478                 :      39636 : void OConnection::release() throw ()
     479                 :            : {
     480                 :            :     // include this one when you want to see who calls it (call graph)
     481                 :      39636 :     OSubComponent::release();
     482                 :      39636 : }
     483                 :            : 
     484                 :            : // OSubComponent
     485                 :         56 : void OConnection::disposing()
     486                 :            : {
     487                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::disposing" );
     488         [ +  - ]:         56 :     MutexGuard aGuard(m_aMutex);
     489                 :            : 
     490         [ +  - ]:         56 :     OSubComponent::disposing();
     491         [ +  - ]:         56 :     OConnectionWrapper::disposing();
     492                 :            : 
     493                 :         56 :     OWeakRefArrayIterator aEnd = m_aStatements.end();
     494 [ +  - ][ +  + ]:        166 :     for (OWeakRefArrayIterator i = m_aStatements.begin(); aEnd != i; ++i)
                 [ +  - ]
     495                 :            :     {
     496 [ +  - ][ +  - ]:        110 :         Reference<XComponent> xComp(i->get(),UNO_QUERY);
                 [ +  - ]
     497         [ +  - ]:        110 :         ::comphelper::disposeComponent(xComp);
     498                 :        110 :     }
     499                 :         56 :     m_aStatements.clear();
     500         [ +  - ]:         56 :     m_xMasterTables = NULL;
     501                 :            : 
     502         [ +  - ]:         56 :     if(m_pTables)
     503         [ +  - ]:         56 :         m_pTables->dispose();
     504         [ -  + ]:         56 :     if(m_pViews)
     505         [ #  # ]:          0 :         m_pViews->dispose();
     506                 :            : 
     507         [ +  - ]:         56 :     ::comphelper::disposeComponent(m_xQueries);
     508                 :            : 
     509                 :         56 :     OWeakRefArrayIterator aComposerEnd = m_aComposers.end();
     510 [ +  - ][ +  + ]:        132 :     for (OWeakRefArrayIterator j = m_aComposers.begin(); aComposerEnd != j; ++j)
                 [ +  - ]
     511                 :            :     {
     512 [ +  - ][ +  - ]:         76 :         Reference<XComponent> xComp(j->get(),UNO_QUERY);
                 [ +  - ]
     513         [ +  - ]:         76 :         ::comphelper::disposeComponent(xComp);
     514         [ #  # ]:         76 :     }
     515                 :            : 
     516                 :         56 :     m_aComposers.clear();
     517                 :            : 
     518                 :            :     try
     519                 :            :     {
     520         [ +  - ]:         56 :         if (m_xMasterConnection.is())
     521 [ +  - ][ +  - ]:         56 :             m_xMasterConnection->close();
     522                 :            :     }
     523         [ #  # ]:          0 :     catch(const Exception&)
     524                 :            :     {
     525                 :            :     }
     526 [ +  - ][ +  - ]:         56 :     m_xMasterConnection = NULL;
     527                 :         56 : }
     528                 :            : 
     529                 :            : // XChild
     530                 :        458 : Reference< XInterface >  OConnection::getParent(void) throw( RuntimeException )
     531                 :            : {
     532                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getParent" );
     533         [ +  - ]:        458 :     MutexGuard aGuard(m_aMutex);
     534         [ +  - ]:        458 :     checkDisposed();
     535         [ +  - ]:        458 :     return m_xParent;
     536                 :            : }
     537                 :            : 
     538                 :          0 : void OConnection::setParent(const Reference< XInterface > & /*Parent*/) throw( NoSupportException, RuntimeException )
     539                 :            : {
     540                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::setParent" );
     541         [ #  # ]:          0 :     throw NoSupportException();
     542                 :            : }
     543                 :            : 
     544                 :            : // XSQLQueryComposerFactory
     545                 :          0 : Reference< XSQLQueryComposer >  OConnection::createQueryComposer(void) throw( RuntimeException )
     546                 :            : {
     547                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::createQueryComposer" );
     548         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     549         [ #  # ]:          0 :     checkDisposed();
     550                 :            : 
     551                 :            :     //  Reference< XNumberFormatsSupplier >  xSupplier = pParent->getNumberFormatsSupplier();
     552 [ #  # ][ #  # ]:          0 :     Reference< XSQLQueryComposer >  xComposer( new OQueryComposer( this ) );
         [ #  # ][ #  # ]
     553 [ #  # ][ #  # ]:          0 :     m_aComposers.push_back(WeakReferenceHelper(xComposer));
                 [ #  # ]
     554         [ #  # ]:          0 :     return xComposer;
     555                 :            : }
     556                 :            : 
     557                 :         50 : void OConnection::impl_fillTableFilter()
     558                 :            : {
     559 [ +  - ][ +  - ]:         50 :     Reference<XPropertySet> xProp(getParent(),UNO_QUERY);
     560         [ +  - ]:         50 :     if ( xProp.is() )
     561                 :            :     {
     562 [ +  - ][ +  - ]:         50 :         xProp->getPropertyValue(PROPERTY_TABLEFILTER)       >>= m_aTableFilter;
         [ +  - ][ +  - ]
     563 [ +  - ][ +  - ]:         50 :         xProp->getPropertyValue(PROPERTY_TABLETYPEFILTER)   >>= m_aTableTypeFilter;
         [ +  - ][ +  - ]
     564                 :         50 :     }
     565                 :         50 : }
     566                 :            : 
     567                 :        564 : void OConnection::refresh(const Reference< XNameAccess >& _rToBeRefreshed)
     568                 :            : {
     569                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::refresh" );
     570 [ +  - ][ +  - ]:        564 :     if ( _rToBeRefreshed == Reference< XNameAccess >(m_pTables) )
                 [ +  - ]
     571                 :            :     {
     572 [ +  - ][ +  + ]:        564 :         if (m_pTables && !m_pTables->isInitialized())
                 [ +  + ]
     573                 :            :         {
     574                 :         50 :             impl_fillTableFilter();
     575                 :            :             // check if our "master connection" can supply tables
     576                 :         50 :             getMasterTables();
     577                 :            : 
     578 [ +  - ][ +  - ]:         50 :             if (m_xMasterTables.is() && m_xMasterTables->getTables().is())
         [ +  - ][ +  - ]
           [ +  -  #  # ]
                 [ +  - ]
     579                 :            :             {   // yes -> wrap them
     580         [ +  - ]:         50 :                 m_pTables->construct(m_xMasterTables->getTables(),m_aTableFilter, m_aTableTypeFilter);
     581                 :            :             }
     582                 :            :             else
     583                 :            :             {   // no -> use an own container
     584                 :          0 :                 m_pTables->construct(m_aTableFilter, m_aTableTypeFilter);
     585                 :            :             }
     586                 :            :         }
     587                 :            :     }
     588 [ #  # ][ #  # ]:          0 :     else if ( _rToBeRefreshed == Reference< XNameAccess >(m_pViews) )
                 [ #  # ]
     589                 :            :     {
     590 [ #  # ][ #  # ]:          0 :         if (m_pViews && !m_pViews->isInitialized())
                 [ #  # ]
     591                 :            :         {
     592         [ #  # ]:          0 :             impl_fillTableFilter();
     593                 :            :             // check if our "master connection" can supply tables
     594 [ #  # ][ #  # ]:          0 :             Reference< XViewsSupplier > xMaster(getMasterTables(),UNO_QUERY);
     595                 :            : 
     596 [ #  # ][ #  # ]:          0 :             if (xMaster.is() && xMaster->getViews().is())
         [ #  # ][ #  # ]
           [ #  #  #  # ]
                 [ #  # ]
     597 [ #  # ][ #  # ]:          0 :                 m_pViews->construct(xMaster->getViews(),m_aTableFilter, m_aTableTypeFilter);
                 [ #  # ]
     598                 :            :             else
     599         [ #  # ]:          0 :                 m_pViews->construct(m_aTableFilter, m_aTableTypeFilter);
     600                 :            :         }
     601                 :            :     }
     602                 :        564 : }
     603                 :            : 
     604                 :            : // XTablesSupplier
     605                 :        564 : Reference< XNameAccess >  OConnection::getTables() throw( RuntimeException )
     606                 :            : {
     607                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getTables" );
     608         [ +  - ]:        564 :     MutexGuard aGuard(m_aMutex);
     609         [ +  - ]:        564 :     checkDisposed();
     610                 :            : 
     611 [ +  - ][ +  - ]:        564 :     refresh(m_pTables);
                 [ +  - ]
     612                 :            : 
     613 [ +  - ][ +  - ]:        564 :     return m_pTables;
                 [ +  - ]
     614                 :            : }
     615                 :            : 
     616                 :          0 : Reference< XNameAccess > SAL_CALL OConnection::getViews(  ) throw(RuntimeException)
     617                 :            : {
     618                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getViews" );
     619         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     620         [ #  # ]:          0 :     checkDisposed();
     621                 :            : 
     622 [ #  # ][ #  # ]:          0 :     refresh(m_pViews);
                 [ #  # ]
     623                 :            : 
     624 [ #  # ][ #  # ]:          0 :     return m_pViews;
                 [ #  # ]
     625                 :            : }
     626                 :            : // XQueriesSupplier
     627                 :         76 : Reference< XNameAccess >  OConnection::getQueries(void) throw( RuntimeException )
     628                 :            : {
     629                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getQueries" );
     630         [ +  - ]:         76 :     MutexGuard aGuard(m_aMutex);
     631         [ +  - ]:         76 :     checkDisposed();
     632                 :            : 
     633         [ +  - ]:         76 :     return m_xQueries;
     634                 :            : }
     635                 :            : 
     636                 :            : // ::com::sun::star::sdb::XCommandPreparation
     637                 :          0 : Reference< XPreparedStatement >  SAL_CALL OConnection::prepareCommand( const ::rtl::OUString& command, sal_Int32 commandType ) throw(::com::sun::star::sdbc::SQLException, RuntimeException)
     638                 :            : {
     639                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::prepareCommand" );
     640         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     641         [ #  # ]:          0 :     checkDisposed();
     642                 :            : 
     643                 :          0 :     rtl::OUString aStatement;
     644      [ #  #  # ]:          0 :     switch (commandType)
     645                 :            :     {
     646                 :            :         case CommandType::TABLE:
     647                 :            :             {
     648         [ #  # ]:          0 :                 aStatement = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT * FROM "));
     649                 :            : 
     650                 :          0 :                 ::rtl::OUString sCatalog, sSchema, sTable;
     651 [ #  # ][ #  # ]:          0 :                 ::dbtools::qualifiedNameComponents( getMetaData(), command, sCatalog, sSchema, sTable, ::dbtools::eInDataManipulation );
     652 [ #  # ][ #  # ]:          0 :                 aStatement += ::dbtools::composeTableNameForSelect( this, sCatalog, sSchema, sTable );
     653                 :            :             }
     654                 :          0 :             break;
     655                 :            :         case CommandType::QUERY:
     656 [ #  # ][ #  # ]:          0 :             if ( m_xQueries->hasByName(command) )
                 [ #  # ]
     657                 :            :             {
     658 [ #  # ][ #  # ]:          0 :                 Reference< XPropertySet > xQuery(m_xQueries->getByName(command),UNO_QUERY);
                 [ #  # ]
     659 [ #  # ][ #  # ]:          0 :                 xQuery->getPropertyValue(PROPERTY_COMMAND) >>= aStatement;
                 [ #  # ]
     660                 :            :             }
     661                 :          0 :             break;
     662                 :            :         default:
     663                 :          0 :             aStatement = command;
     664                 :            :     }
     665                 :            :     // TODO EscapeProcessing
     666 [ #  # ][ #  # ]:          0 :     return prepareStatement(aStatement);
     667                 :            : }
     668                 :            : 
     669                 :         76 : Reference< XInterface > SAL_CALL OConnection::createInstance( const ::rtl::OUString& _sServiceSpecifier ) throw (Exception, RuntimeException)
     670                 :            : {
     671                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::createInstance" );
     672                 :         76 :     Reference< XServiceInfo > xRet;
     673 [ -  + ][ #  # ]:         76 :     if ( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER == _sServiceSpecifier || _sServiceSpecifier == "com.sun.star.sdb.SingleSelectQueryAnalyzer" )
                 [ +  - ]
           [ +  -  #  # ]
                 [ +  - ]
     674                 :            :     {
     675 [ +  - ][ +  - ]:         76 :         xRet = new OSingleSelectQueryComposer( getTables(),this, m_aContext );
         [ +  - ][ +  - ]
                 [ +  - ]
     676 [ +  - ][ +  - ]:         76 :         m_aComposers.push_back(WeakReferenceHelper(xRet));
                 [ +  - ]
     677                 :            :     }
     678                 :            :     else
     679                 :            :     {
     680         [ #  # ]:          0 :         if ( !_sServiceSpecifier.isEmpty() )
     681                 :            :         {
     682         [ #  # ]:          0 :             TSupportServices::iterator aFind = m_aSupportServices.find(_sServiceSpecifier);
     683         [ #  # ]:          0 :             if ( aFind == m_aSupportServices.end() )
     684                 :            :             {
     685         [ #  # ]:          0 :                 Sequence<Any> aArgs(1);
     686         [ #  # ]:          0 :                 Reference<XConnection> xMy(this);
     687 [ #  # ][ #  # ]:          0 :                 aArgs[0] <<= NamedValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ActiveConnection")),makeAny(xMy));
         [ #  # ][ #  # ]
     688 [ #  # ][ #  # ]:          0 :                 aFind = m_aSupportServices.insert(TSupportServices::value_type(_sServiceSpecifier,m_aContext.createComponentWithArguments(_sServiceSpecifier,aArgs))).first;
         [ #  # ][ #  # ]
                 [ #  # ]
     689                 :            :             }
     690                 :          0 :             return aFind->second;
     691                 :            :         }
     692                 :            :     }
     693         [ +  - ]:         76 :     return Reference< XInterface >(xRet,UNO_QUERY);
     694                 :            : }
     695                 :            : 
     696                 :          0 : Reference< XInterface > SAL_CALL OConnection::createInstanceWithArguments( const ::rtl::OUString& _sServiceSpecifier, const Sequence< Any >& /*Arguments*/ ) throw (Exception, RuntimeException)
     697                 :            : {
     698                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::createInstanceWithArguments" );
     699                 :          0 :     return createInstance(_sServiceSpecifier);
     700                 :            : }
     701                 :            : 
     702                 :          2 : Sequence< ::rtl::OUString > SAL_CALL OConnection::getAvailableServiceNames(  ) throw (RuntimeException)
     703                 :            : {
     704                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getAvailableServiceNames" );
     705                 :          2 :     Sequence< ::rtl::OUString > aRet(1);
     706 [ +  - ][ +  - ]:          2 :     aRet[0] = SERVICE_NAME_SINGLESELECTQUERYCOMPOSER;
     707                 :          2 :     return aRet;
     708                 :            : }
     709                 :            : 
     710                 :        218 : Reference< XTablesSupplier > OConnection::getMasterTables()
     711                 :            : {
     712                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getMasterTables" );
     713                 :            : // check if out "master connection" can supply tables
     714         [ +  + ]:        218 :     if(!m_xMasterTables.is())
     715                 :            :     {
     716                 :            :         try
     717                 :            :         {
     718         [ +  - ]:         56 :             Reference<XDatabaseMetaData> xMeta = getMetaData();
     719         [ +  - ]:         56 :             if ( xMeta.is() )
     720 [ +  - ][ +  - ]:         56 :                 m_xMasterTables = ::dbtools::getDataDefinitionByURLAndConnection( xMeta->getURL(), m_xMasterConnection, m_aContext.getLegacyServiceFactory() );
         [ +  - ][ +  - ]
         [ +  - ][ #  # ]
     721                 :            :         }
     722                 :          0 :         catch(const SQLException&)
     723                 :            :         {
     724                 :            :         }
     725                 :            :     }
     726                 :        218 :     return m_xMasterTables;
     727                 :            : }
     728                 :            : 
     729                 :            : // XUsersSupplier
     730                 :          0 : Reference< XNameAccess > SAL_CALL OConnection::getUsers(  ) throw(RuntimeException)
     731                 :            : {
     732                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getUsers" );
     733         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     734         [ #  # ]:          0 :     checkDisposed();
     735                 :            : 
     736 [ #  # ][ #  # ]:          0 :     Reference<XUsersSupplier> xUsr(getMasterTables(),UNO_QUERY);
     737 [ #  # ][ #  # ]:          0 :     return xUsr.is() ? xUsr->getUsers() : Reference< XNameAccess >();
         [ #  # ][ #  # ]
     738                 :            : }
     739                 :            : 
     740                 :            : // XGroupsSupplier
     741                 :          0 : Reference< XNameAccess > SAL_CALL OConnection::getGroups(  ) throw(RuntimeException)
     742                 :            : {
     743                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getGroups" );
     744         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     745         [ #  # ]:          0 :     checkDisposed();
     746 [ #  # ][ #  # ]:          0 :     Reference<XGroupsSupplier> xGrp(getMasterTables(),UNO_QUERY);
     747 [ #  # ][ #  # ]:          0 :     return xGrp.is() ? xGrp->getGroups() : Reference< XNameAccess >();
         [ #  # ][ #  # ]
     748                 :            : }
     749                 :            : 
     750                 :          0 : void OConnection::impl_loadConnectionTools_throw()
     751                 :            : {
     752                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::impl_loadConnectionTools_throw" );
     753         [ #  # ]:          0 :     Sequence< Any > aArguments( 1 );
     754 [ #  # ][ #  # ]:          0 :     aArguments[0] <<= NamedValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Connection" ) ), makeAny( Reference< XConnection >( this ) ) );
         [ #  # ][ #  # ]
                 [ #  # ]
     755                 :            : 
     756 [ #  # ][ #  # ]:          0 :     if ( !m_aContext.createComponentWithArguments( "com.sun.star.sdb.tools.ConnectionTools", aArguments, m_xConnectionTools ) )
     757 [ #  # ][ #  # ]:          0 :         throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "service not registered: com.sun.star.sdb.tools.ConnectionTools" ) ), *this );
         [ #  # ][ #  # ]
     758                 :          0 : }
     759                 :            : 
     760                 :          0 : Reference< XTableName > SAL_CALL OConnection::createTableName(  ) throw (RuntimeException)
     761                 :            : {
     762                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::createTableName" );
     763         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     764         [ #  # ]:          0 :     checkDisposed();
     765         [ #  # ]:          0 :     impl_loadConnectionTools_throw();
     766                 :            : 
     767 [ #  # ][ #  # ]:          0 :     return m_xConnectionTools->createTableName();
                 [ #  # ]
     768                 :            : }
     769                 :            : 
     770                 :          0 : Reference< XObjectNames > SAL_CALL OConnection::getObjectNames(  ) throw (RuntimeException)
     771                 :            : {
     772                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getObjectNames" );
     773         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     774         [ #  # ]:          0 :     checkDisposed();
     775         [ #  # ]:          0 :     impl_loadConnectionTools_throw();
     776                 :            : 
     777 [ #  # ][ #  # ]:          0 :     return m_xConnectionTools->getObjectNames();
                 [ #  # ]
     778                 :            : }
     779                 :            : 
     780                 :          0 : Reference< XDataSourceMetaData > SAL_CALL OConnection::getDataSourceMetaData(  ) throw (RuntimeException)
     781                 :            : {
     782                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getDataSourceMetaData" );
     783         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     784         [ #  # ]:          0 :     checkDisposed();
     785         [ #  # ]:          0 :     impl_loadConnectionTools_throw();
     786                 :            : 
     787 [ #  # ][ #  # ]:          0 :     return m_xConnectionTools->getDataSourceMetaData();
                 [ #  # ]
     788                 :            : }
     789                 :            : 
     790                 :          0 : Reference< ::com::sun::star::container::XNameAccess > SAL_CALL OConnection::getFieldsByCommandDescriptor( ::sal_Int32 commandType, const ::rtl::OUString& command, ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent >& keepFieldsAlive ) throw (::com::sun::star::sdbc::SQLException, RuntimeException)
     791                 :            : {
     792                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getFieldsByCommandDescriptor" );
     793         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     794         [ #  # ]:          0 :     checkDisposed();
     795         [ #  # ]:          0 :     impl_loadConnectionTools_throw();
     796                 :            : 
     797 [ #  # ][ #  # ]:          0 :     return m_xConnectionTools->getFieldsByCommandDescriptor(commandType,command,keepFieldsAlive);
                 [ #  # ]
     798                 :            : }
     799                 :            : 
     800                 :          0 : Reference< XSingleSelectQueryComposer > SAL_CALL OConnection::getComposer( ::sal_Int32 commandType, const ::rtl::OUString& command ) throw (::com::sun::star::uno::RuntimeException)
     801                 :            : {
     802                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getComposer" );
     803         [ #  # ]:          0 :     MutexGuard aGuard(m_aMutex);
     804         [ #  # ]:          0 :     checkDisposed();
     805         [ #  # ]:          0 :     impl_loadConnectionTools_throw();
     806                 :            : 
     807 [ #  # ][ #  # ]:          0 :     return m_xConnectionTools->getComposer(commandType,command);
                 [ #  # ]
     808                 :            : }
     809                 :            : 
     810                 :         56 : void OConnection::impl_checkTableQueryNames_nothrow()
     811                 :            : {
     812                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::impl_checkTableQueryNames_nothrow" );
     813 [ +  - ][ +  - ]:         56 :     DatabaseMetaData aMeta( static_cast< XConnection* >( this ) );
     814 [ +  - ][ +  - ]:         56 :     if ( !aMeta.supportsSubqueriesInFrom() )
     815                 :            :         // nothing to do
     816                 :         56 :         return;
     817                 :            : 
     818                 :            :     try
     819                 :            :     {
     820         [ #  # ]:          0 :         Reference< XNameAccess > xTables( getTables() );
     821 [ #  # ][ #  # ]:          0 :         Sequence< ::rtl::OUString > aTableNames( xTables->getElementNames() );
     822         [ #  # ]:          0 :         ::std::set< ::rtl::OUString > aSortedTableNames( aTableNames.getConstArray(), aTableNames.getConstArray() + aTableNames.getLength() );
     823                 :            : 
     824         [ #  # ]:          0 :         Reference< XNameAccess > xQueries( getQueries() );
     825 [ #  # ][ #  # ]:          0 :         Sequence< ::rtl::OUString > aQueryNames( xQueries->getElementNames() );
     826                 :            : 
     827         [ #  # ]:          0 :         for (   const ::rtl::OUString* pQueryName = aQueryNames.getConstArray();
     828                 :          0 :                 pQueryName != aQueryNames.getConstArray() + aQueryNames.getLength();
     829                 :            :                 ++pQueryName
     830                 :            :             )
     831                 :            :         {
     832 [ #  # ][ #  # ]:          0 :             if ( aSortedTableNames.find( *pQueryName ) != aSortedTableNames.end() )
     833                 :            :             {
     834         [ #  # ]:          0 :                 ::rtl::OUString sConflictWarning( DBACORE_RESSTRING( RID_STR_CONFLICTING_NAMES ) );
     835 [ #  # ][ #  # ]:          0 :                 m_aWarnings.appendWarning( sConflictWarning, "01SB0", *this );
     836                 :            :             }
     837 [ #  # ][ #  # ]:          0 :         }
                 [ #  # ]
     838                 :            :     }
     839         [ #  # ]:          0 :     catch( const Exception& )
     840                 :            :     {
     841                 :            :         DBG_UNHANDLED_EXCEPTION();
     842 [ +  - ][ -  + ]:         56 :     }
     843                 :            : }
     844                 :            : 
     845                 :          2 : Reference< XGraphic > SAL_CALL OConnection::getTableIcon( const ::rtl::OUString& _TableName, ::sal_Int32 _ColorMode ) throw (RuntimeException)
     846                 :            : {
     847                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getTableIcon" );
     848                 :          2 :     Reference< XGraphic > xReturn;
     849                 :            : 
     850                 :            :     // ask our aggregate
     851         [ -  + ]:          2 :     if ( m_xTableUIProvider.is() )
     852 [ #  # ][ #  # ]:          0 :         xReturn = m_xTableUIProvider->getTableIcon( _TableName, _ColorMode );
                 [ #  # ]
     853                 :            : 
     854                 :            :     // ask ourself
     855                 :            :     // well, we don't have own functionality here ...
     856                 :            :     // In the future, we might decide to delegate the complete handling to this interface.
     857                 :            :     // In this case, we would need to load the icon here.
     858                 :            : 
     859                 :          2 :     return xReturn;
     860                 :            : }
     861                 :            : 
     862                 :          0 : Reference< XInterface > SAL_CALL OConnection::getTableEditor( const Reference< XDatabaseDocumentUI >& _DocumentUI, const ::rtl::OUString& _TableName ) throw (IllegalArgumentException, WrappedTargetException, RuntimeException)
     863                 :            : {
     864                 :            :     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dataaccess", "Ocke.Janssen@sun.com", "OConnection::getTableEditor" );
     865                 :          0 :     Reference< XInterface > xReturn;
     866                 :            : 
     867                 :            :     // ask our aggregate
     868         [ #  # ]:          0 :     if ( m_xTableUIProvider.is() )
     869 [ #  # ][ #  # ]:          0 :         xReturn = m_xTableUIProvider->getTableEditor( _DocumentUI, _TableName );
                 [ #  # ]
     870                 :            : 
     871                 :            :     // ask ourself
     872                 :            :     // well, we don't have own functionality here ...
     873                 :            :     // In the future, we might decide to delegate the complete handling to this interface.
     874                 :            :     // In this case, we would need to instantiate an css.sdb.TableDesign here.
     875                 :            : 
     876                 :          0 :     return xReturn;
     877                 :            : }
     878                 :            : 
     879                 :            : }   // namespace dbaccess
     880                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10