xref: /trunk/main/connectivity/source/drivers/ado/AResultSet.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_connectivity.hxx"
30 #include "ado/AResultSet.hxx"
31 #include "ado/AResultSetMetaData.hxx"
32 #include <com/sun/star/sdbc/DataType.hpp>
33 #include <com/sun/star/sdbc/KeyRule.hpp>
34 #include <com/sun/star/sdbc/IndexType.hpp>
35 #include <comphelper/property.hxx>
36 #include <com/sun/star/lang/DisposedException.hpp>
37 #include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
38 #include <com/sun/star/sdbc/ResultSetType.hpp>
39 #include <com/sun/star/sdbc/FetchDirection.hpp>
40 #include <cppuhelper/typeprovider.hxx>
41 #include <comphelper/sequence.hxx>
42 #include <com/sun/star/beans/PropertyAttribute.hpp>
43 #include <comphelper/seqstream.hxx>
44 #include "connectivity/dbexception.hxx"
45 #include "connectivity/dbtools.hxx"
46 #include <comphelper/types.hxx>
47 
48 using namespace ::comphelper;
49 
50 
51 #include <oledb.h>
52 
53 #define CHECK_RETURN(x)                                                 \
54     if(!SUCCEEDED(x))                                                               \
55         ADOS::ThrowException(*m_pStmt->m_pConnection->getConnection(),*this);
56 
57 using namespace connectivity::ado;
58 using namespace com::sun::star::uno;
59 using namespace com::sun::star::lang;
60 using namespace com::sun::star::beans;
61 using namespace com::sun::star::sdbc;
62 
63 //------------------------------------------------------------------------------
64 //  IMPLEMENT_SERVICE_INFO(OResultSet,"com.sun.star.sdbcx.AResultSet","com.sun.star.sdbc.ResultSet");
65 ::rtl::OUString SAL_CALL OResultSet::getImplementationName(  ) throw (::com::sun::star::uno::RuntimeException)  \
66 {
67     return ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.ado.ResultSet");
68 }
69 // -------------------------------------------------------------------------
70 ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OResultSet::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)
71 {
72     ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(2);
73     aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ResultSet");
74     aSupported[1] = ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.ResultSet");
75     return aSupported;
76 }
77 // -------------------------------------------------------------------------
78 sal_Bool SAL_CALL OResultSet::supportsService( const ::rtl::OUString& _rServiceName ) throw(::com::sun::star::uno::RuntimeException)
79 {
80     Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
81     const ::rtl::OUString* pSupported = aSupported.getConstArray();
82     const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
83     for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
84         ;
85 
86     return pSupported != pEnd;
87 }
88 // -------------------------------------------------------------------------
89 OResultSet::OResultSet(ADORecordset* _pRecordSet,OStatement_Base* pStmt) :  OResultSet_BASE(m_aMutex)
90                         ,OPropertySetHelper(OResultSet_BASE::rBHelper)
91                         ,m_xStatement(*pStmt)
92                         ,m_pStmt(pStmt)
93                         ,m_nRowPos(0)
94                         ,m_xMetaData(NULL)
95                         ,m_pRecordSet(_pRecordSet)
96                         ,m_bEOF(sal_False)
97 {
98 }
99 // -------------------------------------------------------------------------
100 OResultSet::OResultSet(ADORecordset* _pRecordSet) : OResultSet_BASE(m_aMutex)
101                         ,OPropertySetHelper(OResultSet_BASE::rBHelper)
102                         ,m_xStatement(NULL)
103                         ,m_xMetaData(NULL)
104                         ,m_pRecordSet(_pRecordSet)
105                         ,m_bEOF(sal_False)
106 {
107 }
108 // -----------------------------------------------------------------------------
109 void OResultSet::construct()
110 {
111     osl_incrementInterlockedCount( &m_refCount );
112     if (!m_pRecordSet)
113     {
114         OSL_ENSURE( sal_False, "OResultSet::construct: no RecordSet!" );
115         Reference< XInterface > xInt( *this );
116         osl_decrementInterlockedCount( &m_refCount );
117         ::dbtools::throwFunctionSequenceException( xInt );
118     }
119     m_pRecordSet->AddRef();
120     VARIANT_BOOL bIsAtBOF;
121     CHECK_RETURN(m_pRecordSet->get_BOF(&bIsAtBOF))
122     m_bOnFirstAfterOpen = bIsAtBOF != VARIANT_TRUE;
123     osl_decrementInterlockedCount( &m_refCount );
124 }
125 // -------------------------------------------------------------------------
126 OResultSet::~OResultSet()
127 {
128     if(m_pRecordSet)
129         m_pRecordSet->Release();
130 }
131 // -------------------------------------------------------------------------
132 void OResultSet::disposing(void)
133 {
134     OPropertySetHelper::disposing();
135 
136     ::osl::MutexGuard aGuard(m_aMutex);
137     if(m_pRecordSet)
138         m_pRecordSet->Close();
139 m_xStatement.clear();
140 m_xMetaData.clear();
141 }
142 // -------------------------------------------------------------------------
143 Any SAL_CALL OResultSet::queryInterface( const Type & rType ) throw(RuntimeException)
144 {
145     Any aRet = OPropertySetHelper::queryInterface(rType);
146     return aRet.hasValue() ? aRet : OResultSet_BASE::queryInterface(rType);
147 }
148 // -------------------------------------------------------------------------
149 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OResultSet::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
150 {
151     ::cppu::OTypeCollection aTypes( ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet > *)0 ),
152                                     ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XFastPropertySet > *)0 ),
153                                     ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > *)0 ));
154 
155     return ::comphelper::concatSequences(aTypes.getTypes(),OResultSet_BASE::getTypes());
156 }
157 
158 // -------------------------------------------------------------------------
159 
160 sal_Int32 SAL_CALL OResultSet::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException)
161 {
162     ::osl::MutexGuard aGuard( m_aMutex );
163     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
164 
165 
166     Reference< XResultSetMetaData > xMeta = getMetaData();
167     sal_Int32 nLen = xMeta->getColumnCount();
168     sal_Int32 i = 1;
169     for(;i<=nLen;++i)
170         if(xMeta->isCaseSensitive(i) ? columnName == xMeta->getColumnName(i) :
171             columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i)))
172             break;
173     return i;
174 }
175 #define BLOCK_SIZE 256
176 // -------------------------------------------------------------------------
177 Reference< ::com::sun::star::io::XInputStream > SAL_CALL OResultSet::getBinaryStream( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
178 {
179     ::osl::MutexGuard aGuard( m_aMutex );
180     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
181 
182     WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
183 
184     if((aField.GetAttributes() & adFldLong) == adFldLong)
185     {
186         //Copy the data only upto the Actual Size of Field.
187         sal_Int32 nSize = aField.GetActualSize();
188         Sequence<sal_Int8> aData(nSize);
189         long index = 0;
190         while(index < nSize)
191         {
192             m_aValue = aField.GetChunk(BLOCK_SIZE);
193             if(m_aValue.isNull())
194                 break;
195             UCHAR chData;
196             for(long index2 = 0;index2 < BLOCK_SIZE;++index2)
197             {
198                 HRESULT hr = ::SafeArrayGetElement(m_aValue.parray,&index2,&chData);
199                 if(SUCCEEDED(hr))
200                 {
201                     //Take BYTE by BYTE and advance Memory Location
202                     aData.getArray()[index++] = chData;
203                 }
204                 else
205                     break;
206             }
207         }
208 
209         return new ::comphelper::SequenceInputStream(aData);
210     }
211     // else we ask for a bytesequence
212     aField.get_Value(m_aValue);
213 
214     return m_aValue.isNull() ? NULL : new ::comphelper::SequenceInputStream(m_aValue);
215 }
216 // -------------------------------------------------------------------------
217 Reference< ::com::sun::star::io::XInputStream > SAL_CALL OResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
218 {
219     ::dbtools::throwFeatureNotImplementedException( "XRow::getCharacterStream", *this );
220     return NULL;
221 }
222 // -----------------------------------------------------------------------------
223 OLEVariant OResultSet::getValue(sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
224 {
225     ::osl::MutexGuard aGuard( m_aMutex );
226     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
227 
228     WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
229     aField.get_Value(m_aValue);
230     return m_aValue;
231 }
232 // -------------------------------------------------------------------------
233 sal_Bool SAL_CALL OResultSet::getBoolean( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
234 {
235     return getValue(columnIndex);
236 }
237 // -------------------------------------------------------------------------
238 
239 sal_Int8 SAL_CALL OResultSet::getByte( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
240 {
241     return getValue(columnIndex);
242 }
243 // -------------------------------------------------------------------------
244 
245 Sequence< sal_Int8 > SAL_CALL OResultSet::getBytes( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
246 {
247     return getValue(columnIndex);
248 }
249 // -------------------------------------------------------------------------
250 
251 ::com::sun::star::util::Date SAL_CALL OResultSet::getDate( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
252 {
253     return getValue(columnIndex);
254 }
255 // -------------------------------------------------------------------------
256 
257 double SAL_CALL OResultSet::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
258 {
259     return getValue(columnIndex);
260 }
261 // -------------------------------------------------------------------------
262 
263 float SAL_CALL OResultSet::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
264 {
265     return getValue(columnIndex);
266 }
267 // -------------------------------------------------------------------------
268 
269 sal_Int32 SAL_CALL OResultSet::getInt( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
270 {
271     return getValue(columnIndex);
272 }
273 // -------------------------------------------------------------------------
274 
275 sal_Int32 SAL_CALL OResultSet::getRow(  ) throw(SQLException, RuntimeException)
276 {
277     ::osl::MutexGuard aGuard( m_aMutex );
278     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
279 
280 
281     PositionEnum aPos;
282     m_pRecordSet->get_AbsolutePosition(&aPos);
283     return  (aPos > 0) ? aPos : m_nRowPos;
284     // return the rowcount from driver if the driver doesn't support this return our count
285 }
286 // -------------------------------------------------------------------------
287 
288 sal_Int64 SAL_CALL OResultSet::getLong( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
289 {
290     ::dbtools::throwFeatureNotImplementedException( "XRow::getLong", *this );
291     return sal_Int64(0);
292 }
293 // -------------------------------------------------------------------------
294 
295 Reference< XResultSetMetaData > SAL_CALL OResultSet::getMetaData(  ) throw(SQLException, RuntimeException)
296 {
297     ::osl::MutexGuard aGuard( m_aMutex );
298     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
299 
300 
301     if(!m_xMetaData.is())
302         m_xMetaData = new OResultSetMetaData(m_pRecordSet);
303     return m_xMetaData;
304 }
305 // -------------------------------------------------------------------------
306 Reference< XArray > SAL_CALL OResultSet::getArray( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
307 {
308     ::dbtools::throwFeatureNotImplementedException( "XRow::getArray", *this );
309     return NULL;
310 }
311 
312 // -------------------------------------------------------------------------
313 
314 Reference< XClob > SAL_CALL OResultSet::getClob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
315 {
316     ::dbtools::throwFeatureNotImplementedException( "XRow::getClob", *this );
317     return NULL;
318 }
319 // -------------------------------------------------------------------------
320 Reference< XBlob > SAL_CALL OResultSet::getBlob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
321 {
322     ::dbtools::throwFeatureNotImplementedException( "XRow::getBlob", *this );
323     return NULL;
324 }
325 // -------------------------------------------------------------------------
326 
327 Reference< XRef > SAL_CALL OResultSet::getRef( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
328 {
329     ::dbtools::throwFeatureNotImplementedException( "XRow::getRef", *this );
330     return NULL;
331 }
332 // -------------------------------------------------------------------------
333 
334 Any SAL_CALL OResultSet::getObject( sal_Int32 columnIndex, const Reference< ::com::sun::star::container::XNameAccess >& /*typeMap*/ ) throw(SQLException, RuntimeException)
335 {
336     return getValue(columnIndex).makeAny();
337 }
338 // -------------------------------------------------------------------------
339 
340 sal_Int16 SAL_CALL OResultSet::getShort( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
341 {
342     return getValue(columnIndex);
343 }
344 // -------------------------------------------------------------------------
345 
346 ::rtl::OUString SAL_CALL OResultSet::getString( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
347 {
348     return getValue(columnIndex);
349 }
350 
351 // -------------------------------------------------------------------------
352 
353 
354 ::com::sun::star::util::Time SAL_CALL OResultSet::getTime( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
355 {
356     return getValue(columnIndex);
357 }
358 // -------------------------------------------------------------------------
359 
360 
361 ::com::sun::star::util::DateTime SAL_CALL OResultSet::getTimestamp( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
362 {
363     return getValue(columnIndex);
364 }
365 // -------------------------------------------------------------------------
366 
367 sal_Bool SAL_CALL OResultSet::isAfterLast(  ) throw(SQLException, RuntimeException)
368 {
369     ::osl::MutexGuard aGuard( m_aMutex );
370     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
371 
372 
373     VARIANT_BOOL bIsAtEOF;
374     CHECK_RETURN(m_pRecordSet->get_EOF(&bIsAtEOF))
375     return bIsAtEOF == VARIANT_TRUE;
376 }
377 // -------------------------------------------------------------------------
378 sal_Bool SAL_CALL OResultSet::isFirst(  ) throw(SQLException, RuntimeException)
379 {
380     ::osl::MutexGuard aGuard( m_aMutex );
381     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
382 
383 
384     return m_nRowPos == 1;
385 }
386 // -------------------------------------------------------------------------
387 sal_Bool SAL_CALL OResultSet::isLast(  ) throw(SQLException, RuntimeException)
388 {
389     ::osl::MutexGuard aGuard( m_aMutex );
390     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
391 
392 
393     return sal_True;
394 }
395 // -------------------------------------------------------------------------
396 void SAL_CALL OResultSet::beforeFirst(  ) throw(SQLException, RuntimeException)
397 {
398     ::osl::MutexGuard aGuard( m_aMutex );
399     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
400 
401 
402     if(first())
403         m_bOnFirstAfterOpen = !previous();
404 }
405 // -------------------------------------------------------------------------
406 void SAL_CALL OResultSet::afterLast(  ) throw(SQLException, RuntimeException)
407 {
408     ::osl::MutexGuard aGuard( m_aMutex );
409     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
410 
411 
412     if(last())
413         next();
414     m_bEOF = sal_True;
415 }
416 // -------------------------------------------------------------------------
417 
418 void SAL_CALL OResultSet::close(  ) throw(SQLException, RuntimeException)
419 {
420     {
421         ::osl::MutexGuard aGuard( m_aMutex );
422         checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
423 
424     }
425     dispose();
426 }
427 // -------------------------------------------------------------------------
428 
429 sal_Bool SAL_CALL OResultSet::first(  ) throw(SQLException, RuntimeException)
430 {
431     ::osl::MutexGuard aGuard( m_aMutex );
432     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
433 
434 
435     if(SUCCEEDED(m_pRecordSet->MoveFirst()))
436     {
437         m_nRowPos = 1;
438         m_bOnFirstAfterOpen = sal_False;
439         return sal_True;
440     }
441     return sal_False;
442 }
443 // -------------------------------------------------------------------------
444 
445 sal_Bool SAL_CALL OResultSet::last(  ) throw(SQLException, RuntimeException)
446 {
447     ::osl::MutexGuard aGuard( m_aMutex );
448     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
449 
450 
451     sal_Bool bRet = SUCCEEDED(m_pRecordSet->MoveLast());
452     if(bRet)
453     {
454         m_pRecordSet->get_RecordCount(&m_nRowPos);
455         m_bOnFirstAfterOpen = sal_False;
456     }
457     return bRet;
458 }
459 // -------------------------------------------------------------------------
460 sal_Bool SAL_CALL OResultSet::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
461 {
462     ::osl::MutexGuard aGuard( m_aMutex );
463     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
464 
465 
466     if(!row)                 // absolute with zero not allowed
467         ::dbtools::throwFunctionSequenceException(*this);
468 
469     sal_Bool bCheck = sal_True;
470     if(row < 0)
471     {
472         bCheck = SUCCEEDED(m_pRecordSet->MoveLast());
473         if ( bCheck )
474         {
475             while(++row < 0 && bCheck)
476                 bCheck = SUCCEEDED(m_pRecordSet->MovePrevious());
477         }
478     }
479     else
480     {
481         first();
482         OLEVariant aEmpty;
483         aEmpty.setNoArg();
484         bCheck = SUCCEEDED(m_pRecordSet->Move(row-1,aEmpty)); // move to row -1 because we stand already on the first
485         if(bCheck)
486             m_nRowPos = row;
487     }
488     if(bCheck)
489         m_bOnFirstAfterOpen = sal_False;
490     return bCheck;
491 }
492 // -------------------------------------------------------------------------
493 sal_Bool SAL_CALL OResultSet::relative( sal_Int32 row ) throw(SQLException, RuntimeException)
494 {
495     ::osl::MutexGuard aGuard( m_aMutex );
496     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
497 
498 
499     OLEVariant aEmpty;
500     aEmpty.setNoArg();
501     sal_Int32 nNewPos = row;
502     if ( m_bOnFirstAfterOpen && nNewPos > 0 )
503         --nNewPos;
504     sal_Bool bRet = SUCCEEDED(m_pRecordSet->Move(row,aEmpty));
505     if(bRet)
506     {
507         m_nRowPos += row;
508         m_bOnFirstAfterOpen = sal_False;
509     }
510     return bRet;
511 }
512 // -------------------------------------------------------------------------
513 sal_Bool SAL_CALL OResultSet::previous(  ) throw(SQLException, RuntimeException)
514 {
515     ::osl::MutexGuard aGuard( m_aMutex );
516     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
517 
518     sal_Bool bRet = SUCCEEDED(m_pRecordSet->MovePrevious());
519     if(bRet)
520     {
521         --m_nRowPos;
522         m_bOnFirstAfterOpen = sal_False;
523     }
524     return bRet;
525 }
526 // -------------------------------------------------------------------------
527 Reference< XInterface > SAL_CALL OResultSet::getStatement(  ) throw(SQLException, RuntimeException)
528 {
529     ::osl::MutexGuard aGuard( m_aMutex );
530     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
531     return m_xStatement;
532 }
533 // -------------------------------------------------------------------------
534 
535 sal_Bool SAL_CALL OResultSet::rowDeleted(  ) throw(SQLException, RuntimeException)
536 {
537     ::osl::MutexGuard aGuard( m_aMutex );
538     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
539 
540 
541     RecordStatusEnum eRec;
542     m_pRecordSet->get_Status((sal_Int32*)&eRec);
543     sal_Bool  bRet = (eRec & adRecDeleted) == adRecDeleted;
544     if(bRet)
545         --m_nRowPos;
546     return bRet;
547 }
548 // -------------------------------------------------------------------------
549 sal_Bool SAL_CALL OResultSet::rowInserted(  ) throw(SQLException, RuntimeException)
550 {   ::osl::MutexGuard aGuard( m_aMutex );
551     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
552 
553 
554     RecordStatusEnum eRec;
555     m_pRecordSet->get_Status((sal_Int32*)&eRec);
556     sal_Bool  bRet = (eRec & adRecNew) == adRecNew;
557     if(bRet)
558         ++m_nRowPos;
559     return bRet;
560 }
561 // -------------------------------------------------------------------------
562 sal_Bool SAL_CALL OResultSet::rowUpdated(  ) throw(SQLException, RuntimeException)
563 {
564     ::osl::MutexGuard aGuard( m_aMutex );
565     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
566 
567 
568     RecordStatusEnum eRec;
569     m_pRecordSet->get_Status((sal_Int32*)&eRec);
570     return (eRec & adRecModified) == adRecModified;
571 }
572 // -------------------------------------------------------------------------
573 
574 sal_Bool SAL_CALL OResultSet::isBeforeFirst(  ) throw(SQLException, RuntimeException)
575 {
576     ::osl::MutexGuard aGuard( m_aMutex );
577     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
578 
579 
580     OSL_ENSURE(!m_nRowPos,"OResultSet::isBeforeFirst: Error in setting m_nRowPos!");
581     VARIANT_BOOL bIsAtBOF = VARIANT_TRUE;
582     if(!m_bOnFirstAfterOpen)
583     {
584         OSL_ENSURE(!m_nRowPos,"OResultSet::isBeforeFirst: Error in setting m_nRowPos!");
585         m_pRecordSet->get_BOF(&bIsAtBOF);
586     }
587     return bIsAtBOF == VARIANT_TRUE;
588 }
589 // -------------------------------------------------------------------------
590 
591 sal_Bool SAL_CALL OResultSet::next(  ) throw(SQLException, RuntimeException)
592 {
593     ::osl::MutexGuard aGuard( m_aMutex );
594     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
595 
596 
597     sal_Bool bRet = sal_True;
598     if(m_bOnFirstAfterOpen)
599     {
600         m_bOnFirstAfterOpen = sal_False;
601         ++m_nRowPos;
602     }
603     else
604     {
605         bRet = SUCCEEDED(m_pRecordSet->MoveNext());
606 
607         if(bRet)
608         {
609             VARIANT_BOOL bIsAtEOF;
610             CHECK_RETURN(m_pRecordSet->get_EOF(&bIsAtEOF))
611             bRet = bIsAtEOF != VARIANT_TRUE;
612             ++m_nRowPos;
613         }
614         else
615             ADOS::ThrowException(*m_pStmt->m_pConnection->getConnection(),*this);
616     }
617 
618     return bRet;
619 }
620 // -------------------------------------------------------------------------
621 
622 sal_Bool SAL_CALL OResultSet::wasNull(  ) throw(SQLException, RuntimeException)
623 {
624     ::osl::MutexGuard aGuard( m_aMutex );
625     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
626 
627 
628     return m_aValue.isNull();
629 }
630 // -------------------------------------------------------------------------
631 
632 void SAL_CALL OResultSet::cancel(  ) throw(RuntimeException)
633 {
634     ::osl::MutexGuard aGuard( m_aMutex );
635     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
636 
637 
638     m_pRecordSet->Cancel();
639 }
640 // -------------------------------------------------------------------------
641 void SAL_CALL OResultSet::clearWarnings(  ) throw(SQLException, RuntimeException)
642 {
643 }
644 // -------------------------------------------------------------------------
645 Any SAL_CALL OResultSet::getWarnings(  ) throw(SQLException, RuntimeException)
646 {
647     return Any();
648 }
649 // -------------------------------------------------------------------------
650 void SAL_CALL OResultSet::insertRow(  ) throw(SQLException, RuntimeException)
651 {
652     ::osl::MutexGuard aGuard( m_aMutex );
653     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
654 
655 
656     OLEVariant aEmpty;
657     aEmpty.setNoArg();
658     m_pRecordSet->AddNew(aEmpty,aEmpty);
659 }
660 // -------------------------------------------------------------------------
661 void SAL_CALL OResultSet::updateRow(  ) throw(SQLException, RuntimeException)
662 {
663     ::osl::MutexGuard aGuard( m_aMutex );
664     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
665 
666 
667     OLEVariant aEmpty;
668     aEmpty.setNoArg();
669     m_pRecordSet->Update(aEmpty,aEmpty);
670 }
671 // -------------------------------------------------------------------------
672 void SAL_CALL OResultSet::deleteRow(  ) throw(SQLException, RuntimeException)
673 {
674     ::osl::MutexGuard aGuard( m_aMutex );
675     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
676 
677 
678     m_pRecordSet->Delete(adAffectCurrent);
679     m_pRecordSet->UpdateBatch(adAffectCurrent);
680 }
681 // -------------------------------------------------------------------------
682 
683 void SAL_CALL OResultSet::cancelRowUpdates(  ) throw(SQLException, RuntimeException)
684 {
685     ::osl::MutexGuard aGuard( m_aMutex );
686     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
687 
688 
689     m_pRecordSet->CancelUpdate();
690 }
691 // -------------------------------------------------------------------------
692 
693 void SAL_CALL OResultSet::moveToInsertRow(  ) throw(SQLException, RuntimeException)
694 {
695  //   ::osl::MutexGuard aGuard( m_aMutex );
696     //checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
697  //   if ( getResultSetConcurrency() == ResultSetConcurrency::READ_ONLY )
698  //       throw SQLException();
699 }
700 // -------------------------------------------------------------------------
701 
702 void SAL_CALL OResultSet::moveToCurrentRow(  ) throw(SQLException, RuntimeException)
703 {
704 }
705 // -----------------------------------------------------------------------------
706 void OResultSet::updateValue(sal_Int32 columnIndex,const OLEVariant& x)
707 {
708     ::osl::MutexGuard aGuard( m_aMutex );
709     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
710 
711     WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
712     aField.PutValue(x);
713 }
714 // -------------------------------------------------------------------------
715 void SAL_CALL OResultSet::updateNull( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
716 {
717     OLEVariant x;
718     x.setNull();
719     updateValue(columnIndex,x);
720 }
721 // -------------------------------------------------------------------------
722 
723 void SAL_CALL OResultSet::updateBoolean( sal_Int32 columnIndex, sal_Bool x ) throw(SQLException, RuntimeException)
724 {
725     updateValue(columnIndex,x);
726 }
727 // -------------------------------------------------------------------------
728 void SAL_CALL OResultSet::updateByte( sal_Int32 columnIndex, sal_Int8 x ) throw(SQLException, RuntimeException)
729 {
730     updateValue(columnIndex,x);
731 }
732 // -------------------------------------------------------------------------
733 
734 void SAL_CALL OResultSet::updateShort( sal_Int32 columnIndex, sal_Int16 x ) throw(SQLException, RuntimeException)
735 {
736     updateValue(columnIndex,x);
737 }
738 // -------------------------------------------------------------------------
739 void SAL_CALL OResultSet::updateInt( sal_Int32 columnIndex, sal_Int32 x ) throw(SQLException, RuntimeException)
740 {
741     updateValue(columnIndex,x);
742 }
743 // -------------------------------------------------------------------------
744 void SAL_CALL OResultSet::updateLong( sal_Int32 columnIndex, sal_Int64 x ) throw(SQLException, RuntimeException)
745 {
746     updateValue(columnIndex,x);
747 }
748 // -----------------------------------------------------------------------
749 void SAL_CALL OResultSet::updateFloat( sal_Int32 columnIndex, float x ) throw(SQLException, RuntimeException)
750 {
751     updateValue(columnIndex,x);
752 }
753 // -------------------------------------------------------------------------
754 
755 void SAL_CALL OResultSet::updateDouble( sal_Int32 columnIndex, double x ) throw(SQLException, RuntimeException)
756 {
757     updateValue(columnIndex,x);
758 }
759 // -------------------------------------------------------------------------
760 void SAL_CALL OResultSet::updateString( sal_Int32 columnIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException)
761 {
762     updateValue(columnIndex,x);
763 }
764 // -------------------------------------------------------------------------
765 void SAL_CALL OResultSet::updateBytes( sal_Int32 columnIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException)
766 {
767     updateValue(columnIndex,x);
768 }
769 // -------------------------------------------------------------------------
770 void SAL_CALL OResultSet::updateDate( sal_Int32 columnIndex, const ::com::sun::star::util::Date& x ) throw(SQLException, RuntimeException)
771 {
772     updateValue(columnIndex,x);
773 }
774 // -------------------------------------------------------------------------
775 
776 void SAL_CALL OResultSet::updateTime( sal_Int32 columnIndex, const ::com::sun::star::util::Time& x ) throw(SQLException, RuntimeException)
777 {
778     updateValue(columnIndex,x);
779 }
780 // -------------------------------------------------------------------------
781 
782 void SAL_CALL OResultSet::updateTimestamp( sal_Int32 columnIndex, const ::com::sun::star::util::DateTime& x ) throw(SQLException, RuntimeException)
783 {
784     updateValue(columnIndex,x);
785 }
786 // -------------------------------------------------------------------------
787 
788 void SAL_CALL OResultSet::updateBinaryStream( sal_Int32 columnIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
789 {
790     if(!x.is())
791         ::dbtools::throwFunctionSequenceException(*this);
792 
793     Sequence<sal_Int8> aSeq;
794     x->readBytes(aSeq,length);
795     updateBytes(columnIndex,aSeq);
796 }
797 // -------------------------------------------------------------------------
798 void SAL_CALL OResultSet::updateCharacterStream( sal_Int32 columnIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
799 {
800     if(!x.is())
801         ::dbtools::throwFunctionSequenceException(*this);
802 
803     Sequence<sal_Int8> aSeq;
804     x->readBytes(aSeq,length);
805     updateBytes(columnIndex,aSeq);
806 }
807 // -------------------------------------------------------------------------
808 void SAL_CALL OResultSet::refreshRow(  ) throw(SQLException, RuntimeException)
809 {
810     ::osl::MutexGuard aGuard( m_aMutex );
811     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
812 
813 
814     m_pRecordSet->Resync(adAffectCurrent,adResyncAllValues);
815 }
816 // -------------------------------------------------------------------------
817 void SAL_CALL OResultSet::updateObject( sal_Int32 columnIndex, const Any& x ) throw(SQLException, RuntimeException)
818 {
819     if (!::dbtools::implUpdateObject(this, columnIndex, x))
820         throw SQLException();
821 }
822 // -------------------------------------------------------------------------
823 
824 void SAL_CALL OResultSet::updateNumericObject( sal_Int32 columnIndex, const Any& x, sal_Int32 /*scale*/ ) throw(SQLException, RuntimeException)
825 {
826     if (!::dbtools::implUpdateObject(this, columnIndex, x))
827         throw SQLException();
828 }
829 //------------------------------------------------------------------------------
830 // XRowLocate
831 Any SAL_CALL OResultSet::getBookmark(  ) throw(SQLException, RuntimeException)
832 {
833     ::osl::MutexGuard aGuard( m_aMutex );
834     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
835 
836     if(m_nRowPos < (sal_Int32)m_aBookmarks.size()) // this bookmark was already fetched
837         return makeAny(sal_Int32(m_nRowPos-1));
838 
839     OLEVariant aVar;
840     m_pRecordSet->get_Bookmark(&aVar);
841     m_aBookmarks.push_back(aVar);
842     return makeAny((sal_Int32)(m_aBookmarks.size()-1));
843 
844 }
845 //------------------------------------------------------------------------------
846 sal_Bool SAL_CALL OResultSet::moveToBookmark( const Any& bookmark ) throw(SQLException, RuntimeException)
847 {
848     ::osl::MutexGuard aGuard( m_aMutex );
849     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
850 
851 
852     sal_Int32 nPos;
853     bookmark >>= nPos;
854     OSL_ENSURE(nPos >= 0 && nPos < (sal_Int32)m_aBookmarks.size(),"Invalid Index for vector");
855     if(nPos < 0 || nPos >= (sal_Int32)m_aBookmarks.size())
856         ::dbtools::throwFunctionSequenceException(*this);
857 
858     return SUCCEEDED(m_pRecordSet->Move(0,m_aBookmarks[nPos]));
859 }
860 //------------------------------------------------------------------------------
861 sal_Bool SAL_CALL OResultSet::moveRelativeToBookmark( const Any& bookmark, sal_Int32 rows ) throw(SQLException, RuntimeException)
862 {
863     ::osl::MutexGuard aGuard( m_aMutex );
864     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
865 
866 
867     sal_Int32 nPos;
868     bookmark >>= nPos;
869     nPos += rows;
870     OSL_ENSURE(nPos >= 0 && nPos < (sal_Int32)m_aBookmarks.size(),"Invalid Index for vector");
871     if(nPos < 0 || nPos >= (sal_Int32)m_aBookmarks.size())
872         ::dbtools::throwFunctionSequenceException(*this);
873     return SUCCEEDED(m_pRecordSet->Move(rows,m_aBookmarks[nPos]));
874 }
875 //------------------------------------------------------------------------------
876 sal_Int32 SAL_CALL OResultSet::compareBookmarks( const Any& first, const Any& second ) throw(SQLException, RuntimeException)
877 {
878     ::osl::MutexGuard aGuard( m_aMutex );
879     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
880 
881     sal_Int32 nPos1;
882     first >>= nPos1;
883     sal_Int32 nPos2;
884     second >>= nPos2;
885     if(nPos1 == nPos2)  // they should be equal
886         return sal_True;
887 
888     OSL_ENSURE((nPos1 >= 0 && nPos1 < (sal_Int32)m_aBookmarks.size()) || (nPos1 >= 0 && nPos2 < (sal_Int32)m_aBookmarks.size()),"Invalid Index for vector");
889 
890     CompareEnum eNum;
891     m_pRecordSet->CompareBookmarks(m_aBookmarks[nPos1],m_aBookmarks[nPos2],&eNum);
892     return ((sal_Int32)eNum) +1;
893 }
894 //------------------------------------------------------------------------------
895 sal_Bool SAL_CALL OResultSet::hasOrderedBookmarks(  ) throw(SQLException, RuntimeException)
896 {
897     ::osl::MutexGuard aGuard( m_aMutex );
898     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
899 
900 
901     ADOProperties* pProps = NULL;
902     m_pRecordSet->get_Properties(&pProps);
903     WpADOProperties aProps;
904     aProps.setWithOutAddRef(pProps);
905     ADOS::ThrowException(*((OConnection*)m_pStmt->getConnection().get())->getConnection(),*this);
906     OSL_ENSURE(aProps.IsValid(),"There are no properties at the connection");
907 
908     WpADOProperty aProp(aProps.GetItem(::rtl::OUString::createFromAscii("Bookmarks Ordered")));
909     OLEVariant aVar;
910     if(aProp.IsValid())
911         aVar = aProp.GetValue();
912     else
913         ADOS::ThrowException(*((OConnection*)m_pStmt->getConnection().get())->getConnection(),*this);
914 
915     sal_Bool bValue(sal_False);
916     if(!aVar.isNull() && !aVar.isEmpty())
917         bValue = aVar;
918     return bValue;
919 }
920 //------------------------------------------------------------------------------
921 sal_Int32 SAL_CALL OResultSet::hashBookmark( const Any& bookmark ) throw(SQLException, RuntimeException)
922 {
923     ::osl::MutexGuard aGuard( m_aMutex );
924     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
925 
926 
927     sal_Int32 nPos;
928     bookmark >>= nPos;
929     return nPos;
930 }
931 //------------------------------------------------------------------------------
932 // XDeleteRows
933 Sequence< sal_Int32 > SAL_CALL OResultSet::deleteRows( const Sequence< Any >& rows ) throw(SQLException, RuntimeException)
934 {
935     ::osl::MutexGuard aGuard( m_aMutex );
936     checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
937 
938 
939     OLEVariant aVar;
940     sal_Int32 nPos;
941 
942     // Create SafeArray Bounds and initialize the array
943     SAFEARRAYBOUND rgsabound[1];
944     rgsabound[0].lLbound   = 0;
945     rgsabound[0].cElements = rows.getLength();
946     SAFEARRAY *psa         = SafeArrayCreate( VT_VARIANT, 1, rgsabound );
947 
948     const Any* pBegin = rows.getConstArray();
949     const Any* pEnd = pBegin + rows.getLength();
950     for(sal_Int32 i=0;pBegin != pEnd ;++pBegin,++i)
951     {
952         *pBegin >>= nPos;
953         SafeArrayPutElement(psa,&i,&m_aBookmarks[nPos]);
954     }
955 
956     // Initialize and fill the SafeArray
957     OLEVariant vsa;
958     vsa.setArray(psa,VT_VARIANT);
959 
960     m_pRecordSet->put_Filter(vsa);
961     m_pRecordSet->Delete(adAffectGroup);
962     m_pRecordSet->UpdateBatch(adAffectGroup);
963 
964     Sequence< sal_Int32 > aSeq(rows.getLength());
965     if(first())
966     {
967         sal_Int32* pSeq = aSeq.getArray();
968         sal_Int32 i=0;
969         do
970         {
971             OSL_ENSURE(i<aSeq.getLength(),"Index greater than length of sequence");
972             m_pRecordSet->get_Status(&pSeq[i]);
973             if(pSeq[i++] == adRecDeleted)
974                 --m_nRowPos;
975         }
976         while(next());
977     }
978     return aSeq;
979 }
980 //------------------------------------------------------------------------------
981 sal_Int32 OResultSet::getResultSetConcurrency() const
982     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
983 {
984     sal_Int32 nValue=ResultSetConcurrency::READ_ONLY;
985     LockTypeEnum eRet;
986     if(!SUCCEEDED(m_pRecordSet->get_LockType(&eRet)))
987     {
988         switch(eRet)
989         {
990             case adLockReadOnly:
991                 nValue = ResultSetConcurrency::READ_ONLY;
992                 break;
993             default:
994                 nValue = ResultSetConcurrency::UPDATABLE;
995                 break;
996         }
997     }
998     return nValue;
999 }
1000 //------------------------------------------------------------------------------
1001 sal_Int32 OResultSet::getResultSetType() const
1002     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
1003 {
1004     sal_Int32 nValue=0;
1005     CursorTypeEnum eRet;
1006     if(!SUCCEEDED(m_pRecordSet->get_CursorType(&eRet)))
1007     {
1008         switch(eRet)
1009         {
1010             case adOpenUnspecified:
1011             case adOpenForwardOnly:
1012                 nValue = ResultSetType::FORWARD_ONLY;
1013                 break;
1014             case adOpenStatic:
1015             case adOpenKeyset:
1016                 nValue = ResultSetType::SCROLL_INSENSITIVE;
1017                 break;
1018             case adOpenDynamic:
1019                 nValue = ResultSetType::SCROLL_SENSITIVE;
1020                 break;
1021         }
1022     }
1023     return nValue;
1024 }
1025 //------------------------------------------------------------------------------
1026 sal_Int32 OResultSet::getFetchDirection() const
1027     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
1028 {
1029     return FetchDirection::FORWARD;
1030 }
1031 //------------------------------------------------------------------------------
1032 sal_Int32 OResultSet::getFetchSize() const
1033     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
1034 {
1035     sal_Int32 nValue=-1;
1036     m_pRecordSet->get_CacheSize(&nValue);
1037     return nValue;
1038 }
1039 //------------------------------------------------------------------------------
1040 ::rtl::OUString OResultSet::getCursorName() const
1041     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
1042 {
1043     return ::rtl::OUString();
1044 }
1045 
1046 //------------------------------------------------------------------------------
1047 void OResultSet::setFetchDirection(sal_Int32 /*_par0*/)
1048     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
1049 {
1050     ::dbtools::throwFeatureNotImplementedException( "ResultSet::FetchDirection", *this );
1051 }
1052 //------------------------------------------------------------------------------
1053 void OResultSet::setFetchSize(sal_Int32 _par0)
1054     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
1055 {
1056     m_pRecordSet->put_CacheSize(_par0);
1057 }
1058 // -------------------------------------------------------------------------
1059 ::cppu::IPropertyArrayHelper* OResultSet::createArrayHelper( ) const
1060 {
1061     Sequence< com::sun::star::beans::Property > aProps(5);
1062     com::sun::star::beans::Property* pProperties = aProps.getArray();
1063     sal_Int32 nPos = 0;
1064 
1065     //  DECL_PROP1IMPL(CURSORNAME,          ::rtl::OUString) PropertyAttribute::READONLY);
1066     DECL_PROP0(FETCHDIRECTION,          sal_Int32);
1067     DECL_PROP0(FETCHSIZE,               sal_Int32);
1068     DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY);
1069     DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY);
1070     DECL_PROP1IMPL(RESULTSETTYPE,       sal_Int32) PropertyAttribute::READONLY);
1071 
1072     return new ::cppu::OPropertyArrayHelper(aProps);
1073 }
1074 // -------------------------------------------------------------------------
1075 ::cppu::IPropertyArrayHelper & OResultSet::getInfoHelper()
1076 {
1077     return *const_cast<OResultSet*>(this)->getArrayHelper();
1078 }
1079 // -------------------------------------------------------------------------
1080 sal_Bool OResultSet::convertFastPropertyValue(
1081                             Any & rConvertedValue,
1082                             Any & rOldValue,
1083                             sal_Int32 nHandle,
1084                             const Any& rValue )
1085                                 throw (::com::sun::star::lang::IllegalArgumentException)
1086 {
1087     switch(nHandle)
1088     {
1089         case PROPERTY_ID_ISBOOKMARKABLE:
1090         case PROPERTY_ID_CURSORNAME:
1091         case PROPERTY_ID_RESULTSETCONCURRENCY:
1092         case PROPERTY_ID_RESULTSETTYPE:
1093             throw ::com::sun::star::lang::IllegalArgumentException();
1094             break;
1095         case PROPERTY_ID_FETCHDIRECTION:
1096             return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchDirection());
1097         case PROPERTY_ID_FETCHSIZE:
1098             return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchSize());
1099         default:
1100             ;
1101     }
1102     return sal_False;
1103 }
1104 // -------------------------------------------------------------------------
1105 void OResultSet::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue)throw (Exception)
1106 {
1107     switch(nHandle)
1108     {
1109         case PROPERTY_ID_ISBOOKMARKABLE:
1110         case PROPERTY_ID_CURSORNAME:
1111         case PROPERTY_ID_RESULTSETCONCURRENCY:
1112         case PROPERTY_ID_RESULTSETTYPE:
1113             throw Exception();
1114             break;
1115         case PROPERTY_ID_FETCHDIRECTION:
1116             setFetchDirection(getINT32(rValue));
1117             break;
1118         case PROPERTY_ID_FETCHSIZE:
1119             setFetchSize(getINT32(rValue));
1120             break;
1121         default:
1122             ;
1123     }
1124 }
1125 // -------------------------------------------------------------------------
1126 void OResultSet::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const
1127 {
1128     switch(nHandle)
1129     {
1130         case PROPERTY_ID_ISBOOKMARKABLE:
1131             {
1132                 VARIANT_BOOL bBool;
1133                 m_pRecordSet->Supports(adBookmark,&bBool);
1134                 sal_Bool bRet = bBool == VARIANT_TRUE;
1135                 rValue.setValue(&bRet, ::getCppuBooleanType() );
1136             }
1137             break;
1138         case PROPERTY_ID_CURSORNAME:
1139             rValue <<= getCursorName();
1140             break;
1141         case PROPERTY_ID_RESULTSETCONCURRENCY:
1142             rValue <<= getResultSetConcurrency();
1143             break;
1144         case PROPERTY_ID_RESULTSETTYPE:
1145             rValue <<= getResultSetType();
1146             break;
1147         case PROPERTY_ID_FETCHDIRECTION:
1148             rValue <<= getFetchDirection();
1149             break;
1150         case PROPERTY_ID_FETCHSIZE:
1151             rValue <<= getFetchSize();
1152             break;
1153     }
1154 }
1155 // -----------------------------------------------------------------------------
1156 void SAL_CALL OResultSet::acquire() throw()
1157 {
1158     OResultSet_BASE::acquire();
1159 }
1160 // -----------------------------------------------------------------------------
1161 void SAL_CALL OResultSet::release() throw()
1162 {
1163     OResultSet_BASE::release();
1164 }
1165 // -----------------------------------------------------------------------------
1166 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OResultSet::getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException)
1167 {
1168     return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
1169 }
1170 // -----------------------------------------------------------------------------
1171 
1172 
1173 
1174