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