/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_connectivity.hxx"

#include <stdio.h>
#include "connectivity/FValue.hxx"
#include "connectivity/CommonTools.hxx"
#include <connectivity/dbconversion.hxx>
#include <comphelper/extract.hxx>
#include <com/sun/star/io/XInputStream.hpp>
#include <rtl/ustrbuf.hxx>
#include <rtl/logfile.hxx>

using namespace ::dbtools;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::io;

namespace connectivity
{

namespace {
	static sal_Bool isStorageCompatible(sal_Int32 _eType1, sal_Int32 _eType2)
	{
        RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::isStorageCompatible" );
		sal_Bool bIsCompatible = sal_True;

		if (_eType1 != _eType2)
		{
            RTL_LOGFILE_CONTEXT_TRACE( aLogger, "ORowSetValue::isStorageCompatible _eType1 != _eType2" );
			switch (_eType1)
			{
				case DataType::CHAR:
				case DataType::VARCHAR:
				case DataType::DECIMAL:
				case DataType::NUMERIC:
				case DataType::LONGVARCHAR:
					bIsCompatible = (DataType::CHAR			== _eType2)
								||	(DataType::VARCHAR		== _eType2)
								||	(DataType::DECIMAL		== _eType2)
								||	(DataType::NUMERIC		== _eType2)
								||	(DataType::LONGVARCHAR	== _eType2);
					break;

				case DataType::DOUBLE:
				case DataType::REAL:
					bIsCompatible = (DataType::DOUBLE	== _eType2)
								||	(DataType::REAL		== _eType2);
					break;

				case DataType::BINARY:
				case DataType::VARBINARY:
				case DataType::LONGVARBINARY:
					bIsCompatible = (DataType::BINARY			== _eType2)
								||	(DataType::VARBINARY		== _eType2)
								||	(DataType::LONGVARBINARY	== _eType2);
					break;

				case DataType::INTEGER:
					bIsCompatible = (DataType::SMALLINT	== _eType2)
								||	(DataType::TINYINT	== _eType2)
								||	(DataType::BIT		== _eType2)
								||	(DataType::BOOLEAN	== _eType2);
					break;
				case DataType::SMALLINT:
					bIsCompatible = (DataType::TINYINT	== _eType2)
								||	(DataType::BIT		== _eType2)
								||	(DataType::BOOLEAN	== _eType2);
					break;
				case DataType::TINYINT:
					bIsCompatible = (DataType::BIT		== _eType2)
								||	(DataType::BOOLEAN	== _eType2);
					break;

				case DataType::BLOB:
				case DataType::CLOB:
				case DataType::OBJECT:
					bIsCompatible = (DataType::BLOB		== _eType2)
								||	(DataType::CLOB		== _eType2)
								||	(DataType::OBJECT	== _eType2);
					break;

				default:
					bIsCompatible = sal_False;
			}
		}
		return bIsCompatible;
	}
}

// -----------------------------------------------------------------------------
#ifdef DBG_UTIL

#include <vector>
#include <rtl/string.h>

namespace tracing
{
	struct AllocationType
	{
		const sal_Char*	pName;
		sal_Int32		nAllocatedUnits;

		AllocationType( ) : pName( NULL ), nAllocatedUnits( 0 ) { }
	};

    // =============================================================================
	class AllocationTracer
	{
	public:
		typedef ::std::vector< AllocationType >	AllocationState;
		static AllocationState					s_aAllocated;
		static ::osl::Mutex						s_aMutex;

	public:
		static void registerUnit( const sal_Char* _pName );
		static void revokeUnit( const sal_Char* _pName );

	private:
		static AllocationState::iterator	getLocation( const sal_Char* _pName );
	};

    // =============================================================================
	AllocationTracer::AllocationState::iterator	AllocationTracer::getLocation( const sal_Char* _pName )
	{
		AllocationState::iterator aLookFor = s_aAllocated.begin();
		for	(	;
				aLookFor != s_aAllocated.end();
				++aLookFor
			)
		{
			if ( 0 == rtl_str_compare( aLookFor->pName, _pName ) )
				// found
				return aLookFor;
		}
		// not found
		s_aAllocated.push_back( AllocationType() );
		aLookFor = s_aAllocated.end(); --aLookFor;
		aLookFor->pName = _pName;	// note that this assumes that _pName is a constant string ....
		return aLookFor;
	}

    // =============================================================================
	AllocationTracer::AllocationState			AllocationTracer::s_aAllocated;
	::osl::Mutex								AllocationTracer::s_aMutex;

    // =============================================================================
	void AllocationTracer::registerUnit( const sal_Char* _pName )
	{
		::osl::MutexGuard aGuard( s_aMutex );

		AllocationState::iterator aPos = getLocation( _pName );
		++aPos->nAllocatedUnits;
	}

    // =============================================================================
	void AllocationTracer::revokeUnit( const sal_Char* _pName )
	{
		::osl::MutexGuard aGuard( s_aMutex );

		AllocationState::iterator aPos = getLocation( _pName );
		--aPos->nAllocatedUnits;
	}

#define TRACE_ALLOC( type )	tracing::AllocationTracer::registerUnit( #type );
#define TRACE_FREE( type )	tracing::AllocationTracer::revokeUnit( #type );
}
#else
#define TRACE_ALLOC( type )
#define TRACE_FREE( type )
#endif

// -----------------------------------------------------------------------------
void ORowSetValue::setTypeKind(sal_Int32 _eType)
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::setTypeKind" );
	if ( !m_bNull && !isStorageCompatible(_eType, m_eTypeKind) )
	{
		switch(_eType)
		{
			case DataType::VARCHAR:
			case DataType::CHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				(*this) = getString();
				break;
			case DataType::BIGINT:
				(*this) = getLong();
				break;

			case DataType::FLOAT:
				(*this) = getFloat();
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				(*this) = getDouble();
				break;
			case DataType::TINYINT:
				(*this) = getInt8();
				break;
			case DataType::SMALLINT:
				(*this) = getInt16();
				break;
			case DataType::INTEGER:
				(*this) = getInt32();
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				(*this) = getBool();
				break;
			case DataType::DATE:
				(*this) = getDate();
				break;
			case DataType::TIME:
				(*this) = getTime();
				break;
			case DataType::TIMESTAMP:
				(*this) = getDateTime();
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				(*this) = getSequence();
				break;
			case DataType::BLOB:
			case DataType::CLOB:
			case DataType::OBJECT:
			case DataType::OTHER:
				(*this) = getAny();
				break;
			default:
                (*this) = getAny();
				OSL_ENSURE(0,"ORowSetValue:operator==(): UNSPUPPORTED TYPE!");
		}
	}

	m_eTypeKind = _eType;
}

