LCOV - code coverage report
Current view: top level - libreoffice/ucbhelper/source/provider - propertyvalueset.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 27 181 14.9 %
Date: 2012-12-27 Functions: 12 43 27.9 %
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             : #ifndef __VECTOR__
      28             : #include <vector>
      29             : #endif
      30             : #include <com/sun/star/beans/Property.hpp>
      31             : #include <com/sun/star/beans/XPropertyAccess.hpp>
      32             : #include <com/sun/star/beans/XPropertySet.hpp>
      33             : #include <com/sun/star/beans/XPropertySetInfo.hpp>
      34             : #include <com/sun/star/script/Converter.hpp>
      35             : 
      36             : #include "osl/diagnose.h"
      37             : #include "osl/mutex.hxx"
      38             : #include <ucbhelper/propertyvalueset.hxx>
      39             : 
      40             : using namespace com::sun::star::beans;
      41             : using namespace com::sun::star::container;
      42             : using namespace com::sun::star::io;
      43             : using namespace com::sun::star::lang;
      44             : using namespace com::sun::star::script;
      45             : using namespace com::sun::star::sdbc;
      46             : using namespace com::sun::star::uno;
      47             : using namespace com::sun::star::util;
      48             : using ::rtl::OUString;
      49             : 
      50             : namespace ucbhelper_impl
      51             : {
      52             : 
      53             : //=========================================================================
      54             : //
      55             : // PropertyValue.
      56             : //
      57             : //=========================================================================
      58             : 
      59             : const sal_uInt32 NO_VALUE_SET               = 0x00000000;
      60             : const sal_uInt32 STRING_VALUE_SET           = 0x00000001;
      61             : const sal_uInt32 BOOLEAN_VALUE_SET          = 0x00000002;
      62             : const sal_uInt32 BYTE_VALUE_SET             = 0x00000004;
      63             : const sal_uInt32 SHORT_VALUE_SET            = 0x00000008;
      64             : const sal_uInt32 INT_VALUE_SET              = 0x00000010;
      65             : const sal_uInt32 LONG_VALUE_SET             = 0x00000020;
      66             : const sal_uInt32 FLOAT_VALUE_SET            = 0x00000040;
      67             : const sal_uInt32 DOUBLE_VALUE_SET           = 0x00000080;
      68             : const sal_uInt32 BYTES_VALUE_SET            = 0x00000100;
      69             : const sal_uInt32 DATE_VALUE_SET             = 0x00000200;
      70             : const sal_uInt32 TIME_VALUE_SET             = 0x00000400;
      71             : const sal_uInt32 TIMESTAMP_VALUE_SET        = 0x00000800;
      72             : const sal_uInt32 BINARYSTREAM_VALUE_SET     = 0x00001000;
      73             : const sal_uInt32 CHARACTERSTREAM_VALUE_SET  = 0x00002000;
      74             : const sal_uInt32 REF_VALUE_SET              = 0x00004000;
      75             : const sal_uInt32 BLOB_VALUE_SET             = 0x00008000;
      76             : const sal_uInt32 CLOB_VALUE_SET             = 0x00010000;
      77             : const sal_uInt32 ARRAY_VALUE_SET            = 0x00020000;
      78             : const sal_uInt32 OBJECT_VALUE_SET           = 0x00040000;
      79             : 
      80           9 : struct PropertyValue
      81             : {
      82             :     ::rtl::OUString
      83             :                 sPropertyName;
      84             : 
      85             :     sal_uInt32  nPropsSet;
      86             :     sal_uInt32  nOrigValue;
      87             : 
      88             :     OUString    aString;    // getString
      89             :     sal_Bool    bBoolean;   // getBoolean
      90             :     sal_Int8    nByte;      // getByte
      91             :     sal_Int16   nShort;     // getShort
      92             :     sal_Int32   nInt;       // getInt
      93             :     sal_Int64   nLong;      // getLong
      94             :     float       nFloat;     // getFloat
      95             :     double      nDouble;    // getDouble
      96             : 
      97             :     Sequence< sal_Int8 >        aBytes;             // getBytes
      98             :     Date                        aDate;              // getDate
      99             :     Time                        aTime;              // getTime
     100             :     DateTime                    aTimestamp;         // getTimestamp
     101             :     Reference< XInputStream >   xBinaryStream;      // getBinaryStream
     102             :     Reference< XInputStream >   xCharacterStream;   // getCharacterStream
     103             :     Reference< XRef >           xRef;               // getRef
     104             :     Reference< XBlob >          xBlob;              // getBlob
     105             :     Reference< XClob >          xClob;              // getClob
     106             :     Reference< XArray >         xArray;             // getArray
     107             :     Any                         aObject;            // getObject
     108             : 
     109           3 :     inline PropertyValue()
     110             :         : nPropsSet( NO_VALUE_SET ), nOrigValue( NO_VALUE_SET ),
     111             :           bBoolean(false),
     112             :           nByte(0),
     113             :           nShort(0),
     114             :           nInt(0),
     115             :           nLong(0),
     116             :           nFloat(0.0),
     117           3 :           nDouble(0.0)
     118           3 :         {}
     119             : };
     120             : } // namespace ucbhelper_impl
     121             : 
     122             : using namespace ucbhelper_impl;
     123             : 
     124             : namespace ucbhelper
     125             : {
     126             : 
     127             : //=========================================================================
     128             : //
     129             : // class PropertyValues.
     130             : //
     131             : //=========================================================================
     132             : 
     133             : typedef std::vector< ucbhelper_impl::PropertyValue > PropertyValuesVector;
     134             : 
     135           6 : class PropertyValues : public PropertyValuesVector {};
     136             : 
     137             : } // namespace ucbhelper
     138             : 
     139             : //=========================================================================
     140             : //
     141             : // Welcome to the macro hell...
     142             : //
     143             : //=========================================================================
     144             : 
     145             : #define GETVALUE_IMPL_TYPE( _type_, _type_name_, _member_name_, _cppu_type_ ) \
     146             :                                                                               \
     147             :     osl::MutexGuard aGuard( m_aMutex );                                       \
     148             :                                                                               \
     149             :     _type_ aValue = _type_();   /* default ctor */                            \
     150             :                                                                               \
     151             :     m_bWasNull = sal_True;                                                    \
     152             :                                                                               \
     153             :     if ( ( columnIndex < 1 )                                                  \
     154             :          || ( columnIndex > sal_Int32( m_pValues->size() ) ) )                \
     155             :     {                                                                         \
     156             :         OSL_FAIL( "PropertyValueSet - index out of range!" );    \
     157             :     }                                                                         \
     158             :     else                                                                      \
     159             :     {                                                                         \
     160             :         ucbhelper_impl::PropertyValue& rValue                                 \
     161             :             = (*m_pValues)[ columnIndex - 1 ];                                \
     162             :                                                                               \
     163             :         if ( rValue.nOrigValue != NO_VALUE_SET )                              \
     164             :         {                                                                     \
     165             :             if ( rValue.nPropsSet & _type_name_ )                             \
     166             :             {                                                                 \
     167             :                 /* Values is present natively... */                           \
     168             :                 aValue = rValue._member_name_;                                \
     169             :                 m_bWasNull = sal_False;                                       \
     170             :             }                                                                 \
     171             :             else                                                              \
     172             :             {                                                                 \
     173             :                 if ( !(rValue.nPropsSet & OBJECT_VALUE_SET) )                 \
     174             :                 {                                                             \
     175             :                     /* Value is not (yet) available as Any. Create it. */     \
     176             :                     getObject( columnIndex, Reference< XNameAccess >() );     \
     177             :                 }                                                             \
     178             :                                                                               \
     179             :                 if ( rValue.nPropsSet & OBJECT_VALUE_SET )                    \
     180             :                 {                                                             \
     181             :                     /* Value is available as Any. */                          \
     182             :                                                                               \
     183             :                     if ( rValue.aObject.hasValue() )                          \
     184             :                     {                                                         \
     185             :                         /* Try to convert into native value. */               \
     186             :                         if ( rValue.aObject >>= aValue )                      \
     187             :                         {                                                     \
     188             :                             rValue._member_name_ = aValue;                    \
     189             :                             rValue.nPropsSet |= _type_name_;                  \
     190             :                             m_bWasNull = sal_False;                           \
     191             :                         }                                                     \
     192             :                         else                                                  \
     193             :                         {                                                     \
     194             :                             /* Last chance. Try type converter service... */  \
     195             :                                                                               \
     196             :                             Reference< XTypeConverter > xConverter            \
     197             :                                                     = getTypeConverter();     \
     198             :                             if ( xConverter.is() )                            \
     199             :                             {                                                 \
     200             :                                 try                                           \
     201             :                                 {                                             \
     202             :                                     Any aConvAny = xConverter->convertTo(     \
     203             :                                                              rValue.aObject,      \
     204             :                                                             _cppu_type_ );    \
     205             :                                                                               \
     206             :                                     if ( aConvAny >>= aValue )                \
     207             :                                     {                                         \
     208             :                                         rValue._member_name_ = aValue;        \
     209             :                                         rValue.nPropsSet |= _type_name_;      \
     210             :                                         m_bWasNull = sal_False;               \
     211             :                                     }                                         \
     212             :                                 }                                             \
     213             :                                 catch (const IllegalArgumentException&)       \
     214             :                                 {                                             \
     215             :                                 }                                             \
     216             :                                 catch (const CannotConvertException&)         \
     217             :                                 {                                             \
     218             :                                 }                                             \
     219             :                             }                                                 \
     220             :                         }                                                     \
     221             :                     }                                                         \
     222             :                 }                                                             \
     223             :             }                                                                 \
     224             :         }                                                                     \
     225             :     }                                                                         \
     226             :     return aValue;
     227             : 
     228             : #define GETVALUE_IMPL( _type_, _type_name_, _member_name_ )                   \
     229             :     GETVALUE_IMPL_TYPE( _type_,                                               \
     230             :                         _type_name_,                                          \
     231             :                         _member_name_,                                        \
     232             :                         getCppuType( static_cast< const _type_ * >( 0 ) ) )
     233             : 
     234             : #define SETVALUE_IMPL( _prop_name_, _type_name_, _member_name_, _value_ )     \
     235             :                                                                               \
     236             :     osl::MutexGuard aGuard( m_aMutex );                                       \
     237             :                                                                               \
     238             :     ucbhelper_impl::PropertyValue aNewValue;                                  \
     239             :     aNewValue.sPropertyName = _prop_name_;                                    \
     240             :     aNewValue.nPropsSet     = _type_name_;                                    \
     241             :     aNewValue.nOrigValue    = _type_name_;                                    \
     242             :     aNewValue._member_name_ = _value_;                                        \
     243             :                                                                               \
     244             :     m_pValues->push_back( aNewValue );
     245             : 
     246             : namespace ucbhelper {
     247             : 
     248             : //=========================================================================
     249             : //=========================================================================
     250             : //
     251             : // PropertyValueSet Implementation.
     252             : //
     253             : //=========================================================================
     254             : //=========================================================================
     255             : 
     256             : //=========================================================================
     257           3 : PropertyValueSet::PropertyValueSet(
     258             :                     const Reference< XComponentContext >& rxContext )
     259             : :  m_xContext( rxContext ),
     260           3 :   m_pValues( new PropertyValues ),
     261             :   m_bWasNull( sal_False ),
     262           6 :   m_bTriedToGetTypeConverter( sal_False )
     263             : 
     264             : {
     265           3 : }
     266             : 
     267             : //=========================================================================
     268             : // virtual
     269           9 : PropertyValueSet::~PropertyValueSet()
     270             : {
     271           3 :     delete m_pValues;
     272           6 : }
     273             : 
     274             : //=========================================================================
     275             : //
     276             : // XInterface methods.
     277             : //
     278             : //=========================================================================
     279             : 
     280          24 : XINTERFACE_IMPL_3( PropertyValueSet,
     281             :                    XTypeProvider,
     282             :                    XRow,
     283             :                    XColumnLocate );
     284             : 
     285             : //=========================================================================
     286             : //
     287             : // XTypeProvider methods.
     288             : //
     289             : //=========================================================================
     290             : 
     291           0 : XTYPEPROVIDER_IMPL_3( PropertyValueSet,
     292             :                       XTypeProvider,
     293             :                          XRow,
     294             :                       XColumnLocate );
     295             : 
     296             : //=========================================================================
     297             : //
     298             : // XRow methods.
     299             : //
     300             : //=========================================================================
     301             : 
     302             : // virtual
     303           0 : sal_Bool SAL_CALL PropertyValueSet::wasNull()
     304             :     throw( SQLException, RuntimeException )
     305             : {
     306             :     // This method can not be implemented correctly!!! Imagine different
     307             :     // threads doing a getXYZ - wasNull calling sequence on the same
     308             :     // implementation object...
     309           0 :     return m_bWasNull;
     310             : }
     311             : 
     312             : //=========================================================================
     313             : // virtual
     314           0 : OUString SAL_CALL PropertyValueSet::getString( sal_Int32 columnIndex )
     315             :     throw( SQLException, RuntimeException )
     316             : {
     317           0 :     GETVALUE_IMPL( OUString, STRING_VALUE_SET, aString );
     318             : }
     319             : 
     320             : //=========================================================================
     321             : // virtual
     322           0 : sal_Bool SAL_CALL PropertyValueSet::getBoolean( sal_Int32 columnIndex )
     323             :     throw( SQLException, RuntimeException )
     324             : {
     325           0 :     GETVALUE_IMPL_TYPE(
     326           0 :             sal_Bool, BOOLEAN_VALUE_SET, bBoolean, getCppuBooleanType() );
     327             : }
     328             : 
     329             : //=========================================================================
     330             : // virtual
     331           0 : sal_Int8 SAL_CALL PropertyValueSet::getByte( sal_Int32 columnIndex )
     332             :     throw( SQLException, RuntimeException )
     333             : {
     334           0 :     GETVALUE_IMPL( sal_Int8, BYTE_VALUE_SET, nByte );
     335             : }
     336             : 
     337             : //=========================================================================
     338             : // virtual
     339           0 : sal_Int16 SAL_CALL PropertyValueSet::getShort( sal_Int32 columnIndex )
     340             :     throw( SQLException, RuntimeException )
     341             : {
     342           0 :     GETVALUE_IMPL( sal_Int16, SHORT_VALUE_SET, nShort );
     343             : }
     344             : 
     345             : //=========================================================================
     346             : // virtual
     347           0 : sal_Int32 SAL_CALL PropertyValueSet::getInt( sal_Int32 columnIndex )
     348             :     throw( SQLException, RuntimeException )
     349             : {
     350           0 :     GETVALUE_IMPL( sal_Int32, INT_VALUE_SET, nInt );
     351             : }
     352             : 
     353             : //=========================================================================
     354             : // virtual
     355           0 : sal_Int64 SAL_CALL PropertyValueSet::getLong( sal_Int32 columnIndex )
     356             :     throw( SQLException, RuntimeException )
     357             : {
     358           0 :     GETVALUE_IMPL( sal_Int64, LONG_VALUE_SET, nLong );
     359             : }
     360             : 
     361             : //=========================================================================
     362             : // virtual
     363           0 : float SAL_CALL PropertyValueSet::getFloat( sal_Int32 columnIndex )
     364             :     throw( SQLException, RuntimeException )
     365             : {
     366           0 :     GETVALUE_IMPL( float, FLOAT_VALUE_SET, nFloat );
     367             : }
     368             : 
     369             : //=========================================================================
     370             : // virtual
     371           0 : double SAL_CALL PropertyValueSet::getDouble( sal_Int32 columnIndex )
     372             :     throw( SQLException, RuntimeException )
     373             : {
     374           0 :     GETVALUE_IMPL( double, DOUBLE_VALUE_SET, nDouble );
     375             : }
     376             : 
     377             : //=========================================================================
     378             : // virtual
     379             : Sequence< sal_Int8 > SAL_CALL
     380           0 : PropertyValueSet::getBytes( sal_Int32 columnIndex )
     381             :     throw( SQLException, RuntimeException )
     382             : {
     383           0 :     GETVALUE_IMPL( Sequence< sal_Int8 >, BYTES_VALUE_SET, aBytes );
     384             : }
     385             : 
     386             : //=========================================================================
     387             : // virtual
     388           0 : Date SAL_CALL PropertyValueSet::getDate( sal_Int32 columnIndex )
     389             :     throw( SQLException, RuntimeException )
     390             : {
     391           0 :     GETVALUE_IMPL( Date, DATE_VALUE_SET, aDate );
     392             : }
     393             : 
     394             : //=========================================================================
     395             : // virtual
     396           0 : Time SAL_CALL PropertyValueSet::getTime( sal_Int32 columnIndex )
     397             :     throw( SQLException, RuntimeException )
     398             : {
     399           0 :     GETVALUE_IMPL( Time, TIME_VALUE_SET, aTime );
     400             : }
     401             : 
     402             : //=========================================================================
     403             : // virtual
     404           0 : DateTime SAL_CALL PropertyValueSet::getTimestamp( sal_Int32 columnIndex )
     405             :     throw( SQLException, RuntimeException )
     406             : {
     407           0 :     GETVALUE_IMPL( DateTime, TIMESTAMP_VALUE_SET, aTimestamp );
     408             : }
     409             : 
     410             : //=========================================================================
     411             : // virtual
     412             : Reference< XInputStream > SAL_CALL
     413           0 : PropertyValueSet::getBinaryStream( sal_Int32 columnIndex )
     414             :     throw( SQLException, RuntimeException )
     415             : {
     416           0 :     GETVALUE_IMPL(
     417           0 :         Reference< XInputStream >, BINARYSTREAM_VALUE_SET, xBinaryStream );
     418             : }
     419             : 
     420             : //=========================================================================
     421             : // virtual
     422             : Reference< XInputStream > SAL_CALL
     423           0 : PropertyValueSet::getCharacterStream( sal_Int32 columnIndex )
     424             :     throw( SQLException, RuntimeException )
     425             : {
     426           0 :     GETVALUE_IMPL(
     427           0 :         Reference< XInputStream >, CHARACTERSTREAM_VALUE_SET, xCharacterStream );
     428             : }
     429             : 
     430             : //=========================================================================
     431             : // virtual
     432           3 : Any SAL_CALL PropertyValueSet::getObject(
     433             :                                     sal_Int32 columnIndex,
     434             :                                          const Reference< XNameAccess >& )
     435             :     throw( SQLException, RuntimeException )
     436             : {
     437           3 :     osl::MutexGuard aGuard( m_aMutex );
     438             : 
     439           3 :     Any aValue;
     440             : 
     441           3 :     m_bWasNull = sal_True;
     442             : 
     443           6 :     if ( ( columnIndex < 1 )
     444           3 :          || ( columnIndex > sal_Int32( m_pValues->size() ) ) )
     445             :     {
     446             :         OSL_FAIL( "PropertyValueSet - index out of range!" );
     447             :     }
     448             :     else
     449             :     {
     450             :         ucbhelper_impl::PropertyValue& rValue
     451           3 :             = (*m_pValues)[ columnIndex - 1 ];
     452             : 
     453           3 :         if ( rValue.nPropsSet & OBJECT_VALUE_SET )
     454             :         {
     455             :             // Values is present natively...
     456           3 :             aValue = rValue.aObject;
     457           3 :             m_bWasNull = sal_False;
     458             :         }
     459             :         else
     460             :         {
     461             :             // Make Any from original value.
     462             : 
     463           0 :             switch ( rValue.nOrigValue )
     464             :             {
     465             :                 case NO_VALUE_SET:
     466           0 :                     break;
     467             : 
     468             :                 case STRING_VALUE_SET:
     469           0 :                     aValue <<= rValue.aString;
     470           0 :                     break;
     471             : 
     472             :                 case BOOLEAN_VALUE_SET:
     473           0 :                     aValue <<= rValue.bBoolean;
     474           0 :                     break;
     475             : 
     476             :                 case BYTE_VALUE_SET:
     477           0 :                     aValue <<= rValue.nByte;
     478           0 :                     break;
     479             : 
     480             :                 case SHORT_VALUE_SET:
     481           0 :                     aValue <<= rValue.nShort;
     482           0 :                     break;
     483             : 
     484             :                 case INT_VALUE_SET:
     485           0 :                     aValue <<= rValue.nInt;
     486           0 :                     break;
     487             : 
     488             :                 case LONG_VALUE_SET:
     489           0 :                     aValue <<= rValue.nLong;
     490           0 :                     break;
     491             : 
     492             :                 case FLOAT_VALUE_SET:
     493           0 :                     aValue <<= rValue.nFloat;
     494           0 :                     break;
     495             : 
     496             :                 case DOUBLE_VALUE_SET:
     497           0 :                     aValue <<= rValue.nDouble;
     498           0 :                     break;
     499             : 
     500             :                 case BYTES_VALUE_SET:
     501           0 :                     aValue <<= rValue.aBytes;
     502           0 :                     break;
     503             : 
     504             :                 case DATE_VALUE_SET:
     505           0 :                     aValue <<= rValue.aDate;
     506           0 :                     break;
     507             : 
     508             :                 case TIME_VALUE_SET:
     509           0 :                     aValue <<= rValue.aTime;
     510           0 :                     break;
     511             : 
     512             :                 case TIMESTAMP_VALUE_SET:
     513           0 :                     aValue <<= rValue.aTimestamp;
     514           0 :                     break;
     515             : 
     516             :                 case BINARYSTREAM_VALUE_SET:
     517           0 :                     aValue <<= rValue.xBinaryStream;
     518           0 :                     break;
     519             : 
     520             :                 case CHARACTERSTREAM_VALUE_SET:
     521           0 :                     aValue <<= rValue.xCharacterStream;
     522           0 :                     break;
     523             : 
     524             :                 case REF_VALUE_SET:
     525           0 :                     aValue <<= rValue.xRef;
     526           0 :                     break;
     527             : 
     528             :                 case BLOB_VALUE_SET:
     529           0 :                     aValue <<= rValue.xBlob;
     530           0 :                     break;
     531             : 
     532             :                 case CLOB_VALUE_SET:
     533           0 :                     aValue <<= rValue.xClob;
     534           0 :                     break;
     535             : 
     536             :                 case ARRAY_VALUE_SET:
     537           0 :                     aValue <<= rValue.xArray;
     538           0 :                     break;
     539             : 
     540             :                 case OBJECT_VALUE_SET:
     541             :                     // Fall-through is intended!
     542             :                 default:
     543             :                     OSL_FAIL( "PropertyValueSet::getObject - "
     544             :                                 "Wrong original type" );
     545           0 :                     break;
     546             :             }
     547             : 
     548           0 :             if ( aValue.hasValue() )
     549             :             {
     550           0 :                 rValue.aObject = aValue;
     551           0 :                 rValue.nPropsSet |= OBJECT_VALUE_SET;
     552           0 :                 m_bWasNull = sal_False;
     553             :             }
     554             :         }
     555             :      }
     556             : 
     557           3 :     return aValue;
     558             : }
     559             : 
     560             : //=========================================================================
     561             : // virtual
     562           0 : Reference< XRef > SAL_CALL PropertyValueSet::getRef( sal_Int32 columnIndex )
     563             :     throw( SQLException, RuntimeException )
     564             : {
     565           0 :     GETVALUE_IMPL( Reference< XRef >, REF_VALUE_SET, xRef );
     566             : }
     567             : 
     568             : //=========================================================================
     569             : // virtual
     570           0 : Reference< XBlob > SAL_CALL PropertyValueSet::getBlob( sal_Int32 columnIndex )
     571             :     throw( SQLException, RuntimeException )
     572             : {
     573           0 :     GETVALUE_IMPL( Reference< XBlob >, BLOB_VALUE_SET, xBlob );
     574             : }
     575             : 
     576             : //=========================================================================
     577             : // virtual
     578           0 : Reference< XClob > SAL_CALL PropertyValueSet::getClob( sal_Int32 columnIndex )
     579             :     throw( SQLException, RuntimeException )
     580             : {
     581           0 :     GETVALUE_IMPL( Reference< XClob >, CLOB_VALUE_SET, xClob );
     582             : }
     583             : 
     584             : //=========================================================================
     585             : // virtual
     586           0 : Reference< XArray > SAL_CALL PropertyValueSet::getArray( sal_Int32 columnIndex )
     587             :     throw( SQLException, RuntimeException )
     588             : {
     589           0 :     GETVALUE_IMPL( Reference< XArray >, ARRAY_VALUE_SET, xArray );
     590             : }
     591             : 
     592             : //=========================================================================
     593             : //
     594             : // XColumnLocate methods.
     595             : //
     596             : //=========================================================================
     597             : 
     598             : // virtual
     599           0 : sal_Int32 SAL_CALL PropertyValueSet::findColumn( const OUString& columnName )
     600             :     throw( SQLException, RuntimeException )
     601             : {
     602           0 :     osl::MutexGuard aGuard( m_aMutex );
     603             : 
     604           0 :     if ( !columnName.isEmpty() )
     605             :     {
     606           0 :         sal_Int32 nCount = m_pValues->size();
     607           0 :         for ( sal_Int32 n = 0; n < nCount; ++n )
     608             :         {
     609           0 :             if ( (*m_pValues)[ n ].sPropertyName.equals( columnName ) )
     610           0 :                 return sal_Int32( n + 1 ); // Index is 1-based.
     611             :         }
     612             :     }
     613           0 :     return 0;
     614             : }
     615             : 
     616             : //=========================================================================
     617             : //
     618             : // Non-interface methods.
     619             : //
     620             : //=========================================================================
     621             : 
     622           0 : const Reference< XTypeConverter >& PropertyValueSet::getTypeConverter()
     623             : {
     624           0 :     osl::MutexGuard aGuard( m_aMutex );
     625             : 
     626           0 :     if ( !m_bTriedToGetTypeConverter && !m_xTypeConverter.is() )
     627             :     {
     628           0 :         m_bTriedToGetTypeConverter = sal_True;
     629           0 :         m_xTypeConverter = Converter::create(m_xContext);
     630             : 
     631             :         OSL_ENSURE( m_xTypeConverter.is(),
     632             :                     "PropertyValueSet::getTypeConverter() - "
     633             :                     "Service 'com.sun.star.script.Converter' n/a!" );
     634             :     }
     635           0 :     return m_xTypeConverter;
     636             : }
     637             : 
     638             : //=========================================================================
     639           0 : void PropertyValueSet::appendString( const ::rtl::OUString& rPropName,
     640             :                                      const OUString& rValue )
     641             : {
     642           0 :     SETVALUE_IMPL( rPropName, STRING_VALUE_SET, aString, rValue );
     643           0 : }
     644             : 
     645             : //=========================================================================
     646           0 : void PropertyValueSet::appendBoolean( const ::rtl::OUString& rPropName,
     647             :                                       sal_Bool bValue )
     648             : {
     649           0 :     SETVALUE_IMPL( rPropName, BOOLEAN_VALUE_SET, bBoolean, bValue );
     650           0 : }
     651             : 
     652             : //=========================================================================
     653           0 : void PropertyValueSet::appendLong( const ::rtl::OUString& rPropName,
     654             :                                    sal_Int64 nValue )
     655             : {
     656           0 :     SETVALUE_IMPL( rPropName, LONG_VALUE_SET, nLong, nValue );
     657           0 : }
     658             : 
     659             : //=========================================================================
     660           0 : void PropertyValueSet::appendTimestamp( const ::rtl::OUString& rPropName,
     661             :                                         const DateTime& rValue )
     662             : {
     663           0 :     SETVALUE_IMPL( rPropName, TIMESTAMP_VALUE_SET, aTimestamp, rValue );
     664           0 : }
     665             : 
     666             : //=========================================================================
     667           3 : void PropertyValueSet::appendObject( const ::rtl::OUString& rPropName,
     668             :                                      const Any& rValue )
     669             : {
     670           3 :     SETVALUE_IMPL( rPropName, OBJECT_VALUE_SET, aObject, rValue );
     671           3 : }
     672             : 
     673             : //=========================================================================
     674           0 : void PropertyValueSet::appendVoid( const ::rtl::OUString& rPropName )
     675             : {
     676           0 :     SETVALUE_IMPL( rPropName, NO_VALUE_SET, aObject, Any() );
     677           0 : }
     678             : 
     679             : //=========================================================================
     680           0 : void PropertyValueSet::appendPropertySet(
     681             :                                 const Reference< XPropertySet >& rxSet )
     682             : {
     683           0 :     if ( rxSet.is() )
     684             :     {
     685           0 :         Reference< XPropertySetInfo > xInfo = rxSet->getPropertySetInfo();
     686           0 :         if ( xInfo.is() )
     687             :         {
     688           0 :             Sequence< Property > aProps      = xInfo->getProperties();
     689           0 :             const Property*      pProps      = aProps.getConstArray();
     690           0 :             sal_Int32            nPropsCount = aProps.getLength();
     691             : 
     692           0 :             Reference< XPropertyAccess > xPropertyAccess( rxSet, UNO_QUERY );
     693           0 :             if ( xPropertyAccess.is() )
     694             :             {
     695             :                 // Efficient: Get all prop values with one ( remote) call.
     696             : 
     697             :                 Sequence< ::com::sun::star::beans::PropertyValue > aPropValues
     698           0 :                     = xPropertyAccess->getPropertyValues();
     699             : 
     700             :                 const ::com::sun::star::beans::PropertyValue* pPropValues
     701           0 :                       = aPropValues.getConstArray();
     702             : 
     703           0 :                 sal_Int32 nValuesCount = aPropValues.getLength();
     704           0 :                 for ( sal_Int32 n = 0; n < nValuesCount; ++n )
     705             :                 {
     706             :                     const ::com::sun::star::beans::PropertyValue& rPropValue
     707           0 :                         = pPropValues[ n ];
     708             : 
     709             :                     // Find info for current property value.
     710           0 :                     for ( sal_Int32 m = 0; m < nPropsCount; ++m )
     711             :                     {
     712           0 :                         const Property& rProp = pProps[ m ];
     713           0 :                         if ( rProp.Name == rPropValue.Name )
     714             :                         {
     715             :                             // Found!
     716           0 :                             appendObject( rProp, rPropValue.Value );
     717           0 :                             break;
     718             :                         }
     719             :                     }
     720           0 :                 }
     721             :             }
     722             :             else
     723             :             {
     724             :                 // Get every single prop value with one ( remote) call.
     725             : 
     726           0 :                 for ( sal_Int32 n = 0; n < nPropsCount; ++n )
     727             :                 {
     728           0 :                     const Property& rProp = pProps[ n ];
     729             : 
     730             :                     try
     731             :                     {
     732           0 :                         Any aValue = rxSet->getPropertyValue( rProp.Name );
     733             : 
     734           0 :                         if ( aValue.hasValue() )
     735           0 :                             appendObject( rProp, aValue );
     736             :                     }
     737           0 :                     catch (const UnknownPropertyException&)
     738             :                     {
     739             :                     }
     740           0 :                     catch (const WrappedTargetException&)
     741             :                     {
     742             :                     }
     743             :                 }
     744           0 :             }
     745           0 :         }
     746             :     }
     747           0 : }
     748             : 
     749             : //=========================================================================
     750           0 : sal_Bool PropertyValueSet::appendPropertySetValue(
     751             :                                 const Reference< XPropertySet >& rxSet,
     752             :                                 const Property& rProperty )
     753             : {
     754           0 :     if ( rxSet.is() )
     755             :     {
     756             :         try
     757             :         {
     758           0 :             Any aValue = rxSet->getPropertyValue( rProperty.Name );
     759           0 :             if ( aValue.hasValue() )
     760             :             {
     761           0 :                 appendObject( rProperty, aValue );
     762           0 :                 return sal_True;
     763           0 :             }
     764             :         }
     765           0 :         catch (const UnknownPropertyException&)
     766             :         {
     767             :         }
     768           0 :         catch (const WrappedTargetException&)
     769             :         {
     770             :         }
     771             :     }
     772             : 
     773             :     // Error.
     774           0 :     return sal_False;
     775             : }
     776             : 
     777             : } // namespace ucbhelper
     778             : 
     779             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10