Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * Effective License of whole file:
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License version 2.1, as published by the Free Software Foundation.
9 : : *
10 : : * This library is distributed in the hope that it will be useful,
11 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : : * Lesser General Public License for more details.
14 : : *
15 : : * You should have received a copy of the GNU Lesser General Public
16 : : * License along with this library; if not, write to the Free Software
17 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18 : : * MA 02111-1307 USA
19 : : *
20 : : * Parts "Copyright by Sun Microsystems, Inc" prior to August 2011:
21 : : *
22 : : * The Contents of this file are made available subject to the terms of
23 : : * the GNU Lesser General Public License Version 2.1
24 : : *
25 : : * Copyright: 2000 by Sun Microsystems, Inc.
26 : : *
27 : : * Contributor(s): Joerg Budischewski
28 : : *
29 : : * All parts contributed on or after August 2011:
30 : : *
31 : : * Version: MPL 1.1 / GPLv3+ / LGPLv2.1+
32 : : *
33 : : * The contents of this file are subject to the Mozilla Public License Version
34 : : * 1.1 (the "License"); you may not use this file except in compliance with
35 : : * the License or as specified alternatively below. You may obtain a copy of
36 : : * the License at http://www.mozilla.org/MPL/
37 : : *
38 : : * Software distributed under the License is distributed on an "AS IS" basis,
39 : : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
40 : : * for the specific language governing rights and limitations under the
41 : : * License.
42 : : *
43 : : * Major Contributor(s):
44 : : * [ Copyright (C) 2011 Lionel Elie Mamane <lionel@mamane.lu> ]
45 : : *
46 : : * All Rights Reserved.
47 : : *
48 : : * For minor contributions see the git repository.
49 : : *
50 : : * Alternatively, the contents of this file may be used under the terms of
51 : : * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
52 : : * the GNU Lesser General Public License Version 2.1 or later (the "LGPLv2.1+"),
53 : : * in which case the provisions of the GPLv3+ or the LGPLv2.1+ are applicable
54 : : * instead of those above.
55 : : *
56 : : ************************************************************************/
57 : :
58 : : #include <osl/thread.h>
59 : :
60 : : #include <rtl/ustrbuf.hxx>
61 : :
62 : : #include <cppuhelper/typeprovider.hxx>
63 : : #include <cppuhelper/queryinterface.hxx>
64 : :
65 : : #include "pq_tools.hxx"
66 : : #include "pq_array.hxx"
67 : : #include "pq_statement.hxx"
68 : : #include "pq_baseresultset.hxx"
69 : : #include "pq_resultsetmetadata.hxx"
70 : :
71 : : #include <com/sun/star/lang/DisposedException.hpp>
72 : :
73 : : using osl::Mutex;
74 : : using osl::MutexGuard;
75 : :
76 : : using rtl::OUString;
77 : : using rtl::OUStringToOString;
78 : : using rtl::OUStringBuffer;
79 : : using rtl::OString;
80 : :
81 : : using com::sun::star::beans::XPropertySetInfo;
82 : : using com::sun::star::beans::XPropertySet;
83 : : using com::sun::star::beans::XMultiPropertySet;
84 : : using com::sun::star::beans::XFastPropertySet;
85 : :
86 : : using com::sun::star::uno::Any;
87 : : using com::sun::star::uno::makeAny;
88 : : using com::sun::star::uno::Type;
89 : : using com::sun::star::uno::RuntimeException;
90 : : using com::sun::star::uno::Exception;
91 : : using com::sun::star::uno::Sequence;
92 : : using com::sun::star::uno::Reference;
93 : : using com::sun::star::uno::XInterface;
94 : :
95 : : using com::sun::star::lang::IllegalArgumentException;
96 : :
97 : : using com::sun::star::sdbc::XWarningsSupplier;
98 : : using com::sun::star::sdbc::XCloseable;
99 : : using com::sun::star::sdbc::XStatement;
100 : : using com::sun::star::sdbc::XResultSet;
101 : : using com::sun::star::sdbc::XConnection;
102 : : using com::sun::star::sdbc::SQLException;
103 : : using com::sun::star::sdbc::XRow;
104 : : using com::sun::star::sdbc::XColumnLocate;
105 : : using com::sun::star::sdbc::XResultSetMetaData;
106 : : using com::sun::star::sdbc::XResultSetMetaDataSupplier;
107 : :
108 : :
109 : : using com::sun::star::beans::Property;
110 : :
111 : : namespace pq_sdbc_driver
112 : : {
113 : 0 : static ::cppu::IPropertyArrayHelper & getResultSetPropertyArrayHelper()
114 : : {
115 : : static ::cppu::IPropertyArrayHelper *pArrayHelper;
116 : 0 : if( ! pArrayHelper )
117 : : {
118 : 0 : MutexGuard guard( Mutex::getGlobalMutex() );
119 : 0 : if( ! pArrayHelper )
120 : : {
121 : : static Property aTable[] =
122 : : {
123 : : // LEM TODO: this needs to be kept in sync with other, e.g. pq_statics.css:508
124 : : // Should really share!
125 : : // At least use for the handles the #define'd values in .hxx file...
126 : : Property(
127 : : OUString( RTL_CONSTASCII_USTRINGPARAM("CursorName") ), 0,
128 : 0 : ::getCppuType( (OUString *)0) , 0 ),
129 : : Property(
130 : : OUString( RTL_CONSTASCII_USTRINGPARAM("EscapeProcessing") ), 1,
131 : 0 : ::getBooleanCppuType() , 0 ),
132 : : Property(
133 : : OUString( RTL_CONSTASCII_USTRINGPARAM("FetchDirection") ), 2,
134 : 0 : ::getCppuType( (sal_Int32 *)0) , 0 ),
135 : : Property(
136 : : OUString( RTL_CONSTASCII_USTRINGPARAM("FetchSize") ), 3,
137 : 0 : ::getCppuType( (sal_Int32 *)0) , 0 ),
138 : : Property(
139 : : OUString( RTL_CONSTASCII_USTRINGPARAM("IsBookmarkable") ), 4,
140 : 0 : ::getBooleanCppuType() , 0 ),
141 : : Property(
142 : : OUString( RTL_CONSTASCII_USTRINGPARAM("ResultSetConcurrency") ), 5,
143 : 0 : ::getCppuType( (sal_Int32 *)0) , 0 ),
144 : : Property(
145 : : OUString( RTL_CONSTASCII_USTRINGPARAM("ResultSetType") ), 6,
146 : 0 : ::getCppuType( (sal_Int32 *)0) , 0 )
147 : 0 : };
148 : : OSL_ASSERT( sizeof(aTable) / sizeof(Property) == BASERESULTSET_SIZE );
149 : 0 : static ::cppu::OPropertyArrayHelper arrayHelper( aTable, BASERESULTSET_SIZE, sal_True );
150 : 0 : pArrayHelper = &arrayHelper;
151 : 0 : }
152 : : }
153 : 0 : return *pArrayHelper;
154 : : }
155 : :
156 : 0 : BaseResultSet::BaseResultSet(
157 : : const ::rtl::Reference< RefCountedMutex > & refMutex,
158 : : const Reference< XInterface > & owner,
159 : : sal_Int32 rowCount,
160 : : sal_Int32 colCount,
161 : : const Reference< com::sun::star::script::XTypeConverter > & tc )
162 : 0 : : OComponentHelper( refMutex->mutex ),
163 : : OPropertySetHelper( OComponentHelper::rBHelper ),
164 : : m_owner( owner ),
165 : : m_tc( tc ),
166 : : m_refMutex( refMutex ),
167 : : m_row( -1 ),
168 : : m_rowCount( rowCount ),
169 : 0 : m_fieldCount( colCount )
170 : : {
171 : : POSTGRE_TRACE( "ctor BaseResultSet" );
172 : 0 : }
173 : :
174 : : // LEM TODO: refMutex->mutex should live longer than OComponentHelper,
175 : : // but calling OComponentHelper::dispose explicitly here calls
176 : : // BaseResultSet::~BaseResultSet in an infinite loop :(
177 : 0 : BaseResultSet::~BaseResultSet()
178 : : {
179 : : POSTGRE_TRACE( "dtor BaseResultSet" );
180 : 0 : }
181 : :
182 : 0 : Any BaseResultSet::queryInterface( const Type & reqType ) throw (RuntimeException)
183 : : {
184 : 0 : Any ret;
185 : :
186 : 0 : ret = OComponentHelper::queryInterface( reqType );
187 : 0 : if( ! ret.hasValue() )
188 : : ret = ::cppu::queryInterface( reqType,
189 : : static_cast< XResultSet * > ( this ),
190 : : static_cast< XResultSetMetaDataSupplier * > ( this ),
191 : : static_cast< XRow * > ( this ),
192 : : static_cast< XColumnLocate * > ( this ),
193 : : static_cast< XCloseable * > ( this ),
194 : : static_cast< XPropertySet * > ( this ),
195 : : static_cast< XMultiPropertySet * > ( this ),
196 : 0 : static_cast< XFastPropertySet * > ( this ) );
197 : 0 : return ret;
198 : : }
199 : :
200 : : // void BaseResultSet::close( ) throw (SQLException, RuntimeException)
201 : : // {
202 : : // Reference< XInterface > owner;
203 : : // {
204 : : // ResultSetGuard guard(*this);
205 : : // if( m_result )
206 : : // {
207 : : // PQclear(m_result );
208 : : // m_result = 0;
209 : : // m_row = -1;
210 : : // }
211 : : // owner = m_owner;
212 : : // m_owner.clear();
213 : : // }
214 : : // }
215 : :
216 : 0 : Sequence<Type > BaseResultSet::getTypes() throw( RuntimeException )
217 : : {
218 : : static cppu::OTypeCollection *pCollection;
219 : 0 : if( ! pCollection )
220 : : {
221 : 0 : MutexGuard guard( osl::Mutex::getGlobalMutex() );
222 : 0 : if( !pCollection )
223 : : {
224 : : static cppu::OTypeCollection collection(
225 : 0 : getCppuType( (Reference< XResultSet> *) 0 ),
226 : 0 : getCppuType( (Reference< XResultSetMetaDataSupplier> *) 0 ),
227 : 0 : getCppuType( (Reference< XRow> *) 0 ),
228 : 0 : getCppuType( (Reference< XColumnLocate> *) 0 ),
229 : 0 : getCppuType( (Reference< XCloseable> *) 0 ),
230 : 0 : getCppuType( (Reference< XPropertySet >*) 0 ),
231 : 0 : getCppuType( (Reference< XFastPropertySet > *) 0 ),
232 : 0 : getCppuType( (Reference< XMultiPropertySet > *) 0 ),
233 : 0 : OComponentHelper::getTypes());
234 : 0 : pCollection = &collection;
235 : 0 : }
236 : : }
237 : 0 : return pCollection->getTypes();
238 : : }
239 : :
240 : 0 : Sequence< sal_Int8> BaseResultSet::getImplementationId() throw( RuntimeException )
241 : : {
242 : : static cppu::OImplementationId *pId;
243 : 0 : if( ! pId )
244 : : {
245 : 0 : MutexGuard guard( osl::Mutex::getGlobalMutex() );
246 : 0 : if( ! pId )
247 : : {
248 : 0 : static cppu::OImplementationId id(sal_False);
249 : 0 : pId = &id;
250 : 0 : }
251 : : }
252 : 0 : return pId->getImplementationId();
253 : : }
254 : :
255 : : // Reference< XResultSetMetaData > BaseResultSet::getMetaData( ) throw (SQLException, RuntimeException)
256 : : // {
257 : : // ResultSetGuard guard(*this);
258 : : // checkClosed();
259 : : // return new ResultSetMetaData( m_refMutex, this, &m_result );
260 : : // }
261 : :
262 : 0 : sal_Bool BaseResultSet::next( ) throw (SQLException, RuntimeException)
263 : : {
264 : 0 : MutexGuard guard( m_refMutex->mutex );
265 : 0 : checkClosed();
266 : 0 : m_row ++;
267 : 0 : return m_row < m_rowCount;
268 : : }
269 : :
270 : 0 : sal_Bool BaseResultSet::isBeforeFirst( ) throw (SQLException, RuntimeException)
271 : : {
272 : 0 : MutexGuard guard( m_refMutex->mutex );
273 : 0 : checkClosed();
274 : 0 : return m_row == -1;
275 : : }
276 : :
277 : 0 : sal_Bool BaseResultSet::isAfterLast( ) throw (SQLException, RuntimeException)
278 : : {
279 : 0 : MutexGuard guard( m_refMutex->mutex );
280 : 0 : checkClosed();
281 : 0 : return m_row >= m_rowCount;
282 : : }
283 : :
284 : 0 : sal_Bool BaseResultSet::isFirst( ) throw (SQLException, RuntimeException)
285 : : {
286 : 0 : MutexGuard guard( m_refMutex->mutex );
287 : 0 : checkClosed();
288 : 0 : return m_row == 0 && m_rowCount;
289 : : }
290 : :
291 : 0 : sal_Bool BaseResultSet::isLast( ) throw (SQLException, RuntimeException)
292 : : {
293 : 0 : MutexGuard guard( m_refMutex->mutex );
294 : 0 : checkClosed();
295 : 0 : return m_row >= 0 && m_row + 1 == m_rowCount;
296 : : }
297 : :
298 : 0 : void BaseResultSet::beforeFirst( ) throw (SQLException, RuntimeException)
299 : : {
300 : 0 : MutexGuard guard( m_refMutex->mutex );
301 : 0 : checkClosed();
302 : 0 : m_row = -1;
303 : 0 : }
304 : :
305 : 0 : void BaseResultSet::afterLast( ) throw (SQLException, RuntimeException)
306 : : {
307 : 0 : MutexGuard guard( m_refMutex->mutex );
308 : 0 : checkClosed();
309 : 0 : m_row = m_rowCount;
310 : 0 : }
311 : :
312 : 0 : sal_Bool BaseResultSet::first( ) throw (SQLException, RuntimeException)
313 : : {
314 : 0 : MutexGuard guard( m_refMutex->mutex );
315 : 0 : checkClosed();
316 : 0 : sal_Bool bRet = ( m_rowCount > 0 );
317 : 0 : if( bRet )
318 : 0 : m_row = 0;
319 : 0 : return bRet;
320 : : }
321 : :
322 : 0 : sal_Bool BaseResultSet::last( ) throw (SQLException, RuntimeException)
323 : : {
324 : 0 : MutexGuard guard( m_refMutex->mutex );
325 : 0 : checkClosed();
326 : 0 : sal_Bool bRet = ( m_rowCount > 0 );
327 : 0 : if( bRet )
328 : 0 : m_row = m_rowCount -1;
329 : 0 : return bRet;
330 : : }
331 : :
332 : 0 : sal_Int32 BaseResultSet::getRow( ) throw (SQLException, RuntimeException)
333 : : {
334 : 0 : MutexGuard guard( m_refMutex->mutex );
335 : 0 : checkClosed();
336 : 0 : return m_row +1;
337 : : }
338 : :
339 : 0 : sal_Bool BaseResultSet::absolute( sal_Int32 row ) throw (SQLException, RuntimeException)
340 : : {
341 : 0 : MutexGuard guard( m_refMutex->mutex );
342 : 0 : checkClosed();
343 : 0 : if( row > 0 )
344 : : {
345 : 0 : m_row = row -1;
346 : 0 : if( m_row > m_rowCount )
347 : 0 : m_row = m_rowCount;
348 : : }
349 : : else
350 : : {
351 : 0 : m_row = m_rowCount + row;
352 : 0 : if( m_row < -1 )
353 : 0 : m_row = -1;
354 : : }
355 : 0 : return sal_True;
356 : : }
357 : :
358 : 0 : sal_Bool BaseResultSet::relative( sal_Int32 rows ) throw (SQLException, RuntimeException)
359 : : {
360 : 0 : MutexGuard guard( m_refMutex->mutex );
361 : 0 : checkClosed();
362 : 0 : m_row += rows;
363 : :
364 : 0 : if( m_row > m_rowCount )
365 : 0 : m_row = m_rowCount;
366 : 0 : else if ( m_row < -1 )
367 : 0 : m_row = -1;
368 : 0 : return sal_True;
369 : : }
370 : :
371 : 0 : sal_Bool BaseResultSet::previous( ) throw (SQLException, RuntimeException)
372 : : {
373 : 0 : MutexGuard guard( m_refMutex->mutex );
374 : 0 : checkClosed();
375 : 0 : sal_Bool bRet = ( m_row != -1 );
376 : 0 : if( bRet )
377 : 0 : m_row --;
378 : 0 : return bRet;
379 : : }
380 : :
381 : 0 : void BaseResultSet::refreshRow( ) throw (SQLException, RuntimeException)
382 : : {
383 : : // TODO: not supported for now
384 : 0 : }
385 : :
386 : 0 : sal_Bool BaseResultSet::rowUpdated( ) throw (SQLException, RuntimeException)
387 : : {
388 : 0 : return sal_False;
389 : : }
390 : :
391 : 0 : sal_Bool BaseResultSet::rowInserted( ) throw (SQLException, RuntimeException)
392 : : {
393 : 0 : return sal_False;
394 : : }
395 : :
396 : 0 : sal_Bool BaseResultSet::rowDeleted( ) throw (SQLException, RuntimeException)
397 : : {
398 : 0 : return sal_False;
399 : : }
400 : :
401 : 0 : Reference< XInterface > BaseResultSet::getStatement() throw (SQLException, RuntimeException)
402 : : {
403 : 0 : MutexGuard guard( m_refMutex->mutex );
404 : 0 : checkClosed();
405 : 0 : return m_owner;
406 : : }
407 : :
408 : :
409 : : //----------------- XRow interface ----------------------------------------------------
410 : :
411 : 0 : sal_Bool BaseResultSet::wasNull( ) throw (SQLException, RuntimeException)
412 : : {
413 : 0 : return m_wasNull;
414 : : }
415 : :
416 : 0 : Any BaseResultSet::convertTo( const Any & val , const Type & type )
417 : : {
418 : 0 : Any aRet;
419 : : try
420 : : {
421 : 0 : aRet = m_tc->convertTo( val , type );
422 : : }
423 : 0 : catch( com::sun::star::lang::IllegalArgumentException & )
424 : : {}
425 : 0 : catch( com::sun::star::script::CannotConvertException & )
426 : : {}
427 : 0 : return aRet;
428 : : }
429 : :
430 : 0 : sal_Bool BaseResultSet::getBoolean( sal_Int32 columnIndex ) throw (SQLException, RuntimeException)
431 : : {
432 : 0 : MutexGuard guard( m_refMutex->mutex );
433 : 0 : checkClosed();
434 : 0 : checkColumnIndex( columnIndex );
435 : 0 : checkRowIndex( sal_True /* must be on row */ );
436 : :
437 : 0 : OUString str = getString( columnIndex );
438 : :
439 : 0 : if( str.getLength() > 0 )
440 : : {
441 : 0 : switch(str[0])
442 : : {
443 : : case '1':
444 : : case 't':
445 : : case 'T':
446 : : case 'y':
447 : : case 'Y':
448 : :
449 : 0 : return sal_True;
450 : : }
451 : : }
452 : 0 : return sal_False;
453 : : }
454 : :
455 : 0 : sal_Int8 BaseResultSet::getByte( sal_Int32 columnIndex )
456 : : throw (SQLException, RuntimeException)
457 : : {
458 : 0 : MutexGuard guard( m_refMutex->mutex );
459 : 0 : checkClosed();
460 : 0 : checkColumnIndex( columnIndex );
461 : 0 : checkRowIndex( sal_True /* must be on row */ );
462 : 0 : sal_Int8 b = 0;
463 : 0 : convertTo( getValue( columnIndex ), getCppuType( &b )) >>= b;
464 : 0 : return b;
465 : : }
466 : :
467 : 0 : sal_Int16 BaseResultSet::getShort( sal_Int32 columnIndex )
468 : : throw (SQLException, RuntimeException)
469 : : {
470 : 0 : MutexGuard guard( m_refMutex->mutex );
471 : 0 : checkClosed();
472 : 0 : checkColumnIndex( columnIndex );
473 : 0 : checkRowIndex( sal_True /* must be on row */ );
474 : 0 : sal_Int16 i = 0;
475 : 0 : convertTo( getValue( columnIndex ), getCppuType( &i )) >>= i;
476 : 0 : return i;
477 : : }
478 : :
479 : 0 : OUString BaseResultSet::getString( sal_Int32 columnIndex ) throw (SQLException, RuntimeException)
480 : : {
481 : 0 : MutexGuard guard(m_refMutex->mutex);
482 : 0 : checkClosed();
483 : 0 : checkColumnIndex( columnIndex );
484 : 0 : checkRowIndex( sal_True /* must be on row */ );
485 : 0 : OUString ret;
486 : 0 : convertTo( getValue( columnIndex ), getCppuType( &ret ) ) >>= ret;
487 : : // printf( "BaseResultSet::getString() %s\n" , OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ).getStr() );
488 : 0 : return ret;
489 : : }
490 : :
491 : 0 : sal_Int32 BaseResultSet::getInt( sal_Int32 columnIndex )
492 : : throw (SQLException, RuntimeException)
493 : : {
494 : 0 : MutexGuard guard( m_refMutex->mutex );
495 : 0 : checkClosed();
496 : 0 : checkColumnIndex( columnIndex );
497 : 0 : checkRowIndex( sal_True /* must be on row */ );
498 : 0 : sal_Int32 i = 0;
499 : 0 : convertTo( getValue( columnIndex ), getCppuType( &i )) >>= i;
500 : 0 : return i;
501 : : }
502 : :
503 : 0 : sal_Int64 BaseResultSet::getLong( sal_Int32 columnIndex )
504 : : throw (SQLException, RuntimeException)
505 : : {
506 : 0 : MutexGuard guard( m_refMutex->mutex );
507 : 0 : checkClosed();
508 : 0 : checkColumnIndex( columnIndex );
509 : 0 : checkRowIndex( sal_True /* must be on row */ );
510 : 0 : sal_Int64 i = 0;
511 : 0 : convertTo( getValue( columnIndex ), getCppuType( &i )) >>= i;
512 : 0 : return i;
513 : : }
514 : :
515 : 0 : float BaseResultSet::getFloat( sal_Int32 columnIndex )
516 : : throw (SQLException, RuntimeException)
517 : : {
518 : 0 : MutexGuard guard( m_refMutex->mutex );
519 : 0 : checkClosed();
520 : 0 : checkColumnIndex( columnIndex );
521 : 0 : checkRowIndex( sal_True /* must be on row */ );
522 : 0 : float f = 0.;
523 : 0 : convertTo( getValue( columnIndex ), getCppuType( &f )) >>= f;
524 : 0 : return f;
525 : : }
526 : :
527 : 0 : double BaseResultSet::getDouble( sal_Int32 columnIndex )
528 : : throw (SQLException, RuntimeException)
529 : : {
530 : 0 : MutexGuard guard( m_refMutex->mutex );
531 : 0 : checkClosed();
532 : 0 : checkColumnIndex( columnIndex );
533 : 0 : double d = 0.;
534 : 0 : convertTo( getValue( columnIndex ), getCppuType( &d )) >>= d;
535 : 0 : return d;
536 : : }
537 : :
538 : 0 : Sequence< sal_Int8 > BaseResultSet::getBytes( sal_Int32 columnIndex )
539 : : throw (SQLException, RuntimeException)
540 : : {
541 : 0 : MutexGuard guard( m_refMutex->mutex );
542 : 0 : checkClosed();
543 : 0 : checkColumnIndex( columnIndex );
544 : 0 : checkRowIndex( sal_True /* must be on row */ );
545 : :
546 : 0 : Sequence< sal_Int8 > ret;
547 : 0 : OUString ustr;
548 : 0 : if( ! (getValue( columnIndex ) >>= ustr) )
549 : 0 : m_wasNull = true;
550 : : else
551 : : {
552 : : // if this is a binary, it must contain escaped data !
553 : 0 : OString val = rtl::OUStringToOString( ustr, RTL_TEXTENCODING_ASCII_US );
554 : :
555 : : size_t length;
556 : 0 : char * res = (char*) PQunescapeBytea( (unsigned char *)val.getStr() , &length);
557 : 0 : ret = Sequence< sal_Int8 > ( (sal_Int8*)res, length );
558 : 0 : if( res )
559 : 0 : free( res );
560 : : }
561 : 0 : return ret;
562 : : }
563 : :
564 : :
565 : 0 : ::com::sun::star::util::Date BaseResultSet::getDate( sal_Int32 columnIndex )
566 : : throw (SQLException, RuntimeException)
567 : : {
568 : 0 : return string2Date( getString( columnIndex ) );
569 : : }
570 : :
571 : 0 : ::com::sun::star::util::Time BaseResultSet::getTime( sal_Int32 columnIndex )
572 : : throw (SQLException, RuntimeException)
573 : : {
574 : 0 : return string2Time( getString( columnIndex ) );
575 : : }
576 : :
577 : 0 : ::com::sun::star::util::DateTime BaseResultSet::getTimestamp( sal_Int32 columnIndex )
578 : : throw (SQLException, RuntimeException)
579 : : {
580 : 0 : return string2DateTime( getString( columnIndex ) );
581 : : }
582 : :
583 : : // LEM TODO: these look like they are missing an actual implementation
584 : 0 : Reference< ::com::sun::star::io::XInputStream > BaseResultSet::getBinaryStream( sal_Int32 /* columnIndex */ )
585 : : throw (SQLException, RuntimeException)
586 : : {
587 : 0 : return 0;
588 : : }
589 : :
590 : 0 : Reference< ::com::sun::star::io::XInputStream > BaseResultSet::getCharacterStream( sal_Int32 /* columnIndex */ )
591 : : throw (SQLException, RuntimeException)
592 : : {
593 : 0 : return 0;
594 : : }
595 : :
596 : 0 : Any BaseResultSet::getObject(
597 : : sal_Int32 /* columnIndex */,
598 : : const Reference< ::com::sun::star::container::XNameAccess >& /* typeMap */ )
599 : : throw (SQLException, RuntimeException)
600 : : {
601 : 0 : return Any();
602 : : }
603 : :
604 : 0 : Reference< ::com::sun::star::sdbc::XRef > BaseResultSet::getRef( sal_Int32 /* columnIndex */ )
605 : : throw (SQLException, RuntimeException)
606 : : {
607 : 0 : return Reference< com::sun::star::sdbc::XRef > ();
608 : : }
609 : :
610 : 0 : Reference< ::com::sun::star::sdbc::XBlob > BaseResultSet::getBlob( sal_Int32 /* columnIndex */ )
611 : : throw (SQLException, RuntimeException)
612 : : {
613 : 0 : return Reference< com::sun::star::sdbc::XBlob > ();
614 : : }
615 : :
616 : 0 : Reference< ::com::sun::star::sdbc::XClob > BaseResultSet::getClob( sal_Int32 /* columnIndex */ )
617 : : throw (SQLException, RuntimeException)
618 : : {
619 : 0 : return Reference< com::sun::star::sdbc::XClob > ();
620 : : }
621 : :
622 : 0 : Reference< ::com::sun::star::sdbc::XArray > BaseResultSet::getArray( sal_Int32 columnIndex )
623 : : throw (SQLException, RuntimeException)
624 : : {
625 : 0 : return new Array( m_refMutex, parseArray( getString( columnIndex ) ), *this, m_tc );
626 : : }
627 : :
628 : 0 : ::cppu::IPropertyArrayHelper & BaseResultSet::getInfoHelper()
629 : : {
630 : 0 : return getResultSetPropertyArrayHelper();
631 : : }
632 : :
633 : 0 : sal_Bool BaseResultSet::convertFastPropertyValue(
634 : : Any & /* rConvertedValue */, Any & /* rOldValue */, sal_Int32 nHandle, const Any& rValue )
635 : : throw (IllegalArgumentException)
636 : : {
637 : : sal_Bool bRet;
638 : 0 : switch( nHandle )
639 : : {
640 : : case BASERESULTSET_CURSOR_NAME:
641 : : {
642 : 0 : OUString val;
643 : 0 : bRet = ( rValue >>= val );
644 : 0 : m_props[nHandle] = makeAny( val );
645 : 0 : break;
646 : : }
647 : : case BASERESULTSET_ESCAPE_PROCESSING:
648 : : case BASERESULTSET_IS_BOOKMARKABLE:
649 : : {
650 : : sal_Bool val;
651 : 0 : bRet = ( rValue >>= val );
652 : 0 : m_props[nHandle] = makeAny( val );
653 : : break;
654 : : }
655 : : case BASERESULTSET_FETCH_DIRECTION:
656 : : case BASERESULTSET_FETCH_SIZE:
657 : : case BASERESULTSET_RESULT_SET_CONCURRENCY:
658 : : case BASERESULTSET_RESULT_SET_TYPE:
659 : : {
660 : : sal_Int32 val;
661 : 0 : bRet = ( rValue >>= val );
662 : 0 : m_props[nHandle] = makeAny( val );
663 : : break;
664 : : }
665 : : default:
666 : : {
667 : 0 : OUStringBuffer buf(128);
668 : 0 : buf.appendAscii( "pq_resultset: Invalid property handle (" );
669 : 0 : buf.append( nHandle );
670 : 0 : buf.appendAscii( ")" );
671 : 0 : throw IllegalArgumentException( buf.makeStringAndClear(), *this, 2 );
672 : : }
673 : : }
674 : 0 : return bRet;
675 : : }
676 : :
677 : :
678 : 0 : void BaseResultSet::setFastPropertyValue_NoBroadcast(
679 : : sal_Int32 nHandle,const Any& rValue ) throw (Exception)
680 : : {
681 : 0 : m_props[nHandle] = rValue;
682 : 0 : }
683 : :
684 : 0 : void BaseResultSet::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const
685 : : {
686 : 0 : rValue = m_props[nHandle];
687 : 0 : }
688 : :
689 : 0 : Reference < XPropertySetInfo > BaseResultSet::getPropertySetInfo()
690 : : throw(RuntimeException)
691 : : {
692 : 0 : return OPropertySetHelper::createPropertySetInfo( getResultSetPropertyArrayHelper() );
693 : : }
694 : :
695 : 0 : void BaseResultSet::disposing()
696 : : {
697 : 0 : close();
698 : 0 : }
699 : :
700 : 0 : void BaseResultSet::checkColumnIndex(sal_Int32 index ) throw ( SQLException, RuntimeException )
701 : : {
702 : 0 : if( index < 1 || index > m_fieldCount )
703 : : {
704 : 0 : OUStringBuffer buf(128);
705 : 0 : buf.appendAscii( "pq_resultset: index out of range (" );
706 : 0 : buf.append( index );
707 : 0 : buf.appendAscii( ", allowed range is 1 to " );
708 : 0 : buf.append( m_fieldCount );
709 : 0 : buf.appendAscii( ")" );
710 : 0 : throw SQLException( buf.makeStringAndClear(), *this, OUString(), 1, Any() );
711 : : }
712 : :
713 : 0 : }
714 : :
715 : 0 : void BaseResultSet::checkRowIndex( sal_Bool mustBeOnValidRow )
716 : : {
717 : 0 : OUStringBuffer buf( 128 );
718 : 0 : buf.appendAscii( "pq_baseresultset: row index out of range, allowed is " );
719 : 0 : if( mustBeOnValidRow )
720 : : {
721 : 0 : if( m_row < 0 || m_row >= m_rowCount )
722 : : {
723 : 0 : buf.appendAscii( "0 to " );
724 : 0 : buf.append( ((sal_Int32)(m_rowCount -1)) );
725 : 0 : buf.appendAscii( ", got " );
726 : 0 : buf.append( m_row );
727 : 0 : throw SQLException( buf.makeStringAndClear(), *this, OUString(),1, Any() );
728 : : }
729 : : }
730 : : else
731 : : {
732 : 0 : if( m_row < -1 || m_row > m_rowCount )
733 : : {
734 : 0 : buf.appendAscii( "-1 to " );
735 : 0 : buf.append( m_rowCount );
736 : 0 : buf.appendAscii( ", got " );
737 : 0 : buf.append( m_row );
738 : 0 : throw SQLException( buf.makeStringAndClear(), *this, OUString(),1, Any() );
739 : : }
740 : 0 : }
741 : 0 : }
742 : :
743 : : }
|