// -----------------------------------------------------------------------------
void ORowSetValue::free()
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::free" );
	if(!m_bNull)
	{
		switch(m_eTypeKind)
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				OSL_ENSURE(m_aValue.m_pString,"String pointer is null!");
				rtl_uString_release(m_aValue.m_pString);
				m_aValue.m_pString = NULL;
				break;
			case DataType::INTEGER:
				if ( !m_bSigned )
				{
					delete (sal_Int64*)m_aValue.m_pValue;
					TRACE_FREE( sal_Int64 )
					m_aValue.m_pValue = NULL;
				}
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
				{
					delete (sal_Int64*)m_aValue.m_pValue;
					TRACE_FREE( sal_Int64 )
					m_aValue.m_pValue = NULL;
				}
				else
				{
					OSL_ENSURE(m_aValue.m_pString,"String pointer is null!");
					rtl_uString_release(m_aValue.m_pString);
					m_aValue.m_pString = NULL;
				}
				break;
			case DataType::FLOAT:
				delete (float*)m_aValue.m_pValue;
				TRACE_FREE( float )
				m_aValue.m_pValue = NULL;
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				delete (double*)m_aValue.m_pValue;
				TRACE_FREE( double )
				m_aValue.m_pValue = NULL;
				break;
			case DataType::DATE:
				delete (::com::sun::star::util::Date*)m_aValue.m_pValue;
				TRACE_FREE( Date )
				m_aValue.m_pValue = NULL;
				break;
			case DataType::TIME:
				delete (::com::sun::star::util::Time*)m_aValue.m_pValue;
				TRACE_FREE( Time )
				m_aValue.m_pValue = NULL;
				break;
			case DataType::TIMESTAMP:
				delete (::com::sun::star::util::DateTime*)m_aValue.m_pValue;
				TRACE_FREE( DateTime )
				m_aValue.m_pValue = NULL;
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				delete (Sequence<sal_Int8>*)m_aValue.m_pValue;
				TRACE_FREE( Sequence_sal_Int8 )
				m_aValue.m_pValue = NULL;
				break;
			case DataType::BLOB:
			case DataType::CLOB:
			case DataType::OBJECT:
				delete (Any*)m_aValue.m_pValue;
				TRACE_FREE( Any )
				m_aValue.m_pValue = NULL;
				break;
            case DataType::BIT:
            case DataType::TINYINT:
            case DataType::SMALLINT:
            case DataType::BOOLEAN:
                break;
            default:
                if ( m_aValue.m_pValue )
                {
				    delete (Any*)m_aValue.m_pValue;
				    TRACE_FREE( Any )
				    m_aValue.m_pValue = NULL;
                }
                break;

		}
		m_bNull = sal_True;
	}
}
// -----------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const ORowSetValue& _rRH)
{
	if(&_rRH == this)
		return *this;

	if ( m_eTypeKind != _rRH.m_eTypeKind || (_rRH.m_bNull && !m_bNull) || m_bSigned != _rRH.m_bSigned)
		free();

	m_bBound	= _rRH.m_bBound;
	m_eTypeKind	= _rRH.m_eTypeKind;
	m_bSigned	= _rRH.m_bSigned;

	if(m_bNull && !_rRH.m_bNull)
	{
		switch(_rRH.m_eTypeKind)
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				rtl_uString_acquire(_rRH.m_aValue.m_pString);
				m_aValue.m_pString = _rRH.m_aValue.m_pString;
				break;
			case DataType::BIGINT:
				if ( _rRH.m_bSigned )
				{
					m_aValue.m_pValue	= new sal_Int64(*(sal_Int64*)_rRH.m_aValue.m_pValue);
					TRACE_ALLOC( sal_Int64 )
				}
				else
				{
					rtl_uString_acquire(_rRH.m_aValue.m_pString);
					m_aValue.m_pString = _rRH.m_aValue.m_pString;
				}
				break;
			case DataType::FLOAT:
				m_aValue.m_pValue	= new float(*(float*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( float )
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				m_aValue.m_pValue	= new double(*(double*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( double )
				break;
			case DataType::DATE:
				m_aValue.m_pValue	= new Date(*(Date*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( Date )
				break;
			case DataType::TIME:
				m_aValue.m_pValue	= new Time(*(Time*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( Time )
				break;
			case DataType::TIMESTAMP:
				m_aValue.m_pValue	= new DateTime(*(DateTime*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( DateTime )
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				m_aValue.m_pValue	= new Sequence<sal_Int8>(*(Sequence<sal_Int8>*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( Sequence_sal_Int8 )
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				m_aValue.m_bBool	= _rRH.m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( _rRH.m_bSigned )
					m_aValue.m_nInt8	= _rRH.m_aValue.m_nInt8;
				else
					m_aValue.m_nInt16	= _rRH.m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( _rRH.m_bSigned )
					m_aValue.m_nInt16	= _rRH.m_aValue.m_nInt16;
				else
					m_aValue.m_nInt32	= _rRH.m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( _rRH.m_bSigned )
					m_aValue.m_nInt32	= _rRH.m_aValue.m_nInt32;
				else
				{
					m_aValue.m_pValue	= new sal_Int64(*(sal_Int64*)_rRH.m_aValue.m_pValue);
					TRACE_ALLOC( sal_Int64 )
				}
				break;
			default:
				m_aValue.m_pValue	= new Any(*(Any*)_rRH.m_aValue.m_pValue);
				TRACE_ALLOC( Any )
		}
	}
	else if(!_rRH.m_bNull)
	{
		switch(_rRH.m_eTypeKind)
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				(*this) = ::rtl::OUString(_rRH.m_aValue.m_pString);
				break;
			case DataType::BIGINT:
				if ( _rRH.m_bSigned )
					(*this) = *(sal_Int64*)_rRH.m_aValue.m_pValue;
				else
					(*this) = ::rtl::OUString(_rRH.m_aValue.m_pString);
				break;
			case DataType::FLOAT:
				(*this) = *(float*)_rRH.m_aValue.m_pValue;
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				(*this) = *(double*)_rRH.m_aValue.m_pValue;
				break;
			case DataType::DATE:
				(*this) = *(Date*)_rRH.m_aValue.m_pValue;
				break;
			case DataType::TIME:
				(*this) = *(Time*)_rRH.m_aValue.m_pValue;
				break;
			case DataType::TIMESTAMP:
				(*this) = *(DateTime*)_rRH.m_aValue.m_pValue;
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				(*this) = *(Sequence<sal_Int8>*)_rRH.m_aValue.m_pValue;
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				m_aValue.m_bBool	= _rRH.m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( _rRH.m_bSigned )
					m_aValue.m_nInt8	= _rRH.m_aValue.m_nInt8;
				else
					m_aValue.m_nInt16	= _rRH.m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( _rRH.m_bSigned )
					m_aValue.m_nInt16	= _rRH.m_aValue.m_nInt16;
				else
					m_aValue.m_nInt32	= _rRH.m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( _rRH.m_bSigned )
					m_aValue.m_nInt32	= _rRH.m_aValue.m_nInt32;
				else
                    *static_cast<sal_Int64*>(m_aValue.m_pValue) = *(sal_Int64*)_rRH.m_aValue.m_pValue;
				break;
			default:
				(*(Any*)m_aValue.m_pValue)	= (*(Any*)_rRH.m_aValue.m_pValue);
		}
	}

	m_bNull		= _rRH.m_bNull;
	// OJ: BUGID: 96277
	m_eTypeKind	= _rRH.m_eTypeKind;

	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const Date& _rRH)
{
	if(m_eTypeKind != DataType::DATE)
		free();

	if(m_bNull)
	{
		m_aValue.m_pValue = new Date(_rRH);
		TRACE_ALLOC( Date )
		m_eTypeKind = DataType::DATE;
		m_bNull = sal_False;
	}
	else
		*(Date*)m_aValue.m_pValue = _rRH;

	return *this;
}
// -------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const Time& _rRH)
{
	if(m_eTypeKind != DataType::TIME)
		free();

	if(m_bNull)
	{
		m_aValue.m_pValue = new Time(_rRH);
		TRACE_ALLOC( Time )
		m_eTypeKind = DataType::TIME;
		m_bNull = sal_False;
	}
	else
		*(Time*)m_aValue.m_pValue = _rRH;

	return *this;
}
// -------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const DateTime& _rRH)
{
	if(m_eTypeKind != DataType::TIMESTAMP)
		free();
	if(m_bNull)
	{
		m_aValue.m_pValue = new DateTime(_rRH);
		TRACE_ALLOC( DateTime )
		m_eTypeKind = DataType::TIMESTAMP;
		m_bNull = sal_False;
	}
	else
		*(DateTime*)m_aValue.m_pValue = _rRH;

	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const ::rtl::OUString& _rRH)
{
	if(m_eTypeKind != DataType::VARCHAR || m_aValue.m_pString != _rRH.pData)
	{
		free();
		m_bNull = sal_False;

		m_aValue.m_pString = _rRH.pData;
		rtl_uString_acquire(m_aValue.m_pString);
		m_eTypeKind = DataType::VARCHAR;
	}

	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const double& _rRH)
{
	if( !isStorageCompatible(m_eTypeKind,DataType::DOUBLE) )
		free();

	if(m_bNull)
	{
		m_aValue.m_pValue = new double(_rRH);
		TRACE_ALLOC( double )
		m_eTypeKind = DataType::DOUBLE;
		m_bNull = sal_False;
	}
	else
		*(double*)m_aValue.m_pValue = _rRH;

	return *this;
}
// -----------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const float& _rRH)
{
	if(m_eTypeKind != DataType::FLOAT)
		free();

	if(m_bNull)
	{
		m_aValue.m_pValue = new float(_rRH);
		TRACE_ALLOC( float )
		m_eTypeKind = DataType::FLOAT;
		m_bNull = sal_False;
	}
	else
		*(float*)m_aValue.m_pValue = _rRH;

	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const sal_Int8& _rRH)
{
	if(m_eTypeKind != DataType::TINYINT )
		free();

	m_aValue.m_nInt8 = _rRH;
	m_eTypeKind = DataType::TINYINT;
	m_bNull = sal_False;
	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const sal_Int16& _rRH)
{
	if(m_eTypeKind != DataType::SMALLINT )
		free();

	m_aValue.m_nInt16 = _rRH;
	m_eTypeKind = DataType::SMALLINT;
	m_bNull = sal_False;

	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const sal_Int32& _rRH)
{
	if(m_eTypeKind != DataType::INTEGER )
		free();

	if ( m_bSigned )
		m_aValue.m_nInt32 = _rRH;
	else
	{
		if ( m_bNull )
		{
			m_aValue.m_pValue = new sal_Int64(_rRH);
			TRACE_ALLOC( sal_Int64 )
		}
		else
			*static_cast<sal_Int64*>(m_aValue.m_pValue) = static_cast<sal_Int64>(_rRH);
	}

	m_eTypeKind = DataType::INTEGER;
	m_bNull = sal_False;

	return *this;
}
// -------------------------------------------------------------------------

ORowSetValue& ORowSetValue::operator=(const sal_Bool _rRH)
{
	if(m_eTypeKind != DataType::BIT && DataType::BOOLEAN != m_eTypeKind )
		free();

	m_aValue.m_bBool = _rRH;
	m_eTypeKind = DataType::BIT;
	m_bNull = sal_False;

	return *this;
}
// -------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const sal_Int64& _rRH)
{
	if ( DataType::BIGINT != m_eTypeKind || !m_bSigned )
		free();

	if ( m_bSigned )
	{
		if(m_bNull)
		{
			m_aValue.m_pValue = new sal_Int64(_rRH);
			TRACE_ALLOC( sal_Int64 )
		}
		else
			*static_cast<sal_Int64*>(m_aValue.m_pValue) = _rRH;
	}
	else
	{
		::rtl::OUString aVal = ::rtl::OUString::valueOf(_rRH);
		m_aValue.m_pString = aVal.pData;
		rtl_uString_acquire(m_aValue.m_pString);
	}

	m_eTypeKind = DataType::BIGINT;
	m_bNull = sal_False;

	return *this;
}
// -------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const Sequence<sal_Int8>& _rRH)
{
	if (!isStorageCompatible(DataType::LONGVARBINARY,m_eTypeKind))
		free();

	if (m_bNull)
	{
		m_aValue.m_pValue = new Sequence<sal_Int8>(_rRH);
		TRACE_ALLOC( Sequence_sal_Int8 )
	}
	else
		*static_cast< Sequence< sal_Int8 >* >(m_aValue.m_pValue) = _rRH;

	m_eTypeKind = DataType::LONGVARBINARY;
	m_bNull = sal_False;

	return *this;
}
// -------------------------------------------------------------------------
ORowSetValue& ORowSetValue::operator=(const Any& _rAny)
{
	if (!isStorageCompatible(DataType::OBJECT,m_eTypeKind))
		free();

	if ( m_bNull )
	{
		m_aValue.m_pValue = new Any(_rAny);
		TRACE_ALLOC( Any )
	}
	else
		*static_cast<Any*>(m_aValue.m_pValue) = _rAny;

	m_eTypeKind = DataType::OBJECT;
	m_bNull = sal_False;

	return *this;
}
// -------------------------------------------------------------------------

sal_Bool operator==(const Date& _rLH,const Date& _rRH)
{
	return _rLH.Day == _rRH.Day && _rLH.Month == _rRH.Month && _rLH.Year == _rRH.Year;
}
// -------------------------------------------------------------------------

sal_Bool operator==(const Time& _rLH,const Time& _rRH)
{
	return _rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.HundredthSeconds == _rRH.HundredthSeconds;
}
// -------------------------------------------------------------------------

sal_Bool operator==(const DateTime& _rLH,const DateTime& _rRH)
{
	return _rLH.Day == _rRH.Day && _rLH.Month == _rRH.Month && _rLH.Year == _rRH.Year &&
		_rLH.Minutes == _rRH.Minutes && _rLH.Hours == _rRH.Hours && _rLH.Seconds == _rRH.Seconds && _rLH.HundredthSeconds == _rRH.HundredthSeconds;
}
// -------------------------------------------------------------------------

bool ORowSetValue::operator==(const ORowSetValue& _rRH) const
{
	if ( m_bNull != _rRH.isNull() )
        return false;

	if(m_bNull && _rRH.isNull())
		return true;

	if ( m_eTypeKind != _rRH.m_eTypeKind )
    {
        switch(m_eTypeKind)
        {
            case DataType::FLOAT:
            case DataType::DOUBLE:
            case DataType::REAL:
                return getDouble() == _rRH.getDouble();
            default:
                switch(_rRH.m_eTypeKind)
                {
                    case DataType::FLOAT:
                    case DataType::DOUBLE:
                    case DataType::REAL:
                            return getDouble() == _rRH.getDouble();
                    default:
                            break;
                }
                break;
            }
        return false;
    }

	bool bRet = false;
	OSL_ENSURE(!m_bNull,"SHould not be null!");
	switch(m_eTypeKind)
	{
		case DataType::VARCHAR:
		case DataType::CHAR:
		case DataType::LONGVARCHAR:
		{
			::rtl::OUString aVal1(m_aValue.m_pString);
			::rtl::OUString aVal2(_rRH.m_aValue.m_pString);
			return aVal1 == aVal2;
		}
		default:
			if ( m_bSigned != _rRH.m_bSigned )
				return false;
			break;
	}
	
	switch(m_eTypeKind)
	{
		case DataType::DECIMAL:
		case DataType::NUMERIC:
			{
				::rtl::OUString aVal1(m_aValue.m_pString);
				::rtl::OUString aVal2(_rRH.m_aValue.m_pString);
				bRet = aVal1 == aVal2;
			}
			break;
		case DataType::FLOAT:
			bRet = *(float*)m_aValue.m_pValue == *(float*)_rRH.m_aValue.m_pValue;
			break;
		case DataType::DOUBLE:
		case DataType::REAL:
			bRet = *(double*)m_aValue.m_pValue == *(double*)_rRH.m_aValue.m_pValue;
			break;
		case DataType::TINYINT:
			bRet = m_bSigned ? ( m_aValue.m_nInt8 == _rRH.m_aValue.m_nInt8 ) : (m_aValue.m_nInt16 == _rRH.m_aValue.m_nInt16);
			break;
		case DataType::SMALLINT:
			bRet = m_bSigned ? ( m_aValue.m_nInt16 == _rRH.m_aValue.m_nInt16 ) : (m_aValue.m_nInt32 == _rRH.m_aValue.m_nInt32);
			break;
		case DataType::INTEGER:
			bRet = m_bSigned ? ( m_aValue.m_nInt32 == _rRH.m_aValue.m_nInt32 ) : (*(sal_Int64*)m_aValue.m_pValue == *(sal_Int64*)_rRH.m_aValue.m_pValue);
			break;
		case DataType::BIGINT:
			if ( m_bSigned )
				bRet = *(sal_Int64*)m_aValue.m_pValue == *(sal_Int64*)_rRH.m_aValue.m_pValue;
			else
			{
				::rtl::OUString aVal1(m_aValue.m_pString);
				::rtl::OUString aVal2(_rRH.m_aValue.m_pString);
				bRet = aVal1 == aVal2;
			}
			break;
		case DataType::BIT:
		case DataType::BOOLEAN:
			bRet = m_aValue.m_bBool == _rRH.m_aValue.m_bBool;
			break;
		case DataType::DATE:
			bRet = *(Date*)m_aValue.m_pValue == *(Date*)_rRH.m_aValue.m_pValue;
			break;
		case DataType::TIME:
			bRet = *(Time*)m_aValue.m_pValue == *(Time*)_rRH.m_aValue.m_pValue;
			break;
		case DataType::TIMESTAMP:
			bRet = *(DateTime*)m_aValue.m_pValue == *(DateTime*)_rRH.m_aValue.m_pValue;
			break;
		case DataType::BINARY:
		case DataType::VARBINARY:
		case DataType::LONGVARBINARY:
			bRet = false;
			break;
		case DataType::BLOB:
		case DataType::CLOB:
		case DataType::OBJECT:
		case DataType::OTHER:
			bRet = false;
			break;
		default:
            bRet = false;
			OSL_ENSURE(0,"ORowSetValue::operator==(): UNSPUPPORTED TYPE!");
            break;
	}
	return bRet;
}
// -------------------------------------------------------------------------
Any ORowSetValue::makeAny() const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::makeAny" );
	Any rValue;
	if(isBound() && !isNull())
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				OSL_ENSURE(m_aValue.m_pString,"Value is null!");
				rValue <<= (::rtl::OUString)m_aValue.m_pString;
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
				{
					OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
					rValue <<= *(sal_Int64*)m_aValue.m_pValue;
				}
				else
				{
					OSL_ENSURE(m_aValue.m_pString,"Value is null!");
					rValue <<= (::rtl::OUString)m_aValue.m_pString;
				}
				break;
			case DataType::FLOAT:
				OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
				rValue <<= *(float*)m_aValue.m_pValue;
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
				rValue <<= *(double*)m_aValue.m_pValue;
				break;
			case DataType::DATE:
				OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
				rValue <<= *(Date*)m_aValue.m_pValue;
				break;
			case DataType::TIME:
				OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
				rValue <<= *(Time*)m_aValue.m_pValue;
				break;
			case DataType::TIMESTAMP:
				OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
				rValue <<= *(DateTime*)m_aValue.m_pValue;
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
				rValue <<= *(Sequence<sal_Int8>*)m_aValue.m_pValue;
				break;
			case DataType::BLOB:
			case DataType::CLOB:
			case DataType::OBJECT:
			case DataType::OTHER:
				rValue = getAny();
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				rValue.setValue( &m_aValue.m_bBool, ::getCppuBooleanType() );
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					rValue <<= m_aValue.m_nInt8;
				else
					rValue <<= m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					rValue <<= m_aValue.m_nInt16;
				else
					rValue <<= m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					rValue <<= m_aValue.m_nInt32;
				else
				{
					OSL_ENSURE(m_aValue.m_pValue,"Value is null!");
					rValue <<= *(sal_Int64*)m_aValue.m_pValue;
				}
				break;
			default:
				OSL_ENSURE(0,"ORowSetValue::makeAny(): UNSPUPPORTED TYPE!");
                rValue = getAny();
				break;
		}
	}
	return rValue;
}
// -------------------------------------------------------------------------
::rtl::OUString ORowSetValue::getString( ) const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getString" );
	::rtl::OUString aRet;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				aRet = m_aValue.m_pString;
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
					aRet = ::rtl::OUString::valueOf((sal_Int64)*this);
				else
					aRet = m_aValue.m_pString;
				break;
			case DataType::FLOAT:
				aRet = ::rtl::OUString::valueOf((float)*this);
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				aRet = ::rtl::OUString::valueOf((double)*this);
				break;
			case DataType::DATE:
				aRet = connectivity::toDateString(*this);
				break;
			case DataType::TIME:
				aRet = connectivity::toTimeString(*this);
				break;
			case DataType::TIMESTAMP:
				aRet = connectivity::toDateTimeString(*this);
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				{
					::rtl::OUStringBuffer sVal = ::rtl::OUString::createFromAscii("0x");
					Sequence<sal_Int8> aSeq(getSequence());
					const sal_Int8* pBegin	= aSeq.getConstArray();
					const sal_Int8* pEnd	= pBegin + aSeq.getLength();
					for(;pBegin != pEnd;++pBegin)
						sVal.append((sal_Int32)*pBegin,16);
                    aRet = sVal.makeStringAndClear();
				}
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				aRet = ::rtl::OUString::valueOf((sal_Int32)(sal_Bool)*this);
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					aRet = ::rtl::OUString::valueOf((sal_Int32)(sal_Int8)*this);
				else
					aRet = ::rtl::OUString::valueOf((sal_Int32)(sal_Int16)*this);
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					aRet = ::rtl::OUString::valueOf((sal_Int32)(sal_Int16)*this);
				else
					aRet = ::rtl::OUString::valueOf((sal_Int32)*this);
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					aRet = ::rtl::OUString::valueOf((sal_Int32)*this);
				else
					aRet = ::rtl::OUString::valueOf((sal_Int64)*this);
				break;
			case DataType::CLOB:
				{
					Any aValue( getAny() );
					Reference< XClob > xClob;
					if ( aValue >>= xClob )
					{
						if ( xClob.is() )
						{
							aRet = xClob->getSubString(1,(sal_Int32)xClob->length() );
						}
					}
				}
				break;
            default:
                {
                    Any aValue = getAny();
                    aValue >>= aRet;
				    break;
                }
		}
	}
	return aRet;
}
// -------------------------------------------------------------------------
sal_Bool ORowSetValue::getBool()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getBool" );
	sal_Bool bRet = sal_False;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
            case DataType::LONGVARCHAR:
                {
                    const ::rtl::OUString sValue(m_aValue.m_pString);
                    const static ::rtl::OUString s_sTrue(RTL_CONSTASCII_USTRINGPARAM("true"));
                    const static ::rtl::OUString s_sFalse(RTL_CONSTASCII_USTRINGPARAM("false"));
                    if ( sValue.equalsIgnoreAsciiCase(s_sTrue) )
                    {
                        bRet = sal_True;
                        break;
                    }
                    else if ( sValue.equalsIgnoreAsciiCase(s_sFalse) )
                    {
                        bRet = sal_False;
                        break;
                    }
                }
                // run through
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			
				bRet = ::rtl::OUString(m_aValue.m_pString).toInt32() != 0;
				break;
			case DataType::BIGINT:
                if ( m_bSigned )
					bRet = *(sal_Int64*)m_aValue.m_pValue != 0;
				else
					bRet = ::rtl::OUString(m_aValue.m_pString).toInt64() != 0;
				break;
			case DataType::FLOAT:
				bRet = *(float*)m_aValue.m_pValue != 0.0;
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				bRet = *(double*)m_aValue.m_pValue != 0.0;
				break;
			case DataType::DATE:
			case DataType::TIME:
			case DataType::TIMESTAMP:
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				OSL_ASSERT(!"getBool() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				bRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				bRet = m_bSigned ? (m_aValue.m_nInt8  != 0) : (m_aValue.m_nInt16 != 0);
				break;
			case DataType::SMALLINT:
				bRet = m_bSigned ? (m_aValue.m_nInt16  != 0) : (m_aValue.m_nInt32 != 0);
				break;
			case DataType::INTEGER:
				bRet = m_bSigned ? (m_aValue.m_nInt32 != 0) : (*static_cast<sal_Int64*>(m_aValue.m_pValue) != sal_Int64(0));
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= bRet;
				    break;
                }
		}
	}
	return bRet;
}
// -------------------------------------------------------------------------
sal_Int8 ORowSetValue::getInt8()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getInt8" );


	sal_Int8 nRet = 0;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				nRet = sal_Int8(::rtl::OUString(m_aValue.m_pString).toInt32());
				break;
			case DataType::BIGINT:
                if ( m_bSigned )
					nRet = sal_Int8(*(sal_Int64*)m_aValue.m_pValue);
				else
					nRet = sal_Int8(::rtl::OUString(m_aValue.m_pString).toInt32());
				break;
			case DataType::FLOAT:
				nRet = sal_Int8(*(float*)m_aValue.m_pValue);
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				nRet = sal_Int8(*(double*)m_aValue.m_pValue);
				break;
			case DataType::DATE:
			case DataType::TIME:
			case DataType::TIMESTAMP:
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::BLOB:
			case DataType::CLOB:
				OSL_ASSERT(!"getInt8() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				nRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt8;
				else
					nRet = static_cast<sal_Int8>(m_aValue.m_nInt16);
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					nRet = static_cast<sal_Int8>(m_aValue.m_nInt16);
				else
					nRet = static_cast<sal_Int8>(m_aValue.m_nInt32);
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					nRet = static_cast<sal_Int8>(m_aValue.m_nInt32);
				else
					nRet = static_cast<sal_Int8>(*static_cast<sal_Int64*>(m_aValue.m_pValue));
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= nRet;
				    break;
                }
		}
	}
	return nRet;
}
// -------------------------------------------------------------------------
sal_Int16 ORowSetValue::getInt16()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getInt16" );


	sal_Int16 nRet = 0;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				nRet = sal_Int16(::rtl::OUString(m_aValue.m_pString).toInt32());
				break;
			case DataType::BIGINT:
                if ( m_bSigned )
					nRet = sal_Int16(*(sal_Int64*)m_aValue.m_pValue);
				else
					nRet = sal_Int16(::rtl::OUString(m_aValue.m_pString).toInt32());
				break;
			case DataType::FLOAT:
				nRet = sal_Int16(*(float*)m_aValue.m_pValue);
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				nRet = sal_Int16(*(double*)m_aValue.m_pValue);
				break;
			case DataType::DATE:
			case DataType::TIME:
			case DataType::TIMESTAMP:
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::BLOB:
			case DataType::CLOB:
				OSL_ASSERT(!"getInt16() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				nRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt8;
				else
					nRet = m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt16;
				else
					nRet = static_cast<sal_Int16>(m_aValue.m_nInt32);
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					nRet = static_cast<sal_Int16>(m_aValue.m_nInt32);
				else
					nRet = static_cast<sal_Int16>(*static_cast<sal_Int64*>(m_aValue.m_pValue));
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= nRet;
				    break;
                }
		}
	}
	return nRet;
}
// -------------------------------------------------------------------------
sal_Int32 ORowSetValue::getInt32()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getInt32" );
	sal_Int32 nRet = 0;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				nRet = ::rtl::OUString(m_aValue.m_pString).toInt32();
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
					nRet = sal_Int32(*(sal_Int64*)m_aValue.m_pValue);
				else
					nRet = ::rtl::OUString(m_aValue.m_pString).toInt32();
				break;
			case DataType::FLOAT:
				nRet = sal_Int32(*(float*)m_aValue.m_pValue);
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				nRet = sal_Int32(*(double*)m_aValue.m_pValue);
				break;
			case DataType::DATE:
				nRet = dbtools::DBTypeConversion::toDays(*(::com::sun::star::util::Date*)m_aValue.m_pValue);
				break;
			case DataType::TIME:
			case DataType::TIMESTAMP:
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::BLOB:
			case DataType::CLOB:
				OSL_ASSERT(!"getInt32() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				nRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt8;
				else
					nRet = m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt16;
				else
					nRet = m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt32;
				else
					nRet = static_cast<sal_Int32>(*static_cast<sal_Int64*>(m_aValue.m_pValue));
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= nRet;
				    break;
                }
		}
	}
	return nRet;
}
// -------------------------------------------------------------------------
sal_Int64 ORowSetValue::getLong()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getLong" );
	sal_Int64 nRet = 0;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				nRet = ::rtl::OUString(m_aValue.m_pString).toInt64();
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
					nRet = *(sal_Int64*)m_aValue.m_pValue;
				else
					nRet = ::rtl::OUString(m_aValue.m_pString).toInt64();
				break;
			case DataType::FLOAT:
				nRet = sal_Int64(*(float*)m_aValue.m_pValue);
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				nRet = sal_Int64(*(double*)m_aValue.m_pValue);
				break;
			case DataType::DATE:
				nRet = dbtools::DBTypeConversion::toDays(*(::com::sun::star::util::Date*)m_aValue.m_pValue);
				break;
			case DataType::TIME:
			case DataType::TIMESTAMP:
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::BLOB:
			case DataType::CLOB:
				OSL_ASSERT(!"getInt32() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				nRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt8;
				else
					nRet = m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt16;
				else
					nRet = m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt32;
				else
					nRet = *(sal_Int64*)m_aValue.m_pValue;
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= nRet;
				    break;
                }
		}
	}
	return nRet;
}
// -------------------------------------------------------------------------
float ORowSetValue::getFloat()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getFloat" );
	float nRet = 0;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				nRet = ::rtl::OUString(m_aValue.m_pString).toFloat();
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
					nRet = float(*(sal_Int64*)m_aValue.m_pValue);
				else
					nRet = ::rtl::OUString(m_aValue.m_pString).toFloat();
				break;
			case DataType::FLOAT:
				nRet = *(float*)m_aValue.m_pValue;
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				nRet = (float)*(double*)m_aValue.m_pValue;
				break;
			case DataType::DATE:
				nRet = (float)dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::Date*)m_aValue.m_pValue);
				break;
			case DataType::TIME:
				nRet = (float)dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::Time*)m_aValue.m_pValue);
				break;
			case DataType::TIMESTAMP:
				nRet = (float)dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::DateTime*)m_aValue.m_pValue);
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::BLOB:
			case DataType::CLOB:
				OSL_ASSERT(!"getDouble() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				nRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt8;
				else
					nRet = m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt16;
				else
					nRet = (float)m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					nRet = (float)m_aValue.m_nInt32;
				else
					nRet = float(*(sal_Int64*)m_aValue.m_pValue);
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= nRet;
				    break;
                }
		}
	}
	return nRet;
}
// -------------------------------------------------------------------------
double ORowSetValue::getDouble()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getDouble" );


	double nRet = 0;
	if(!m_bNull)
	{
		switch(getTypeKind())
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::LONGVARCHAR:
				nRet = ::rtl::OUString(m_aValue.m_pString).toDouble();
				break;
			case DataType::BIGINT:
				if ( m_bSigned )
					nRet = double(*(sal_Int64*)m_aValue.m_pValue);
				else
					nRet = ::rtl::OUString(m_aValue.m_pString).toDouble();
				break;
			case DataType::FLOAT:
				nRet = *(float*)m_aValue.m_pValue;
				break;
			case DataType::DOUBLE:
			case DataType::REAL:
				nRet = *(double*)m_aValue.m_pValue;
				break;
			case DataType::DATE:
				nRet = dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::Date*)m_aValue.m_pValue);
				break;
			case DataType::TIME:
				nRet = dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::Time*)m_aValue.m_pValue);
				break;
			case DataType::TIMESTAMP:
				nRet = dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::DateTime*)m_aValue.m_pValue);
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::BLOB:
			case DataType::CLOB:
				OSL_ASSERT(!"getDouble() for this type is not allowed!");
				break;
			case DataType::BIT:
			case DataType::BOOLEAN:
				nRet = m_aValue.m_bBool;
				break;
			case DataType::TINYINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt8;
				else
					nRet = m_aValue.m_nInt16;
				break;
			case DataType::SMALLINT:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt16;
				else
					nRet = m_aValue.m_nInt32;
				break;
			case DataType::INTEGER:
				if ( m_bSigned )
					nRet = m_aValue.m_nInt32;
				else
					nRet = double(*(sal_Int64*)m_aValue.m_pValue);
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= nRet;
				    break;
                }
		}
	}
	return nRet;
}
// -------------------------------------------------------------------------
void ORowSetValue::setFromDouble(const double& _rVal,sal_Int32 _nDatatype)
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::setFromDouble" );
	free();

	m_bNull = sal_False;
	switch(_nDatatype)
	{
		case DataType::CHAR:
		case DataType::VARCHAR:
		case DataType::DECIMAL:
		case DataType::NUMERIC:
		case DataType::LONGVARCHAR:
			{
				::rtl::OUString aVal = ::rtl::OUString::valueOf(_rVal);
				m_aValue.m_pString = aVal.pData;
				rtl_uString_acquire(m_aValue.m_pString);
			}
			break;
		case DataType::BIGINT:
			if ( m_bSigned )
			{
				m_aValue.m_pValue = new sal_Int64((sal_Int64)_rVal);
				TRACE_ALLOC( sal_Int64 )
			}
			else
			{
				::rtl::OUString aVal = ::rtl::OUString::valueOf(_rVal);
				m_aValue.m_pString = aVal.pData;
				rtl_uString_acquire(m_aValue.m_pString);
			}
			break;
		case DataType::FLOAT:
			m_aValue.m_pValue = new float((float)_rVal);
			TRACE_ALLOC( float )
			break;
		case DataType::DOUBLE:
		case DataType::REAL:
			m_aValue.m_pValue = new double(_rVal);
			TRACE_ALLOC( double )
			break;
		case DataType::DATE:
			m_aValue.m_pValue = new Date(dbtools::DBTypeConversion::toDate(_rVal));
			TRACE_ALLOC( Date )
			break;
		case DataType::TIME:
			m_aValue.m_pValue = new Time(dbtools::DBTypeConversion::toTime(_rVal));
			TRACE_ALLOC( Time )
			break;
		case DataType::TIMESTAMP:
			m_aValue.m_pValue = new DateTime(dbtools::DBTypeConversion::toDateTime(_rVal));
			TRACE_ALLOC( DateTime )
			break;
		case DataType::BINARY:
		case DataType::VARBINARY:
		case DataType::LONGVARBINARY:
		case DataType::BLOB:
		case DataType::CLOB:
			OSL_ASSERT(!"setFromDouble() for this type is not allowed!");
			break;
		case DataType::BIT:
		case DataType::BOOLEAN:
			m_aValue.m_bBool = _rVal != 0.0;
			break;
		case DataType::TINYINT:
			if ( m_bSigned )
				m_aValue.m_nInt8 = sal_Int8(_rVal);
			else
				m_aValue.m_nInt16 = sal_Int16(_rVal);
			break;
		case DataType::SMALLINT:
			if ( m_bSigned )
				m_aValue.m_nInt16 = sal_Int16(_rVal);
			else
				m_aValue.m_nInt32 = sal_Int32(_rVal);
			break;
		case DataType::INTEGER:
			if ( m_bSigned )
				m_aValue.m_nInt32 = sal_Int32(_rVal);
			else
			{
				m_aValue.m_pValue = new sal_Int64((sal_Int64)_rVal);
				TRACE_ALLOC( sal_Int64 )
			}
			break;
            default:
                {
                    m_aValue.m_pValue = new Any(_rVal);
				    break;
                }
	}
	m_eTypeKind = _nDatatype;
}
// -----------------------------------------------------------------------------
Sequence<sal_Int8>	ORowSetValue::getSequence() const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getSequence" );
	Sequence<sal_Int8> aSeq;
	if (!m_bNull)
	{
		switch(m_eTypeKind)
		{
			case DataType::OBJECT:
			case DataType::CLOB:
			case DataType::BLOB:
			{
				Reference<XInputStream> xStream;
				const Any aValue = makeAny();
				if(aValue.hasValue())
				{
                    Reference<XBlob> xBlob(aValue,UNO_QUERY);
                    if ( xBlob.is() )
                        xStream = xBlob->getBinaryStream();
                    else
                    {
                        Reference<XClob> xClob(aValue,UNO_QUERY);
                        if ( xClob.is() )
                            xStream = xClob->getCharacterStream();
                    }
					if(xStream.is())
                    {
                        const sal_uInt32	nBytesToRead = 65535;
		                sal_uInt32			nRead;

		                do
		                {
			                ::com::sun::star::uno::Sequence< sal_Int8 > aReadSeq;
                			
			                nRead = xStream->readSomeBytes( aReadSeq, nBytesToRead );

			                if( nRead )
			                {
				                const sal_uInt32 nOldLength = aSeq.getLength();
				                aSeq.realloc( nOldLength + nRead );
				                rtl_copyMemory( aSeq.getArray() + nOldLength, aReadSeq.getConstArray(), aReadSeq.getLength() );
			                }
		                }
		                while( nBytesToRead == nRead );
                        xStream->closeInput();
                    }
				}
			}
			break;
			case DataType::VARCHAR:
			case DataType::LONGVARCHAR:
				{
					::rtl::OUString sVal(m_aValue.m_pString);
					aSeq = Sequence<sal_Int8>(reinterpret_cast<const sal_Int8*>(sVal.getStr()),sizeof(sal_Unicode)*sVal.getLength());
				}
				break;
			case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
				aSeq = *static_cast< Sequence<sal_Int8>*>(m_aValue.m_pValue);
				break;
			default:
                {
                    Any aValue = getAny();
                    aValue >>= aSeq;
				    break;
                }
		}
	}
	return aSeq;

}
// -----------------------------------------------------------------------------
::com::sun::star::util::Date ORowSetValue::getDate() const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getDate" );
	::com::sun::star::util::Date aValue;
	if(!m_bNull)
	{
		switch(m_eTypeKind)
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::LONGVARCHAR:
				aValue = DBTypeConversion::toDate(getString());
				break;
			case DataType::DECIMAL:
			case DataType::NUMERIC:
			case DataType::FLOAT:
			case DataType::DOUBLE:
			case DataType::REAL:
				aValue = DBTypeConversion::toDate((double)*this);
				break;

			case DataType::DATE:
				aValue = *static_cast< ::com::sun::star::util::Date*>(m_aValue.m_pValue);
				break;
			case DataType::TIMESTAMP:
				{
					::com::sun::star::util::DateTime* pDateTime = static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue);
					aValue.Day		= pDateTime->Day;
					aValue.Month	= pDateTime->Month;
					aValue.Year		= pDateTime->Year;
				}
				break;
            case DataType::BIT:
            case DataType::BOOLEAN:
            case DataType::TINYINT:
            case DataType::SMALLINT:
			case DataType::INTEGER:
			case DataType::BIGINT:
				aValue = DBTypeConversion::toDate( double( sal_Int64( *this ) ) );
				break;

			case DataType::BLOB:
			case DataType::CLOB:
			case DataType::OBJECT:
            default:
                OSL_ENSURE( false, "ORowSetValue::getDate: cannot retrieve the data!" );
                // NO break!

            case DataType::BINARY:
			case DataType::VARBINARY:
			case DataType::LONGVARBINARY:
			case DataType::TIME:
                aValue = DBTypeConversion::toDate( (double)0 );
                break;
		}
	}
	return aValue;
}
// -----------------------------------------------------------------------------
::com::sun::star::util::Time ORowSetValue::getTime()		const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getTime" );
	::com::sun::star::util::Time aValue;
	if(!m_bNull)
	{
		switch(m_eTypeKind)
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::LONGVARCHAR:
				aValue = DBTypeConversion::toTime(getString());
				break;
			case DataType::DECIMAL:
			case DataType::NUMERIC:
				aValue = DBTypeConversion::toTime((double)*this);
				break;
			case DataType::FLOAT:
			case DataType::DOUBLE:
			case DataType::REAL:
				aValue = DBTypeConversion::toTime((double)*this);
				break;
			case DataType::TIMESTAMP:
				{
					::com::sun::star::util::DateTime* pDateTime = static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue);
					aValue.HundredthSeconds	= pDateTime->HundredthSeconds;
					aValue.Seconds			= pDateTime->Seconds;
					aValue.Minutes			= pDateTime->Minutes;
					aValue.Hours			= pDateTime->Hours;
				}
				break;
			case DataType::TIME:
				aValue = *static_cast< ::com::sun::star::util::Time*>(m_aValue.m_pValue);
                break;
			default:
                {
                    Any aAnyValue = getAny();
                    aAnyValue >>= aValue;
				    break;
                }
		}
	}
	return aValue;
}
// -----------------------------------------------------------------------------
::com::sun::star::util::DateTime ORowSetValue::getDateTime()	const
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::getDateTime" );
	::com::sun::star::util::DateTime aValue;
	if(!m_bNull)
	{
		switch(m_eTypeKind)
		{
			case DataType::CHAR:
			case DataType::VARCHAR:
			case DataType::LONGVARCHAR:
				aValue = DBTypeConversion::toDateTime(getString());
				break;
			case DataType::DECIMAL:
			case DataType::NUMERIC:
				aValue = DBTypeConversion::toDateTime((double)*this);
				break;
			case DataType::FLOAT:
			case DataType::DOUBLE:
			case DataType::REAL:
				aValue = DBTypeConversion::toDateTime((double)*this);
				break;
			case DataType::DATE:
				{
					::com::sun::star::util::Date* pDate = static_cast< ::com::sun::star::util::Date*>(m_aValue.m_pValue);
					aValue.Day		= pDate->Day;
					aValue.Month	= pDate->Month;
					aValue.Year		= pDate->Year;
				}
				break;
			case DataType::TIME:
				{
					::com::sun::star::util::Time* pTime = static_cast< ::com::sun::star::util::Time*>(m_aValue.m_pValue);
					aValue.HundredthSeconds	= pTime->HundredthSeconds;
					aValue.Seconds			= pTime->Seconds;
					aValue.Minutes			= pTime->Minutes;
					aValue.Hours			= pTime->Hours;
				}
				break;
			case DataType::TIMESTAMP:
				aValue = *static_cast< ::com::sun::star::util::DateTime*>(m_aValue.m_pValue);
				break;
			default:
                {
                    Any aAnyValue = getAny();
                    aAnyValue >>= aValue;
				    break;
                }
		}
	}
	return aValue;
}
// -----------------------------------------------------------------------------
void ORowSetValue::setSigned(sal_Bool _bMod)
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::setSigned" );
	if ( m_bSigned != _bMod )
	{
		m_bSigned = _bMod;
		if ( !m_bNull )
		{
			sal_Int32 nType = m_eTypeKind;
			switch(m_eTypeKind)
			{
				case DataType::BIGINT:
					if ( m_bSigned ) // now we are signed, so we were unsigned and need to call getString()
                    {
                        m_bSigned = !m_bSigned;
                        const ::rtl::OUString sValue = getString();
                        free();
                        m_bSigned = !m_bSigned;
						(*this) = sValue;
                    }
					else
                    {
                        m_bSigned = !m_bSigned;
                        const sal_Int64 nValue = getLong();
                        free();
                        m_bSigned = !m_bSigned;
						(*this) = nValue;
                    }
					break;
				case DataType::TINYINT:
					if ( m_bSigned )
						(*this) = getInt8();
					else
					{
						m_bSigned = !m_bSigned;
						(*this) = getInt16();
						m_bSigned = !m_bSigned;
					}
					break;
				case DataType::SMALLINT:
					if ( m_bSigned )
						(*this) = getInt16();
					else
					{
						m_bSigned = !m_bSigned;
						(*this) = getInt32();
						m_bSigned = !m_bSigned;
					}
					break;
				case DataType::INTEGER:
					if ( m_bSigned )
						(*this) = getInt32();
					else
					{
						m_bSigned = !m_bSigned;
						(*this) = getLong();
						m_bSigned = !m_bSigned;
					}
					break;
			}
			m_eTypeKind = nType;
		}
	}
}

