LCOV - code coverage report
Current view: top level - connectivity/source/commontools - FValue.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 480 1171 41.0 %
Date: 2015-06-13 12:38:46 Functions: 48 89 53.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             : #include <string.h>
      22             : #include <connectivity/FValue.hxx>
      23             : #include <connectivity/CommonTools.hxx>
      24             : #include <connectivity/dbconversion.hxx>
      25             : #include <comphelper/extract.hxx>
      26             : #include <com/sun/star/io/XInputStream.hpp>
      27             : #include <rtl/ustrbuf.hxx>
      28             : #include <boost/type_traits.hpp>
      29             : 
      30             : using namespace ::dbtools;
      31             : using namespace ::com::sun::star::sdbc;
      32             : using namespace ::com::sun::star::sdb;
      33             : using namespace ::com::sun::star::uno;
      34             : using namespace ::com::sun::star::util;
      35             : using namespace ::com::sun::star::io;
      36             : 
      37             : namespace connectivity
      38             : {
      39             : 
      40             : namespace {
      41       59656 :     static bool isStorageCompatible(sal_Int32 _eType1, sal_Int32 _eType2)
      42             :     {
      43       59656 :         bool bIsCompatible = true;
      44             : 
      45       59656 :         if (_eType1 != _eType2)
      46             :         {
      47             :             SAL_INFO( "connectivity.commontools", "ORowSetValue::isStorageCompatible _eType1 != _eType2" );
      48       16883 :             switch (_eType1)
      49             :             {
      50             :                 case DataType::CHAR:
      51             :                 case DataType::VARCHAR:
      52             :                 case DataType::DECIMAL:
      53             :                 case DataType::NUMERIC:
      54             :                 case DataType::LONGVARCHAR:
      55             :                     bIsCompatible = (DataType::CHAR         == _eType2)
      56       16376 :                                 ||  (DataType::VARCHAR      == _eType2)
      57           0 :                                 ||  (DataType::DECIMAL      == _eType2)
      58           0 :                                 ||  (DataType::NUMERIC      == _eType2)
      59       16376 :                                 ||  (DataType::LONGVARCHAR  == _eType2);
      60       16376 :                     break;
      61             : 
      62             :                 case DataType::DOUBLE:
      63             :                 case DataType::REAL:
      64             :                     bIsCompatible = (DataType::DOUBLE   == _eType2)
      65           0 :                                 ||  (DataType::REAL     == _eType2);
      66           0 :                     break;
      67             : 
      68             :                 case DataType::BINARY:
      69             :                 case DataType::VARBINARY:
      70             :                 case DataType::LONGVARBINARY:
      71             :                     bIsCompatible = (DataType::BINARY           == _eType2)
      72           0 :                                 ||  (DataType::VARBINARY        == _eType2)
      73           0 :                                 ||  (DataType::LONGVARBINARY    == _eType2);
      74           0 :                     break;
      75             : 
      76             :                 case DataType::INTEGER:
      77             :                     bIsCompatible = (DataType::SMALLINT == _eType2)
      78           0 :                                 ||  (DataType::TINYINT  == _eType2)
      79           0 :                                 ||  (DataType::BIT      == _eType2)
      80           0 :                                 ||  (DataType::BOOLEAN  == _eType2);
      81           0 :                     break;
      82             :                 case DataType::SMALLINT:
      83             :                     bIsCompatible = (DataType::TINYINT  == _eType2)
      84           0 :                                 ||  (DataType::BIT      == _eType2)
      85           0 :                                 ||  (DataType::BOOLEAN  == _eType2);
      86           0 :                     break;
      87             :                 case DataType::TINYINT:
      88             :                     bIsCompatible = (DataType::BIT      == _eType2)
      89           0 :                                 ||  (DataType::BOOLEAN  == _eType2);
      90           0 :                     break;
      91             : 
      92             :                 case DataType::BLOB:
      93             :                 case DataType::CLOB:
      94             :                 case DataType::OBJECT:
      95             :                     bIsCompatible = (DataType::BLOB     == _eType2)
      96         439 :                                 ||  (DataType::CLOB     == _eType2)
      97         847 :                                 ||  (DataType::OBJECT   == _eType2);
      98         439 :                     break;
      99             : 
     100             :                 default:
     101          68 :                     bIsCompatible = false;
     102             :             }
     103             :         }
     104       59656 :         return bIsCompatible;
     105             :     }
     106             : }
     107             : 
     108             : 
     109             : #ifdef DBG_UTIL
     110             : 
     111             : #include <vector>
     112             : #include <rtl/string.h>
     113             : 
     114             : namespace tracing
     115             : {
     116             :     struct AllocationType
     117             :     {
     118             :         const sal_Char* pName;
     119             :         sal_Int32       nAllocatedUnits;
     120             : 
     121             :         AllocationType( ) : pName( NULL ), nAllocatedUnits( 0 ) { }
     122             :     };
     123             : 
     124             : 
     125             :     class AllocationTracer
     126             :     {
     127             :     public:
     128             :         typedef ::std::vector< AllocationType > AllocationState;
     129             :         static AllocationState                  s_aAllocated;
     130             :         static ::osl::Mutex                     s_aMutex;
     131             : 
     132             :     public:
     133             :         static void registerUnit( const sal_Char* _pName );
     134             :         static void revokeUnit( const sal_Char* _pName );
     135             : 
     136             :     private:
     137             :         static AllocationState::iterator    getLocation( const sal_Char* _pName );
     138             :     };
     139             : 
     140             : 
     141             :     AllocationTracer::AllocationState::iterator AllocationTracer::getLocation( const sal_Char* _pName )
     142             :     {
     143             :         AllocationState::iterator aLookFor = s_aAllocated.begin();
     144             :         for (   ;
     145             :                 aLookFor != s_aAllocated.end();
     146             :                 ++aLookFor
     147             :             )
     148             :         {
     149             :             if ( 0 == rtl_str_compare( aLookFor->pName, _pName ) )
     150             :                 // found
     151             :                 return aLookFor;
     152             :         }
     153             :         // not found
     154             :         s_aAllocated.push_back( AllocationType() );
     155             :         aLookFor = s_aAllocated.end(); --aLookFor;
     156             :         aLookFor->pName = _pName;   // note that this assumes that _pName is a constant string ....
     157             :         return aLookFor;
     158             :     }
     159             : 
     160             : 
     161             :     AllocationTracer::AllocationState           AllocationTracer::s_aAllocated;
     162             :     ::osl::Mutex                                AllocationTracer::s_aMutex;
     163             : 
     164             : 
     165             :     void AllocationTracer::registerUnit( const sal_Char* _pName )
     166             :     {
     167             :         ::osl::MutexGuard aGuard( s_aMutex );
     168             : 
     169             :         AllocationState::iterator aPos = getLocation( _pName );
     170             :         ++aPos->nAllocatedUnits;
     171             :     }
     172             : 
     173             : 
     174             :     void AllocationTracer::revokeUnit( const sal_Char* _pName )
     175             :     {
     176             :         ::osl::MutexGuard aGuard( s_aMutex );
     177             : 
     178             :         AllocationState::iterator aPos = getLocation( _pName );
     179             :         --aPos->nAllocatedUnits;
     180             :     }
     181             : 
     182             : #define TRACE_ALLOC( type ) tracing::AllocationTracer::registerUnit( #type );
     183             : #define TRACE_FREE( type )  tracing::AllocationTracer::revokeUnit( #type );
     184             : }
     185             : #else
     186             : #define TRACE_ALLOC( type )
     187             : #define TRACE_FREE( type )
     188             : #endif
     189             : 
     190             : 
     191       48820 : void ORowSetValue::setTypeKind(sal_Int32 _eType)
     192             : {
     193       48820 :     if ( !m_bNull && !isStorageCompatible(_eType, m_eTypeKind) )
     194             :     {
     195          68 :         switch(_eType)
     196             :         {
     197             :             case DataType::VARCHAR:
     198             :             case DataType::CHAR:
     199             :             case DataType::DECIMAL:
     200             :             case DataType::NUMERIC:
     201             :             case DataType::LONGVARCHAR:
     202           0 :                 (*this) = getString();
     203           0 :                 break;
     204             :             case DataType::BIGINT:
     205             :             {
     206           0 :                 sal_Int64 nVal(getLong());
     207           0 :                 sal_uInt64 nuVal(getULong());
     208           0 :                 if (nVal == 0 && nuVal != 0)
     209           0 :                     (*this) = nuVal;
     210             :                 else
     211           0 :                     (*this) = nVal;
     212           0 :                 break;
     213             :             }
     214             : 
     215             :             case DataType::FLOAT:
     216           0 :                 (*this) = getFloat();
     217           0 :                 break;
     218             :             case DataType::DOUBLE:
     219             :             case DataType::REAL:
     220           0 :                 (*this) = getDouble();
     221           0 :                 break;
     222             :             case DataType::TINYINT:
     223           0 :                 (*this) = getInt8();
     224           0 :                 break;
     225             :             case DataType::SMALLINT:
     226           0 :                 (*this) = getInt16();
     227           0 :                 break;
     228             :             case DataType::INTEGER:
     229             :             {
     230           0 :                 sal_Int32 nVal(getInt32());
     231           0 :                 sal_uInt32 nuVal(getUInt32());
     232           0 :                 if (nVal == 0 && nuVal != 0)
     233           0 :                     (*this) = nuVal;
     234             :                 else
     235           0 :                     (*this) = nVal;
     236           0 :                 break;
     237             :             }
     238             :             case DataType::BIT:
     239             :             case DataType::BOOLEAN:
     240           8 :                 (*this) = getBool();
     241           8 :                 break;
     242             :             case DataType::DATE:
     243           0 :                 (*this) = getDate();
     244           0 :                 break;
     245             :             case DataType::TIME:
     246           0 :                 (*this) = getTime();
     247           0 :                 break;
     248             :             case DataType::TIMESTAMP:
     249           0 :                 (*this) = getDateTime();
     250           0 :                 break;
     251             :             case DataType::BINARY:
     252             :             case DataType::VARBINARY:
     253             :             case DataType::LONGVARBINARY:
     254           0 :                 (*this) = getSequence();
     255           0 :                 break;
     256             :             case DataType::BLOB:
     257             :             case DataType::CLOB:
     258             :             case DataType::OBJECT:
     259             :             case DataType::OTHER:
     260          60 :                 (*this) = makeAny();
     261          60 :                 break;
     262             :             default:
     263           0 :                 (*this) = makeAny();
     264             :                 SAL_WARN( "connectivity.commontools","ORowSetValue::setTypeKind(): UNSUPPORTED TYPE!");
     265             :         }
     266             :     }
     267             : 
     268       48820 :     m_eTypeKind = _eType;
     269       48820 : }
     270             : 
     271             : 
     272      390036 : void ORowSetValue::free()
     273             : {
     274      390036 :     if(!m_bNull)
     275             :     {
     276      199750 :         switch(m_eTypeKind)
     277             :         {
     278             :             case DataType::CHAR:
     279             :             case DataType::VARCHAR:
     280             :             case DataType::DECIMAL:
     281             :             case DataType::NUMERIC:
     282             :             case DataType::LONGVARCHAR:
     283             :                 OSL_ENSURE(m_aValue.m_pString,"String pointer is null!");
     284       99810 :                 rtl_uString_release(m_aValue.m_pString);
     285       99810 :                 m_aValue.m_pString = NULL;
     286       99810 :                 break;
     287             :             case DataType::DATE:
     288         224 :                 delete static_cast<css::util::Date*>(m_aValue.m_pValue);
     289             :                 TRACE_FREE( Date )
     290         224 :                 m_aValue.m_pValue = NULL;
     291         224 :                 break;
     292             :             case DataType::TIME:
     293           0 :                 delete static_cast<css::util::Time*>(m_aValue.m_pValue);
     294             :                 TRACE_FREE( tools::Time )
     295           0 :                 m_aValue.m_pValue = NULL;
     296           0 :                 break;
     297             :             case DataType::TIMESTAMP:
     298           0 :                 delete static_cast<css::util::DateTime*>(m_aValue.m_pValue);
     299             :                 TRACE_FREE( DateTime )
     300           0 :                 m_aValue.m_pValue = NULL;
     301           0 :                 break;
     302             :             case DataType::BINARY:
     303             :             case DataType::VARBINARY:
     304             :             case DataType::LONGVARBINARY:
     305           0 :                 delete static_cast<Sequence<sal_Int8>*>(m_aValue.m_pValue);
     306             :                 TRACE_FREE( Sequence_sal_Int8 )
     307           0 :                 m_aValue.m_pValue = NULL;
     308           0 :                 break;
     309             :             case DataType::BLOB:
     310             :             case DataType::CLOB:
     311             :             case DataType::OBJECT:
     312       45639 :                 delete static_cast<Any*>(m_aValue.m_pValue);
     313             :                 TRACE_FREE( Any )
     314       45639 :                 m_aValue.m_pValue = NULL;
     315       45639 :                 break;
     316             :             case DataType::BIT:
     317             :             case DataType::TINYINT:
     318             :             case DataType::SMALLINT:
     319             :             case DataType::INTEGER:
     320             :             case DataType::BIGINT:
     321             :             case DataType::BOOLEAN:
     322             :             case DataType::FLOAT:
     323             :             case DataType::DOUBLE:
     324             :             case DataType::REAL:
     325       53366 :                 break;
     326             :             default:
     327         711 :                 if ( m_aValue.m_pValue )
     328             :                 {
     329         711 :                     delete static_cast<Any*>(m_aValue.m_pValue);
     330             :                     TRACE_FREE( Any )
     331         711 :                     m_aValue.m_pValue = NULL;
     332             :                 }
     333         711 :                 break;
     334             : 
     335             :         }
     336      199750 :         m_bNull = true;
     337             :     }
     338      390036 : }
     339             : 
     340      160536 : ORowSetValue& ORowSetValue::operator=(const ORowSetValue& _rRH)
     341             : {
     342      160536 :     if(&_rRH == this)
     343          14 :         return *this;
     344             : 
     345      160522 :     if ( m_eTypeKind != _rRH.m_eTypeKind || (_rRH.m_bNull && !m_bNull) || m_bSigned != _rRH.m_bSigned)
     346      142894 :         free();
     347             : 
     348      160522 :     m_bBound    = _rRH.m_bBound;
     349      160522 :     m_eTypeKind = _rRH.m_eTypeKind;
     350      160522 :     m_bSigned   = _rRH.m_bSigned;
     351             : 
     352      305749 :     if(m_bNull && !_rRH.m_bNull)
     353             :     {
     354      145227 :         switch(_rRH.m_eTypeKind)
     355             :         {
     356             :             case DataType::CHAR:
     357             :             case DataType::VARCHAR:
     358             :             case DataType::DECIMAL:
     359             :             case DataType::NUMERIC:
     360             :             case DataType::LONGVARCHAR:
     361       51880 :                 rtl_uString_acquire(_rRH.m_aValue.m_pString);
     362       51880 :                 m_aValue.m_pString = _rRH.m_aValue.m_pString;
     363       51880 :                 break;
     364             :             case DataType::DATE:
     365          78 :                 m_aValue.m_pValue   = new Date(*static_cast<Date*>(_rRH.m_aValue.m_pValue));
     366             :                 TRACE_ALLOC( Date )
     367          78 :                 break;
     368             :             case DataType::TIME:
     369           0 :                 m_aValue.m_pValue   = new Time(*static_cast<Time*>(_rRH.m_aValue.m_pValue));
     370             :                 TRACE_ALLOC( tools::Time )
     371           0 :                 break;
     372             :             case DataType::TIMESTAMP:
     373           0 :                 m_aValue.m_pValue   = new DateTime(*static_cast<DateTime*>(_rRH.m_aValue.m_pValue));
     374             :                 TRACE_ALLOC( DateTime )
     375           0 :                 break;
     376             :             case DataType::BINARY:
     377             :             case DataType::VARBINARY:
     378             :             case DataType::LONGVARBINARY:
     379           0 :                 m_aValue.m_pValue   = new Sequence<sal_Int8>(*static_cast<Sequence<sal_Int8>*>(_rRH.m_aValue.m_pValue));
     380             :                 TRACE_ALLOC( Sequence_sal_Int8 )
     381           0 :                 break;
     382             :             case DataType::BIT:
     383             :             case DataType::BOOLEAN:
     384          40 :                 m_aValue.m_bBool    = _rRH.m_aValue.m_bBool;
     385          40 :                 break;
     386             :             case DataType::TINYINT:
     387           2 :                 if ( _rRH.m_bSigned )
     388           0 :                     m_aValue.m_nInt8    = _rRH.m_aValue.m_nInt8;
     389             :                 else
     390           2 :                     m_aValue.m_uInt8    = _rRH.m_aValue.m_uInt8;
     391           2 :                 break;
     392             :             case DataType::SMALLINT:
     393          76 :                 if ( _rRH.m_bSigned )
     394          76 :                     m_aValue.m_nInt16   = _rRH.m_aValue.m_nInt16;
     395             :                 else
     396           0 :                     m_aValue.m_uInt16   = _rRH.m_aValue.m_uInt16;
     397          76 :                 break;
     398             :             case DataType::INTEGER:
     399       47178 :                 if ( _rRH.m_bSigned )
     400       47178 :                     m_aValue.m_nInt32   = _rRH.m_aValue.m_nInt32;
     401             :                 else
     402           0 :                     m_aValue.m_uInt32   = _rRH.m_aValue.m_uInt32;
     403       47178 :                 break;
     404             :             case DataType::BIGINT:
     405           0 :                 if ( _rRH.m_bSigned )
     406           0 :                     m_aValue.m_nInt64   = _rRH.m_aValue.m_nInt64;
     407             :                 else
     408           0 :                     m_aValue.m_uInt64   = _rRH.m_aValue.m_uInt64;
     409           0 :                 break;
     410             :             case DataType::FLOAT:
     411           0 :                 m_aValue.m_nFloat  = _rRH.m_aValue.m_nFloat;
     412           0 :                 break;
     413             :             case DataType::DOUBLE:
     414             :             case DataType::REAL:
     415           0 :                 m_aValue.m_nDouble  = _rRH.m_aValue.m_nDouble;
     416           0 :                 break;
     417             :             default:
     418       45973 :                 m_aValue.m_pValue   = new Any(*static_cast<Any*>(_rRH.m_aValue.m_pValue));
     419             :                 TRACE_ALLOC( Any )
     420             :         }
     421             :     }
     422       15295 :     else if(!_rRH.m_bNull)
     423             :     {
     424       11853 :         switch(_rRH.m_eTypeKind)
     425             :         {
     426             :             case DataType::CHAR:
     427             :             case DataType::VARCHAR:
     428             :             case DataType::DECIMAL:
     429             :             case DataType::NUMERIC:
     430             :             case DataType::LONGVARCHAR:
     431        7297 :                 (*this) = OUString(_rRH.m_aValue.m_pString);
     432        7297 :                 break;
     433             :             case DataType::DATE:
     434          30 :                 (*this) = *static_cast<Date*>(_rRH.m_aValue.m_pValue);
     435          30 :                 break;
     436             :             case DataType::TIME:
     437           0 :                 (*this) = *static_cast<Time*>(_rRH.m_aValue.m_pValue);
     438           0 :                 break;
     439             :             case DataType::TIMESTAMP:
     440           0 :                 (*this) = *static_cast<DateTime*>(_rRH.m_aValue.m_pValue);
     441           0 :                 break;
     442             :             case DataType::BINARY:
     443             :             case DataType::VARBINARY:
     444             :             case DataType::LONGVARBINARY:
     445           0 :                 (*this) = *static_cast<Sequence<sal_Int8>*>(_rRH.m_aValue.m_pValue);
     446           0 :                 break;
     447             :             case DataType::BIT:
     448             :             case DataType::BOOLEAN:
     449           0 :                 m_aValue.m_bBool    = _rRH.m_aValue.m_bBool;
     450           0 :                 break;
     451             :             case DataType::TINYINT:
     452           0 :                 if ( _rRH.m_bSigned )
     453           0 :                     m_aValue.m_nInt8    = _rRH.m_aValue.m_nInt8;
     454             :                 else
     455           0 :                     m_aValue.m_uInt8    = _rRH.m_aValue.m_uInt8;
     456           0 :                 break;
     457             :             case DataType::SMALLINT:
     458           0 :                 if ( _rRH.m_bSigned )
     459           0 :                     m_aValue.m_nInt16   = _rRH.m_aValue.m_nInt16;
     460             :                 else
     461           0 :                     m_aValue.m_uInt16   = _rRH.m_aValue.m_uInt16;
     462           0 :                 break;
     463             :             case DataType::INTEGER:
     464        4522 :                 if ( _rRH.m_bSigned )
     465        4522 :                     m_aValue.m_nInt32   = _rRH.m_aValue.m_nInt32;
     466             :                 else
     467           0 :                     m_aValue.m_uInt32   = _rRH.m_aValue.m_uInt32;
     468        4522 :                 break;
     469             :             case DataType::BIGINT:
     470           0 :                 if ( _rRH.m_bSigned )
     471           0 :                     m_aValue.m_nInt64   = _rRH.m_aValue.m_nInt64;
     472             :                 else
     473           0 :                     m_aValue.m_uInt64   = _rRH.m_aValue.m_uInt64;
     474           0 :                 break;
     475             :             case DataType::FLOAT:
     476           0 :                 m_aValue.m_nFloat  = _rRH.m_aValue.m_nFloat;
     477           0 :                 break;
     478             :             case DataType::DOUBLE:
     479             :             case DataType::REAL:
     480           0 :                 m_aValue.m_nDouble  = _rRH.m_aValue.m_nDouble;
     481           0 :                 break;
     482             :             default:
     483           4 :                 *static_cast<Any*>(m_aValue.m_pValue) = *static_cast<Any*>(_rRH.m_aValue.m_pValue);
     484             :         }
     485             :     }
     486             : 
     487      160522 :     m_bNull     = _rRH.m_bNull;
     488             :     // OJ: BUGID: 96277
     489      160522 :     m_eTypeKind = _rRH.m_eTypeKind;
     490             : 
     491      160522 :     return *this;
     492             : }
     493             : 
     494             : 
     495         176 : ORowSetValue& ORowSetValue::operator=(const Date& _rRH)
     496             : {
     497         176 :     if(m_eTypeKind != DataType::DATE)
     498          88 :         free();
     499             : 
     500         176 :     if(m_bNull)
     501             :     {
     502         146 :         m_aValue.m_pValue = new Date(_rRH);
     503             :         TRACE_ALLOC( Date )
     504         146 :         m_eTypeKind = DataType::DATE;
     505         146 :         m_bNull = false;
     506             :     }
     507             :     else
     508          30 :         *static_cast<Date*>(m_aValue.m_pValue) = _rRH;
     509             : 
     510         176 :     return *this;
     511             : }
     512             : 
     513           0 : ORowSetValue& ORowSetValue::operator=(const css::util::Time& _rRH)
     514             : {
     515           0 :     if(m_eTypeKind != DataType::TIME)
     516           0 :         free();
     517             : 
     518           0 :     if(m_bNull)
     519             :     {
     520           0 :         m_aValue.m_pValue = new Time(_rRH);
     521             :         TRACE_ALLOC( tools::Time )
     522           0 :         m_eTypeKind = DataType::TIME;
     523           0 :         m_bNull = false;
     524             :     }
     525             :     else
     526           0 :         *static_cast<Time*>(m_aValue.m_pValue) = _rRH;
     527             : 
     528           0 :     return *this;
     529             : }
     530             : 
     531           0 : ORowSetValue& ORowSetValue::operator=(const DateTime& _rRH)
     532             : {
     533           0 :     if(m_eTypeKind != DataType::TIMESTAMP)
     534           0 :         free();
     535           0 :     if(m_bNull)
     536             :     {
     537           0 :         m_aValue.m_pValue = new DateTime(_rRH);
     538             :         TRACE_ALLOC( DateTime )
     539           0 :         m_eTypeKind = DataType::TIMESTAMP;
     540           0 :         m_bNull = false;
     541             :     }
     542             :     else
     543           0 :         *static_cast<DateTime*>(m_aValue.m_pValue) = _rRH;
     544             : 
     545           0 :     return *this;
     546             : }
     547             : 
     548             : 
     549       50402 : ORowSetValue& ORowSetValue::operator=(const OUString& _rRH)
     550             : {
     551       50402 :     if(m_eTypeKind != DataType::VARCHAR || m_aValue.m_pString != _rRH.pData)
     552             :     {
     553       47930 :         free();
     554       47930 :         m_bNull = false;
     555             : 
     556       47930 :         m_aValue.m_pString = _rRH.pData;
     557       47930 :         rtl_uString_acquire(m_aValue.m_pString);
     558       47930 :         m_eTypeKind = DataType::VARCHAR;
     559             :     }
     560             : 
     561       50402 :     return *this;
     562             : }
     563             : 
     564             : 
     565          89 : ORowSetValue& ORowSetValue::operator=(const double& _rRH)
     566             : {
     567          89 :     if(m_eTypeKind != DataType::DOUBLE)
     568          80 :         free();
     569             : 
     570          89 :     m_aValue.m_nDouble = _rRH;
     571          89 :     m_eTypeKind = DataType::DOUBLE;
     572          89 :     m_bNull = false;
     573             : 
     574          89 :     return *this;
     575             : }
     576             : 
     577           2 : ORowSetValue& ORowSetValue::operator=(const float& _rRH)
     578             : {
     579           2 :     if(m_eTypeKind != DataType::FLOAT)
     580           1 :         free();
     581             : 
     582           2 :     m_aValue.m_nFloat = _rRH;
     583           2 :     m_eTypeKind = DataType::FLOAT;
     584           2 :     m_bNull = false;
     585             : 
     586           2 :     return *this;
     587             : }
     588             : 
     589             : 
     590           2 : ORowSetValue& ORowSetValue::operator=(const sal_Int8& _rRH)
     591             : {
     592           2 :     if(m_eTypeKind != DataType::TINYINT )
     593           1 :         free();
     594             : 
     595           2 :     m_aValue.m_nInt8 = _rRH;
     596           2 :     m_eTypeKind = DataType::TINYINT;
     597           2 :     m_bNull = false;
     598           2 :     m_bSigned = true;
     599           2 :     return *this;
     600             : }
     601             : 
     602             : 
     603           3 : ORowSetValue& ORowSetValue::operator=(const sal_uInt8& _rRH)
     604             : {
     605           3 :     if(m_eTypeKind != DataType::TINYINT )
     606           0 :         free();
     607             : 
     608           3 :     m_aValue.m_uInt8 = _rRH;
     609           3 :     m_eTypeKind = DataType::TINYINT;
     610           3 :     m_bNull = false;
     611           3 :     m_bSigned = false;
     612           3 :     return *this;
     613             : }
     614             : 
     615             : 
     616          78 : ORowSetValue& ORowSetValue::operator=(const sal_Int16& _rRH)
     617             : {
     618          78 :     if(m_eTypeKind != DataType::SMALLINT )
     619           1 :         free();
     620             : 
     621          78 :     m_aValue.m_nInt16 = _rRH;
     622          78 :     m_eTypeKind = DataType::SMALLINT;
     623          78 :     m_bNull = false;
     624          78 :     m_bSigned = true;
     625             : 
     626          78 :     return *this;
     627             : }
     628             : 
     629             : 
     630           3 : ORowSetValue& ORowSetValue::operator=(const sal_uInt16& _rRH)
     631             : {
     632           3 :     if(m_eTypeKind != DataType::SMALLINT )
     633           2 :         free();
     634             : 
     635           3 :     m_aValue.m_uInt16 = _rRH;
     636           3 :     m_eTypeKind = DataType::SMALLINT;
     637           3 :     m_bNull = false;
     638           3 :     m_bSigned = false;
     639             : 
     640           3 :     return *this;
     641             : }
     642             : 
     643             : 
     644       19347 : ORowSetValue& ORowSetValue::operator=(const sal_Int32& _rRH)
     645             : {
     646       19347 :     if(m_eTypeKind != DataType::INTEGER )
     647         764 :         free();
     648             : 
     649       19347 :     m_aValue.m_nInt32 = _rRH;
     650             : 
     651       19347 :     m_eTypeKind = DataType::INTEGER;
     652       19347 :     m_bNull = false;
     653       19347 :     m_bSigned = true;
     654             : 
     655       19347 :     return *this;
     656             : }
     657             : 
     658             : 
     659           1 : ORowSetValue& ORowSetValue::operator=(const sal_uInt32& _rRH)
     660             : {
     661           1 :     if(m_eTypeKind != DataType::INTEGER )
     662           0 :         free();
     663             : 
     664           1 :     m_aValue.m_uInt32 = _rRH;
     665             : 
     666           1 :     m_eTypeKind = DataType::INTEGER;
     667           1 :     m_bNull = false;
     668           1 :     m_bSigned = false;
     669             : 
     670           1 :     return *this;
     671             : }
     672             : 
     673             : 
     674          84 : ORowSetValue& ORowSetValue::operator=(const bool _rRH)
     675             : {
     676          84 :     if(m_eTypeKind != DataType::BIT && DataType::BOOLEAN != m_eTypeKind )
     677          73 :         free();
     678             : 
     679          84 :     m_aValue.m_bBool = _rRH;
     680          84 :     m_eTypeKind = DataType::BOOLEAN;
     681          84 :     m_bNull = false;
     682             : 
     683          84 :     return *this;
     684             : }
     685             : 
     686           3 : ORowSetValue& ORowSetValue::operator=(const sal_Int64& _rRH)
     687             : {
     688           3 :     if ( DataType::BIGINT != m_eTypeKind)
     689           2 :         free();
     690             : 
     691           3 :     m_aValue.m_nInt64 = _rRH;
     692           3 :     m_eTypeKind = DataType::BIGINT;
     693           3 :     m_bNull = false;
     694           3 :     m_bSigned = true;
     695             : 
     696           3 :     return *this;
     697             : }
     698             : 
     699           2 : ORowSetValue& ORowSetValue::operator=(const sal_uInt64& _rRH)
     700             : {
     701           2 :     if ( DataType::BIGINT != m_eTypeKind)
     702           1 :         free();
     703             : 
     704           2 :     m_aValue.m_uInt64 = _rRH;
     705           2 :     m_eTypeKind = DataType::BIGINT;
     706           2 :     m_bNull = false;
     707           2 :     m_bSigned = false;
     708             : 
     709           2 :     return *this;
     710             : }
     711             : 
     712           0 : ORowSetValue& ORowSetValue::operator=(const Sequence<sal_Int8>& _rRH)
     713             : {
     714           0 :     if (!isStorageCompatible(DataType::LONGVARBINARY,m_eTypeKind))
     715           0 :         free();
     716             : 
     717           0 :     if (m_bNull)
     718             :     {
     719           0 :         m_aValue.m_pValue = new Sequence<sal_Int8>(_rRH);
     720             :         TRACE_ALLOC( Sequence_sal_Int8 )
     721             :     }
     722             :     else
     723           0 :         *static_cast< Sequence< sal_Int8 >* >(m_aValue.m_pValue) = _rRH;
     724             : 
     725           0 :     m_eTypeKind = DataType::LONGVARBINARY;
     726           0 :     m_bNull = false;
     727             : 
     728           0 :     return *this;
     729             : }
     730             : 
     731       13934 : ORowSetValue& ORowSetValue::operator=(const Any& _rAny)
     732             : {
     733       13934 :     if (!isStorageCompatible(DataType::OBJECT,m_eTypeKind))
     734         377 :         free();
     735             : 
     736       13934 :     if ( m_bNull )
     737             :     {
     738         377 :         m_aValue.m_pValue = new Any(_rAny);
     739             :         TRACE_ALLOC( Any )
     740             :     }
     741             :     else
     742       13557 :         *static_cast<Any*>(m_aValue.m_pValue) = _rAny;
     743             : 
     744       13934 :     m_eTypeKind = DataType::OBJECT;
     745       13934 :     m_bNull = false;
     746             : 
     747       13934 :     return *this;
     748             : }
     749             : 
     750             : 
     751          10 : bool operator==(const Date& _rLH, const Date& _rRH)
     752             : {
     753          10 :     return _rLH.Day == _rRH.Day && _rLH.Month == _rRH.Month && _rLH.Year == _rRH.Year;
     754             : }
     755             : 
     756             : 
     757           0 : bool operator==(const css::util::Time& _rLH, const css::util::Time& _rRH)
     758             : {
     759           0 :     return _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.NanoSeconds == _rRH.NanoSeconds;
     760             : }
     761             : 
     762             : 
     763           0 : bool operator==(const DateTime& _rLH, const DateTime& _rRH)
     764             : {
     765           0 :     return _rLH.Day == _rRH.Day && _rLH.Month == _rRH.Month && _rLH.Year == _rRH.Year &&
     766           0 :         _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.NanoSeconds == _rRH.NanoSeconds;
     767             : }
     768             : 
     769             : 
     770        6291 : bool ORowSetValue::operator==(const ORowSetValue& _rRH) const
     771             : {
     772        6291 :     if ( m_bNull != _rRH.isNull() )
     773         688 :         return false;
     774             : 
     775        5603 :     if(m_bNull && _rRH.isNull())
     776        1181 :         return true;
     777             : 
     778        4422 :     if ( m_eTypeKind != _rRH.m_eTypeKind )
     779             :     {
     780          14 :         switch(m_eTypeKind)
     781             :         {
     782             :             case DataType::FLOAT:
     783             :             case DataType::DOUBLE:
     784             :             case DataType::REAL:
     785           0 :                 return getDouble() == _rRH.getDouble();
     786             :             default:
     787          14 :                 switch(_rRH.m_eTypeKind)
     788             :                 {
     789             :                     case DataType::FLOAT:
     790             :                     case DataType::DOUBLE:
     791             :                     case DataType::REAL:
     792           0 :                             return getDouble() == _rRH.getDouble();
     793             :                     default:
     794          14 :                             break;
     795             :                 }
     796          14 :                 break;
     797             :             }
     798          14 :         return false;
     799             :     }
     800             : 
     801        4408 :     bool bRet = false;
     802             :     OSL_ENSURE(!m_bNull,"SHould not be null!");
     803        4408 :     switch(m_eTypeKind)
     804             :     {
     805             :         case DataType::VARCHAR:
     806             :         case DataType::CHAR:
     807             :         case DataType::LONGVARCHAR:
     808             :         {
     809        2712 :             OUString aVal1(m_aValue.m_pString);
     810        5424 :             OUString aVal2(_rRH.m_aValue.m_pString);
     811        5424 :             return aVal1 == aVal2;
     812             :         }
     813             :         default:
     814        1696 :             if ( m_bSigned != _rRH.m_bSigned )
     815           0 :                 return false;
     816        1696 :             break;
     817             :     }
     818             : 
     819        1696 :     switch(m_eTypeKind)
     820             :     {
     821             :         case DataType::DECIMAL:
     822             :         case DataType::NUMERIC:
     823             :             {
     824          23 :                 OUString aVal1(m_aValue.m_pString);
     825          46 :                 OUString aVal2(_rRH.m_aValue.m_pString);
     826          46 :                 bRet = aVal1 == aVal2;
     827             :             }
     828          23 :             break;
     829             :         case DataType::FLOAT:
     830           0 :             bRet = m_aValue.m_nFloat == _rRH.m_aValue.m_nFloat;
     831           0 :             break;
     832             :         case DataType::DOUBLE:
     833             :         case DataType::REAL:
     834           0 :             bRet = m_aValue.m_nDouble == _rRH.m_aValue.m_nDouble;
     835           0 :             break;
     836             :         case DataType::TINYINT:
     837           0 :             bRet = m_bSigned ? ( m_aValue.m_nInt8 == _rRH.m_aValue.m_nInt8 ) : (m_aValue.m_uInt8 == _rRH.m_aValue.m_uInt8);
     838           0 :             break;
     839             :         case DataType::SMALLINT:
     840           0 :             bRet = m_bSigned ? ( m_aValue.m_nInt16 == _rRH.m_aValue.m_nInt16 ) : (m_aValue.m_uInt16 == _rRH.m_aValue.m_uInt16);
     841           0 :             break;
     842             :         case DataType::INTEGER:
     843        1537 :             bRet = m_bSigned ? ( m_aValue.m_nInt32 == _rRH.m_aValue.m_nInt32 ) : (m_aValue.m_uInt32 == _rRH.m_aValue.m_uInt32);
     844        1537 :             break;
     845             :         case DataType::BIGINT:
     846           0 :             bRet = m_bSigned ? ( m_aValue.m_nInt64 == _rRH.m_aValue.m_nInt64 ) : (m_aValue.m_uInt64 == _rRH.m_aValue.m_uInt64);
     847           0 :             break;
     848             :         case DataType::BIT:
     849             :         case DataType::BOOLEAN:
     850           6 :             bRet = m_aValue.m_bBool == _rRH.m_aValue.m_bBool;
     851           6 :             break;
     852             :         case DataType::DATE:
     853          10 :             bRet = *static_cast<Date*>(m_aValue.m_pValue) == *static_cast<Date*>(_rRH.m_aValue.m_pValue);
     854          10 :             break;
     855             :         case DataType::TIME:
     856           0 :             bRet = *static_cast<Time*>(m_aValue.m_pValue) == *static_cast<Time*>(_rRH.m_aValue.m_pValue);
     857           0 :             break;
     858             :         case DataType::TIMESTAMP:
     859           0 :             bRet = *static_cast<DateTime*>(m_aValue.m_pValue) == *static_cast<DateTime*>(_rRH.m_aValue.m_pValue);
     860           0 :             break;
     861             :         case DataType::BINARY:
     862             :         case DataType::VARBINARY:
     863             :         case DataType::LONGVARBINARY:
     864           0 :             bRet = false;
     865           0 :             break;
     866             :         case DataType::BLOB:
     867             :         case DataType::CLOB:
     868             :         case DataType::OBJECT:
     869             :         case DataType::OTHER:
     870         120 :             bRet = false;
     871         120 :             break;
     872             :         default:
     873           0 :             bRet = false;
     874             :             SAL_WARN( "connectivity.commontools","ORowSetValue::operator==(): UNSUPPORTED TYPE!");
     875           0 :             break;
     876             :     }
     877        1696 :     return bRet;
     878             : }
     879             : 
     880        9306 : Any ORowSetValue::makeAny() const
     881             : {
     882        9306 :     Any rValue;
     883        9306 :     if(isBound() && !isNull())
     884             :     {
     885        8645 :         switch(getTypeKind())
     886             :         {
     887             :             case DataType::SQLNULL:
     888             :                 assert(rValue == Any());
     889           0 :                 break;
     890             :             case DataType::CHAR:
     891             :             case DataType::VARCHAR:
     892             :             case DataType::DECIMAL:
     893             :             case DataType::NUMERIC:
     894             :             case DataType::LONGVARCHAR:
     895             :                 OSL_ENSURE(m_aValue.m_pString,"Value is null!");
     896        5470 :                 rValue <<= OUString(m_aValue.m_pString);
     897        5470 :                 break;
     898             :             case DataType::FLOAT:
     899           1 :                 rValue <<= m_aValue.m_nFloat;
     900           1 :                 break;
     901             :             case DataType::DOUBLE:
     902             :             case DataType::REAL:
     903           1 :                 rValue <<= m_aValue.m_nDouble;
     904           1 :                 break;
     905             :             case DataType::DATE:
     906             :                 OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
     907          23 :                 rValue <<= *static_cast<Date*>(m_aValue.m_pValue);
     908          23 :                 break;
     909             :             case DataType::TIME:
     910             :                 OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
     911           0 :                 rValue <<= *static_cast<Time*>(m_aValue.m_pValue);
     912           0 :                 break;
     913             :             case DataType::TIMESTAMP:
     914             :                 OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
     915           0 :                 rValue <<= *static_cast<DateTime*>(m_aValue.m_pValue);
     916           0 :                 break;
     917             :             case DataType::BINARY:
     918             :             case DataType::VARBINARY:
     919             :             case DataType::LONGVARBINARY:
     920             :                 OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
     921           0 :                 rValue <<= *static_cast<Sequence<sal_Int8>*>(m_aValue.m_pValue);
     922           0 :                 break;
     923             :             case DataType::BLOB:
     924             :             case DataType::CLOB:
     925             :             case DataType::OBJECT:
     926             :             case DataType::OTHER:
     927          47 :                 rValue = getAny();
     928          47 :                 break;
     929             :             case DataType::BIT:
     930             :             case DataType::BOOLEAN:
     931           1 :                 rValue <<= m_aValue.m_bBool;
     932           1 :                 break;
     933             :             case DataType::TINYINT:
     934           2 :                 if ( m_bSigned )
     935             :                     // TypeClass_BYTE
     936           1 :                     rValue <<= m_aValue.m_nInt8;
     937             :                 else
     938             :                     // There is no TypeClass_UNSIGNED_BYTE,
     939             :                     // so silently promote it to a 16-bit integer,
     940             :                     // that is TypeClass_UNSIGNED_SHORT
     941           1 :                     rValue <<= static_cast<sal_uInt16>(m_aValue.m_uInt8);
     942           2 :                 break;
     943             :             case DataType::SMALLINT:
     944           2 :                 if ( m_bSigned )
     945             :                     // TypeClass_SHORT
     946           1 :                     rValue <<= m_aValue.m_nInt16;
     947             :                 else
     948             :                     // TypeClass_UNSIGNED_SHORT
     949           1 :                     rValue <<= m_aValue.m_uInt16;
     950           2 :                 break;
     951             :             case DataType::INTEGER:
     952        3096 :                 if ( m_bSigned )
     953             :                     // TypeClass_LONG
     954        3095 :                     rValue <<= m_aValue.m_nInt32;
     955             :                 else
     956             :                     // TypeClass_UNSIGNED_LONG
     957           1 :                     rValue <<= m_aValue.m_uInt32;
     958        3096 :                 break;
     959             :             case DataType::BIGINT:
     960           2 :                 if ( m_bSigned )
     961             :                     // TypeClass_HYPER
     962           1 :                     rValue <<= m_aValue.m_nInt64;
     963             :                 else
     964             :                     // TypeClass_UNSIGNED_HYPER
     965           1 :                     rValue <<= m_aValue.m_uInt64;
     966           2 :                 break;
     967             :             default:
     968             :                 SAL_WARN( "connectivity.commontools","ORowSetValue::makeAny(): UNSUPPORTED TYPE!");
     969           0 :                 rValue = getAny();
     970           0 :                 break;
     971             :         }
     972             :     }
     973        9306 :     return rValue;
     974             : }
     975             : 
     976        4272 : OUString ORowSetValue::getString( ) const
     977             : {
     978        4272 :     OUString aRet;
     979        4272 :     if(!m_bNull)
     980             :     {
     981        4272 :         switch(getTypeKind())
     982             :         {
     983             :             case DataType::CHAR:
     984             :             case DataType::VARCHAR:
     985             :             case DataType::DECIMAL:
     986             :             case DataType::NUMERIC:
     987             :             case DataType::LONGVARCHAR:
     988        4264 :                 aRet = m_aValue.m_pString;
     989        4264 :                 break;
     990             :             case DataType::FLOAT:
     991           0 :                 aRet = OUString::number(static_cast<float>(*this));
     992           0 :                 break;
     993             :             case DataType::DOUBLE:
     994             :             case DataType::REAL:
     995           4 :                 aRet = OUString::number(static_cast<double>(*this));
     996           4 :                 break;
     997             :             case DataType::DATE:
     998           0 :                 aRet = DBTypeConversion::toDateString(*this);
     999           0 :                 break;
    1000             :             case DataType::TIME:
    1001           0 :                 aRet = DBTypeConversion::toTimeString(*this);
    1002           0 :                 break;
    1003             :             case DataType::TIMESTAMP:
    1004           0 :                 aRet = DBTypeConversion::toDateTimeString(*this);
    1005           0 :                 break;
    1006             :             case DataType::BINARY:
    1007             :             case DataType::VARBINARY:
    1008             :             case DataType::LONGVARBINARY:
    1009             :                 {
    1010           0 :                     OUStringBuffer sVal("0x");
    1011           0 :                     Sequence<sal_Int8> aSeq(getSequence());
    1012           0 :                     const sal_Int8* pBegin  = aSeq.getConstArray();
    1013           0 :                     const sal_Int8* pEnd    = pBegin + aSeq.getLength();
    1014           0 :                     for(;pBegin != pEnd;++pBegin)
    1015           0 :                         sVal.append((sal_Int32)*pBegin,16);
    1016           0 :                     aRet = sVal.makeStringAndClear();
    1017             :                 }
    1018           0 :                 break;
    1019             :             case DataType::BIT:
    1020           2 :                 aRet = OUString::number(int(static_cast<bool>(*this)));
    1021           2 :                 break;
    1022             :             case DataType::BOOLEAN:
    1023           2 :                 aRet = OUString::boolean(static_cast<bool>(*this));
    1024           2 :                 break;
    1025             :             case DataType::TINYINT:
    1026             :             case DataType::SMALLINT:
    1027             :             case DataType::INTEGER:
    1028           0 :                 if ( m_bSigned )
    1029           0 :                     aRet = OUString::number(static_cast<sal_Int32>(*this));
    1030             :                 else
    1031           0 :                     aRet = OUString::number(static_cast<sal_uInt32>(*this));
    1032           0 :                 break;
    1033             :             case DataType::BIGINT:
    1034           0 :                 if ( m_bSigned )
    1035           0 :                     aRet = OUString::number(static_cast<sal_Int64>(*this));
    1036             :                 else
    1037           0 :                     aRet = OUString::number(static_cast<sal_uInt64>(*this));
    1038           0 :                 break;
    1039             :             case DataType::CLOB:
    1040             :                 {
    1041           0 :                     Any aValue( getAny() );
    1042           0 :                     Reference< XClob > xClob;
    1043           0 :                     if ( aValue >>= xClob )
    1044             :                     {
    1045           0 :                         if ( xClob.is() )
    1046             :                         {
    1047           0 :                             aRet = xClob->getSubString(1,(sal_Int32)xClob->length() );
    1048             :                         }
    1049           0 :                     }
    1050             :                 }
    1051           0 :                 break;
    1052             :             default:
    1053             :                 {
    1054           0 :                     Any aValue = makeAny();
    1055           0 :                     aValue >>= aRet;
    1056           0 :                     break;
    1057             :                 }
    1058             :         }
    1059             :     }
    1060        4272 :     return aRet;
    1061             : }
    1062             : 
    1063          14 : bool ORowSetValue::getBool()    const
    1064             : {
    1065          14 :     bool bRet = false;
    1066          14 :     if(!m_bNull)
    1067             :     {
    1068          14 :         switch(getTypeKind())
    1069             :         {
    1070             :             case DataType::CHAR:
    1071             :             case DataType::VARCHAR:
    1072             :             case DataType::LONGVARCHAR:
    1073             :                 {
    1074           6 :                     const OUString sValue(m_aValue.m_pString);
    1075           6 :                     if ( sValue.equalsIgnoreAsciiCase("true") || (sValue == "1") )
    1076             :                     {
    1077           3 :                         bRet = true;
    1078           3 :                         break;
    1079             :                     }
    1080           3 :                     else if ( sValue.equalsIgnoreAsciiCase("false") || (sValue == "0") )
    1081             :                     {
    1082           3 :                         bRet = false;
    1083           3 :                         break;
    1084           0 :                     }
    1085             :                 }
    1086             :                 // run through
    1087             :             case DataType::DECIMAL:
    1088             :             case DataType::NUMERIC:
    1089             : 
    1090           0 :                 bRet = OUString(m_aValue.m_pString).toInt32() != 0;
    1091           0 :                 break;
    1092             :             case DataType::FLOAT:
    1093           0 :                 bRet = m_aValue.m_nFloat != 0.0;
    1094           0 :                 break;
    1095             :             case DataType::DOUBLE:
    1096             :             case DataType::REAL:
    1097           0 :                 bRet = m_aValue.m_nDouble != 0.0;
    1098           0 :                 break;
    1099             :             case DataType::DATE:
    1100             :             case DataType::TIME:
    1101             :             case DataType::TIMESTAMP:
    1102             :             case DataType::BINARY:
    1103             :             case DataType::VARBINARY:
    1104             :             case DataType::LONGVARBINARY:
    1105             :                 OSL_FAIL("getBool() for this type is not allowed!");
    1106           0 :                 break;
    1107             :             case DataType::BIT:
    1108             :             case DataType::BOOLEAN:
    1109           8 :                 bRet = m_aValue.m_bBool;
    1110           8 :                 break;
    1111             :             case DataType::TINYINT:
    1112           0 :                 bRet = m_bSigned ? (m_aValue.m_nInt8  != 0) : (m_aValue.m_uInt8 != 0);
    1113           0 :                 break;
    1114             :             case DataType::SMALLINT:
    1115           0 :                 bRet = m_bSigned ? (m_aValue.m_nInt16  != 0) : (m_aValue.m_uInt16 != 0);
    1116           0 :                 break;
    1117             :             case DataType::INTEGER:
    1118           0 :                 bRet = m_bSigned ? (m_aValue.m_nInt32 != 0) : (m_aValue.m_uInt32 != 0);
    1119           0 :                 break;
    1120             :             case DataType::BIGINT:
    1121           0 :                 bRet = m_bSigned ? (m_aValue.m_nInt64 != 0) : (m_aValue.m_uInt64 != 0);
    1122           0 :                 break;
    1123             :             default:
    1124             :                 {
    1125           0 :                     Any aValue = makeAny();
    1126           0 :                     aValue >>= bRet;
    1127           0 :                     break;
    1128             :                 }
    1129             :         }
    1130             :     }
    1131          14 :     return bRet;
    1132             : }
    1133             : 
    1134             : 
    1135           2 : sal_Int8 ORowSetValue::getInt8()    const
    1136             : {
    1137           2 :     sal_Int8 nRet = 0;
    1138           2 :     if(!m_bNull)
    1139             :     {
    1140           2 :         switch(getTypeKind())
    1141             :         {
    1142             :             case DataType::CHAR:
    1143             :             case DataType::VARCHAR:
    1144             :             case DataType::DECIMAL:
    1145             :             case DataType::NUMERIC:
    1146             :             case DataType::LONGVARCHAR:
    1147           0 :                 nRet = sal_Int8(OUString(m_aValue.m_pString).toInt32());
    1148           0 :                 break;
    1149             :             case DataType::FLOAT:
    1150           0 :                 nRet = sal_Int8(m_aValue.m_nFloat);
    1151           0 :                 break;
    1152             :             case DataType::DOUBLE:
    1153             :             case DataType::REAL:
    1154           0 :                 nRet = sal_Int8(m_aValue.m_nDouble);
    1155           0 :                 break;
    1156             :             case DataType::DATE:
    1157             :             case DataType::TIME:
    1158             :             case DataType::TIMESTAMP:
    1159             :             case DataType::BINARY:
    1160             :             case DataType::VARBINARY:
    1161             :             case DataType::LONGVARBINARY:
    1162             :             case DataType::BLOB:
    1163             :             case DataType::CLOB:
    1164             :                 OSL_FAIL("getInt8() for this type is not allowed!");
    1165           0 :                 break;
    1166             :             case DataType::BIT:
    1167             :             case DataType::BOOLEAN:
    1168           0 :                 nRet = sal_Int8(m_aValue.m_bBool);
    1169           0 :                 break;
    1170             :             case DataType::TINYINT:
    1171           2 :                 if ( m_bSigned )
    1172           2 :                     nRet = m_aValue.m_nInt8;
    1173             :                 else
    1174           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_uInt8);
    1175           2 :                 break;
    1176             :             case DataType::SMALLINT:
    1177           0 :                 if ( m_bSigned )
    1178           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_nInt16);
    1179             :                 else
    1180           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_uInt16);
    1181           0 :                 break;
    1182             :             case DataType::INTEGER:
    1183           0 :                 if ( m_bSigned )
    1184           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_nInt32);
    1185             :                 else
    1186           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_uInt32);
    1187           0 :                 break;
    1188             :             case DataType::BIGINT:
    1189           0 :                 if ( m_bSigned )
    1190           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_nInt64);
    1191             :                 else
    1192           0 :                     nRet = static_cast<sal_Int8>(m_aValue.m_uInt64);
    1193           0 :                 break;
    1194             :             default:
    1195             :                 {
    1196           0 :                     Any aValue = makeAny();
    1197           0 :                     aValue >>= nRet;
    1198           0 :                     break;
    1199             :                 }
    1200             :         }
    1201             :     }
    1202           2 :     return nRet;
    1203             : }
    1204             : 
    1205             : 
    1206          42 : sal_uInt8 ORowSetValue::getUInt8()    const
    1207             : {
    1208          42 :     sal_uInt8 nRet = 0;
    1209          42 :     if(!m_bNull)
    1210             :     {
    1211          42 :         switch(getTypeKind())
    1212             :         {
    1213             :             case DataType::CHAR:
    1214             :             case DataType::VARCHAR:
    1215             :             case DataType::DECIMAL:
    1216             :             case DataType::NUMERIC:
    1217             :             case DataType::LONGVARCHAR:
    1218           0 :                 nRet = sal_uInt8(OUString(m_aValue.m_pString).toInt32());
    1219           0 :                 break;
    1220             :             case DataType::FLOAT:
    1221           0 :                 nRet = sal_uInt8(m_aValue.m_nFloat);
    1222           0 :                 break;
    1223             :             case DataType::DOUBLE:
    1224             :             case DataType::REAL:
    1225           0 :                 nRet = sal_uInt8(m_aValue.m_nDouble);
    1226           0 :                 break;
    1227             :             case DataType::DATE:
    1228             :             case DataType::TIME:
    1229             :             case DataType::TIMESTAMP:
    1230             :             case DataType::BINARY:
    1231             :             case DataType::VARBINARY:
    1232             :             case DataType::LONGVARBINARY:
    1233             :             case DataType::BLOB:
    1234             :             case DataType::CLOB:
    1235             :                 OSL_FAIL("getuInt8() for this type is not allowed!");
    1236           0 :                 break;
    1237             :             case DataType::BIT:
    1238             :             case DataType::BOOLEAN:
    1239           0 :                 nRet = int(m_aValue.m_bBool);
    1240           0 :                 break;
    1241             :             case DataType::TINYINT:
    1242           6 :                 if ( m_bSigned )
    1243           0 :                     nRet = m_aValue.m_nInt8;
    1244             :                 else
    1245           6 :                     nRet = m_aValue.m_uInt8;
    1246           6 :                 break;
    1247             :             case DataType::SMALLINT:
    1248           1 :                 if ( m_bSigned )
    1249           0 :                     nRet = static_cast<sal_uInt8>(m_aValue.m_nInt16);
    1250             :                 else
    1251           1 :                     nRet = static_cast<sal_uInt8>(m_aValue.m_uInt16);
    1252           1 :                 break;
    1253             :             case DataType::INTEGER:
    1254          35 :                 if ( m_bSigned )
    1255          35 :                     nRet = static_cast<sal_uInt8>(m_aValue.m_nInt32);
    1256             :                 else
    1257           0 :                     nRet = static_cast<sal_uInt8>(m_aValue.m_uInt32);
    1258          35 :                 break;
    1259             :             case DataType::BIGINT:
    1260           0 :                 if ( m_bSigned )
    1261           0 :                     nRet = static_cast<sal_uInt8>(m_aValue.m_nInt64);
    1262             :                 else
    1263           0 :                     nRet = static_cast<sal_uInt8>(m_aValue.m_uInt64);
    1264           0 :                 break;
    1265             :             default:
    1266             :                 {
    1267           0 :                     Any aValue = makeAny();
    1268           0 :                     aValue >>= nRet;
    1269           0 :                     break;
    1270             :                 }
    1271             :         }
    1272             :     }
    1273          42 :     return nRet;
    1274             : }
    1275             : 
    1276             : 
    1277             : 
    1278           2 : sal_Int16 ORowSetValue::getInt16()  const
    1279             : {
    1280           2 :     sal_Int16 nRet = 0;
    1281           2 :     if(!m_bNull)
    1282             :     {
    1283           2 :         switch(getTypeKind())
    1284             :         {
    1285             :             case DataType::CHAR:
    1286             :             case DataType::VARCHAR:
    1287             :             case DataType::DECIMAL:
    1288             :             case DataType::NUMERIC:
    1289             :             case DataType::LONGVARCHAR:
    1290           0 :                 nRet = sal_Int16(OUString(m_aValue.m_pString).toInt32());
    1291           0 :                 break;
    1292             :             case DataType::FLOAT:
    1293           0 :                 nRet = sal_Int16(m_aValue.m_nFloat);
    1294           0 :                 break;
    1295             :             case DataType::DOUBLE:
    1296             :             case DataType::REAL:
    1297           0 :                 nRet = sal_Int16(m_aValue.m_nDouble);
    1298           0 :                 break;
    1299             :             case DataType::DATE:
    1300             :             case DataType::TIME:
    1301             :             case DataType::TIMESTAMP:
    1302             :             case DataType::BINARY:
    1303             :             case DataType::VARBINARY:
    1304             :             case DataType::LONGVARBINARY:
    1305             :             case DataType::BLOB:
    1306             :             case DataType::CLOB:
    1307             :                 OSL_FAIL("getInt16() for this type is not allowed!");
    1308           0 :                 break;
    1309             :             case DataType::BIT:
    1310             :             case DataType::BOOLEAN:
    1311           0 :                 nRet = sal_Int16(m_aValue.m_bBool);
    1312           0 :                 break;
    1313             :             case DataType::TINYINT:
    1314           0 :                 if ( m_bSigned )
    1315           0 :                     nRet = m_aValue.m_nInt8;
    1316             :                 else
    1317           0 :                     nRet = m_aValue.m_uInt8;
    1318           0 :                 break;
    1319             :             case DataType::SMALLINT:
    1320           2 :                 if ( m_bSigned )
    1321           2 :                     nRet = m_aValue.m_nInt16;
    1322             :                 else
    1323           0 :                     nRet = static_cast<sal_Int16>(m_aValue.m_uInt16);
    1324           2 :                 break;
    1325             :             case DataType::INTEGER:
    1326           0 :                 if ( m_bSigned )
    1327           0 :                     nRet = static_cast<sal_Int16>(m_aValue.m_nInt32);
    1328             :                 else
    1329           0 :                     nRet = static_cast<sal_Int16>(m_aValue.m_uInt32);
    1330           0 :                 break;
    1331             :             case DataType::BIGINT:
    1332           0 :                 if ( m_bSigned )
    1333           0 :                     nRet = static_cast<sal_Int16>(m_aValue.m_nInt64);
    1334             :                 else
    1335           0 :                     nRet = static_cast<sal_Int16>(m_aValue.m_uInt64);
    1336           0 :                 break;
    1337             :             default:
    1338             :                 {
    1339           0 :                     Any aValue = makeAny();
    1340           0 :                     aValue >>= nRet;
    1341           0 :                     break;
    1342             :                 }
    1343             :         }
    1344             :     }
    1345           2 :     return nRet;
    1346             : }
    1347             : 
    1348             : 
    1349           2 : sal_uInt16 ORowSetValue::getUInt16()  const
    1350             : {
    1351           2 :     sal_uInt16 nRet = 0;
    1352           2 :     if(!m_bNull)
    1353             :     {
    1354           2 :         switch(getTypeKind())
    1355             :         {
    1356             :             case DataType::CHAR:
    1357             :             case DataType::VARCHAR:
    1358             :             case DataType::DECIMAL:
    1359             :             case DataType::NUMERIC:
    1360             :             case DataType::LONGVARCHAR:
    1361           0 :                 nRet = sal_uInt16(OUString(m_aValue.m_pString).toInt32());
    1362           0 :                 break;
    1363             :             case DataType::FLOAT:
    1364           0 :                 nRet = sal_uInt16(m_aValue.m_nFloat);
    1365           0 :                 break;
    1366             :             case DataType::DOUBLE:
    1367             :             case DataType::REAL:
    1368           0 :                 nRet = sal_uInt16(m_aValue.m_nDouble);
    1369           0 :                 break;
    1370             :             case DataType::DATE:
    1371             :             case DataType::TIME:
    1372             :             case DataType::TIMESTAMP:
    1373             :             case DataType::BINARY:
    1374             :             case DataType::VARBINARY:
    1375             :             case DataType::LONGVARBINARY:
    1376             :             case DataType::BLOB:
    1377             :             case DataType::CLOB:
    1378             :                 OSL_FAIL("getuInt16() for this type is not allowed!");
    1379           0 :                 break;
    1380             :             case DataType::BIT:
    1381             :             case DataType::BOOLEAN:
    1382           0 :                 nRet = sal_uInt16(m_aValue.m_bBool);
    1383           0 :                 break;
    1384             :             case DataType::TINYINT:
    1385           0 :                 if ( m_bSigned )
    1386           0 :                     nRet = m_aValue.m_nInt8;
    1387             :                 else
    1388           0 :                     nRet = m_aValue.m_uInt8;
    1389           0 :                 break;
    1390             :             case DataType::SMALLINT:
    1391           2 :                 if ( m_bSigned )
    1392           0 :                     nRet = m_aValue.m_nInt16;
    1393             :                 else
    1394           2 :                     nRet = m_aValue.m_uInt16;
    1395           2 :                 break;
    1396             :             case DataType::INTEGER:
    1397           0 :                 if ( m_bSigned )
    1398           0 :                     nRet = static_cast<sal_uInt16>(m_aValue.m_nInt32);
    1399             :                 else
    1400           0 :                     nRet = static_cast<sal_uInt16>(m_aValue.m_uInt32);
    1401           0 :                 break;
    1402             :             case DataType::BIGINT:
    1403           0 :                 if ( m_bSigned )
    1404           0 :                     nRet = static_cast<sal_uInt16>(m_aValue.m_nInt64);
    1405             :                 else
    1406           0 :                     nRet = static_cast<sal_uInt16>(m_aValue.m_uInt64);
    1407           0 :                 break;
    1408             :             default:
    1409             :                 {
    1410           0 :                     Any aValue = makeAny();
    1411           0 :                     aValue >>= nRet;
    1412           0 :                     break;
    1413             :                 }
    1414             :         }
    1415             :     }
    1416           2 :     return nRet;
    1417             : }
    1418             : 
    1419             : 
    1420       16524 : sal_Int32 ORowSetValue::getInt32()  const
    1421             : {
    1422       16524 :     sal_Int32 nRet = 0;
    1423       16524 :     if(!m_bNull)
    1424             :     {
    1425       16524 :         switch(getTypeKind())
    1426             :         {
    1427             :             case DataType::CHAR:
    1428             :             case DataType::VARCHAR:
    1429             :             case DataType::DECIMAL:
    1430             :             case DataType::NUMERIC:
    1431             :             case DataType::LONGVARCHAR:
    1432           0 :                 nRet = OUString(m_aValue.m_pString).toInt32();
    1433           0 :                 break;
    1434             :             case DataType::FLOAT:
    1435           0 :                 nRet = sal_Int32(m_aValue.m_nFloat);
    1436           0 :                 break;
    1437             :             case DataType::DOUBLE:
    1438             :             case DataType::REAL:
    1439           0 :                 nRet = sal_Int32(m_aValue.m_nDouble);
    1440           0 :                 break;
    1441             :             case DataType::DATE:
    1442           0 :                 nRet = dbtools::DBTypeConversion::toDays(*static_cast<css::util::Date*>(m_aValue.m_pValue));
    1443           0 :                 break;
    1444             :             case DataType::TIME:
    1445             :             case DataType::TIMESTAMP:
    1446             :             case DataType::BINARY:
    1447             :             case DataType::VARBINARY:
    1448             :             case DataType::LONGVARBINARY:
    1449             :             case DataType::BLOB:
    1450             :             case DataType::CLOB:
    1451             :                 OSL_FAIL("getInt32() for this type is not allowed!");
    1452           0 :                 break;
    1453             :             case DataType::BIT:
    1454             :             case DataType::BOOLEAN:
    1455           0 :                 nRet = sal_Int32(m_aValue.m_bBool);
    1456           0 :                 break;
    1457             :             case DataType::TINYINT:
    1458           0 :                 if ( m_bSigned )
    1459           0 :                     nRet = m_aValue.m_nInt8;
    1460             :                 else
    1461           0 :                     nRet = m_aValue.m_uInt8;
    1462           0 :                 break;
    1463             :             case DataType::SMALLINT:
    1464         148 :                 if ( m_bSigned )
    1465         148 :                     nRet = m_aValue.m_nInt16;
    1466             :                 else
    1467           0 :                     nRet = m_aValue.m_uInt16;
    1468         148 :                 break;
    1469             :             case DataType::INTEGER:
    1470       16376 :                 if ( m_bSigned )
    1471       16376 :                     nRet = m_aValue.m_nInt32;
    1472             :                 else
    1473           0 :                     nRet = static_cast<sal_Int32>(m_aValue.m_uInt32);
    1474       16376 :                 break;
    1475             :             case DataType::BIGINT:
    1476           0 :                 if ( m_bSigned )
    1477           0 :                     nRet = static_cast<sal_Int32>(m_aValue.m_nInt64);
    1478             :                 else
    1479           0 :                     nRet = static_cast<sal_Int32>(m_aValue.m_uInt64);
    1480           0 :                 break;
    1481             :             default:
    1482             :                 {
    1483           0 :                     Any aValue = makeAny();
    1484           0 :                     aValue >>= nRet;
    1485           0 :                     break;
    1486             :                 }
    1487             :         }
    1488             :     }
    1489       16524 :     return nRet;
    1490             : }
    1491             : 
    1492             : 
    1493           2 : sal_uInt32 ORowSetValue::getUInt32()  const
    1494             : {
    1495           2 :     sal_uInt32 nRet = 0;
    1496           2 :     if(!m_bNull)
    1497             :     {
    1498           2 :         switch(getTypeKind())
    1499             :         {
    1500             :             case DataType::CHAR:
    1501             :             case DataType::VARCHAR:
    1502             :             case DataType::DECIMAL:
    1503             :             case DataType::NUMERIC:
    1504             :             case DataType::LONGVARCHAR:
    1505           0 :                 nRet = OUString(m_aValue.m_pString).toUInt32();
    1506           0 :                 break;
    1507             :             case DataType::FLOAT:
    1508           0 :                 nRet = sal_uInt32(m_aValue.m_nFloat);
    1509           0 :                 break;
    1510             :             case DataType::DOUBLE:
    1511             :             case DataType::REAL:
    1512           0 :                 nRet = sal_uInt32(m_aValue.m_nDouble);
    1513           0 :                 break;
    1514             :             case DataType::DATE:
    1515           0 :                 nRet = dbtools::DBTypeConversion::toDays(*static_cast<css::util::Date*>(m_aValue.m_pValue));
    1516           0 :                 break;
    1517             :             case DataType::TIME:
    1518             :             case DataType::TIMESTAMP:
    1519             :             case DataType::BINARY:
    1520             :             case DataType::VARBINARY:
    1521             :             case DataType::LONGVARBINARY:
    1522             :             case DataType::BLOB:
    1523             :             case DataType::CLOB:
    1524             :                 OSL_FAIL("getuInt32() for this type is not allowed!");
    1525           0 :                 break;
    1526             :             case DataType::BIT:
    1527             :             case DataType::BOOLEAN:
    1528           0 :                 nRet = sal_uInt32(m_aValue.m_bBool);
    1529           0 :                 break;
    1530             :             case DataType::TINYINT:
    1531           0 :                 if ( m_bSigned )
    1532           0 :                     nRet = m_aValue.m_nInt8;
    1533             :                 else
    1534           0 :                     nRet = m_aValue.m_uInt8;
    1535           0 :                 break;
    1536             :             case DataType::SMALLINT:
    1537           0 :                 if ( m_bSigned )
    1538           0 :                     nRet = m_aValue.m_nInt16;
    1539             :                 else
    1540           0 :                     nRet = m_aValue.m_uInt16;
    1541           0 :                 break;
    1542             :             case DataType::INTEGER:
    1543           1 :                 if ( m_bSigned )
    1544           0 :                     nRet = m_aValue.m_nInt32;
    1545             :                 else
    1546           1 :                     nRet = m_aValue.m_uInt32;
    1547           1 :                 break;
    1548             :             case DataType::BIGINT:
    1549           1 :                 if ( m_bSigned )
    1550           0 :                     nRet = static_cast<sal_uInt32>(m_aValue.m_nInt64);
    1551             :                 else
    1552           1 :                     nRet = static_cast<sal_uInt32>(m_aValue.m_uInt64);
    1553           1 :                 break;
    1554             :             default:
    1555             :                 {
    1556           0 :                     Any aValue = makeAny();
    1557           0 :                     aValue >>= nRet;
    1558           0 :                     break;
    1559             :                 }
    1560             :         }
    1561             :     }
    1562           2 :     return nRet;
    1563             : }
    1564             : 
    1565             : 
    1566           2 : sal_Int64 ORowSetValue::getLong()   const
    1567             : {
    1568           2 :     sal_Int64 nRet = 0;
    1569           2 :     if(!m_bNull)
    1570             :     {
    1571           2 :         switch(getTypeKind())
    1572             :         {
    1573             :             case DataType::CHAR:
    1574             :             case DataType::VARCHAR:
    1575             :             case DataType::DECIMAL:
    1576             :             case DataType::NUMERIC:
    1577             :             case DataType::LONGVARCHAR:
    1578           0 :                 nRet = OUString(m_aValue.m_pString).toInt64();
    1579           0 :                 break;
    1580             :             case DataType::FLOAT:
    1581           0 :                 nRet = sal_Int64(m_aValue.m_nFloat);
    1582           0 :                 break;
    1583             :             case DataType::DOUBLE:
    1584             :             case DataType::REAL:
    1585           0 :                 nRet = sal_Int64(m_aValue.m_nDouble);
    1586           0 :                 break;
    1587             :             case DataType::DATE:
    1588           0 :                 nRet = dbtools::DBTypeConversion::toDays(*static_cast<css::util::Date*>(m_aValue.m_pValue));
    1589           0 :                 break;
    1590             :             case DataType::TIME:
    1591             :             case DataType::TIMESTAMP:
    1592             :             case DataType::BINARY:
    1593             :             case DataType::VARBINARY:
    1594             :             case DataType::LONGVARBINARY:
    1595             :             case DataType::BLOB:
    1596             :             case DataType::CLOB:
    1597             :                 OSL_FAIL("getLong() for this type is not allowed!");
    1598           0 :                 break;
    1599             :             case DataType::BIT:
    1600             :             case DataType::BOOLEAN:
    1601           0 :                 nRet = sal_Int64(m_aValue.m_bBool);
    1602           0 :                 break;
    1603             :             case DataType::TINYINT:
    1604           0 :                 if ( m_bSigned )
    1605           0 :                     nRet = m_aValue.m_nInt8;
    1606             :                 else
    1607           0 :                     nRet = m_aValue.m_uInt8;
    1608           0 :                 break;
    1609             :             case DataType::SMALLINT:
    1610           0 :                 if ( m_bSigned )
    1611           0 :                     nRet = m_aValue.m_nInt16;
    1612             :                 else
    1613           0 :                     nRet = m_aValue.m_uInt16;
    1614           0 :                 break;
    1615             :             case DataType::INTEGER:
    1616           0 :                 if ( m_bSigned )
    1617           0 :                     nRet = m_aValue.m_nInt32;
    1618             :                 else
    1619           0 :                     nRet = m_aValue.m_uInt32;
    1620           0 :                 break;
    1621             :             case DataType::BIGINT:
    1622           2 :                 if ( m_bSigned )
    1623           2 :                     nRet = m_aValue.m_nInt64;
    1624             :                 else
    1625           0 :                     nRet = static_cast<sal_Int64>(m_aValue.m_uInt64);
    1626           2 :                 break;
    1627             :             default:
    1628             :                 {
    1629           0 :                     Any aValue = makeAny();
    1630           0 :                     aValue >>= nRet;
    1631           0 :                     break;
    1632             :                 }
    1633             :         }
    1634             :     }
    1635           2 :     return nRet;
    1636             : }
    1637             : 
    1638             : 
    1639           2 : sal_uInt64 ORowSetValue::getULong()   const
    1640             : {
    1641           2 :     sal_uInt64 nRet = 0;
    1642           2 :     if(!m_bNull)
    1643             :     {
    1644           2 :         switch(getTypeKind())
    1645             :         {
    1646             :             case DataType::CHAR:
    1647             :             case DataType::VARCHAR:
    1648             :             case DataType::DECIMAL:
    1649             :             case DataType::NUMERIC:
    1650             :             case DataType::LONGVARCHAR:
    1651           0 :                 nRet = static_cast<sal_uInt64>(OUString(m_aValue.m_pString).toUInt64());
    1652           0 :                 break;
    1653             :             case DataType::FLOAT:
    1654           0 :                 nRet = sal_uInt64(m_aValue.m_nFloat);
    1655           0 :                 break;
    1656             :             case DataType::DOUBLE:
    1657             :             case DataType::REAL:
    1658           0 :                 nRet = sal_uInt64(m_aValue.m_nDouble);
    1659           0 :                 break;
    1660             :             case DataType::DATE:
    1661           0 :                 nRet = dbtools::DBTypeConversion::toDays(*static_cast<css::util::Date*>(m_aValue.m_pValue));
    1662           0 :                 break;
    1663             :             case DataType::TIME:
    1664             :             case DataType::TIMESTAMP:
    1665             :             case DataType::BINARY:
    1666             :             case DataType::VARBINARY:
    1667             :             case DataType::LONGVARBINARY:
    1668             :             case DataType::BLOB:
    1669             :             case DataType::CLOB:
    1670             :                 OSL_FAIL("getULong() for this type is not allowed!");
    1671           0 :                 break;
    1672             :             case DataType::BIT:
    1673             :             case DataType::BOOLEAN:
    1674           0 :                 nRet = sal_uInt64(m_aValue.m_bBool);
    1675           0 :                 break;
    1676             :             case DataType::TINYINT:
    1677           0 :                 if ( m_bSigned )
    1678           0 :                     nRet = m_aValue.m_nInt8;
    1679             :                 else
    1680           0 :                     nRet = m_aValue.m_uInt8;
    1681           0 :                 break;
    1682             :             case DataType::SMALLINT:
    1683           0 :                 if ( m_bSigned )
    1684           0 :                     nRet = m_aValue.m_nInt16;
    1685             :                 else
    1686           0 :                     nRet = m_aValue.m_uInt16;
    1687           0 :                 break;
    1688             :             case DataType::INTEGER:
    1689           0 :                 if ( m_bSigned )
    1690           0 :                     nRet = m_aValue.m_nInt32;
    1691             :                 else
    1692           0 :                     nRet = m_aValue.m_uInt32;
    1693           0 :                 break;
    1694             :             case DataType::BIGINT:
    1695           2 :                 if ( m_bSigned )
    1696           0 :                     nRet = m_aValue.m_nInt64;
    1697             :                 else
    1698           2 :                     nRet = m_aValue.m_uInt64;
    1699           2 :                 break;
    1700             :             default:
    1701             :                 {
    1702           0 :                     Any aValue = makeAny();
    1703           0 :                     aValue >>= nRet;
    1704           0 :                     break;
    1705             :                 }
    1706             :         }
    1707             :     }
    1708           2 :     return nRet;
    1709             : }
    1710             : 
    1711             : 
    1712           2 : float ORowSetValue::getFloat()  const
    1713             : {
    1714           2 :     float nRet = 0;
    1715           2 :     if(!m_bNull)
    1716             :     {
    1717           2 :         switch(getTypeKind())
    1718             :         {
    1719             :             case DataType::CHAR:
    1720             :             case DataType::VARCHAR:
    1721             :             case DataType::DECIMAL:
    1722             :             case DataType::NUMERIC:
    1723             :             case DataType::LONGVARCHAR:
    1724           0 :                 nRet = OUString(m_aValue.m_pString).toFloat();
    1725           0 :                 break;
    1726             :             case DataType::FLOAT:
    1727           2 :                 nRet = m_aValue.m_nFloat;
    1728           2 :                 break;
    1729             :             case DataType::DOUBLE:
    1730             :             case DataType::REAL:
    1731           0 :                 nRet = (float)m_aValue.m_nDouble;
    1732           0 :                 break;
    1733             :             case DataType::DATE:
    1734           0 :                 nRet = (float)dbtools::DBTypeConversion::toDouble(*static_cast<css::util::Date*>(m_aValue.m_pValue));
    1735           0 :                 break;
    1736             :             case DataType::TIME:
    1737           0 :                 nRet = (float)dbtools::DBTypeConversion::toDouble(*static_cast<css::util::Time*>(m_aValue.m_pValue));
    1738           0 :                 break;
    1739             :             case DataType::TIMESTAMP:
    1740           0 :                 nRet = (float)dbtools::DBTypeConversion::toDouble(*static_cast<css::util::DateTime*>(m_aValue.m_pValue));
    1741           0 :                 break;
    1742             :             case DataType::BINARY:
    1743             :             case DataType::VARBINARY:
    1744             :             case DataType::LONGVARBINARY:
    1745             :             case DataType::BLOB:
    1746             :             case DataType::CLOB:
    1747             :                 OSL_FAIL("getDouble() for this type is not allowed!");
    1748           0 :                 break;
    1749             :             case DataType::BIT:
    1750             :             case DataType::BOOLEAN:
    1751           0 :                 nRet = float(m_aValue.m_bBool);
    1752           0 :                 break;
    1753             :             case DataType::TINYINT:
    1754           0 :                 if ( m_bSigned )
    1755           0 :                     nRet = m_aValue.m_nInt8;
    1756             :                 else
    1757           0 :                     nRet = m_aValue.m_uInt8;
    1758           0 :                 break;
    1759             :             case DataType::SMALLINT:
    1760           0 :                 if ( m_bSigned )
    1761           0 :                     nRet = m_aValue.m_nInt16;
    1762             :                 else
    1763           0 :                     nRet = (float)m_aValue.m_uInt16;
    1764           0 :                 break;
    1765             :             case DataType::INTEGER:
    1766           0 :                 if ( m_bSigned )
    1767           0 :                     nRet = (float)m_aValue.m_nInt32;
    1768             :                 else
    1769           0 :                     nRet = (float)m_aValue.m_uInt32;
    1770           0 :                 break;
    1771             :             case DataType::BIGINT:
    1772           0 :                 if ( m_bSigned )
    1773           0 :                     nRet = (float)m_aValue.m_nInt64;
    1774             :                 else
    1775           0 :                     nRet = (float)m_aValue.m_uInt64;
    1776           0 :                 break;
    1777             :             default:
    1778             :                 {
    1779           0 :                     Any aValue = makeAny();
    1780           0 :                     aValue >>= nRet;
    1781           0 :                     break;
    1782             :                 }
    1783             :         }
    1784             :     }
    1785           2 :     return nRet;
    1786             : }
    1787             : 
    1788          24 : double ORowSetValue::getDouble()    const
    1789             : {
    1790          24 :     double nRet = 0;
    1791          24 :     if(!m_bNull)
    1792             :     {
    1793          24 :         switch(getTypeKind())
    1794             :         {
    1795             :             case DataType::CHAR:
    1796             :             case DataType::VARCHAR:
    1797             :             case DataType::DECIMAL:
    1798             :             case DataType::NUMERIC:
    1799             :             case DataType::LONGVARCHAR:
    1800           0 :                 nRet = OUString(m_aValue.m_pString).toDouble();
    1801           0 :                 break;
    1802             :             case DataType::FLOAT:
    1803           0 :                 nRet = m_aValue.m_nFloat;
    1804           0 :                 break;
    1805             :             case DataType::DOUBLE:
    1806             :             case DataType::REAL:
    1807          24 :                 nRet = m_aValue.m_nDouble;
    1808          24 :                 break;
    1809             :             case DataType::DATE:
    1810           0 :                 nRet = dbtools::DBTypeConversion::toDouble(*static_cast<css::util::Date*>(m_aValue.m_pValue));
    1811           0 :                 break;
    1812             :             case DataType::TIME:
    1813           0 :                 nRet = dbtools::DBTypeConversion::toDouble(*static_cast<css::util::Time*>(m_aValue.m_pValue));
    1814           0 :                 break;
    1815             :             case DataType::TIMESTAMP:
    1816           0 :                 nRet = dbtools::DBTypeConversion::toDouble(*static_cast<css::util::DateTime*>(m_aValue.m_pValue));
    1817           0 :                 break;
    1818             :             case DataType::BINARY:
    1819             :             case DataType::VARBINARY:
    1820             :             case DataType::LONGVARBINARY:
    1821             :             case DataType::BLOB:
    1822             :             case DataType::CLOB:
    1823             :                 OSL_FAIL("getDouble() for this type is not allowed!");
    1824           0 :                 break;
    1825             :             case DataType::BIT:
    1826             :             case DataType::BOOLEAN:
    1827           0 :                 nRet = double(m_aValue.m_bBool);
    1828           0 :                 break;
    1829             :             case DataType::TINYINT:
    1830           0 :                 if ( m_bSigned )
    1831           0 :                     nRet = m_aValue.m_nInt8;
    1832             :                 else
    1833           0 :                     nRet = m_aValue.m_uInt8;
    1834           0 :                 break;
    1835             :             case DataType::SMALLINT:
    1836           0 :                 if ( m_bSigned )
    1837           0 :                     nRet = m_aValue.m_nInt16;
    1838             :                 else
    1839           0 :                     nRet = m_aValue.m_uInt16;
    1840           0 :                 break;
    1841             :             case DataType::INTEGER:
    1842           0 :                 if ( m_bSigned )
    1843           0 :                     nRet = m_aValue.m_nInt32;
    1844             :                 else
    1845           0 :                     nRet = m_aValue.m_uInt32;
    1846           0 :                 break;
    1847             :             case DataType::BIGINT:
    1848           0 :                 if ( m_bSigned )
    1849           0 :                     nRet = m_aValue.m_nInt64;
    1850             :                 else
    1851           0 :                     nRet = m_aValue.m_uInt64;
    1852           0 :                 break;
    1853             :             default:
    1854             :                 {
    1855           0 :                     Any aValue = makeAny();
    1856           0 :                     aValue >>= nRet;
    1857           0 :                     break;
    1858             :                 }
    1859             :         }
    1860             :     }
    1861          24 :     return nRet;
    1862             : }
    1863             : 
    1864           0 : Sequence<sal_Int8>  ORowSetValue::getSequence() const
    1865             : {
    1866           0 :     Sequence<sal_Int8> aSeq;
    1867           0 :     if (!m_bNull)
    1868             :     {
    1869           0 :         switch(m_eTypeKind)
    1870             :         {
    1871             :             case DataType::OBJECT:
    1872             :             case DataType::CLOB:
    1873             :             case DataType::BLOB:
    1874             :             {
    1875           0 :                 Reference<XInputStream> xStream;
    1876           0 :                 const Any aValue = makeAny();
    1877           0 :                 if(aValue.hasValue())
    1878             :                 {
    1879           0 :                     Reference<XBlob> xBlob(aValue,UNO_QUERY);
    1880           0 :                     if ( xBlob.is() )
    1881           0 :                         xStream = xBlob->getBinaryStream();
    1882             :                     else
    1883             :                     {
    1884           0 :                         Reference<XClob> xClob(aValue,UNO_QUERY);
    1885           0 :                         if ( xClob.is() )
    1886           0 :                             xStream = xClob->getCharacterStream();
    1887             :                     }
    1888           0 :                     if(xStream.is())
    1889             :                     {
    1890           0 :                         const sal_uInt32    nBytesToRead = 65535;
    1891             :                         sal_uInt32          nRead;
    1892             : 
    1893           0 :                         do
    1894             :                         {
    1895           0 :                             ::com::sun::star::uno::Sequence< sal_Int8 > aReadSeq;
    1896             : 
    1897           0 :                             nRead = xStream->readSomeBytes( aReadSeq, nBytesToRead );
    1898             : 
    1899           0 :                             if( nRead )
    1900             :                             {
    1901           0 :                                 const sal_uInt32 nOldLength = aSeq.getLength();
    1902           0 :                                 aSeq.realloc( nOldLength + nRead );
    1903           0 :                                 memcpy( aSeq.getArray() + nOldLength, aReadSeq.getConstArray(), aReadSeq.getLength() );
    1904           0 :                             }
    1905             :                         }
    1906             :                         while( nBytesToRead == nRead );
    1907           0 :                         xStream->closeInput();
    1908           0 :                     }
    1909           0 :                 }
    1910             :             }
    1911           0 :             break;
    1912             :             case DataType::VARCHAR:
    1913             :             case DataType::LONGVARCHAR:
    1914             :                 {
    1915           0 :                     OUString sVal(m_aValue.m_pString);
    1916           0 :                     aSeq = Sequence<sal_Int8>(reinterpret_cast<const sal_Int8*>(sVal.getStr()),sizeof(sal_Unicode)*sVal.getLength());
    1917             :                 }
    1918           0 :                 break;
    1919             :             case DataType::BINARY:
    1920             :             case DataType::VARBINARY:
    1921             :             case DataType::LONGVARBINARY:
    1922           0 :                 aSeq = *static_cast< Sequence<sal_Int8>*>(m_aValue.m_pValue);
    1923           0 :                 break;
    1924             :             default:
    1925             :                 {
    1926           0 :                     Any aValue = makeAny();
    1927           0 :                     aValue >>= aSeq;
    1928           0 :                     break;
    1929             :                 }
    1930             :         }
    1931             :     }
    1932           0 :     return aSeq;
    1933             : 
    1934             : }
    1935             : 
    1936          18 : ::com::sun::star::util::Date ORowSetValue::getDate() const
    1937             : {
    1938          18 :     ::com::sun::star::util::Date aValue;
    1939          18 :     if(!m_bNull)
    1940             :     {
    1941          18 :         switch(m_eTypeKind)
    1942             :         {
    1943             :             case DataType::CHAR:
    1944             :             case DataType::VARCHAR:
    1945             :             case DataType::LONGVARCHAR:
    1946           0 :                 aValue = DBTypeConversion::toDate(getString());
    1947           0 :                 break;
    1948             :             case DataType::DECIMAL:
    1949             :             case DataType::NUMERIC:
    1950             :             case DataType::FLOAT:
    1951             :             case DataType::DOUBLE:
    1952             :             case DataType::REAL:
    1953           0 :                 aValue = DBTypeConversion::toDate((double)*this);
    1954           0 :                 break;
    1955             : 
    1956             :             case DataType::DATE:
    1957          18 :                 aValue = *static_cast< ::com::sun::star::util::Date*>(m_aValue.m_pValue);
    1958          18 :                 break;
    1959             :             case DataType::TIMESTAMP:
    1960             :                 {
    1961           0 :                     ::com::sun::star::util::DateTime* pDateTime = static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue);
    1962           0 :                     aValue.Day      = pDateTime->Day;
    1963           0 :                     aValue.Month    = pDateTime->Month;
    1964           0 :                     aValue.Year     = pDateTime->Year;
    1965             :                 }
    1966           0 :                 break;
    1967             :             case DataType::BIT:
    1968             :             case DataType::BOOLEAN:
    1969             :             case DataType::TINYINT:
    1970             :             case DataType::SMALLINT:
    1971             :             case DataType::INTEGER:
    1972             :             case DataType::BIGINT:
    1973           0 :                 aValue = DBTypeConversion::toDate( double( sal_Int64( *this ) ) );
    1974           0 :                 break;
    1975             : 
    1976             :             case DataType::BLOB:
    1977             :             case DataType::CLOB:
    1978             :             case DataType::OBJECT:
    1979             :             default:
    1980             :                 OSL_ENSURE( false, "ORowSetValue::getDate: cannot retrieve the data!" );
    1981             :                 // NO break!
    1982             : 
    1983             :             case DataType::BINARY:
    1984             :             case DataType::VARBINARY:
    1985             :             case DataType::LONGVARBINARY:
    1986             :             case DataType::TIME:
    1987           0 :                 aValue = DBTypeConversion::toDate( (double)0 );
    1988           0 :                 break;
    1989             :         }
    1990             :     }
    1991          18 :     return aValue;
    1992             : }
    1993             : 
    1994           0 : ::com::sun::star::util::Time ORowSetValue::getTime()        const
    1995             : {
    1996           0 :     ::com::sun::star::util::Time aValue;
    1997           0 :     if(!m_bNull)
    1998             :     {
    1999           0 :         switch(m_eTypeKind)
    2000             :         {
    2001             :             case DataType::CHAR:
    2002             :             case DataType::VARCHAR:
    2003             :             case DataType::LONGVARCHAR:
    2004           0 :                 aValue = DBTypeConversion::toTime(getString());
    2005           0 :                 break;
    2006             :             case DataType::DECIMAL:
    2007             :             case DataType::NUMERIC:
    2008           0 :                 aValue = DBTypeConversion::toTime((double)*this);
    2009           0 :                 break;
    2010             :             case DataType::FLOAT:
    2011             :             case DataType::DOUBLE:
    2012             :             case DataType::REAL:
    2013           0 :                 aValue = DBTypeConversion::toTime((double)*this);
    2014           0 :                 break;
    2015             :             case DataType::TIMESTAMP:
    2016             :                 {
    2017           0 :                     ::com::sun::star::util::DateTime* pDateTime = static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue);
    2018           0 :                     aValue.NanoSeconds      = pDateTime->NanoSeconds;
    2019           0 :                     aValue.Seconds          = pDateTime->Seconds;
    2020           0 :                     aValue.Minutes          = pDateTime->Minutes;
    2021           0 :                     aValue.Hours            = pDateTime->Hours;
    2022             :                 }
    2023           0 :                 break;
    2024             :             case DataType::TIME:
    2025           0 :                 aValue = *static_cast< ::com::sun::star::util::Time*>(m_aValue.m_pValue);
    2026           0 :                 break;
    2027             :             default:
    2028             :                 {
    2029           0 :                     Any aAnyValue = makeAny();
    2030           0 :                     aAnyValue >>= aValue;
    2031           0 :                     break;
    2032             :                 }
    2033             :         }
    2034             :     }
    2035           0 :     return aValue;
    2036             : }
    2037             : 
    2038           0 : ::com::sun::star::util::DateTime ORowSetValue::getDateTime()    const
    2039             : {
    2040           0 :     ::com::sun::star::util::DateTime aValue;
    2041           0 :     if(!m_bNull)
    2042             :     {
    2043           0 :         switch(m_eTypeKind)
    2044             :         {
    2045             :             case DataType::CHAR:
    2046             :             case DataType::VARCHAR:
    2047             :             case DataType::LONGVARCHAR:
    2048           0 :                 aValue = DBTypeConversion::toDateTime(getString());
    2049           0 :                 break;
    2050             :             case DataType::DECIMAL:
    2051             :             case DataType::NUMERIC:
    2052           0 :                 aValue = DBTypeConversion::toDateTime((double)*this);
    2053           0 :                 break;
    2054             :             case DataType::FLOAT:
    2055             :             case DataType::DOUBLE:
    2056             :             case DataType::REAL:
    2057           0 :                 aValue = DBTypeConversion::toDateTime((double)*this);
    2058           0 :                 break;
    2059             :             case DataType::DATE:
    2060             :                 {
    2061           0 :                     ::com::sun::star::util::Date* pDate = static_cast< ::com::sun::star::util::Date*>(m_aValue.m_pValue);
    2062           0 :                     aValue.Day      = pDate->Day;
    2063           0 :                     aValue.Month    = pDate->Month;
    2064           0 :                     aValue.Year     = pDate->Year;
    2065             :                 }
    2066           0 :                 break;
    2067             :             case DataType::TIME:
    2068             :                 {
    2069           0 :                     ::com::sun::star::util::Time* pTime = static_cast< ::com::sun::star::util::Time*>(m_aValue.m_pValue);
    2070           0 :                     aValue.NanoSeconds      = pTime->NanoSeconds;
    2071           0 :                     aValue.Seconds          = pTime->Seconds;
    2072           0 :                     aValue.Minutes          = pTime->Minutes;
    2073           0 :                     aValue.Hours            = pTime->Hours;
    2074             :                 }
    2075           0 :                 break;
    2076             :             case DataType::TIMESTAMP:
    2077           0 :                 aValue = *static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue);
    2078           0 :                 break;
    2079             :             default:
    2080             :                 {
    2081           0 :                     Any aAnyValue = makeAny();
    2082           0 :                     aAnyValue >>= aValue;
    2083           0 :                     break;
    2084             :                 }
    2085             :         }
    2086             :     }
    2087           0 :     return aValue;
    2088             : }
    2089             : 
    2090       31304 : void ORowSetValue::setSigned(bool _bMod)
    2091             : {
    2092       31304 :     if ( m_bSigned != _bMod )
    2093             :     {
    2094         220 :         m_bSigned = _bMod;
    2095         220 :         if ( !m_bNull )
    2096             :         {
    2097           3 :             sal_Int32 nType = m_eTypeKind;
    2098           3 :             switch(m_eTypeKind)
    2099             :             {
    2100             :                 case DataType::TINYINT:
    2101           0 :                     if ( m_bSigned )
    2102           0 :                         (*this) = getInt8();
    2103             :                     else
    2104             :                     {
    2105           0 :                         m_bSigned = !m_bSigned;
    2106           0 :                         (*this) = getInt16();
    2107           0 :                         m_bSigned = !m_bSigned;
    2108             :                     }
    2109           0 :                     break;
    2110             :                 case DataType::SMALLINT:
    2111           0 :                     if ( m_bSigned )
    2112           0 :                         (*this) = getInt16();
    2113             :                     else
    2114             :                     {
    2115           0 :                         m_bSigned = !m_bSigned;
    2116           0 :                         (*this) = getInt32();
    2117           0 :                         m_bSigned = !m_bSigned;
    2118             :                     }
    2119           0 :                     break;
    2120             :                 case DataType::INTEGER:
    2121           0 :                     if ( m_bSigned )
    2122           0 :                         (*this) = getInt32();
    2123             :                     else
    2124             :                     {
    2125           0 :                         m_bSigned = !m_bSigned;
    2126           0 :                         (*this) = getLong();
    2127           0 :                         m_bSigned = !m_bSigned;
    2128             :                     }
    2129           0 :                     break;
    2130             :                 case DataType::BIGINT:
    2131           1 :                     if ( m_bSigned )
    2132           0 :                         m_aValue.m_nInt64 = static_cast<sal_Int64>(m_aValue.m_uInt64);
    2133             :                     else
    2134           1 :                         m_aValue.m_uInt64 = static_cast<sal_uInt64>(m_aValue.m_nInt64);
    2135           1 :                     break;
    2136             :             }
    2137           3 :             m_eTypeKind = nType;
    2138             :         }
    2139             :     }
    2140       31304 : }
    2141             : 
    2142             : 
    2143             : namespace detail
    2144             : {
    2145       31940 :     class SAL_NO_VTABLE IValueSource
    2146             :     {
    2147             :     public:
    2148             :         virtual OUString             getString() const = 0;
    2149             :         virtual bool                        getBoolean() const = 0;
    2150             :         virtual sal_Int8                    getByte() const = 0;
    2151             :         virtual sal_Int16                   getShort() const = 0;
    2152             :         virtual sal_Int32                   getInt() const = 0;
    2153             :         virtual sal_Int64                   getLong() const = 0;
    2154             :         virtual float                       getFloat() const = 0;
    2155             :         virtual double                      getDouble() const = 0;
    2156             :         virtual Date                        getDate() const = 0;
    2157             :         virtual css::util::Time             getTime() const = 0;
    2158             :         virtual DateTime                    getTimestamp() const = 0;
    2159             :         virtual Sequence< sal_Int8 >        getBytes() const = 0;
    2160             :         virtual Reference< XBlob >          getBlob() const = 0;
    2161             :         virtual Reference< XClob >          getClob() const = 0;
    2162             :         virtual Any                         getObject() const = 0;
    2163             :         virtual bool                        wasNull() const = 0;
    2164             : 
    2165       31940 :         virtual ~IValueSource() { }
    2166             :     };
    2167             : 
    2168       31940 :     class RowValue : public IValueSource
    2169             :     {
    2170             :     public:
    2171       31940 :         RowValue( const Reference< XRow >& _xRow, const sal_Int32 _nPos )
    2172             :             :m_xRow( _xRow )
    2173       31940 :             ,m_nPos( _nPos )
    2174             :         {
    2175       31940 :         }
    2176             : 
    2177             :         // IValueSource
    2178       17497 :         virtual OUString             getString() const SAL_OVERRIDE           { return m_xRow->getString( m_nPos ); };
    2179          68 :         virtual bool                        getBoolean() const SAL_OVERRIDE          { return m_xRow->getBoolean( m_nPos ); };
    2180           0 :         virtual sal_Int8                    getByte() const SAL_OVERRIDE             { return m_xRow->getByte( m_nPos ); };
    2181           0 :         virtual sal_Int16                   getShort() const SAL_OVERRIDE            { return m_xRow->getShort( m_nPos ); }
    2182       14283 :         virtual sal_Int32                   getInt() const SAL_OVERRIDE              { return m_xRow->getInt( m_nPos ); }
    2183           0 :         virtual sal_Int64                   getLong() const SAL_OVERRIDE             { return m_xRow->getLong( m_nPos ); }
    2184           0 :         virtual float                       getFloat() const SAL_OVERRIDE            { return m_xRow->getFloat( m_nPos ); };
    2185           0 :         virtual double                      getDouble() const SAL_OVERRIDE           { return m_xRow->getDouble( m_nPos ); };
    2186          92 :         virtual Date                        getDate() const SAL_OVERRIDE             { return m_xRow->getDate( m_nPos ); };
    2187           0 :         virtual css::util::Time             getTime() const SAL_OVERRIDE             { return m_xRow->getTime( m_nPos ); };
    2188           0 :         virtual DateTime                    getTimestamp() const SAL_OVERRIDE        { return m_xRow->getTimestamp( m_nPos ); };
    2189           0 :         virtual Sequence< sal_Int8 >        getBytes() const SAL_OVERRIDE            { return m_xRow->getBytes( m_nPos ); };
    2190           0 :         virtual Reference< XBlob >          getBlob() const SAL_OVERRIDE             { return m_xRow->getBlob( m_nPos ); };
    2191           0 :         virtual Reference< XClob >          getClob() const SAL_OVERRIDE             { return m_xRow->getClob( m_nPos ); };
    2192           0 :         virtual Any                         getObject() const SAL_OVERRIDE           { return m_xRow->getObject( m_nPos ,NULL); };
    2193       31940 :         virtual bool                        wasNull() const SAL_OVERRIDE             { return m_xRow->wasNull( ); };
    2194             : 
    2195             :     private:
    2196             :         const Reference< XRow > m_xRow;
    2197             :         const sal_Int32         m_nPos;
    2198             :     };
    2199             : 
    2200           0 :     class ColumnValue : public IValueSource
    2201             :     {
    2202             :     public:
    2203           0 :         explicit ColumnValue( const Reference< XColumn >& _rxColumn )
    2204           0 :             :m_xColumn( _rxColumn )
    2205             :         {
    2206           0 :         }
    2207             : 
    2208             :         // IValueSource
    2209           0 :         virtual OUString             getString() const SAL_OVERRIDE           { return m_xColumn->getString(); };
    2210           0 :         virtual bool                        getBoolean() const SAL_OVERRIDE          { return m_xColumn->getBoolean(); };
    2211           0 :         virtual sal_Int8                    getByte() const SAL_OVERRIDE             { return m_xColumn->getByte(); };
    2212           0 :         virtual sal_Int16                   getShort() const SAL_OVERRIDE            { return m_xColumn->getShort(); }
    2213           0 :         virtual sal_Int32                   getInt() const SAL_OVERRIDE              { return m_xColumn->getInt(); }
    2214           0 :         virtual sal_Int64                   getLong() const SAL_OVERRIDE             { return m_xColumn->getLong(); }
    2215           0 :         virtual float                       getFloat() const SAL_OVERRIDE            { return m_xColumn->getFloat(); };
    2216           0 :         virtual double                      getDouble() const SAL_OVERRIDE           { return m_xColumn->getDouble(); };
    2217           0 :         virtual Date                        getDate() const SAL_OVERRIDE             { return m_xColumn->getDate(); };
    2218           0 :         virtual css::util::Time             getTime() const SAL_OVERRIDE             { return m_xColumn->getTime(); };
    2219           0 :         virtual DateTime                    getTimestamp() const SAL_OVERRIDE        { return m_xColumn->getTimestamp(); };
    2220           0 :         virtual Sequence< sal_Int8 >        getBytes() const SAL_OVERRIDE            { return m_xColumn->getBytes(); };
    2221           0 :         virtual Reference< XBlob >          getBlob() const SAL_OVERRIDE             { return m_xColumn->getBlob(); };
    2222           0 :         virtual Reference< XClob >          getClob() const SAL_OVERRIDE             { return m_xColumn->getClob(); };
    2223           0 :         virtual Any                         getObject() const SAL_OVERRIDE           { return m_xColumn->getObject( NULL ); };
    2224           0 :         virtual bool                        wasNull() const SAL_OVERRIDE             { return m_xColumn->wasNull( ); };
    2225             : 
    2226             :     private:
    2227             :         const Reference< XColumn >  m_xColumn;
    2228             :     };
    2229             : }
    2230             : 
    2231             : 
    2232           0 : void ORowSetValue::fill( const sal_Int32 _nType, const Reference< XColumn >& _rxColumn )
    2233             : {
    2234           0 :     detail::ColumnValue aColumnValue( _rxColumn );
    2235           0 :     impl_fill( _nType, true, aColumnValue );
    2236           0 : }
    2237             : 
    2238             : 
    2239       31940 : void ORowSetValue::fill( sal_Int32 _nPos, sal_Int32 _nType, bool  _bNullable, const Reference< XRow>& _xRow )
    2240             : {
    2241       31940 :     detail::RowValue aRowValue( _xRow, _nPos );
    2242       31940 :     impl_fill( _nType, _bNullable, aRowValue );
    2243       31940 : }
    2244             : 
    2245             : 
    2246       31940 : void ORowSetValue::fill(sal_Int32 _nPos,
    2247             :                      sal_Int32 _nType,
    2248             :                      const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow>& _xRow)
    2249             : {
    2250       31940 :     fill(_nPos,_nType,true,_xRow);
    2251       31940 : }
    2252             : 
    2253             : 
    2254       31940 : void ORowSetValue::impl_fill( const sal_Int32 _nType, bool _bNullable, const detail::IValueSource& _rValueSource )
    2255             : {
    2256       31940 :     bool bReadData = true;
    2257       31940 :     switch(_nType)
    2258             :     {
    2259             :     case DataType::CHAR:
    2260             :     case DataType::VARCHAR:
    2261             :     case DataType::DECIMAL:
    2262             :     case DataType::NUMERIC:
    2263             :     case DataType::LONGVARCHAR:
    2264       17497 :         (*this) = _rValueSource.getString();
    2265       17497 :         break;
    2266             :     case DataType::BIGINT:
    2267           0 :         if ( isSigned() )
    2268           0 :             (*this) = _rValueSource.getLong();
    2269             :         else
    2270             :             // TODO: this is rather horrible performance-wise
    2271             :             //       but fixing it needs extending the ::com::sun::star::sdbc::XRow API
    2272             :             //       to have a getULong(), and needs updating all drivers :-|
    2273             :             //       When doing that, add getUByte, getUShort, getUInt for symmetry/completeness
    2274           0 :             (*this) = _rValueSource.getString().toUInt64();
    2275           0 :         break;
    2276             :     case DataType::FLOAT:
    2277           0 :         (*this) = _rValueSource.getFloat();
    2278           0 :         break;
    2279             :     case DataType::DOUBLE:
    2280             :     case DataType::REAL:
    2281           0 :         (*this) = _rValueSource.getDouble();
    2282           0 :         break;
    2283             :     case DataType::DATE:
    2284          92 :         (*this) = _rValueSource.getDate();
    2285          92 :         break;
    2286             :     case DataType::TIME:
    2287           0 :         (*this) = _rValueSource.getTime();
    2288           0 :         break;
    2289             :     case DataType::TIMESTAMP:
    2290           0 :         (*this) = _rValueSource.getTimestamp();
    2291           0 :         break;
    2292             :     case DataType::BINARY:
    2293             :     case DataType::VARBINARY:
    2294             :     case DataType::LONGVARBINARY:
    2295           0 :         (*this) = _rValueSource.getBytes();
    2296           0 :         break;
    2297             :     case DataType::BIT:
    2298             :     case DataType::BOOLEAN:
    2299          68 :         (*this) = _rValueSource.getBoolean();
    2300          68 :         break;
    2301             :     case DataType::TINYINT:
    2302           0 :         if ( isSigned() )
    2303           0 :             (*this) = _rValueSource.getByte();
    2304             :         else
    2305           0 :             (*this) = _rValueSource.getShort();
    2306           0 :         break;
    2307             :     case DataType::SMALLINT:
    2308           0 :         if ( isSigned() )
    2309           0 :             (*this) = _rValueSource.getShort();
    2310             :         else
    2311           0 :             (*this) = _rValueSource.getInt();
    2312           0 :         break;
    2313             :     case DataType::INTEGER:
    2314       14283 :         if ( isSigned() )
    2315       14283 :             (*this) = _rValueSource.getInt();
    2316             :         else
    2317           0 :             (*this) = _rValueSource.getLong();
    2318       14283 :         break;
    2319             :     case DataType::CLOB:
    2320           0 :         (*this) = ::com::sun::star::uno::makeAny(_rValueSource.getClob());
    2321           0 :         setTypeKind(DataType::CLOB);
    2322           0 :         break;
    2323             :     case DataType::BLOB:
    2324           0 :         (*this) = ::com::sun::star::uno::makeAny(_rValueSource.getBlob());
    2325           0 :         setTypeKind(DataType::BLOB);
    2326           0 :         break;
    2327             :     case DataType::OTHER:
    2328           0 :         (*this) = _rValueSource.getObject();
    2329           0 :         setTypeKind(DataType::OTHER);
    2330           0 :         break;
    2331             :     default:
    2332             :         SAL_WARN( "connectivity.commontools", "ORowSetValue::fill: unsupported type!" );
    2333           0 :         (*this) = _rValueSource.getObject();
    2334           0 :         break;
    2335             :     }
    2336       31940 :     if ( bReadData && _bNullable && _rValueSource.wasNull() )
    2337        2313 :         setNull();
    2338       31940 :     setTypeKind(_nType);
    2339       31940 : }
    2340             : 
    2341          49 : void ORowSetValue::fill(const Any& _rValue)
    2342             : {
    2343          49 :     switch (_rValue.getValueType().getTypeClass())
    2344             :     {
    2345             :         case TypeClass_VOID:
    2346           0 :             setNull();            break;
    2347             :         case TypeClass_BOOLEAN:
    2348             :         {
    2349           1 :             bool bValue( false );
    2350           1 :             _rValue >>= bValue;
    2351           1 :             (*this) = bValue;
    2352           1 :             break;
    2353             :         }
    2354             :         case TypeClass_CHAR:
    2355             :         {
    2356           0 :             sal_Unicode aDummy(0);
    2357           0 :             _rValue >>= aDummy;
    2358           0 :             (*this) = OUString(aDummy);
    2359           0 :             break;
    2360             :         }
    2361             :         case TypeClass_STRING:
    2362             :         {
    2363           7 :             OUString sDummy;
    2364           7 :             _rValue >>= sDummy;
    2365           7 :             (*this) = sDummy;
    2366           7 :             break;
    2367             :         }
    2368             :         case TypeClass_FLOAT:
    2369             :         {
    2370           1 :             float aDummy(0.0);
    2371           1 :             _rValue >>= aDummy;
    2372           1 :             (*this) = aDummy;
    2373           1 :             break;
    2374             :         }
    2375             :         case TypeClass_DOUBLE:
    2376             :         {
    2377           1 :             double aDummy(0.0);
    2378           1 :             _rValue >>= aDummy;
    2379           1 :             (*this) = aDummy;
    2380           1 :             break;
    2381             :         }
    2382             :         case TypeClass_BYTE:
    2383             :         {
    2384           1 :             sal_Int8 aDummy(0);
    2385           1 :             _rValue >>= aDummy;
    2386           1 :             (*this) = aDummy;
    2387           1 :             break;
    2388             :         }
    2389             :         case TypeClass_SHORT:
    2390             :         {
    2391           1 :             sal_Int16 aDummy(0);
    2392           1 :             _rValue >>= aDummy;
    2393           1 :             (*this) = aDummy;
    2394           1 :             break;
    2395             :         }
    2396             :         case TypeClass_UNSIGNED_SHORT:
    2397             :         {
    2398           2 :             sal_uInt16 nValue(0);
    2399           2 :             _rValue >>= nValue;
    2400           2 :             (*this) = nValue;
    2401           2 :             break;
    2402             :         }
    2403             :         case TypeClass_LONG:
    2404             :         {
    2405           1 :             sal_Int32 aDummy(0);
    2406           1 :             _rValue >>= aDummy;
    2407           1 :             (*this) = aDummy;
    2408           1 :             break;
    2409             :         }
    2410             :         case TypeClass_UNSIGNED_LONG:
    2411             :         {
    2412           1 :             sal_uInt32 nValue(0);
    2413           1 :             _rValue >>= nValue;
    2414           1 :             (*this) = static_cast<sal_Int64>(nValue);
    2415           1 :             setSigned(false);
    2416           1 :             break;
    2417             :         }
    2418             :         case TypeClass_HYPER:
    2419             :         {
    2420           1 :             sal_Int64 nValue(0);
    2421           1 :             _rValue >>= nValue;
    2422           1 :             (*this) = nValue;
    2423           1 :             break;
    2424             :         }
    2425             :         case TypeClass_UNSIGNED_HYPER:
    2426             :         {
    2427           1 :             sal_uInt64 nValue(0);
    2428           1 :             _rValue >>= nValue;
    2429           1 :             (*this) = nValue;
    2430           1 :             setSigned(false);
    2431           1 :             break;
    2432             :         }
    2433             :         case TypeClass_ENUM:
    2434             :         {
    2435           0 :             sal_Int32 enumValue( 0 );
    2436           0 :             ::cppu::enum2int( enumValue, _rValue );
    2437           0 :             (*this) = enumValue;
    2438             :         }
    2439           0 :         break;
    2440             : 
    2441             :         case TypeClass_SEQUENCE:
    2442             :         {
    2443           0 :             Sequence<sal_Int8> aDummy;
    2444           0 :             if ( _rValue >>= aDummy )
    2445           0 :                 (*this) = aDummy;
    2446             :             else
    2447             :                 SAL_WARN( "connectivity.commontools", "ORowSetValue::fill: unsupported sequence type!" );
    2448           0 :             break;
    2449             :         }
    2450             : 
    2451             :         case TypeClass_STRUCT:
    2452             :         {
    2453           0 :             ::com::sun::star::util::Date aDate;
    2454           0 :             ::com::sun::star::util::Time aTime;
    2455           0 :             ::com::sun::star::util::DateTime aDateTime;
    2456           0 :             if ( _rValue >>= aDate )
    2457             :             {
    2458           0 :                 (*this) = aDate;
    2459             :             }
    2460           0 :             else if ( _rValue >>= aTime )
    2461             :             {
    2462           0 :                 (*this) = aTime;
    2463             :             }
    2464           0 :             else if ( _rValue >>= aDateTime )
    2465             :             {
    2466           0 :                 (*this) = aDateTime;
    2467             :             }
    2468             :             else
    2469             :                 SAL_WARN( "connectivity.commontools", "ORowSetValue::fill: unsupported structure!" );
    2470             : 
    2471           0 :             break;
    2472             :         }
    2473             :         case TypeClass_INTERFACE:
    2474             :             {
    2475          31 :                 Reference< XClob > xClob;
    2476          31 :                 if ( _rValue >>= xClob )
    2477             :                 {
    2478          31 :                     (*this) = _rValue;
    2479          31 :                     setTypeKind(DataType::CLOB);
    2480             :                 }
    2481             :                 else
    2482             :                 {
    2483           0 :                     Reference< XBlob > xBlob;
    2484           0 :                     if ( _rValue >>= xBlob )
    2485             :                     {
    2486           0 :                         (*this) = _rValue;
    2487           0 :                         setTypeKind(DataType::BLOB);
    2488             :                     }
    2489             :                     else
    2490             :                     {
    2491           0 :                         (*this) = _rValue;
    2492           0 :                     }
    2493          31 :                 }
    2494             :             }
    2495          31 :             break;
    2496             : 
    2497             :         default:
    2498             :             SAL_WARN( "connectivity.commontools","Unknown type");
    2499           0 :             break;
    2500             :     }
    2501          49 : }
    2502             : 
    2503             : }   // namespace connectivity
    2504             : 
    2505             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11