Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : /**************************************************************************
22 : TODO
23 : **************************************************************************
24 :
25 : *************************************************************************/
26 : #include <cppuhelper/interfacecontainer.hxx>
27 : #include <com/sun/star/beans/PropertyAttribute.hpp>
28 : #include <ucbhelper/getcomponentcontext.hxx>
29 : #include <ucbhelper/resultset.hxx>
30 : #include <ucbhelper/resultsetmetadata.hxx>
31 :
32 : using namespace com::sun::star;
33 :
34 : //=========================================================================
35 :
36 : namespace ucbhelper_impl
37 : {
38 :
39 : struct PropertyInfo
40 : {
41 : const char* pName;
42 : sal_Int32 nHandle;
43 : sal_Int16 nAttributes;
44 : const uno::Type& (*pGetCppuType)();
45 : };
46 :
47 0 : static const uno::Type& sal_Int32_getCppuType()
48 : {
49 0 : return getCppuType( static_cast< const sal_Int32 * >( 0 ) );
50 : }
51 :
52 0 : static const uno::Type& sal_Bool_getCppuType()
53 : {
54 0 : return getCppuBooleanType();
55 : }
56 :
57 : static const PropertyInfo aPropertyTable[] =
58 : {
59 : { "IsRowCountFinal",
60 : 1000,
61 : beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY,
62 : &sal_Bool_getCppuType
63 : },
64 : { "RowCount",
65 : 1001,
66 : beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY,
67 : &sal_Int32_getCppuType
68 : },
69 : { 0,
70 : 0,
71 : 0,
72 : 0
73 : }
74 : };
75 :
76 : #define RESULTSET_PROPERTY_COUNT 2
77 :
78 : //=========================================================================
79 : //
80 : // class PropertySetInfo
81 : //
82 : //=========================================================================
83 :
84 : class PropertySetInfo :
85 : public cppu::OWeakObject,
86 : public lang::XTypeProvider,
87 : public beans::XPropertySetInfo
88 : {
89 : uno::Sequence< beans::Property >* m_pProps;
90 :
91 : private:
92 : sal_Bool queryProperty(
93 : const rtl::OUString& aName, beans::Property& rProp );
94 :
95 : public:
96 : PropertySetInfo(
97 : const PropertyInfo* pProps,
98 : sal_Int32 nProps );
99 : virtual ~PropertySetInfo();
100 :
101 : // XInterface
102 : XINTERFACE_DECL()
103 :
104 : // XTypeProvider
105 : XTYPEPROVIDER_DECL()
106 :
107 : // XPropertySetInfo
108 : virtual uno::Sequence< beans::Property > SAL_CALL getProperties()
109 : throw( uno::RuntimeException );
110 : virtual beans::Property SAL_CALL getPropertyByName(
111 : const rtl::OUString& aName )
112 : throw( beans::UnknownPropertyException, uno::RuntimeException );
113 : virtual sal_Bool SAL_CALL hasPropertyByName( const rtl::OUString& Name )
114 : throw( uno::RuntimeException );
115 : };
116 :
117 : //=========================================================================
118 : //
119 : // PropertyChangeListenerContainer.
120 : //
121 : //=========================================================================
122 :
123 : struct equalStr_Impl
124 : {
125 0 : bool operator()( const rtl::OUString& s1, const rtl::OUString& s2 ) const
126 : {
127 0 : return !!( s1 == s2 );
128 : }
129 : };
130 :
131 : struct hashStr_Impl
132 : {
133 : size_t operator()( const rtl::OUString& rName ) const
134 : {
135 : return rName.hashCode();
136 : }
137 : };
138 :
139 : typedef cppu::OMultiTypeInterfaceContainerHelperVar
140 : <
141 : rtl::OUString,
142 : hashStr_Impl,
143 : equalStr_Impl
144 : > PropertyChangeListenerContainer;
145 :
146 : //=========================================================================
147 : //
148 : // class PropertyChangeListeners.
149 : //
150 : //=========================================================================
151 :
152 0 : class PropertyChangeListeners : public PropertyChangeListenerContainer
153 : {
154 : public:
155 0 : PropertyChangeListeners( osl::Mutex& rMtx )
156 0 : : PropertyChangeListenerContainer( rMtx ) {}
157 : };
158 :
159 : } // namespace ucbhelper_impl
160 :
161 : using namespace ucbhelper_impl;
162 :
163 : namespace ucbhelper
164 : {
165 :
166 : //=========================================================================
167 : //
168 : // struct ResultSet_Impl.
169 : //
170 : //=========================================================================
171 :
172 : struct ResultSet_Impl
173 : {
174 : uno::Reference< uno::XComponentContext > m_xContext;
175 : uno::Reference< com::sun::star::ucb::XCommandEnvironment > m_xEnv;
176 : uno::Reference< beans::XPropertySetInfo > m_xPropSetInfo;
177 : uno::Reference< sdbc::XResultSetMetaData > m_xMetaData;
178 : uno::Sequence< beans::Property > m_aProperties;
179 : rtl::Reference< ResultSetDataSupplier > m_xDataSupplier;
180 : osl::Mutex m_aMutex;
181 : cppu::OInterfaceContainerHelper* m_pDisposeEventListeners;
182 : PropertyChangeListeners* m_pPropertyChangeListeners;
183 : sal_Int32 m_nPos;
184 : sal_Bool m_bWasNull;
185 : sal_Bool m_bAfterLast;
186 :
187 : inline ResultSet_Impl(
188 : const uno::Reference< uno::XComponentContext >& rxContext,
189 : const uno::Sequence< beans::Property >& rProperties,
190 : const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
191 : const uno::Reference< com::sun::star::ucb::XCommandEnvironment >&
192 : rxEnv );
193 : inline ~ResultSet_Impl();
194 : };
195 :
196 0 : inline ResultSet_Impl::ResultSet_Impl(
197 : const uno::Reference< uno::XComponentContext >& rxContext,
198 : const uno::Sequence< beans::Property >& rProperties,
199 : const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
200 : const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv )
201 : : m_xContext( rxContext ),
202 : m_xEnv( rxEnv ),
203 : m_aProperties( rProperties ),
204 : m_xDataSupplier( rDataSupplier ),
205 : m_pDisposeEventListeners( 0 ),
206 : m_pPropertyChangeListeners( 0 ),
207 : m_nPos( 0 ), // Position is one-based. Zero means: before first element.
208 : m_bWasNull( sal_False ),
209 0 : m_bAfterLast( sal_False )
210 : {
211 0 : }
212 :
213 : //=========================================================================
214 0 : inline ResultSet_Impl::~ResultSet_Impl()
215 : {
216 0 : delete m_pDisposeEventListeners;
217 0 : delete m_pPropertyChangeListeners;
218 0 : }
219 :
220 : //=========================================================================
221 : //=========================================================================
222 : //
223 : // ResultSet Implementation.
224 : //
225 : //=========================================================================
226 : //=========================================================================
227 :
228 0 : ResultSet::ResultSet(
229 : const uno::Reference< uno::XComponentContext >& rxContext,
230 : const uno::Sequence< beans::Property >& rProperties,
231 : const rtl::Reference< ResultSetDataSupplier >& rDataSupplier )
232 : : m_pImpl( new ResultSet_Impl(
233 : rxContext,
234 : rProperties,
235 : rDataSupplier,
236 0 : uno::Reference< com::sun::star::ucb::XCommandEnvironment >() ) )
237 : {
238 0 : rDataSupplier->m_pResultSet = this;
239 0 : }
240 :
241 : //=========================================================================
242 0 : ResultSet::ResultSet(
243 : const uno::Reference< uno::XComponentContext >& rxContext,
244 : const uno::Sequence< beans::Property >& rProperties,
245 : const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
246 : const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv )
247 0 : : m_pImpl( new ResultSet_Impl( rxContext, rProperties, rDataSupplier, rxEnv ) )
248 : {
249 0 : rDataSupplier->m_pResultSet = this;
250 0 : }
251 :
252 : //=========================================================================
253 : // virtual
254 0 : ResultSet::~ResultSet()
255 : {
256 0 : delete m_pImpl;
257 0 : }
258 :
259 : //=========================================================================
260 : //
261 : // XInterface methods.
262 : //
263 : //=========================================================================
264 :
265 0 : XINTERFACE_IMPL_9( ResultSet,
266 : lang::XTypeProvider,
267 : lang::XServiceInfo,
268 : lang::XComponent,
269 : com::sun::star::ucb::XContentAccess,
270 : sdbc::XResultSet,
271 : sdbc::XResultSetMetaDataSupplier,
272 : sdbc::XRow,
273 : sdbc::XCloseable,
274 : beans::XPropertySet );
275 :
276 : //=========================================================================
277 : //
278 : // XTypeProvider methods.
279 : //
280 : //=========================================================================
281 :
282 0 : XTYPEPROVIDER_IMPL_9( ResultSet,
283 : lang::XTypeProvider,
284 : lang::XServiceInfo,
285 : lang::XComponent,
286 : com::sun::star::ucb::XContentAccess,
287 : sdbc::XResultSet,
288 : sdbc::XResultSetMetaDataSupplier,
289 : sdbc::XRow,
290 : sdbc::XCloseable,
291 : beans::XPropertySet );
292 :
293 : //=========================================================================
294 : //
295 : // XServiceInfo methods.
296 : //
297 : //=========================================================================
298 :
299 0 : XSERVICEINFO_NOFACTORY_IMPL_1( ResultSet,
300 : rtl::OUString("ResultSet"),
301 : rtl::OUString(RESULTSET_SERVICE_NAME ) );
302 :
303 : //=========================================================================
304 : //
305 : // XComponent methods.
306 : //
307 : //=========================================================================
308 :
309 : // virtual
310 0 : void SAL_CALL ResultSet::dispose()
311 : throw( uno::RuntimeException )
312 : {
313 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
314 :
315 0 : if ( m_pImpl->m_pDisposeEventListeners &&
316 0 : m_pImpl->m_pDisposeEventListeners->getLength() )
317 : {
318 0 : lang::EventObject aEvt;
319 0 : aEvt.Source = static_cast< lang::XComponent * >( this );
320 0 : m_pImpl->m_pDisposeEventListeners->disposeAndClear( aEvt );
321 : }
322 :
323 0 : if ( m_pImpl->m_pPropertyChangeListeners )
324 : {
325 0 : lang::EventObject aEvt;
326 0 : aEvt.Source = static_cast< beans::XPropertySet * >( this );
327 0 : m_pImpl->m_pPropertyChangeListeners->disposeAndClear( aEvt );
328 : }
329 :
330 0 : m_pImpl->m_xDataSupplier->close();
331 0 : }
332 :
333 : //=========================================================================
334 : // virtual
335 0 : void SAL_CALL ResultSet::addEventListener(
336 : const uno::Reference< lang::XEventListener >& Listener )
337 : throw( uno::RuntimeException )
338 : {
339 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
340 :
341 0 : if ( !m_pImpl->m_pDisposeEventListeners )
342 : m_pImpl->m_pDisposeEventListeners =
343 0 : new cppu::OInterfaceContainerHelper( m_pImpl->m_aMutex );
344 :
345 0 : m_pImpl->m_pDisposeEventListeners->addInterface( Listener );
346 0 : }
347 :
348 : //=========================================================================
349 : // virtual
350 0 : void SAL_CALL ResultSet::removeEventListener(
351 : const uno::Reference< lang::XEventListener >& Listener )
352 : throw( uno::RuntimeException )
353 : {
354 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
355 :
356 0 : if ( m_pImpl->m_pDisposeEventListeners )
357 0 : m_pImpl->m_pDisposeEventListeners->removeInterface( Listener );
358 0 : }
359 :
360 : //=========================================================================
361 : //
362 : // XResultSetMetaDataSupplier methods.
363 : //
364 : //=========================================================================
365 :
366 : // virtual
367 0 : uno::Reference< sdbc::XResultSetMetaData > SAL_CALL ResultSet::getMetaData()
368 : throw( sdbc::SQLException, uno::RuntimeException )
369 : {
370 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
371 :
372 0 : if ( !m_pImpl->m_xMetaData.is() )
373 : m_pImpl->m_xMetaData = new ResultSetMetaData( m_pImpl->m_xContext,
374 0 : m_pImpl->m_aProperties );
375 :
376 0 : return m_pImpl->m_xMetaData;
377 : }
378 :
379 : //=========================================================================
380 : //
381 : // XResultSet methods.
382 : //
383 : //=========================================================================
384 :
385 : // virtual
386 0 : sal_Bool SAL_CALL ResultSet::next()
387 : throw( sdbc::SQLException, uno::RuntimeException )
388 : {
389 : // Note: Cursor is initially positioned before the first row.
390 : // First call to 'next()' moves it to first row.
391 :
392 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
393 :
394 0 : if ( m_pImpl->m_bAfterLast )
395 : {
396 0 : m_pImpl->m_xDataSupplier->validate();
397 0 : return sal_False;
398 : }
399 :
400 : // getResult works zero-based!
401 0 : if ( !m_pImpl->m_xDataSupplier->getResult( m_pImpl->m_nPos ) )
402 : {
403 0 : m_pImpl->m_bAfterLast = sal_True;
404 0 : m_pImpl->m_xDataSupplier->validate();
405 0 : return sal_False;
406 : }
407 :
408 0 : m_pImpl->m_nPos++;
409 0 : m_pImpl->m_xDataSupplier->validate();
410 0 : return sal_True;
411 : }
412 :
413 : //=========================================================================
414 : // virtual
415 0 : sal_Bool SAL_CALL ResultSet::isBeforeFirst()
416 : throw( sdbc::SQLException, uno::RuntimeException )
417 : {
418 0 : if ( m_pImpl->m_bAfterLast )
419 : {
420 0 : m_pImpl->m_xDataSupplier->validate();
421 0 : return sal_False;
422 : }
423 :
424 : // getResult works zero-based!
425 0 : if ( !m_pImpl->m_xDataSupplier->getResult( 0 ) )
426 : {
427 0 : m_pImpl->m_xDataSupplier->validate();
428 0 : return sal_False;
429 : }
430 :
431 0 : m_pImpl->m_xDataSupplier->validate();
432 0 : return ( m_pImpl->m_nPos == 0 );
433 : }
434 :
435 : //=========================================================================
436 : // virtual
437 0 : sal_Bool SAL_CALL ResultSet::isAfterLast()
438 : throw( sdbc::SQLException, uno::RuntimeException )
439 : {
440 0 : m_pImpl->m_xDataSupplier->validate();
441 0 : return m_pImpl->m_bAfterLast;
442 : }
443 :
444 : //=========================================================================
445 : // virtual
446 0 : sal_Bool SAL_CALL ResultSet::isFirst()
447 : throw( sdbc::SQLException, uno::RuntimeException )
448 : {
449 0 : if ( m_pImpl->m_bAfterLast )
450 : {
451 0 : m_pImpl->m_xDataSupplier->validate();
452 0 : return sal_False;
453 : }
454 :
455 0 : m_pImpl->m_xDataSupplier->validate();
456 0 : return ( m_pImpl->m_nPos == 1 );
457 : }
458 :
459 : //=========================================================================
460 : // virtual
461 0 : sal_Bool SAL_CALL ResultSet::isLast()
462 : throw( sdbc::SQLException, uno::RuntimeException )
463 : {
464 0 : if ( m_pImpl->m_bAfterLast )
465 : {
466 0 : m_pImpl->m_xDataSupplier->validate();
467 0 : return sal_False;
468 : }
469 :
470 0 : sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
471 0 : if ( !nCount )
472 : {
473 0 : m_pImpl->m_xDataSupplier->validate();
474 0 : return sal_False;
475 : }
476 :
477 0 : m_pImpl->m_xDataSupplier->validate();
478 0 : return ( m_pImpl->m_nPos == nCount );
479 : }
480 :
481 : //=========================================================================
482 : // virtual
483 0 : void SAL_CALL ResultSet::beforeFirst()
484 : throw( sdbc::SQLException, uno::RuntimeException )
485 : {
486 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
487 0 : m_pImpl->m_bAfterLast = sal_False;
488 0 : m_pImpl->m_nPos = 0;
489 0 : m_pImpl->m_xDataSupplier->validate();
490 0 : }
491 :
492 : //=========================================================================
493 : // virtual
494 0 : void SAL_CALL ResultSet::afterLast()
495 : throw( sdbc::SQLException, uno::RuntimeException )
496 : {
497 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
498 0 : m_pImpl->m_bAfterLast = sal_True;
499 0 : m_pImpl->m_xDataSupplier->validate();
500 0 : }
501 :
502 : //=========================================================================
503 : // virtual
504 0 : sal_Bool SAL_CALL ResultSet::first()
505 : throw( sdbc::SQLException, uno::RuntimeException )
506 : {
507 : // getResult works zero-based!
508 0 : if ( m_pImpl->m_xDataSupplier->getResult( 0 ) )
509 : {
510 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
511 0 : m_pImpl->m_bAfterLast = sal_False;
512 0 : m_pImpl->m_nPos = 1;
513 0 : m_pImpl->m_xDataSupplier->validate();
514 0 : return sal_True;
515 : }
516 :
517 0 : m_pImpl->m_xDataSupplier->validate();
518 0 : return sal_False;
519 : }
520 :
521 : //=========================================================================
522 : // virtual
523 0 : sal_Bool SAL_CALL ResultSet::last()
524 : throw( sdbc::SQLException, uno::RuntimeException )
525 : {
526 0 : sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
527 0 : if ( nCount )
528 : {
529 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
530 0 : m_pImpl->m_bAfterLast = sal_False;
531 0 : m_pImpl->m_nPos = nCount;
532 0 : m_pImpl->m_xDataSupplier->validate();
533 0 : return sal_True;
534 : }
535 :
536 0 : m_pImpl->m_xDataSupplier->validate();
537 0 : return sal_False;
538 : }
539 :
540 : //=========================================================================
541 : // virtual
542 0 : sal_Int32 SAL_CALL ResultSet::getRow()
543 : throw( sdbc::SQLException, uno::RuntimeException )
544 : {
545 0 : if ( m_pImpl->m_bAfterLast )
546 : {
547 0 : m_pImpl->m_xDataSupplier->validate();
548 0 : return 0;
549 : }
550 :
551 0 : m_pImpl->m_xDataSupplier->validate();
552 0 : return m_pImpl->m_nPos;
553 : }
554 :
555 : //=========================================================================
556 : // virtual
557 0 : sal_Bool SAL_CALL ResultSet::absolute( sal_Int32 row )
558 : throw( sdbc::SQLException, uno::RuntimeException )
559 : {
560 : /*
561 : If the row number is positive, the cursor moves to the given row number
562 : with respect to the beginning of the result set. The first row is row 1,
563 : the second is row 2, and so on.
564 :
565 : If the given row number is negative, the cursor moves to an absolute row
566 : position with respect to the end of the result set. For example, calling
567 : absolaute( -1 ) positions the cursor on the last row, absolaute( -2 )
568 : indicates the next-to-last row, and so on.
569 :
570 : An attempt to position the cursor beyond the first/last row in the result
571 : set leaves the cursor before/after the first/last row, respectively.
572 :
573 : Calling absolute( 1 ) is the same as calling first().
574 :
575 : Calling absolute( -1 ) is the same as calling last().
576 : */
577 0 : if ( row < 0 )
578 : {
579 0 : sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
580 :
581 0 : if ( ( row * -1 ) > nCount )
582 : {
583 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
584 0 : m_pImpl->m_bAfterLast = sal_False;
585 0 : m_pImpl->m_nPos = 0;
586 0 : m_pImpl->m_xDataSupplier->validate();
587 0 : return sal_False;
588 : }
589 : else // |row| <= nCount
590 : {
591 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
592 0 : m_pImpl->m_bAfterLast = sal_False;
593 0 : m_pImpl->m_nPos = ( nCount + row + 1 );
594 0 : m_pImpl->m_xDataSupplier->validate();
595 0 : return sal_True;
596 : }
597 : }
598 0 : else if ( row == 0 )
599 : {
600 : // @throws SQLException
601 : // ... if row is 0 ...
602 0 : throw sdbc::SQLException();
603 : }
604 : else // row > 0
605 : {
606 0 : sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
607 :
608 0 : if ( row <= nCount )
609 : {
610 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
611 0 : m_pImpl->m_bAfterLast = sal_False;
612 0 : m_pImpl->m_nPos = row;
613 0 : m_pImpl->m_xDataSupplier->validate();
614 0 : return sal_True;
615 : }
616 : else // row > nCount
617 : {
618 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
619 0 : m_pImpl->m_bAfterLast = sal_True;
620 0 : m_pImpl->m_xDataSupplier->validate();
621 0 : return sal_False;
622 : }
623 : }
624 :
625 : // unreachable...
626 : }
627 :
628 : //=========================================================================
629 : // virtual
630 0 : sal_Bool SAL_CALL ResultSet::relative( sal_Int32 rows )
631 : throw( sdbc::SQLException, uno::RuntimeException )
632 : {
633 : /*
634 : Attempting to move beyond the first/last row in the result set
635 : positions the cursor before/after the the first/last row.
636 :
637 : Calling relative( 0 ) is valid, but does not change the cursor position.
638 :
639 : Calling relative( 1 ) is different from calling next() because it makes
640 : sense to call next() when there is no current row, for example, when
641 : the cursor is positioned before the first row or after the last row of
642 : the result set.
643 : */
644 0 : if ( m_pImpl->m_bAfterLast || ( m_pImpl->m_nPos == 0 ) )
645 : {
646 : // "No current row".
647 0 : throw sdbc::SQLException();
648 : }
649 :
650 0 : if ( rows < 0 )
651 : {
652 0 : if ( ( m_pImpl->m_nPos + rows ) > 0 )
653 : {
654 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
655 0 : m_pImpl->m_bAfterLast = sal_False;
656 0 : m_pImpl->m_nPos = ( m_pImpl->m_nPos + rows );
657 0 : m_pImpl->m_xDataSupplier->validate();
658 0 : return sal_True;
659 : }
660 : else
661 : {
662 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
663 0 : m_pImpl->m_bAfterLast = sal_False;
664 0 : m_pImpl->m_nPos = 0;
665 0 : m_pImpl->m_xDataSupplier->validate();
666 0 : return sal_False;
667 : }
668 : }
669 0 : else if ( rows == 0 )
670 : {
671 : // nop.
672 0 : m_pImpl->m_xDataSupplier->validate();
673 0 : return sal_True;
674 : }
675 : else // rows > 0
676 : {
677 0 : sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
678 0 : if ( ( m_pImpl->m_nPos + rows ) <= nCount )
679 : {
680 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
681 0 : m_pImpl->m_bAfterLast = sal_False;
682 0 : m_pImpl->m_nPos = ( m_pImpl->m_nPos + rows );
683 0 : m_pImpl->m_xDataSupplier->validate();
684 0 : return sal_True;
685 : }
686 : else
687 : {
688 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
689 0 : m_pImpl->m_bAfterLast = sal_True;
690 0 : m_pImpl->m_xDataSupplier->validate();
691 0 : return sal_False;
692 : }
693 : }
694 :
695 : // unreachable...
696 : }
697 :
698 : //=========================================================================
699 : // virtual
700 0 : sal_Bool SAL_CALL ResultSet::previous()
701 : throw( sdbc::SQLException, uno::RuntimeException )
702 : {
703 : /*
704 : previous() is not the same as relative( -1 ) because it makes sense
705 : to call previous() when there is no current row.
706 : */
707 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
708 :
709 0 : if ( m_pImpl->m_bAfterLast )
710 : {
711 0 : m_pImpl->m_bAfterLast = sal_False;
712 0 : sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
713 0 : m_pImpl->m_nPos = nCount;
714 : }
715 0 : else if ( m_pImpl->m_nPos )
716 0 : m_pImpl->m_nPos--;
717 :
718 0 : if ( m_pImpl->m_nPos )
719 : {
720 0 : m_pImpl->m_xDataSupplier->validate();
721 0 : return sal_True;
722 : }
723 :
724 0 : m_pImpl->m_xDataSupplier->validate();
725 0 : return sal_False;
726 : }
727 :
728 : //=========================================================================
729 : // virtual
730 0 : void SAL_CALL ResultSet::refreshRow()
731 : throw( sdbc::SQLException, uno::RuntimeException )
732 : {
733 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
734 0 : if ( m_pImpl->m_bAfterLast || ( m_pImpl->m_nPos == 0 ) )
735 0 : return;
736 :
737 0 : m_pImpl->m_xDataSupplier->releasePropertyValues( m_pImpl->m_nPos );
738 0 : m_pImpl->m_xDataSupplier->validate();
739 : }
740 :
741 : //=========================================================================
742 : // virtual
743 0 : sal_Bool SAL_CALL ResultSet::rowUpdated()
744 : throw( sdbc::SQLException, uno::RuntimeException )
745 : {
746 0 : m_pImpl->m_xDataSupplier->validate();
747 0 : return sal_False;
748 : }
749 :
750 : //=========================================================================
751 : // virtual
752 0 : sal_Bool SAL_CALL ResultSet::rowInserted()
753 : throw( sdbc::SQLException, uno::RuntimeException )
754 : {
755 0 : m_pImpl->m_xDataSupplier->validate();
756 0 : return sal_False;
757 : }
758 :
759 : //=========================================================================
760 : // virtual
761 0 : sal_Bool SAL_CALL ResultSet::rowDeleted()
762 : throw( sdbc::SQLException, uno::RuntimeException )
763 : {
764 0 : m_pImpl->m_xDataSupplier->validate();
765 0 : return sal_False;
766 : }
767 :
768 : //=========================================================================
769 : // virtual
770 0 : uno::Reference< uno::XInterface > SAL_CALL ResultSet::getStatement()
771 : throw( sdbc::SQLException, uno::RuntimeException )
772 : {
773 : /*
774 : returns the Statement that produced this ResultSet object. If the
775 : result set was generated some other way, ... this method returns null.
776 : */
777 0 : m_pImpl->m_xDataSupplier->validate();
778 0 : return uno::Reference< uno::XInterface >();
779 : }
780 :
781 : //=========================================================================
782 : //
783 : // XRow methods.
784 : //
785 : //=========================================================================
786 :
787 : // virtual
788 0 : sal_Bool SAL_CALL ResultSet::wasNull()
789 : throw( sdbc::SQLException, uno::RuntimeException )
790 : {
791 : // This method can not be implemented correctly!!! Imagine different
792 : // threads doing a getXYZ - wasNull calling sequence on the same
793 : // implementation object...
794 :
795 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
796 : {
797 : uno::Reference< sdbc::XRow > xValues
798 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
799 0 : m_pImpl->m_nPos - 1 );
800 0 : if ( xValues.is() )
801 : {
802 0 : m_pImpl->m_xDataSupplier->validate();
803 0 : return xValues->wasNull();
804 0 : }
805 : }
806 :
807 0 : m_pImpl->m_xDataSupplier->validate();
808 0 : return m_pImpl->m_bWasNull;
809 : }
810 :
811 : //=========================================================================
812 : // virtual
813 0 : rtl::OUString SAL_CALL ResultSet::getString( sal_Int32 columnIndex )
814 : throw( sdbc::SQLException, uno::RuntimeException )
815 : {
816 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
817 : {
818 : uno::Reference< sdbc::XRow > xValues
819 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
820 0 : m_pImpl->m_nPos - 1 );
821 0 : if ( xValues.is() )
822 : {
823 0 : m_pImpl->m_bWasNull = sal_False;
824 0 : m_pImpl->m_xDataSupplier->validate();
825 0 : return xValues->getString( columnIndex );
826 0 : }
827 : }
828 :
829 0 : m_pImpl->m_bWasNull = sal_True;
830 0 : m_pImpl->m_xDataSupplier->validate();
831 0 : return rtl::OUString();
832 : }
833 :
834 : //=========================================================================
835 : // virtual
836 0 : sal_Bool SAL_CALL ResultSet::getBoolean( sal_Int32 columnIndex )
837 : throw( sdbc::SQLException, uno::RuntimeException )
838 : {
839 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
840 : {
841 : uno::Reference< sdbc::XRow > xValues
842 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
843 0 : m_pImpl->m_nPos - 1 );
844 0 : if ( xValues.is() )
845 : {
846 0 : m_pImpl->m_bWasNull = sal_False;
847 0 : m_pImpl->m_xDataSupplier->validate();
848 0 : return xValues->getBoolean( columnIndex );
849 0 : }
850 : }
851 :
852 0 : m_pImpl->m_bWasNull = sal_True;
853 0 : m_pImpl->m_xDataSupplier->validate();
854 0 : return sal_False;
855 : }
856 :
857 : //=========================================================================
858 : // virtual
859 0 : sal_Int8 SAL_CALL ResultSet::getByte( sal_Int32 columnIndex )
860 : throw( sdbc::SQLException, uno::RuntimeException )
861 : {
862 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
863 : {
864 : uno::Reference< sdbc::XRow > xValues
865 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
866 0 : m_pImpl->m_nPos - 1 );
867 0 : if ( xValues.is() )
868 : {
869 0 : m_pImpl->m_bWasNull = sal_False;
870 0 : m_pImpl->m_xDataSupplier->validate();
871 0 : return xValues->getByte( columnIndex );
872 0 : }
873 : }
874 :
875 0 : m_pImpl->m_bWasNull = sal_True;
876 0 : m_pImpl->m_xDataSupplier->validate();
877 0 : return 0;
878 : }
879 :
880 : //=========================================================================
881 : // virtual
882 0 : sal_Int16 SAL_CALL ResultSet::getShort( sal_Int32 columnIndex )
883 : throw( sdbc::SQLException, uno::RuntimeException )
884 : {
885 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
886 : {
887 : uno::Reference< sdbc::XRow > xValues
888 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
889 0 : m_pImpl->m_nPos - 1 );
890 0 : if ( xValues.is() )
891 : {
892 0 : m_pImpl->m_bWasNull = sal_False;
893 0 : m_pImpl->m_xDataSupplier->validate();
894 0 : return xValues->getShort( columnIndex );
895 0 : }
896 : }
897 :
898 0 : m_pImpl->m_bWasNull = sal_True;
899 0 : m_pImpl->m_xDataSupplier->validate();
900 0 : return 0;
901 : }
902 :
903 : //=========================================================================
904 : // virtual
905 0 : sal_Int32 SAL_CALL ResultSet::getInt( sal_Int32 columnIndex )
906 : throw( sdbc::SQLException, uno::RuntimeException )
907 : {
908 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
909 : {
910 : uno::Reference< sdbc::XRow > xValues
911 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
912 0 : m_pImpl->m_nPos - 1 );
913 0 : if ( xValues.is() )
914 : {
915 0 : m_pImpl->m_bWasNull = sal_False;
916 0 : m_pImpl->m_xDataSupplier->validate();
917 0 : return xValues->getInt( columnIndex );
918 0 : }
919 : }
920 :
921 0 : m_pImpl->m_bWasNull = sal_True;
922 0 : m_pImpl->m_xDataSupplier->validate();
923 0 : return 0;
924 : }
925 :
926 : //=========================================================================
927 : // virtual
928 0 : sal_Int64 SAL_CALL ResultSet::getLong( sal_Int32 columnIndex )
929 : throw( sdbc::SQLException, uno::RuntimeException )
930 : {
931 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
932 : {
933 : uno::Reference< sdbc::XRow > xValues
934 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
935 0 : m_pImpl->m_nPos - 1 );
936 0 : if ( xValues.is() )
937 : {
938 0 : m_pImpl->m_bWasNull = sal_False;
939 0 : m_pImpl->m_xDataSupplier->validate();
940 0 : return xValues->getLong( columnIndex );
941 0 : }
942 : }
943 :
944 0 : m_pImpl->m_bWasNull = sal_True;
945 0 : m_pImpl->m_xDataSupplier->validate();
946 0 : return 0;
947 : }
948 :
949 : //=========================================================================
950 : // virtual
951 0 : float SAL_CALL ResultSet::getFloat( sal_Int32 columnIndex )
952 : throw( sdbc::SQLException, uno::RuntimeException )
953 : {
954 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
955 : {
956 : uno::Reference< sdbc::XRow > xValues
957 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
958 0 : m_pImpl->m_nPos - 1 );
959 0 : if ( xValues.is() )
960 : {
961 0 : m_pImpl->m_bWasNull = sal_False;
962 0 : m_pImpl->m_xDataSupplier->validate();
963 0 : return xValues->getFloat( columnIndex );
964 0 : }
965 : }
966 :
967 0 : m_pImpl->m_bWasNull = sal_True;
968 0 : m_pImpl->m_xDataSupplier->validate();
969 0 : return 0;
970 : }
971 :
972 : //=========================================================================
973 : // virtual
974 0 : double SAL_CALL ResultSet::getDouble( sal_Int32 columnIndex )
975 : throw( sdbc::SQLException, uno::RuntimeException )
976 : {
977 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
978 : {
979 : uno::Reference< sdbc::XRow > xValues
980 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
981 0 : m_pImpl->m_nPos - 1 );
982 0 : if ( xValues.is() )
983 : {
984 0 : m_pImpl->m_bWasNull = sal_False;
985 0 : m_pImpl->m_xDataSupplier->validate();
986 0 : return xValues->getDouble( columnIndex );
987 0 : }
988 : }
989 :
990 0 : m_pImpl->m_bWasNull = sal_True;
991 0 : m_pImpl->m_xDataSupplier->validate();
992 0 : return 0;
993 : }
994 :
995 : //=========================================================================
996 : // virtual
997 : uno::Sequence< sal_Int8 > SAL_CALL
998 0 : ResultSet::getBytes( sal_Int32 columnIndex )
999 : throw( sdbc::SQLException, uno::RuntimeException )
1000 : {
1001 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1002 : {
1003 : uno::Reference< sdbc::XRow > xValues
1004 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1005 0 : m_pImpl->m_nPos - 1 );
1006 0 : if ( xValues.is() )
1007 : {
1008 0 : m_pImpl->m_bWasNull = sal_False;
1009 0 : m_pImpl->m_xDataSupplier->validate();
1010 0 : return xValues->getBytes( columnIndex );
1011 0 : }
1012 : }
1013 :
1014 0 : m_pImpl->m_bWasNull = sal_True;
1015 0 : m_pImpl->m_xDataSupplier->validate();
1016 0 : return uno::Sequence< sal_Int8 >();
1017 : }
1018 :
1019 : //=========================================================================
1020 : // virtual
1021 0 : util::Date SAL_CALL ResultSet::getDate( sal_Int32 columnIndex )
1022 : throw( sdbc::SQLException, uno::RuntimeException )
1023 : {
1024 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1025 : {
1026 : uno::Reference< sdbc::XRow > xValues
1027 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1028 0 : m_pImpl->m_nPos - 1 );
1029 0 : if ( xValues.is() )
1030 : {
1031 0 : m_pImpl->m_bWasNull = sal_False;
1032 0 : m_pImpl->m_xDataSupplier->validate();
1033 0 : return xValues->getDate( columnIndex );
1034 0 : }
1035 : }
1036 :
1037 0 : m_pImpl->m_bWasNull = sal_True;
1038 0 : m_pImpl->m_xDataSupplier->validate();
1039 0 : return util::Date();
1040 : }
1041 :
1042 : //=========================================================================
1043 : // virtual
1044 0 : util::Time SAL_CALL ResultSet::getTime( sal_Int32 columnIndex )
1045 : throw( sdbc::SQLException, uno::RuntimeException )
1046 : {
1047 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1048 : {
1049 : uno::Reference< sdbc::XRow > xValues
1050 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1051 0 : m_pImpl->m_nPos - 1 );
1052 0 : if ( xValues.is() )
1053 : {
1054 0 : m_pImpl->m_bWasNull = sal_False;
1055 0 : m_pImpl->m_xDataSupplier->validate();
1056 0 : return xValues->getTime( columnIndex );
1057 0 : }
1058 : }
1059 :
1060 0 : m_pImpl->m_bWasNull = sal_True;
1061 0 : m_pImpl->m_xDataSupplier->validate();
1062 0 : return util::Time();
1063 : }
1064 :
1065 : //=========================================================================
1066 : // virtual
1067 : util::DateTime SAL_CALL
1068 0 : ResultSet::getTimestamp( sal_Int32 columnIndex )
1069 : throw( sdbc::SQLException, uno::RuntimeException )
1070 : {
1071 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1072 : {
1073 : uno::Reference< sdbc::XRow > xValues
1074 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1075 0 : m_pImpl->m_nPos - 1 );
1076 0 : if ( xValues.is() )
1077 : {
1078 0 : m_pImpl->m_bWasNull = sal_False;
1079 0 : m_pImpl->m_xDataSupplier->validate();
1080 0 : return xValues->getTimestamp( columnIndex );
1081 0 : }
1082 : }
1083 :
1084 0 : m_pImpl->m_bWasNull = sal_True;
1085 0 : m_pImpl->m_xDataSupplier->validate();
1086 0 : return util::DateTime();
1087 : }
1088 :
1089 : //=========================================================================
1090 : // virtual
1091 : uno::Reference< io::XInputStream > SAL_CALL
1092 0 : ResultSet::getBinaryStream( sal_Int32 columnIndex )
1093 : throw( sdbc::SQLException, uno::RuntimeException )
1094 : {
1095 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1096 : {
1097 : uno::Reference< sdbc::XRow > xValues
1098 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1099 0 : m_pImpl->m_nPos - 1 );
1100 0 : if ( xValues.is() )
1101 : {
1102 0 : m_pImpl->m_bWasNull = sal_False;
1103 0 : m_pImpl->m_xDataSupplier->validate();
1104 0 : return xValues->getBinaryStream( columnIndex );
1105 0 : }
1106 : }
1107 :
1108 0 : m_pImpl->m_bWasNull = sal_True;
1109 0 : m_pImpl->m_xDataSupplier->validate();
1110 0 : return uno::Reference< io::XInputStream >();
1111 : }
1112 :
1113 : //=========================================================================
1114 : // virtual
1115 : uno::Reference< io::XInputStream > SAL_CALL
1116 0 : ResultSet::getCharacterStream( sal_Int32 columnIndex )
1117 : throw( sdbc::SQLException, uno::RuntimeException )
1118 : {
1119 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1120 : {
1121 : uno::Reference< sdbc::XRow > xValues
1122 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1123 0 : m_pImpl->m_nPos - 1 );
1124 0 : if ( xValues.is() )
1125 : {
1126 0 : m_pImpl->m_bWasNull = sal_False;
1127 0 : m_pImpl->m_xDataSupplier->validate();
1128 0 : return xValues->getCharacterStream( columnIndex );
1129 0 : }
1130 : }
1131 :
1132 0 : m_pImpl->m_bWasNull = sal_True;
1133 0 : m_pImpl->m_xDataSupplier->validate();
1134 0 : return uno::Reference< io::XInputStream >();
1135 : }
1136 :
1137 : //=========================================================================
1138 : // virtual
1139 0 : uno::Any SAL_CALL ResultSet::getObject(
1140 : sal_Int32 columnIndex,
1141 : const uno::Reference< container::XNameAccess >& typeMap )
1142 : throw( sdbc::SQLException, uno::RuntimeException )
1143 : {
1144 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1145 : {
1146 : uno::Reference< sdbc::XRow > xValues
1147 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1148 0 : m_pImpl->m_nPos - 1 );
1149 0 : if ( xValues.is() )
1150 : {
1151 0 : m_pImpl->m_bWasNull = sal_False;
1152 0 : m_pImpl->m_xDataSupplier->validate();
1153 0 : return xValues->getObject( columnIndex, typeMap );
1154 0 : }
1155 : }
1156 :
1157 0 : m_pImpl->m_bWasNull = sal_True;
1158 0 : m_pImpl->m_xDataSupplier->validate();
1159 0 : return uno::Any();
1160 : }
1161 :
1162 : //=========================================================================
1163 : // virtual
1164 : uno::Reference< sdbc::XRef > SAL_CALL
1165 0 : ResultSet::getRef( sal_Int32 columnIndex )
1166 : throw( sdbc::SQLException, uno::RuntimeException )
1167 : {
1168 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1169 : {
1170 : uno::Reference< sdbc::XRow > xValues
1171 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1172 0 : m_pImpl->m_nPos - 1 );
1173 0 : if ( xValues.is() )
1174 : {
1175 0 : m_pImpl->m_bWasNull = sal_False;
1176 0 : m_pImpl->m_xDataSupplier->validate();
1177 0 : return xValues->getRef( columnIndex );
1178 0 : }
1179 : }
1180 :
1181 0 : m_pImpl->m_bWasNull = sal_True;
1182 0 : m_pImpl->m_xDataSupplier->validate();
1183 0 : return uno::Reference< sdbc::XRef >();
1184 : }
1185 :
1186 : //=========================================================================
1187 : // virtual
1188 : uno::Reference< sdbc::XBlob > SAL_CALL
1189 0 : ResultSet::getBlob( sal_Int32 columnIndex )
1190 : throw( sdbc::SQLException, uno::RuntimeException )
1191 : {
1192 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1193 : {
1194 : uno::Reference< sdbc::XRow > xValues
1195 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1196 0 : m_pImpl->m_nPos - 1 );
1197 0 : if ( xValues.is() )
1198 : {
1199 0 : m_pImpl->m_bWasNull = sal_False;
1200 0 : m_pImpl->m_xDataSupplier->validate();
1201 0 : return xValues->getBlob( columnIndex );
1202 0 : }
1203 : }
1204 :
1205 0 : m_pImpl->m_bWasNull = sal_True;
1206 0 : m_pImpl->m_xDataSupplier->validate();
1207 0 : return uno::Reference< sdbc::XBlob >();
1208 : }
1209 :
1210 : //=========================================================================
1211 : // virtual
1212 : uno::Reference< sdbc::XClob > SAL_CALL
1213 0 : ResultSet::getClob( sal_Int32 columnIndex )
1214 : throw( sdbc::SQLException, uno::RuntimeException )
1215 : {
1216 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1217 : {
1218 : uno::Reference< sdbc::XRow > xValues
1219 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1220 0 : m_pImpl->m_nPos - 1 );
1221 0 : if ( xValues.is() )
1222 : {
1223 0 : m_pImpl->m_bWasNull = sal_False;
1224 0 : m_pImpl->m_xDataSupplier->validate();
1225 0 : return xValues->getClob( columnIndex );
1226 0 : }
1227 : }
1228 :
1229 0 : m_pImpl->m_bWasNull = sal_True;
1230 0 : m_pImpl->m_xDataSupplier->validate();
1231 0 : return uno::Reference< sdbc::XClob >();
1232 : }
1233 :
1234 : //=========================================================================
1235 : // virtual
1236 : uno::Reference< sdbc::XArray > SAL_CALL
1237 0 : ResultSet::getArray( sal_Int32 columnIndex )
1238 : throw( sdbc::SQLException, uno::RuntimeException )
1239 : {
1240 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1241 : {
1242 : uno::Reference< sdbc::XRow > xValues
1243 0 : = m_pImpl->m_xDataSupplier->queryPropertyValues(
1244 0 : m_pImpl->m_nPos - 1 );
1245 0 : if ( xValues.is() )
1246 : {
1247 0 : m_pImpl->m_bWasNull = sal_False;
1248 0 : m_pImpl->m_xDataSupplier->validate();
1249 0 : return xValues->getArray( columnIndex );
1250 0 : }
1251 : }
1252 :
1253 0 : m_pImpl->m_bWasNull = sal_True;
1254 0 : m_pImpl->m_xDataSupplier->validate();
1255 0 : return uno::Reference< sdbc::XArray >();
1256 : }
1257 :
1258 : //=========================================================================
1259 : //
1260 : // XCloseable methods.
1261 : //
1262 : //=========================================================================
1263 :
1264 : // virtual
1265 0 : void SAL_CALL ResultSet::close()
1266 : throw( sdbc::SQLException, uno::RuntimeException )
1267 : {
1268 0 : m_pImpl->m_xDataSupplier->close();
1269 0 : m_pImpl->m_xDataSupplier->validate();
1270 0 : }
1271 :
1272 : //=========================================================================
1273 : //
1274 : // XContentAccess methods.
1275 : //
1276 : //=========================================================================
1277 :
1278 : // virtual
1279 0 : rtl::OUString SAL_CALL ResultSet::queryContentIdentifierString()
1280 : throw( uno::RuntimeException )
1281 : {
1282 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1283 0 : return m_pImpl->m_xDataSupplier->queryContentIdentifierString(
1284 0 : m_pImpl->m_nPos - 1 );
1285 :
1286 0 : return rtl::OUString();
1287 : }
1288 :
1289 : //=========================================================================
1290 : // virtual
1291 : uno::Reference< com::sun::star::ucb::XContentIdentifier > SAL_CALL
1292 0 : ResultSet::queryContentIdentifier()
1293 : throw( uno::RuntimeException )
1294 : {
1295 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1296 0 : return m_pImpl->m_xDataSupplier->queryContentIdentifier(
1297 0 : m_pImpl->m_nPos - 1 );
1298 :
1299 0 : return uno::Reference< com::sun::star::ucb::XContentIdentifier >();
1300 : }
1301 :
1302 : //=========================================================================
1303 : // virtual
1304 : uno::Reference< com::sun::star::ucb::XContent > SAL_CALL
1305 0 : ResultSet::queryContent()
1306 : throw( uno::RuntimeException )
1307 : {
1308 0 : if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1309 0 : return m_pImpl->m_xDataSupplier->queryContent( m_pImpl->m_nPos - 1 );
1310 :
1311 0 : return uno::Reference< com::sun::star::ucb::XContent >();
1312 : }
1313 :
1314 : //=========================================================================
1315 : //
1316 : // XPropertySet methods.
1317 : //
1318 : //=========================================================================
1319 :
1320 : // virtual
1321 : uno::Reference< beans::XPropertySetInfo > SAL_CALL
1322 0 : ResultSet::getPropertySetInfo()
1323 : throw( uno::RuntimeException )
1324 : {
1325 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
1326 :
1327 0 : if ( !m_pImpl->m_xPropSetInfo.is() )
1328 : m_pImpl->m_xPropSetInfo
1329 : = new PropertySetInfo( aPropertyTable,
1330 0 : RESULTSET_PROPERTY_COUNT );
1331 0 : return m_pImpl->m_xPropSetInfo;
1332 : }
1333 :
1334 : //=========================================================================
1335 : // virtual
1336 0 : void SAL_CALL ResultSet::setPropertyValue( const rtl::OUString& aPropertyName,
1337 : const uno::Any& )
1338 : throw( beans::UnknownPropertyException,
1339 : beans::PropertyVetoException,
1340 : lang::IllegalArgumentException,
1341 : lang::WrappedTargetException,
1342 : uno::RuntimeException )
1343 : {
1344 0 : if ( aPropertyName.isEmpty() )
1345 0 : throw beans::UnknownPropertyException();
1346 :
1347 0 : if ( aPropertyName.equals(
1348 0 : rtl::OUString("RowCount") ) )
1349 : {
1350 : // property is read-only.
1351 0 : throw lang::IllegalArgumentException();
1352 : }
1353 0 : else if ( aPropertyName.equals(
1354 0 : rtl::OUString("IsRowCountFinal") ) )
1355 : {
1356 : // property is read-only.
1357 0 : throw lang::IllegalArgumentException();
1358 : }
1359 : else
1360 : {
1361 0 : throw beans::UnknownPropertyException();
1362 : }
1363 : }
1364 :
1365 : //=========================================================================
1366 : // virtual
1367 0 : uno::Any SAL_CALL ResultSet::getPropertyValue(
1368 : const rtl::OUString& PropertyName )
1369 : throw( beans::UnknownPropertyException,
1370 : lang::WrappedTargetException,
1371 : uno::RuntimeException )
1372 : {
1373 0 : if ( PropertyName.isEmpty() )
1374 0 : throw beans::UnknownPropertyException();
1375 :
1376 0 : uno::Any aValue;
1377 :
1378 0 : if ( PropertyName.equals(
1379 0 : rtl::OUString("RowCount") ) )
1380 : {
1381 0 : aValue <<= m_pImpl->m_xDataSupplier->currentCount();
1382 : }
1383 0 : else if ( PropertyName.equals(
1384 0 : rtl::OUString("IsRowCountFinal") ) )
1385 : {
1386 0 : aValue <<= m_pImpl->m_xDataSupplier->isCountFinal();
1387 : }
1388 : else
1389 : {
1390 0 : throw beans::UnknownPropertyException();
1391 : }
1392 :
1393 0 : return aValue;
1394 : }
1395 :
1396 : //=========================================================================
1397 : // virtual
1398 0 : void SAL_CALL ResultSet::addPropertyChangeListener(
1399 : const rtl::OUString& aPropertyName,
1400 : const uno::Reference< beans::XPropertyChangeListener >& xListener )
1401 : throw( beans::UnknownPropertyException,
1402 : lang::WrappedTargetException,
1403 : uno::RuntimeException )
1404 : {
1405 : // Note: An empty property name means a listener for "all" properties.
1406 :
1407 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
1408 :
1409 0 : if ( !aPropertyName.isEmpty() &&
1410 : !aPropertyName.equals(
1411 0 : rtl::OUString("RowCount") ) &&
1412 : !aPropertyName.equals(
1413 0 : rtl::OUString("IsRowCountFinal") ) )
1414 0 : throw beans::UnknownPropertyException();
1415 :
1416 0 : if ( !m_pImpl->m_pPropertyChangeListeners )
1417 : m_pImpl->m_pPropertyChangeListeners
1418 0 : = new PropertyChangeListeners( m_pImpl->m_aMutex );
1419 :
1420 : m_pImpl->m_pPropertyChangeListeners->addInterface(
1421 0 : aPropertyName, xListener );
1422 0 : }
1423 :
1424 : //=========================================================================
1425 : // virtual
1426 0 : void SAL_CALL ResultSet::removePropertyChangeListener(
1427 : const rtl::OUString& aPropertyName,
1428 : const uno::Reference< beans::XPropertyChangeListener >& xListener )
1429 : throw( beans::UnknownPropertyException,
1430 : lang::WrappedTargetException,
1431 : uno::RuntimeException )
1432 : {
1433 0 : osl::MutexGuard aGuard( m_pImpl->m_aMutex );
1434 :
1435 0 : if ( !aPropertyName.isEmpty() &&
1436 : !aPropertyName.equals(
1437 0 : rtl::OUString("RowCount") ) &&
1438 : !aPropertyName.equals(
1439 0 : rtl::OUString("IsRowCountFinal") ) )
1440 0 : throw beans::UnknownPropertyException();
1441 :
1442 0 : if ( m_pImpl->m_pPropertyChangeListeners )
1443 : m_pImpl->m_pPropertyChangeListeners->removeInterface(
1444 0 : aPropertyName, xListener );
1445 :
1446 0 : }
1447 :
1448 : //=========================================================================
1449 : // virtual
1450 0 : void SAL_CALL ResultSet::addVetoableChangeListener(
1451 : const rtl::OUString&,
1452 : const uno::Reference< beans::XVetoableChangeListener >& )
1453 : throw( beans::UnknownPropertyException,
1454 : lang::WrappedTargetException,
1455 : uno::RuntimeException )
1456 : {
1457 : // No constrained props, at the moment.
1458 0 : }
1459 :
1460 : //=========================================================================
1461 : // virtual
1462 0 : void SAL_CALL ResultSet::removeVetoableChangeListener(
1463 : const rtl::OUString&,
1464 : const uno::Reference< beans::XVetoableChangeListener >& )
1465 : throw( beans::UnknownPropertyException,
1466 : lang::WrappedTargetException,
1467 : uno::RuntimeException )
1468 : {
1469 : // No constrained props, at the moment.
1470 0 : }
1471 :
1472 : //=========================================================================
1473 : //
1474 : // Non-interface methods.
1475 : //
1476 : //=========================================================================
1477 :
1478 0 : void ResultSet::propertyChanged( const beans::PropertyChangeEvent& rEvt )
1479 : {
1480 0 : if ( !m_pImpl->m_pPropertyChangeListeners )
1481 0 : return;
1482 :
1483 : // Notify listeners interested especially in the changed property.
1484 : cppu::OInterfaceContainerHelper* pPropsContainer
1485 : = m_pImpl->m_pPropertyChangeListeners->getContainer(
1486 0 : rEvt.PropertyName );
1487 0 : if ( pPropsContainer )
1488 : {
1489 0 : cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
1490 0 : while ( aIter.hasMoreElements() )
1491 : {
1492 : uno::Reference< beans::XPropertyChangeListener > xListener(
1493 0 : aIter.next(), uno::UNO_QUERY );
1494 0 : if ( xListener.is() )
1495 0 : xListener->propertyChange( rEvt );
1496 0 : }
1497 : }
1498 :
1499 : // Notify listeners interested in all properties.
1500 : pPropsContainer
1501 0 : = m_pImpl->m_pPropertyChangeListeners->getContainer( rtl::OUString() );
1502 0 : if ( pPropsContainer )
1503 : {
1504 0 : cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
1505 0 : while ( aIter.hasMoreElements() )
1506 : {
1507 : uno::Reference< beans::XPropertyChangeListener > xListener(
1508 0 : aIter.next(), uno::UNO_QUERY );
1509 0 : if ( xListener.is() )
1510 0 : xListener->propertyChange( rEvt );
1511 0 : }
1512 : }
1513 : }
1514 :
1515 : //=========================================================================
1516 0 : void ResultSet::rowCountChanged( sal_uInt32 nOld, sal_uInt32 nNew )
1517 : {
1518 : OSL_ENSURE( nOld < nNew, "ResultSet::rowCountChanged - nOld >= nNew!" );
1519 :
1520 0 : if ( !m_pImpl->m_pPropertyChangeListeners )
1521 0 : return;
1522 :
1523 : propertyChanged(
1524 : beans::PropertyChangeEvent(
1525 : static_cast< cppu::OWeakObject * >( this ),
1526 : rtl::OUString("RowCount"),
1527 : sal_False,
1528 : 1001,
1529 : uno::makeAny( nOld ), // old value
1530 0 : uno::makeAny( nNew ) ) ); // new value
1531 : }
1532 :
1533 : //=========================================================================
1534 0 : void ResultSet::rowCountFinal()
1535 : {
1536 0 : if ( !m_pImpl->m_pPropertyChangeListeners )
1537 0 : return;
1538 :
1539 : propertyChanged(
1540 : beans::PropertyChangeEvent(
1541 : static_cast< cppu::OWeakObject * >( this ),
1542 : rtl::OUString("IsRowCountFinal"),
1543 : sal_False,
1544 : 1000,
1545 : uno:: makeAny( sal_False ), // old value
1546 0 : uno::makeAny( sal_True ) ) ); // new value
1547 : }
1548 :
1549 : //=========================================================================
1550 0 : const uno::Sequence< beans::Property >& ResultSet::getProperties()
1551 : {
1552 0 : return m_pImpl->m_aProperties;
1553 : }
1554 :
1555 : //=========================================================================
1556 : const uno::Reference< com::sun::star::ucb::XCommandEnvironment >&
1557 0 : ResultSet::getEnvironment()
1558 : {
1559 0 : return m_pImpl->m_xEnv;
1560 : }
1561 :
1562 : } // namespace ucbhelper
1563 :
1564 : namespace ucbhelper_impl {
1565 :
1566 : //=========================================================================
1567 : //=========================================================================
1568 : //
1569 : // PropertySetInfo Implementation.
1570 : //
1571 : //=========================================================================
1572 : //=========================================================================
1573 :
1574 0 : PropertySetInfo::PropertySetInfo(
1575 : const PropertyInfo* pProps,
1576 0 : sal_Int32 nProps )
1577 : {
1578 0 : m_pProps = new uno::Sequence< beans::Property >( nProps );
1579 :
1580 0 : if ( nProps )
1581 : {
1582 0 : const PropertyInfo* pEntry = pProps;
1583 0 : beans::Property* pProperties = m_pProps->getArray();
1584 :
1585 0 : for ( sal_Int32 n = 0; n < nProps; ++n )
1586 : {
1587 0 : beans::Property& rProp = pProperties[ n ];
1588 :
1589 0 : rProp.Name = rtl::OUString::createFromAscii( pEntry->pName );
1590 0 : rProp.Handle = pEntry->nHandle;
1591 0 : rProp.Type = pEntry->pGetCppuType();
1592 0 : rProp.Attributes = pEntry->nAttributes;
1593 :
1594 0 : pEntry++;
1595 : }
1596 : }
1597 0 : }
1598 :
1599 : //=========================================================================
1600 : // virtual
1601 0 : PropertySetInfo::~PropertySetInfo()
1602 : {
1603 0 : delete m_pProps;
1604 0 : }
1605 :
1606 : //=========================================================================
1607 : //
1608 : // XInterface methods.
1609 : //
1610 : //=========================================================================
1611 :
1612 0 : XINTERFACE_IMPL_2( PropertySetInfo,
1613 : lang::XTypeProvider,
1614 : beans::XPropertySetInfo );
1615 :
1616 : //=========================================================================
1617 : //
1618 : // XTypeProvider methods.
1619 : //
1620 : //=========================================================================
1621 :
1622 0 : XTYPEPROVIDER_IMPL_2( PropertySetInfo,
1623 : lang::XTypeProvider,
1624 : beans::XPropertySetInfo );
1625 :
1626 : //=========================================================================
1627 : //
1628 : // XPropertySetInfo methods.
1629 : //
1630 : //=========================================================================
1631 :
1632 : // virtual
1633 0 : uno::Sequence< beans::Property > SAL_CALL PropertySetInfo::getProperties()
1634 : throw( uno::RuntimeException )
1635 : {
1636 0 : return uno::Sequence< beans::Property >( *m_pProps );
1637 : }
1638 :
1639 : //=========================================================================
1640 : // virtual
1641 0 : beans::Property SAL_CALL PropertySetInfo::getPropertyByName(
1642 : const rtl::OUString& aName )
1643 : throw( beans::UnknownPropertyException, uno::RuntimeException )
1644 : {
1645 0 : beans::Property aProp;
1646 0 : if ( queryProperty( aName, aProp ) )
1647 0 : return aProp;
1648 :
1649 0 : throw beans::UnknownPropertyException();
1650 : }
1651 :
1652 : //=========================================================================
1653 : // virtual
1654 0 : sal_Bool SAL_CALL PropertySetInfo::hasPropertyByName(
1655 : const rtl::OUString& Name )
1656 : throw( uno::RuntimeException )
1657 : {
1658 0 : beans::Property aProp;
1659 0 : return queryProperty( Name, aProp );
1660 : }
1661 :
1662 : //=========================================================================
1663 0 : sal_Bool PropertySetInfo::queryProperty(
1664 : const rtl::OUString& aName, beans::Property& rProp )
1665 : {
1666 0 : sal_Int32 nCount = m_pProps->getLength();
1667 0 : const beans::Property* pProps = m_pProps->getConstArray();
1668 0 : for ( sal_Int32 n = 0; n < nCount; ++n )
1669 : {
1670 0 : const beans::Property& rCurr = pProps[ n ];
1671 0 : if ( rCurr.Name == aName )
1672 : {
1673 0 : rProp = rCurr;
1674 0 : return sal_True;
1675 : }
1676 : }
1677 :
1678 0 : return sal_False;
1679 : }
1680 :
1681 : } // namespace ucbhelper_impl
1682 :
1683 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|