// -----------------------------------------------------------------------------
namespace detail
{
    class SAL_NO_VTABLE IValueSource
    {
    public:
        virtual ::rtl::OUString             getString() const = 0;
        virtual sal_Bool                    getBoolean() const = 0;
        virtual sal_Int8                    getByte() const = 0;
        virtual sal_Int16                   getShort() const = 0;
        virtual sal_Int32                   getInt() const = 0;
        virtual sal_Int64                   getLong() const = 0;
        virtual float                       getFloat() const = 0;
        virtual double                      getDouble() const = 0;
        virtual Date                        getDate() const = 0;
        virtual Time                        getTime() const = 0;
        virtual DateTime                    getTimestamp() const = 0;
        virtual Sequence< sal_Int8 >        getBytes() const = 0;
        virtual Reference< XInputStream >   getBinaryStream() const = 0;
        virtual Reference< XInputStream >   getCharacterStream() const = 0;
        virtual Reference< XBlob >   		getBlob() const = 0;
        virtual Reference< XClob >   		getClob() const = 0;
        virtual Any					   		getObject() const = 0;
        virtual sal_Bool                    wasNull() const = 0;

        virtual ~IValueSource() { }
    };

    class RowValue : public IValueSource
    {
    public:
        RowValue( const Reference< XRow >& _xRow, const sal_Int32 _nPos )
            :m_xRow( _xRow )
            ,m_nPos( _nPos )
        {
        }

