LCOV - code coverage report
Current view: top level - libreoffice/ucbhelper/source/provider - resultsetmetadata.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 170 0.0 %
Date: 2012-12-27 Functions: 0 33 0.0 %
Legend: Lines: hit not hit

          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             : /**************************************************************************
      22             :                                 TODO
      23             :  **************************************************************************
      24             : 
      25             :  *************************************************************************/
      26             : 
      27             : #include "osl/diagnose.h"
      28             : #include <com/sun/star/beans/Property.hpp>
      29             : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      30             : #include <com/sun/star/io/XInputStream.hpp>
      31             : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
      32             : #include <com/sun/star/sdbc/DataType.hpp>
      33             : #include <com/sun/star/sdbc/XArray.hpp>
      34             : #include <com/sun/star/sdbc/XBlob.hpp>
      35             : #include <com/sun/star/sdbc/XClob.hpp>
      36             : #include <com/sun/star/sdbc/XRef.hpp>
      37             : #include <com/sun/star/util/Date.hpp>
      38             : #include <com/sun/star/util/Time.hpp>
      39             : #include <com/sun/star/util/DateTime.hpp>
      40             : #include <com/sun/star/ucb/PropertiesManager.hpp>
      41             : #include <ucbhelper/resultsetmetadata.hxx>
      42             : 
      43             : using namespace com::sun::star::beans;
      44             : using namespace com::sun::star::io;
      45             : using namespace com::sun::star::lang;
      46             : using namespace com::sun::star::sdbc;
      47             : using namespace com::sun::star::ucb;
      48             : using namespace com::sun::star::uno;
      49             : using namespace com::sun::star::util;
      50             : 
      51             : using ::rtl::OUString;
      52             : 
      53             : namespace ucbhelper_impl {
      54             : 
      55           0 : struct ResultSetMetaData_Impl
      56             : {
      57             :     osl::Mutex                                      m_aMutex;
      58             :     std::vector< ::ucbhelper::ResultSetColumnData > m_aColumnData;
      59             :     sal_Bool                                        m_bObtainedTypes;
      60             :     sal_Bool                                        m_bGlobalReadOnlyValue;
      61             : 
      62           0 :     ResultSetMetaData_Impl( sal_Int32 nSize )
      63             :     : m_aColumnData( nSize ), m_bObtainedTypes( sal_False ),
      64           0 :       m_bGlobalReadOnlyValue( sal_True ) {}
      65             : 
      66           0 :     ResultSetMetaData_Impl(
      67             :         const std::vector< ::ucbhelper::ResultSetColumnData >& rColumnData )
      68             :     : m_aColumnData( rColumnData ), m_bObtainedTypes( sal_False ),
      69           0 :       m_bGlobalReadOnlyValue( sal_False ) {}
      70             : };
      71             : 
      72             : }
      73             : 
      74             : using namespace ucbhelper_impl;
      75             : 
      76             : namespace ucbhelper {
      77             : 
      78             : //=========================================================================
      79             : //=========================================================================
      80             : //
      81             : // ResultSetMetaData Implementation.
      82             : //
      83             : //=========================================================================
      84             : //=========================================================================
      85             : 
      86           0 : ResultSetMetaData::ResultSetMetaData(
      87             :                         const Reference< XComponentContext >& rxContext,
      88             :                         const Sequence< Property >& rProps,
      89             :                         sal_Bool bReadOnly )
      90           0 : : m_pImpl( new ResultSetMetaData_Impl( rProps.getLength() ) ),
      91             :   m_xContext( rxContext ),
      92             :   m_aProps( rProps ),
      93           0 :   m_bReadOnly( bReadOnly )
      94             : {
      95           0 : }
      96             : 
      97             : //=========================================================================
      98           0 : ResultSetMetaData::ResultSetMetaData(
      99             :                         const Reference< XComponentContext >& rxContext,
     100             :                         const Sequence< Property >& rProps,
     101             :                         const std::vector< ResultSetColumnData >& rColumnData )
     102           0 : : m_pImpl( new ResultSetMetaData_Impl( rColumnData ) ),
     103             :   m_xContext( rxContext ),
     104             :   m_aProps( rProps ),
     105           0 :   m_bReadOnly( sal_True )
     106             : {
     107             :     OSL_ENSURE( rColumnData.size() == sal_uInt32( rProps.getLength() ),
     108             :                 "ResultSetMetaData ctor - different array sizes!" );
     109           0 : }
     110             : 
     111             : //=========================================================================
     112             : // virtual
     113           0 : ResultSetMetaData::~ResultSetMetaData()
     114             : {
     115           0 :     delete m_pImpl;
     116           0 : }
     117             : 
     118             : //=========================================================================
     119             : //
     120             : // XInterface methods.
     121             : //
     122             : //=========================================================================
     123             : 
     124           0 : XINTERFACE_IMPL_2( ResultSetMetaData,
     125             :                    XTypeProvider,
     126             :                    XResultSetMetaData );
     127             : 
     128             : //=========================================================================
     129             : //
     130             : // XTypeProvider methods.
     131             : //
     132             : //=========================================================================
     133             : 
     134           0 : XTYPEPROVIDER_IMPL_2( ResultSetMetaData,
     135             :                       XTypeProvider,
     136             :                       XResultSetMetaData );
     137             : 
     138             : //=========================================================================
     139             : //
     140             : // XResultSetMetaData methods.
     141             : //
     142             : //=========================================================================
     143             : 
     144             : // virtual
     145           0 : sal_Int32 SAL_CALL ResultSetMetaData::getColumnCount()
     146             :     throw( SQLException, RuntimeException )
     147             : {
     148           0 :     return m_aProps.getLength();
     149             : }
     150             : 
     151             : //=========================================================================
     152             : // virtual
     153           0 : sal_Bool SAL_CALL ResultSetMetaData::isAutoIncrement( sal_Int32 column )
     154             :     throw( SQLException, RuntimeException )
     155             : {
     156             :     /*
     157             :         Checks whether column is automatically numbered, which makes it
     158             :         read-only.
     159             :      */
     160             : 
     161           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     162           0 :         return sal_False;
     163             : 
     164           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isAutoIncrement;
     165             : }
     166             : 
     167             : //=========================================================================
     168             : // virtual
     169           0 : sal_Bool SAL_CALL ResultSetMetaData::isCaseSensitive( sal_Int32 column )
     170             :     throw( SQLException, RuntimeException )
     171             : {
     172           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     173           0 :         return sal_False;
     174             : 
     175           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isCaseSensitive;
     176             : }
     177             : 
     178             : //=========================================================================
     179             : // virtual
     180           0 : sal_Bool SAL_CALL ResultSetMetaData::isSearchable( sal_Int32 column )
     181             :     throw( SQLException, RuntimeException )
     182             : {
     183             :     /*
     184             :         Checks whether the value stored in column can be used in a
     185             :         WHERE clause.
     186             :      */
     187             : 
     188           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     189           0 :         return sal_False;
     190             : 
     191           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isSearchable;
     192             : }
     193             : 
     194             : //=========================================================================
     195             : // virtual
     196           0 : sal_Bool SAL_CALL ResultSetMetaData::isCurrency( sal_Int32 column )
     197             :     throw( SQLException, RuntimeException )
     198             : {
     199             :     /*
     200             :         Checks whether column is a cash value.
     201             :      */
     202             : 
     203           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     204           0 :         return sal_False;
     205             : 
     206           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isCurrency;
     207             : }
     208             : 
     209             : //=========================================================================
     210             : // virtual
     211           0 : sal_Int32 SAL_CALL ResultSetMetaData::isNullable( sal_Int32 column )
     212             :     throw( SQLException, RuntimeException )
     213             : {
     214             :     /*
     215             :         Checks whether a NULL can be stored in column.
     216             :         Possible values: see com/sun/star/sdbc/ColumnValue.idl
     217             :      */
     218             : 
     219           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     220           0 :         return ColumnValue::NULLABLE;
     221             : 
     222           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isNullable;
     223             : }
     224             : 
     225             : //=========================================================================
     226             : // virtual
     227           0 : sal_Bool SAL_CALL ResultSetMetaData::isSigned( sal_Int32 column )
     228             :     throw( SQLException, RuntimeException )
     229             : {
     230             :     /*
     231             :         Checks whether the value stored in column is a signed number.
     232             :      */
     233             : 
     234           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     235           0 :         return sal_False;
     236             : 
     237           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isSigned;
     238             : }
     239             : 
     240             : //=========================================================================
     241             : // virtual
     242           0 : sal_Int32 SAL_CALL ResultSetMetaData::getColumnDisplaySize( sal_Int32 column )
     243             :     throw( SQLException, RuntimeException )
     244             : {
     245             :     /*
     246             :         Gets the normal maximum width in characters for column.
     247             :      */
     248             : 
     249           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     250           0 :         return 16;
     251             : 
     252           0 :     return m_pImpl->m_aColumnData[ column - 1 ].columnDisplaySize;
     253             : }
     254             : 
     255             : //=========================================================================
     256             : // virtual
     257           0 : OUString SAL_CALL ResultSetMetaData::getColumnLabel( sal_Int32 column )
     258             :     throw( SQLException, RuntimeException )
     259             : {
     260             :     /*
     261             :         Gets the suggested column title for column, to be used in print-
     262             :         outs and displays.
     263             :      */
     264             : 
     265           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     266           0 :         return OUString();
     267             : 
     268           0 :     OUString aLabel = m_pImpl->m_aColumnData[ column - 1 ].columnLabel;
     269           0 :     if ( !aLabel.isEmpty() )
     270           0 :         return aLabel;
     271             : 
     272           0 :     return m_aProps.getConstArray()[ column - 1 ].Name;
     273             : }
     274             : 
     275             : //=========================================================================
     276             : // virtual
     277           0 : OUString SAL_CALL ResultSetMetaData::getColumnName( sal_Int32 column )
     278             :     throw( SQLException, RuntimeException )
     279             : {
     280             :     /*
     281             :         Gets the name of column.
     282             :      */
     283             : 
     284           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     285           0 :         return OUString();
     286             : 
     287           0 :     return m_aProps.getConstArray()[ column - 1 ].Name;
     288             : }
     289             : 
     290             : //=========================================================================
     291             : // virtual
     292           0 : OUString SAL_CALL ResultSetMetaData::getSchemaName( sal_Int32 column )
     293             :     throw( SQLException, RuntimeException )
     294             : {
     295             :     /*
     296             :         Gets the schema name for the table from which column of this
     297             :         result set was derived.
     298             :         Because this feature is not widely supported, the return value
     299             :         for many DBMSs will be an empty string.
     300             :      */
     301             : 
     302           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     303           0 :         return OUString();
     304             : 
     305           0 :     return m_pImpl->m_aColumnData[ column - 1 ].schemaName;
     306             : }
     307             : 
     308             : //=========================================================================
     309             : // virtual
     310           0 : sal_Int32 SAL_CALL ResultSetMetaData::getPrecision( sal_Int32 column )
     311             :     throw( SQLException, RuntimeException )
     312             : {
     313             :     /*
     314             :         For number types, getprecision gets the number of decimal digits
     315             :         in column.
     316             :         For character types, it gets the maximum length in characters for
     317             :         column.
     318             :         For binary types, it gets the maximum length in bytes for column.
     319             :      */
     320             : 
     321           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     322           0 :         return -1;
     323             : 
     324           0 :     return m_pImpl->m_aColumnData[ column - 1 ].precision;
     325             : }
     326             : 
     327             : //=========================================================================
     328             : // virtual
     329           0 : sal_Int32 SAL_CALL ResultSetMetaData::getScale( sal_Int32 column )
     330             :     throw( SQLException, RuntimeException )
     331             : {
     332             :     /*
     333             :         Gets the number of digits to the right of the decimal point for
     334             :         values in column.
     335             :      */
     336             : 
     337           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     338           0 :         return 0;
     339             : 
     340           0 :     return m_pImpl->m_aColumnData[ column - 1 ].scale;
     341             : }
     342             : 
     343             : //=========================================================================
     344             : // virtual
     345           0 : OUString SAL_CALL ResultSetMetaData::getTableName( sal_Int32 column )
     346             :     throw( SQLException, RuntimeException )
     347             : {
     348             :     /*
     349             :         Gets the name of the table from which column of this result set
     350             :         was derived or "" if there is none (for example, for a join).
     351             :         Because this feature is not widely supported, the return value
     352             :         for many DBMSs will be an empty string.
     353             :      */
     354             : 
     355           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     356           0 :         return OUString();
     357             : 
     358           0 :     return m_pImpl->m_aColumnData[ column - 1 ].tableName;
     359             : }
     360             : 
     361             : //=========================================================================
     362             : // virtual
     363           0 : OUString SAL_CALL ResultSetMetaData::getCatalogName( sal_Int32 column )
     364             :     throw( SQLException, RuntimeException )
     365             : {
     366             :     /*
     367             :         Gets the catalog name for the table from which column of this
     368             :         result set was derived.
     369             :         Because this feature is not widely supported, the return value
     370             :         for many DBMSs will be an empty string.
     371             :      */
     372             : 
     373           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     374           0 :         return OUString();
     375             : 
     376           0 :     return m_pImpl->m_aColumnData[ column - 1 ].catalogName;
     377             : }
     378             : 
     379             : //=========================================================================
     380             : // virtual
     381           0 : sal_Int32 SAL_CALL ResultSetMetaData::getColumnType( sal_Int32 column )
     382             :     throw( SQLException, RuntimeException )
     383             : {
     384             :     /*
     385             :         Gets the JDBC type for the value stored in column. ... The STRUCT
     386             :         and DISTINCT type codes are always returned for structured and
     387             :         distinct types, regardless of whether the value will be mapped
     388             :         according to the standard mapping or be a custom mapping.
     389             :      */
     390             : 
     391           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     392           0 :         return DataType::SQLNULL;
     393             : 
     394           0 :     if ( m_aProps.getConstArray()[ column - 1 ].Type
     395           0 :             == getCppuVoidType() )
     396             :     {
     397             :         // No type given. Try UCB's Properties Manager...
     398             : 
     399           0 :         osl::Guard< osl::Mutex > aGuard( m_pImpl->m_aMutex );
     400             : 
     401           0 :         if ( !m_pImpl->m_bObtainedTypes )
     402             :         {
     403             :             try
     404             :             {
     405           0 :                 Reference< XPropertySetInfo > xInfo = PropertiesManager::create( m_xContext );
     406             :     // Less (remote) calls...
     407             : 
     408           0 :                 Sequence< Property > aProps = xInfo->getProperties();
     409           0 :                 const Property* pProps1 = aProps.getConstArray();
     410           0 :                 sal_Int32 nCount1 = aProps.getLength();
     411             : 
     412           0 :                 sal_Int32 nCount = m_aProps.getLength();
     413           0 :                 Property* pProps = m_aProps.getArray();
     414           0 :                 for ( sal_Int32 n = 0; n < nCount; ++n )
     415             :                 {
     416           0 :                     Property& rProp = pProps[ n ];
     417             : 
     418           0 :                     for ( sal_Int32 m = 0; m < nCount1; ++m )
     419             :                     {
     420           0 :                         const Property& rProp1 = pProps1[ m ];
     421           0 :                         if ( rProp.Name == rProp1.Name )
     422             :                         {
     423             :                             // Found...
     424           0 :                             rProp.Type = rProp1.Type;
     425           0 :                             break;
     426             :                         }
     427             :                     }
     428           0 :                 }
     429             :             }
     430           0 :             catch ( RuntimeException& )
     431             :             {
     432           0 :                 throw;
     433             :             }
     434           0 :             catch ( Exception& )
     435             :             {
     436             :                 // createInstance
     437             :             }
     438             : 
     439           0 :             m_pImpl->m_bObtainedTypes = sal_True;
     440           0 :         }
     441             :     }
     442             : 
     443           0 :     const Type& rType = m_aProps.getConstArray()[ column - 1 ].Type;
     444           0 :     sal_Int32 nType = DataType::OTHER;
     445             : 
     446           0 :     if ( rType == getCppuType( static_cast< const rtl::OUString * >( 0 ) ) )
     447           0 :         nType = DataType::VARCHAR;  // XRow::getString
     448           0 :     else if ( rType == getCppuBooleanType() )
     449           0 :         nType = DataType::BIT;      // XRow::getBoolean
     450           0 :     else if ( rType == getCppuType( static_cast< const sal_Int32 * >( 0 ) ) )
     451           0 :         nType = DataType::INTEGER;  // XRow::getInt
     452           0 :     else if ( rType == getCppuType( static_cast< const sal_Int64 * >( 0 ) ) )
     453           0 :         nType = DataType::BIGINT;   // XRow::getLong
     454           0 :     else if ( rType == getCppuType( static_cast< const sal_Int16 * >( 0 ) ) )
     455           0 :         nType = DataType::SMALLINT; // XRow::getShort
     456           0 :     else if ( rType == getCppuType( static_cast< const sal_Int8 * >( 0 ) ) )
     457           0 :         nType = DataType::TINYINT;  // XRow::getByte
     458           0 :     else if ( rType == getCppuType( static_cast< const float * >( 0 ) ) )
     459           0 :         nType = DataType::REAL;     // XRow::getFloat
     460           0 :     else if ( rType == getCppuType( static_cast< const double * >( 0 ) ) )
     461           0 :         nType = DataType::DOUBLE;   // XRow::getDouble
     462           0 :     else if ( rType == getCppuType( static_cast< const Sequence< sal_Int8 > * >( 0 ) ) )
     463           0 :         nType = DataType::VARBINARY;// XRow::getBytes
     464           0 :     else if ( rType == getCppuType( static_cast< const Date * >( 0 ) ) )
     465           0 :         nType = DataType::DATE;     // XRow::getDate
     466           0 :     else if ( rType == getCppuType( static_cast< const Time * >( 0 ) ) )
     467           0 :         nType = DataType::TIME;     // XRow::getTime
     468           0 :     else if ( rType == getCppuType( static_cast< const DateTime * >( 0 ) ) )
     469           0 :         nType = DataType::TIMESTAMP;// XRow::getTimestamp
     470           0 :     else if ( rType == getCppuType( static_cast< Reference< XInputStream > * >( 0 ) ) )
     471           0 :         nType = DataType::LONGVARBINARY;    // XRow::getBinaryStream
     472             : //      nType = DataType::LONGVARCHAR;      // XRow::getCharacterStream
     473           0 :     else if ( rType == getCppuType( static_cast< Reference< XClob > * >( 0 ) ) )
     474           0 :         nType = DataType::CLOB; // XRow::getClob
     475           0 :     else if ( rType == getCppuType( static_cast< Reference< XBlob > * >( 0 ) ) )
     476           0 :         nType = DataType::BLOB; // XRow::getBlob
     477           0 :     else if ( rType == getCppuType( static_cast< Reference< XArray > * >( 0 ) ) )
     478           0 :         nType = DataType::ARRAY;// XRow::getArray
     479           0 :     else if ( rType == getCppuType( static_cast< Reference< XRef > * >( 0 ) ) )
     480           0 :         nType = DataType::REF;// XRow::getRef
     481             :     else
     482           0 :         nType = DataType::OBJECT;// XRow::getObject
     483             : 
     484           0 :     return nType;
     485             : }
     486             : 
     487             : //=========================================================================
     488             : // virtual
     489           0 : OUString SAL_CALL ResultSetMetaData::getColumnTypeName( sal_Int32 column )
     490             :     throw( SQLException, RuntimeException )
     491             : {
     492             :     /*
     493             :         Gets the type name used by this particular data source for the
     494             :         values stored in column. If the type code for the type of value
     495             :         stored in column is STRUCT, DISTINCT or JAVA_OBJECT, this method
     496             :         returns a fully-qualified SQL type name.
     497             :      */
     498             : 
     499           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     500           0 :         return OUString();
     501             : 
     502           0 :     return m_pImpl->m_aColumnData[ column - 1 ].columnTypeName;
     503             : }
     504             : 
     505             : //=========================================================================
     506             : // virtual
     507           0 : sal_Bool SAL_CALL ResultSetMetaData::isReadOnly( sal_Int32 column )
     508             :     throw( SQLException, RuntimeException )
     509             : {
     510           0 :     if ( m_pImpl->m_bGlobalReadOnlyValue )
     511           0 :         return m_bReadOnly;
     512             : 
     513           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     514           0 :         return sal_True;
     515             : 
     516             :     // autoincrement==true => readonly
     517           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isAutoIncrement ||
     518           0 :            m_pImpl->m_aColumnData[ column - 1 ].isReadOnly;
     519             : }
     520             : 
     521             : //=========================================================================
     522             : // virtual
     523           0 : sal_Bool SAL_CALL ResultSetMetaData::isWritable( sal_Int32 column )
     524             :     throw( SQLException, RuntimeException )
     525             : {
     526           0 :     if ( m_pImpl->m_bGlobalReadOnlyValue )
     527           0 :         return !m_bReadOnly;
     528             : 
     529           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     530           0 :         return sal_False;
     531             : 
     532           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isWritable;
     533             : }
     534             : 
     535             : //=========================================================================
     536             : // virtual
     537           0 : sal_Bool SAL_CALL ResultSetMetaData::isDefinitelyWritable( sal_Int32 column )
     538             :     throw( SQLException, RuntimeException )
     539             : {
     540           0 :     if ( m_pImpl->m_bGlobalReadOnlyValue )
     541           0 :         return !m_bReadOnly;
     542             : 
     543           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     544           0 :         return sal_False;
     545             : 
     546           0 :     return m_pImpl->m_aColumnData[ column - 1 ].isDefinitelyWritable;
     547             : }
     548             : 
     549             : //=========================================================================
     550             : // virtual
     551           0 : OUString SAL_CALL ResultSetMetaData::getColumnServiceName( sal_Int32 column )
     552             :     throw( SQLException, RuntimeException )
     553             : {
     554             :     /*
     555             :           Returns the fully-qualified name of the service whose instances
     556             :          are manufactured if XResultSet::getObject is called to retrieve
     557             :         a value from the column.
     558             :      */
     559             : 
     560           0 :     if ( ( column < 1 ) || ( column > m_aProps.getLength() ) )
     561           0 :         return OUString();
     562             : 
     563           0 :     return m_pImpl->m_aColumnData[ column - 1 ].columnServiceName;
     564             : }
     565             : 
     566             : } // namespace ucbhelper
     567             : 
     568             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10