        // IValueSource
        virtual ::rtl::OUString             getString() const           { return m_xRow->getString( m_nPos ); };
        virtual sal_Bool                    getBoolean() const          { return m_xRow->getBoolean( m_nPos ); };
        virtual sal_Int8                    getByte() const             { return m_xRow->getByte( m_nPos ); };
        virtual sal_Int16                   getShort() const            { return m_xRow->getShort( m_nPos ); }
        virtual sal_Int32                   getInt() const              { return m_xRow->getInt( m_nPos ); }
        virtual sal_Int64                   getLong() const             { return m_xRow->getLong( m_nPos ); }
        virtual float                       getFloat() const            { return m_xRow->getFloat( m_nPos ); };
        virtual double                      getDouble() const           { return m_xRow->getDouble( m_nPos ); };
        virtual Date                        getDate() const             { return m_xRow->getDate( m_nPos ); };
        virtual Time                        getTime() const             { return m_xRow->getTime( m_nPos ); };
        virtual DateTime                    getTimestamp() const        { return m_xRow->getTimestamp( m_nPos ); };
        virtual Sequence< sal_Int8 >        getBytes() const            { return m_xRow->getBytes( m_nPos ); };
        virtual Reference< XInputStream >   getBinaryStream() const     { return m_xRow->getBinaryStream( m_nPos ); };
        virtual Reference< XInputStream >   getCharacterStream() const  { return m_xRow->getCharacterStream( m_nPos ); };
        virtual Reference< XBlob >   		getBlob() const  			{ return m_xRow->getBlob( m_nPos ); };
        virtual Reference< XClob >   		getClob() const  			{ return m_xRow->getClob( m_nPos ); };
        virtual Any					   		getObject() const 			{ return m_xRow->getObject( m_nPos ,NULL); };
        virtual sal_Bool                    wasNull() const             { return m_xRow->wasNull( ); };

    private:
        const Reference< XRow > m_xRow;
        const sal_Int32         m_nPos;
    };

    class ColumnValue : public IValueSource
    {
    public:
        ColumnValue( const Reference< XColumn >& _rxColumn )
            :m_xColumn( _rxColumn )
        {
        }

        // IValueSource
        virtual ::rtl::OUString             getString() const           { return m_xColumn->getString(); };
        virtual sal_Bool                    getBoolean() const          { return m_xColumn->getBoolean(); };
        virtual sal_Int8                    getByte() const             { return m_xColumn->getByte(); };
        virtual sal_Int16                   getShort() const            { return m_xColumn->getShort(); }
        virtual sal_Int32                   getInt() const              { return m_xColumn->getInt(); }
        virtual sal_Int64                   getLong() const             { return m_xColumn->getLong(); }
        virtual float                       getFloat() const            { return m_xColumn->getFloat(); };
        virtual double                      getDouble() const           { return m_xColumn->getDouble(); };
        virtual Date                        getDate() const             { return m_xColumn->getDate(); };
        virtual Time                        getTime() const             { return m_xColumn->getTime(); };
        virtual DateTime                    getTimestamp() const        { return m_xColumn->getTimestamp(); };
        virtual Sequence< sal_Int8 >        getBytes() const            { return m_xColumn->getBytes(); };
        virtual Reference< XInputStream >   getBinaryStream() const     { return m_xColumn->getBinaryStream(); };
        virtual Reference< XInputStream >   getCharacterStream() const  { return m_xColumn->getCharacterStream(); };
        virtual Reference< XBlob >   		getBlob() const				{ return m_xColumn->getBlob(); };
        virtual Reference< XClob >   		getClob() const 			{ return m_xColumn->getClob(); };
        virtual Any                         getObject() const           { return m_xColumn->getObject( NULL ); };
        virtual sal_Bool                    wasNull() const             { return m_xColumn->wasNull( ); };

    private:
        const Reference< XColumn >  m_xColumn;
    };
}

// -----------------------------------------------------------------------------
void ORowSetValue::fill( const sal_Int32 _nType, const Reference< XColumn >& _rxColumn )
{
    detail::ColumnValue aColumnValue( _rxColumn );
    impl_fill( _nType, sal_True, aColumnValue );
}

// -----------------------------------------------------------------------------
void ORowSetValue::fill( sal_Int32 _nPos, sal_Int32 _nType, sal_Bool  _bNullable, const Reference< XRow>& _xRow )
{
    detail::RowValue aRowValue( _xRow, _nPos );
    impl_fill( _nType, _bNullable, aRowValue );
}

// -----------------------------------------------------------------------------
void ORowSetValue::fill(sal_Int32 _nPos,
					 sal_Int32 _nType,
					 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow>& _xRow)
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::fill (1)" );
    fill(_nPos,_nType,sal_True,_xRow);
}

// -----------------------------------------------------------------------------
void ORowSetValue::impl_fill( const sal_Int32 _nType, sal_Bool _bNullable, const detail::IValueSource& _rValueSource )

{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::fill (2)" );
    sal_Bool bReadData = sal_True;
	switch(_nType)
	{
	case DataType::CHAR:
	case DataType::VARCHAR:
	case DataType::DECIMAL:
	case DataType::NUMERIC:
	case DataType::LONGVARCHAR:
		(*this) = _rValueSource.getString();
		break;
	case DataType::BIGINT:
		if ( isSigned() )
			(*this) = _rValueSource.getLong();
		else
			(*this) = _rValueSource.getString();
		break;
	case DataType::FLOAT:
		(*this) = _rValueSource.getFloat();
		break;
	case DataType::DOUBLE:
	case DataType::REAL:
		(*this) = _rValueSource.getDouble();
		break;
	case DataType::DATE:
		(*this) = _rValueSource.getDate();
		break;
	case DataType::TIME:
		(*this) = _rValueSource.getTime();
		break;
	case DataType::TIMESTAMP:
		(*this) = _rValueSource.getTimestamp();
		break;
	case DataType::BINARY:
	case DataType::VARBINARY:
	case DataType::LONGVARBINARY:
		(*this) = _rValueSource.getBytes();
		break;
	case DataType::BIT:
	case DataType::BOOLEAN:
		(*this) = _rValueSource.getBoolean();
		break;
	case DataType::TINYINT:
		if ( isSigned() )
			(*this) = _rValueSource.getByte();
		else
			(*this) = _rValueSource.getShort();
		break;
	case DataType::SMALLINT:
		if ( isSigned() )
			(*this) = _rValueSource.getShort();
		else
			(*this) = _rValueSource.getInt();
		break;
	case DataType::INTEGER:
		if ( isSigned() )
			(*this) = _rValueSource.getInt();
		else
			(*this) = _rValueSource.getLong();
		break;
	case DataType::CLOB:
        (*this) = ::com::sun::star::uno::makeAny(_rValueSource.getClob());
		setTypeKind(DataType::CLOB);
		break;
	case DataType::BLOB:
		(*this) = ::com::sun::star::uno::makeAny(_rValueSource.getBlob());
		setTypeKind(DataType::BLOB);
		break;
	case DataType::OTHER:
		(*this) = _rValueSource.getObject();
		setTypeKind(DataType::OTHER);
		break;
	default:
        OSL_ENSURE( false, "ORowSetValue::fill: unsupported type!" );
        (*this) = _rValueSource.getObject();
        break;
	}
	if ( bReadData && _bNullable && _rValueSource.wasNull() )
		setNull();
	setTypeKind(_nType);
}
// -----------------------------------------------------------------------------
void ORowSetValue::fill(const Any& _rValue)
{
    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbtools", "Ocke.Janssen@sun.com", "ORowSetValue::fill (3)" );
    switch (_rValue.getValueType().getTypeClass())
    {
        case TypeClass_VOID:
            setNull();
            break;
        case TypeClass_BOOLEAN:
        {
            sal_Bool bValue( sal_False );
            _rValue >>= bValue;
            (*this) = bValue;
            break;
        }
        case TypeClass_CHAR:
        {
            sal_Unicode aDummy(0);
            _rValue >>= aDummy;
            (*this) = ::rtl::OUString(aDummy);
            break;
        }
        case TypeClass_STRING:
        {
            ::rtl::OUString sDummy;
            _rValue >>= sDummy;
            (*this) = sDummy;
            break;
        }
        case TypeClass_FLOAT:
        {
            float aDummy(0.0);
            _rValue >>= aDummy;
            (*this) = aDummy;
            break;
        }
        case TypeClass_DOUBLE:
        {
            double aDummy(0.0);
            _rValue >>= aDummy;
            (*this) = aDummy;
            break;
        }
        case TypeClass_BYTE:
        {
            sal_Int8 aDummy(0);
            _rValue >>= aDummy;
            (*this) = aDummy;
            break;
        }
        case TypeClass_SHORT:
        {
            sal_Int16 aDummy(0);
            _rValue >>= aDummy;
            (*this) = aDummy;
            break;
        }
        case TypeClass_LONG:
        {
            sal_Int32 aDummy(0);
            _rValue >>= aDummy;
            (*this) = aDummy;
            break;
        }
        case TypeClass_UNSIGNED_SHORT:
        {
            sal_uInt16 nValue(0);
            _rValue >>= nValue;
            (*this) = static_cast<sal_Int32>(nValue);
            setSigned(sal_False);
            break;
        }
        case TypeClass_HYPER:
        {
            sal_Int64 nValue(0);
            _rValue >>= nValue;
            (*this) = nValue;
            break;
        }
        case TypeClass_UNSIGNED_HYPER:
        {
            sal_uInt64 nValue(0);
            _rValue >>= nValue;
            (*this) = static_cast<sal_Int64>(nValue);
            setSigned(sal_False);
            break;
        }
        case TypeClass_UNSIGNED_LONG:
        {
            sal_uInt32 nValue(0);
            _rValue >>= nValue;
            (*this) = static_cast<sal_Int64>(nValue);
            setSigned(sal_False);
            break;
        }
        case TypeClass_ENUM:
        {
            sal_Int32 enumValue( 0 );
            ::cppu::enum2int( enumValue, _rValue );
            (*this) = enumValue;
        }
        break;

        case TypeClass_SEQUENCE:
        {
            Sequence<sal_Int8> aDummy;
            if ( _rValue >>= aDummy )
                (*this) = aDummy;
            else
                OSL_ENSURE( false, "ORowSetValue::fill: unsupported sequence type!" );
            break;
        }

        case TypeClass_STRUCT:
        {
            ::com::sun::star::util::Date aDate;
            ::com::sun::star::util::Time aTime;
            ::com::sun::star::util::DateTime aDateTime;
            if ( _rValue >>= aDate )
            {
                (*this) = aDate;
            }
            else if ( _rValue >>= aTime )
            {
                (*this) = aTime;
            }
            else if ( _rValue >>= aDateTime )
            {
                (*this) = aDateTime;
            }
            else
                OSL_ENSURE( false, "ORowSetValue::fill: unsupported structure!" );

            break;
        }
		case TypeClass_INTERFACE:
			{
				Reference< XClob > xClob;
				if ( _rValue >>= xClob )
				{
					(*this) = _rValue;
					setTypeKind(DataType::CLOB);
				}
				else
				{
					Reference< XBlob > xBlob;
					if ( _rValue >>= xBlob )
					{
						(*this) = _rValue;
						setTypeKind(DataType::BLOB);
					}
                    else
                    {
                        (*this) = _rValue;
                    }
                }
			}
			break;
            
        default:
            OSL_ENSURE(0,"Unknown type");
            break;
    }
}

}   // namespace connectivity
