xref: /trunk/main/connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 <comphelper/sequence.hxx>
31 #include "ado/ADatabaseMetaDataResultSet.hxx"
32 #include "ado/ADatabaseMetaDataResultSetMetaData.hxx"
33 #include <com/sun/star/sdbc/DataType.hpp>
34 #include <com/sun/star/sdbc/ColumnValue.hpp>
35 #include <com/sun/star/sdbc/KeyRule.hpp>
36 #include <com/sun/star/sdbc/ProcedureResult.hpp>
37 #include <com/sun/star/sdbc/IndexType.hpp>
38 #include <comphelper/property.hxx>
39 #include <com/sun/star/lang/DisposedException.hpp>
40 #include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
41 #include <com/sun/star/sdbc/ResultSetType.hpp>
42 #include <com/sun/star/sdbc/FetchDirection.hpp>
43 #include <cppuhelper/typeprovider.hxx>
44 #include <comphelper/seqstream.hxx>
45 #include "connectivity/dbexception.hxx"
46 
47 
48 #include <oledb.h>
49 
50 using namespace dbtools;
51 using namespace connectivity::ado;
52 using namespace cppu;
53 using namespace ::comphelper;
54 //------------------------------------------------------------------------------
55 using namespace ::com::sun::star::lang;
56 using namespace com::sun::star::uno;
57 using namespace com::sun::star::lang;
58 using namespace com::sun::star::beans;
59 using namespace com::sun::star::sdbc;
60 
61 // -------------------------------------------------------------------------
62 ODatabaseMetaDataResultSet::ODatabaseMetaDataResultSet(ADORecordset* _pRecordSet)
63     :ODatabaseMetaDataResultSet_BASE(m_aMutex)
64     ,OPropertySetHelper(ODatabaseMetaDataResultSet_BASE::rBHelper)
65     ,m_aStatement(NULL)
66     ,m_xMetaData(NULL)
67     ,m_pRecordSet(_pRecordSet)
68     ,m_bEOF(sal_False)
69 {
70     osl_incrementInterlockedCount( &m_refCount );
71     m_aColMapping.push_back(-1);
72     if(_pRecordSet)
73     {
74         m_pRecordSet->AddRef();
75         VARIANT_BOOL bIsAtBOF;
76         m_pRecordSet->get_BOF(&bIsAtBOF);
77         m_bOnFirstAfterOpen = bIsAtBOF != VARIANT_TRUE;
78     }
79     else
80         m_bOnFirstAfterOpen = sal_False;
81     osl_decrementInterlockedCount( &m_refCount );
82     //  allocBuffer();
83 }
84 
85 // -------------------------------------------------------------------------
86 ODatabaseMetaDataResultSet::~ODatabaseMetaDataResultSet()
87 {
88     if(m_pRecordSet)
89         m_pRecordSet->Release();
90 }
91 // -------------------------------------------------------------------------
92 void ODatabaseMetaDataResultSet::disposing(void)
93 {
94     OPropertySetHelper::disposing();
95 
96     ::osl::MutexGuard aGuard(m_aMutex);
97     if(m_pRecordSet)
98         m_pRecordSet->Close();
99     m_aStatement    = NULL;
100 m_xMetaData.clear();
101 }
102 // -------------------------------------------------------------------------
103 Any SAL_CALL ODatabaseMetaDataResultSet::queryInterface( const Type & rType ) throw(RuntimeException)
104 {
105     Any aRet = OPropertySetHelper::queryInterface(rType);
106     return aRet.hasValue() ? aRet : ODatabaseMetaDataResultSet_BASE::queryInterface(rType);
107 }
108 // -------------------------------------------------------------------------
109 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL ODatabaseMetaDataResultSet::getTypes(  ) throw(::com::sun::star::uno::RuntimeException)
110 {
111     ::cppu::OTypeCollection aTypes( ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet > *)0 ),
112                                     ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XFastPropertySet > *)0 ),
113                                     ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > *)0 ));
114 
115     return ::comphelper::concatSequences(aTypes.getTypes(),ODatabaseMetaDataResultSet_BASE::getTypes());
116 }
117 // -----------------------------------------------------------------------------
118 void ODatabaseMetaDataResultSet::checkRecordSet() throw(SQLException)
119 {
120     if(!m_pRecordSet)
121         throwFunctionSequenceException(*this);
122 }
123 // -------------------------------------------------------------------------
124 
125 sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException)
126 {
127     ::osl::MutexGuard aGuard( m_aMutex );
128     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed );
129 
130 
131     Reference< XResultSetMetaData > xMeta = getMetaData();
132     sal_Int32 nLen = xMeta->getColumnCount();
133     sal_Int32 i = 1;
134     for(;i<=nLen;++i)
135         if(xMeta->isCaseSensitive(i) ? columnName == xMeta->getColumnName(i) :
136             columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i)))
137             break;
138     return i;
139 }
140 #define BLOCK_SIZE 256
141 // -------------------------------------------------------------------------
142 Reference< ::com::sun::star::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getBinaryStream( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
143 {
144     ::osl::MutexGuard aGuard( m_aMutex );
145     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
146 
147     checkRecordSet();
148 
149 
150     columnIndex = mapColumn(columnIndex);
151     WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
152     if((aField.GetAttributes() & adFldLong) == adFldLong)
153     {
154         //Copy the data only upto the Actual Size of Field.
155         sal_Int32 nSize = aField.GetActualSize();
156         Sequence<sal_Int8> aData(nSize);
157         long index = 0;
158         while(index < nSize)
159         {
160             m_aValue = aField.GetChunk(BLOCK_SIZE);
161             if(m_aValue.isNull())
162                 break;
163             UCHAR chData;
164             for(long index2 = 0;index2 < BLOCK_SIZE;++index2)
165             {
166                 HRESULT hr = ::SafeArrayGetElement(m_aValue.parray,&index2,&chData);
167                 if(SUCCEEDED(hr))
168                 {
169                     //Take BYTE by BYTE and advance Memory Location
170                     aData.getArray()[index++] = chData;
171                 }
172                 else
173                     break;
174             }
175         }
176         return index ? Reference< ::com::sun::star::io::XInputStream >(new SequenceInputStream(aData)) : Reference< ::com::sun::star::io::XInputStream >();
177     }
178     // else we ask for a bytesequence
179     aField.get_Value(m_aValue);
180     if(m_aValue.isNull())
181         return NULL;
182     return new SequenceInputStream(m_aValue);
183 }
184 // -------------------------------------------------------------------------
185 Reference< ::com::sun::star::io::XInputStream > SAL_CALL ODatabaseMetaDataResultSet::getCharacterStream( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
186 {
187     ::dbtools::throwFeatureNotImplementedException( "XRow::getCharacterStream", *this );
188     return NULL;
189 }
190 
191 // -------------------------------------------------------------------------
192 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::getBoolean( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
193 {
194     ::osl::MutexGuard aGuard( m_aMutex );
195 
196     if ( !m_aValueRange.empty()  && columnIndex == 11 && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end() )
197     {
198         getValue(2);
199         if ( static_cast<sal_Int16>(m_aValue) != adCurrency )
200             return sal_False;
201     }
202     return getValue(columnIndex);
203 }
204 // -------------------------------------------------------------------------
205 
206 sal_Int8 SAL_CALL ODatabaseMetaDataResultSet::getByte( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
207 {
208     ::osl::MutexGuard aGuard( m_aMutex );
209 
210     getValue(columnIndex);
211 
212     columnIndex = mapColumn(columnIndex);
213 
214     if(m_aValue.isNull())
215         return 0;
216     if ( !m_aValueRange.empty() && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end())
217         return (sal_Int8)(*m_aValueRangeIter).second[(sal_Int32)m_aValue];
218     else if(m_aStrValueRange.size() && (m_aStrValueRangeIter = m_aStrValueRange.find(columnIndex)) != m_aStrValueRange.end())
219         return (sal_Int8)(*m_aStrValueRangeIter).second[m_aValue];
220 
221     return m_aValue;
222 }
223 // -------------------------------------------------------------------------
224 
225 Sequence< sal_Int8 > SAL_CALL ODatabaseMetaDataResultSet::getBytes( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
226 {
227     return getValue(columnIndex);
228 }
229 // -------------------------------------------------------------------------
230 
231 ::com::sun::star::util::Date SAL_CALL ODatabaseMetaDataResultSet::getDate( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
232 {
233     return getValue(columnIndex);
234 }
235 // -------------------------------------------------------------------------
236 
237 double SAL_CALL ODatabaseMetaDataResultSet::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
238 {
239     return getValue(columnIndex);
240 }
241 // -------------------------------------------------------------------------
242 
243 float SAL_CALL ODatabaseMetaDataResultSet::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
244 {
245     return getValue(columnIndex);
246 }
247 // -------------------------------------------------------------------------
248 
249 sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::getInt( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
250 {
251     ::osl::MutexGuard aGuard( m_aMutex );
252 
253 
254     getValue(columnIndex);
255 
256     columnIndex = mapColumn(columnIndex);
257     if(m_aValue.isNull())
258         return 0;
259 
260     if(m_aValueRange.size() && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end())
261         return (*m_aValueRangeIter).second[(sal_Int32)m_aValue];
262     else if(m_aStrValueRange.size() && (m_aStrValueRangeIter = m_aStrValueRange.find(columnIndex)) != m_aStrValueRange.end())
263         return (*m_aStrValueRangeIter).second[m_aValue];
264 
265     return m_aValue;
266 }
267 // -------------------------------------------------------------------------
268 
269 sal_Int32 SAL_CALL ODatabaseMetaDataResultSet::getRow(  ) throw(SQLException, RuntimeException)
270 {
271     ::dbtools::throwFeatureNotImplementedException( "XResultSet::getRow", *this );
272     return 0;
273 }
274 // -------------------------------------------------------------------------
275 
276 sal_Int64 SAL_CALL ODatabaseMetaDataResultSet::getLong( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
277 {
278     ::dbtools::throwFeatureNotImplementedException( "XRow::getLong", *this );
279     return sal_Int64(0);
280 }
281 // -------------------------------------------------------------------------
282 
283 Reference< XResultSetMetaData > SAL_CALL ODatabaseMetaDataResultSet::getMetaData(  ) throw(SQLException, RuntimeException)
284 {
285     ::osl::MutexGuard aGuard( m_aMutex );
286     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
287 
288     checkRecordSet();
289 
290 
291     if(!m_xMetaData.is())
292         m_xMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
293 
294     return m_xMetaData;
295 }
296 // -------------------------------------------------------------------------
297 Reference< XArray > SAL_CALL ODatabaseMetaDataResultSet::getArray( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
298 {
299     ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
300     return NULL;
301 }
302 
303 // -------------------------------------------------------------------------
304 
305 Reference< XClob > SAL_CALL ODatabaseMetaDataResultSet::getClob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
306 {
307     ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
308     return NULL;
309 }
310 // -------------------------------------------------------------------------
311 Reference< XBlob > SAL_CALL ODatabaseMetaDataResultSet::getBlob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
312 {
313     ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
314     return NULL;
315 }
316 // -------------------------------------------------------------------------
317 
318 Reference< XRef > SAL_CALL ODatabaseMetaDataResultSet::getRef( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException)
319 {
320     ::dbtools::throwFeatureNotImplementedException( "XRow::getRow", *this );
321     return NULL;
322 }
323 // -------------------------------------------------------------------------
324 
325 Any SAL_CALL ODatabaseMetaDataResultSet::getObject( sal_Int32 columnIndex, const Reference< ::com::sun::star::container::XNameAccess >& /*typeMap*/ ) throw(SQLException, RuntimeException)
326 {
327     ::osl::MutexGuard aGuard( m_aMutex );
328     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
329 
330     checkRecordSet();
331 
332 
333     columnIndex = mapColumn(columnIndex);
334     return Any();
335 }
336 // -------------------------------------------------------------------------
337 
338 sal_Int16 SAL_CALL ODatabaseMetaDataResultSet::getShort( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
339 {
340     ::osl::MutexGuard aGuard( m_aMutex );
341 
342     getValue(columnIndex);
343 
344     columnIndex = mapColumn(columnIndex);
345     if(m_aValue.isNull())
346         return 0;
347 
348     if(m_aValueRange.size() && (m_aValueRangeIter = m_aValueRange.find(columnIndex)) != m_aValueRange.end())
349         return (sal_Int16)(*m_aValueRangeIter).second[(sal_Int32)m_aValue];
350     else if(m_aStrValueRange.size() && (m_aStrValueRangeIter = m_aStrValueRange.find(columnIndex)) != m_aStrValueRange.end())
351         return (sal_Int16)(*m_aStrValueRangeIter).second[m_aValue];
352 
353     return m_aValue;
354 }
355 // -------------------------------------------------------------------------
356 
357 ::rtl::OUString SAL_CALL ODatabaseMetaDataResultSet::getString( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
358 {
359     ::osl::MutexGuard aGuard( m_aMutex );
360 
361     getValue(columnIndex);
362 
363 
364     columnIndex = mapColumn(columnIndex);
365     if(m_aValue.isNull())
366         return ::rtl::OUString();
367     if(m_aIntValueRange.size() && (m_aIntValueRangeIter = m_aIntValueRange.find(columnIndex)) != m_aIntValueRange.end())
368         return (*m_aIntValueRangeIter).second[m_aValue];
369 
370     return m_aValue;
371 }
372 
373 // -------------------------------------------------------------------------
374 
375 
376 ::com::sun::star::util::Time SAL_CALL ODatabaseMetaDataResultSet::getTime( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
377 {
378     return getValue(columnIndex);
379 }
380 // -------------------------------------------------------------------------
381 
382 
383 ::com::sun::star::util::DateTime SAL_CALL ODatabaseMetaDataResultSet::getTimestamp( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
384 {
385     return getValue(columnIndex);
386 }
387 // -------------------------------------------------------------------------
388 
389 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isAfterLast(  ) throw(SQLException, RuntimeException)
390 {
391     ::osl::MutexGuard aGuard( m_aMutex );
392     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
393 
394     checkRecordSet();
395 
396 
397     VARIANT_BOOL bIsAtEOF;
398     m_pRecordSet->get_EOF(&bIsAtEOF);
399     return bIsAtEOF == VARIANT_TRUE;
400 }
401 // -------------------------------------------------------------------------
402 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isFirst(  ) throw(SQLException, RuntimeException)
403 {
404     ::osl::MutexGuard aGuard( m_aMutex );
405     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
406 
407     checkRecordSet();
408 
409 
410     return m_nRowPos == 1;
411 }
412 // -------------------------------------------------------------------------
413 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isLast(  ) throw(SQLException, RuntimeException)
414 {
415     ::osl::MutexGuard aGuard( m_aMutex );
416     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
417 
418     checkRecordSet();
419 
420 
421     return sal_True;
422 }
423 // -------------------------------------------------------------------------
424 void SAL_CALL ODatabaseMetaDataResultSet::beforeFirst(  ) throw(SQLException, RuntimeException)
425 {
426     ::osl::MutexGuard aGuard( m_aMutex );
427     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
428 
429     checkRecordSet();
430 
431 
432     if(first())
433         previous();
434 }
435 // -------------------------------------------------------------------------
436 void SAL_CALL ODatabaseMetaDataResultSet::afterLast(  ) throw(SQLException, RuntimeException)
437 {
438     ::osl::MutexGuard aGuard( m_aMutex );
439     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
440 
441     checkRecordSet();
442 
443 
444     if(last())
445         next();
446     m_bEOF = sal_True;
447 }
448 // -------------------------------------------------------------------------
449 
450 void SAL_CALL ODatabaseMetaDataResultSet::close(  ) throw(SQLException, RuntimeException)
451 {
452     {
453         ::osl::MutexGuard aGuard( m_aMutex );
454         checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
455 
456     }
457     dispose();
458 }
459 // -------------------------------------------------------------------------
460 
461 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::first(  ) throw(SQLException, RuntimeException)
462 {
463     ::osl::MutexGuard aGuard( m_aMutex );
464     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
465 
466 
467     if(!m_pRecordSet)
468         return sal_False;
469 
470     sal_Bool bRet = SUCCEEDED(m_pRecordSet->MoveFirst());
471     if ( bRet )
472         m_nRowPos = 1;
473     return bRet;
474 }
475 // -------------------------------------------------------------------------
476 
477 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::last(  ) throw(SQLException, RuntimeException)
478 {
479     ::osl::MutexGuard aGuard( m_aMutex );
480     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed );
481 
482 
483     return m_pRecordSet && SUCCEEDED(m_pRecordSet->MoveLast()) ? sal_True : sal_False;
484 }
485 // -------------------------------------------------------------------------
486 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
487 {
488     ::osl::MutexGuard aGuard( m_aMutex );
489     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
490 
491 
492     if(first())
493     {
494         OLEVariant aEmpty;
495         aEmpty.setNoArg();
496         sal_Bool bRet = SUCCEEDED(m_pRecordSet->Move(row,aEmpty));
497         if(bRet)
498             m_nRowPos = row;
499         return bRet;
500     }
501     return sal_False;
502 }
503 // -------------------------------------------------------------------------
504 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::relative( sal_Int32 row ) throw(SQLException, RuntimeException)
505 {
506     ::osl::MutexGuard aGuard( m_aMutex );
507     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
508 
509 
510     if(!m_pRecordSet)
511         return sal_False;
512 
513     OLEVariant aEmpty;
514     aEmpty.setNoArg();
515     sal_Bool bRet = SUCCEEDED(m_pRecordSet->Move(row,aEmpty));
516     if(bRet)
517         m_nRowPos += row;
518     return bRet;
519 }
520 // -------------------------------------------------------------------------
521 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::previous(  ) throw(SQLException, RuntimeException)
522 {
523     ::osl::MutexGuard aGuard( m_aMutex );
524     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
525 
526 
527     if(!m_pRecordSet)
528         return sal_False;
529 
530     sal_Bool bRet = SUCCEEDED(m_pRecordSet->MovePrevious());
531     if(bRet)
532         --m_nRowPos;
533     return bRet;
534 }
535 // -------------------------------------------------------------------------
536 Reference< XInterface > SAL_CALL ODatabaseMetaDataResultSet::getStatement(  ) throw(SQLException, RuntimeException)
537 {
538     return m_aStatement.get();
539 }
540 // -------------------------------------------------------------------------
541 
542 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowDeleted(  ) throw(SQLException, RuntimeException)
543 {
544     ::osl::MutexGuard aGuard( m_aMutex );
545     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
546 
547     checkRecordSet();
548 
549 
550     RecordStatusEnum eRec;
551     m_pRecordSet->get_Status((sal_Int32*)&eRec);
552     return (eRec & adRecDeleted) == adRecDeleted;
553 }
554 // -------------------------------------------------------------------------
555 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowInserted(  ) throw(SQLException, RuntimeException)
556 {   ::osl::MutexGuard aGuard( m_aMutex );
557     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
558 
559     checkRecordSet();
560 
561 
562     RecordStatusEnum eRec;
563     m_pRecordSet->get_Status((sal_Int32*)&eRec);
564     return (eRec & adRecNew) == adRecNew;
565 }
566 // -------------------------------------------------------------------------
567 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::rowUpdated(  ) throw(SQLException, RuntimeException)
568 {
569     ::osl::MutexGuard aGuard( m_aMutex );
570     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
571 
572     checkRecordSet();
573 
574 
575     RecordStatusEnum eRec;
576     m_pRecordSet->get_Status((sal_Int32*)&eRec);
577     return (eRec & adRecModified) == adRecModified;
578 }
579 // -------------------------------------------------------------------------
580 
581 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::isBeforeFirst(  ) throw(SQLException, RuntimeException)
582 {
583     ::osl::MutexGuard aGuard( m_aMutex );
584     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
585 
586 
587     if(!m_pRecordSet)
588         return sal_True;
589 
590     VARIANT_BOOL bIsAtBOF;
591     m_pRecordSet->get_BOF(&bIsAtBOF);
592     return bIsAtBOF == VARIANT_TRUE;
593 }
594 // -------------------------------------------------------------------------
595 
596 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::next(  ) throw(SQLException, RuntimeException)
597 {
598     ::osl::MutexGuard aGuard( m_aMutex );
599     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
600 
601 
602     if(!m_pRecordSet)
603         return sal_False;
604 
605     if(m_bOnFirstAfterOpen)
606     {
607         m_bOnFirstAfterOpen = sal_False;
608         return sal_True;
609     }
610     else
611         return SUCCEEDED(m_pRecordSet->MoveNext());
612 }
613 // -------------------------------------------------------------------------
614 
615 sal_Bool SAL_CALL ODatabaseMetaDataResultSet::wasNull(  ) throw(SQLException, RuntimeException)
616 {
617     ::osl::MutexGuard aGuard( m_aMutex );
618     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
619 
620     checkRecordSet();
621 
622 
623     return m_aValue.isNull();
624 }
625 // -------------------------------------------------------------------------
626 void SAL_CALL ODatabaseMetaDataResultSet::refreshRow(  ) throw(SQLException, RuntimeException)
627 {
628     ::osl::MutexGuard aGuard( m_aMutex );
629     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
630 
631     checkRecordSet();
632 
633 
634     m_pRecordSet->Resync(adAffectCurrent,adResyncAllValues);
635 }
636 // -------------------------------------------------------------------------
637 
638 void SAL_CALL ODatabaseMetaDataResultSet::cancel(  ) throw(RuntimeException)
639 {
640     ::osl::MutexGuard aGuard( m_aMutex );
641     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
642 
643     checkRecordSet();
644 
645 
646     m_pRecordSet->Cancel();
647 }
648 // -------------------------------------------------------------------------
649 void SAL_CALL ODatabaseMetaDataResultSet::clearWarnings(  ) throw(SQLException, RuntimeException)
650 {
651 }
652 // -------------------------------------------------------------------------
653 Any SAL_CALL ODatabaseMetaDataResultSet::getWarnings(  ) throw(SQLException, RuntimeException)
654 {
655     return Any();
656 }
657 //------------------------------------------------------------------------------
658 sal_Int32 ODatabaseMetaDataResultSet::getResultSetConcurrency() const
659     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
660 {
661     return ResultSetConcurrency::READ_ONLY;
662 }
663 //------------------------------------------------------------------------------
664 sal_Int32 ODatabaseMetaDataResultSet::getResultSetType() const
665     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
666 {
667     return ResultSetType::FORWARD_ONLY;
668 }
669 //------------------------------------------------------------------------------
670 sal_Int32 ODatabaseMetaDataResultSet::getFetchDirection() const
671     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
672 {
673     return FetchDirection::FORWARD;
674 }
675 //------------------------------------------------------------------------------
676 sal_Int32 ODatabaseMetaDataResultSet::getFetchSize() const
677     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
678 {
679     sal_Int32 nValue=-1;
680     if(m_pRecordSet)
681         m_pRecordSet->get_CacheSize(&nValue);
682     return nValue;
683 }
684 //------------------------------------------------------------------------------
685 ::rtl::OUString ODatabaseMetaDataResultSet::getCursorName() const
686     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
687 {
688     return ::rtl::OUString();
689 }
690 
691 //------------------------------------------------------------------------------
692 void ODatabaseMetaDataResultSet::setFetchDirection(sal_Int32 /*_par0*/)
693     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
694 {
695     ::dbtools::throwFeatureNotImplementedException( "ResultSet::FetchDirection", *this );
696 }
697 //------------------------------------------------------------------------------
698 void ODatabaseMetaDataResultSet::setFetchSize(sal_Int32 _par0)
699     throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
700 {
701     if(m_pRecordSet)
702         m_pRecordSet->put_CacheSize(_par0);
703 }
704 // -------------------------------------------------------------------------
705 ::cppu::IPropertyArrayHelper* ODatabaseMetaDataResultSet::createArrayHelper( ) const
706 {
707 
708     Sequence< com::sun::star::beans::Property > aProps(5);
709     com::sun::star::beans::Property* pProperties = aProps.getArray();
710     sal_Int32 nPos = 0;
711     DECL_PROP0(CURSORNAME,          ::rtl::OUString);
712     DECL_PROP0(FETCHDIRECTION,      sal_Int32);
713     DECL_PROP0(FETCHSIZE,           sal_Int32);
714     DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32);
715     DECL_PROP0(RESULTSETTYPE,       sal_Int32);
716 
717     return new ::cppu::OPropertyArrayHelper(aProps);
718 }
719 // -------------------------------------------------------------------------
720 ::cppu::IPropertyArrayHelper & ODatabaseMetaDataResultSet::getInfoHelper()
721 {
722     return *const_cast<ODatabaseMetaDataResultSet*>(this)->getArrayHelper();
723 }
724 // -------------------------------------------------------------------------
725 sal_Bool ODatabaseMetaDataResultSet::convertFastPropertyValue(
726                             Any & rConvertedValue,
727                             Any & rOldValue,
728                             sal_Int32 nHandle,
729                             const Any& rValue )
730                                 throw (::com::sun::star::lang::IllegalArgumentException)
731 {
732     switch(nHandle)
733     {
734         case PROPERTY_ID_CURSORNAME:
735         case PROPERTY_ID_RESULTSETCONCURRENCY:
736         case PROPERTY_ID_RESULTSETTYPE:
737             throw ::com::sun::star::lang::IllegalArgumentException();
738             break;
739         case PROPERTY_ID_FETCHDIRECTION:
740             return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchDirection());
741         case PROPERTY_ID_FETCHSIZE:
742             return ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchSize());
743         default:
744             ;
745     }
746     return sal_False;
747 }
748 // -------------------------------------------------------------------------
749 void ODatabaseMetaDataResultSet::setFastPropertyValue_NoBroadcast(
750                                 sal_Int32 nHandle,
751                                 const Any& /*rValue*/
752                                                  )
753                                                  throw (Exception)
754 {
755     switch(nHandle)
756     {
757         case PROPERTY_ID_CURSORNAME:
758         case PROPERTY_ID_RESULTSETCONCURRENCY:
759         case PROPERTY_ID_RESULTSETTYPE:
760         case PROPERTY_ID_FETCHDIRECTION:
761         case PROPERTY_ID_FETCHSIZE:
762             throw Exception();
763             break;
764         default:
765             OSL_ENSURE(0,"setFastPropertyValue_NoBroadcast: Illegal handle value!");
766     }
767 }
768 // -------------------------------------------------------------------------
769 void ODatabaseMetaDataResultSet::getFastPropertyValue(
770                                 Any& rValue,
771                                 sal_Int32 nHandle
772                                      ) const
773 {
774     switch(nHandle)
775     {
776         case PROPERTY_ID_CURSORNAME:
777             rValue <<= getCursorName();
778             break;
779         case PROPERTY_ID_RESULTSETCONCURRENCY:
780             rValue <<= getResultSetConcurrency();
781             break;
782         case PROPERTY_ID_RESULTSETTYPE:
783             rValue <<= getResultSetType();
784             break;
785         case PROPERTY_ID_FETCHDIRECTION:
786             rValue <<= getFetchDirection();
787             break;
788         case PROPERTY_ID_FETCHSIZE:
789             rValue <<= getFetchSize();
790             break;
791     }
792 }
793 // -------------------------------------------------------------------------
794 void ODatabaseMetaDataResultSet::setProceduresMap()
795 {
796 
797     for(sal_Int32 i=1;i<4;i++)
798         m_aColMapping.push_back(i);
799     m_aColMapping.push_back(5);
800     m_aColMapping.push_back(7);
801     m_aColMapping.push_back(8);
802     m_aColMapping.push_back(6);
803     m_aColMapping.push_back(4);
804 
805     TInt2IntMap aMap;
806     aMap[DB_PT_UNKNOWN]     = ProcedureResult::UNKNOWN;
807     aMap[DB_PT_PROCEDURE]   = ProcedureResult::NONE;
808     aMap[DB_PT_FUNCTION]    = ProcedureResult::RETURN;
809     m_aValueRange[4] = aMap;
810 
811     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
812     pMetaData->setProceduresMap();
813     m_xMetaData = pMetaData;
814 }
815 // -------------------------------------------------------------------------
816 void ODatabaseMetaDataResultSet::setCatalogsMap()
817 {
818     m_aColMapping.push_back(1);
819 
820     m_xMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
821 }
822 // -------------------------------------------------------------------------
823 void ODatabaseMetaDataResultSet::setSchemasMap()
824 {
825     m_aColMapping.push_back(2);
826 
827     m_xMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
828 }
829 // -------------------------------------------------------------------------
830 void ODatabaseMetaDataResultSet::setColumnPrivilegesMap()
831 {
832 
833     m_aColMapping.push_back(3);
834     m_aColMapping.push_back(4);
835     m_aColMapping.push_back(5);
836     m_aColMapping.push_back(6);
837     m_aColMapping.push_back(2);
838     m_aColMapping.push_back(9);
839     m_aColMapping.push_back(10);
840 
841     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
842     pMetaData->setColumnPrivilegesMap();
843     m_xMetaData = pMetaData;
844 }
845 // -------------------------------------------------------------------------
846 void ODatabaseMetaDataResultSet::setColumnsMap()
847 {
848 
849     for(sal_Int32 i=1;i<5;++i)
850         m_aColMapping.push_back(i);
851 
852     m_aColMapping.push_back(12);
853     m_aColMapping.push_back(12); // is used as TYPE_NAME
854 
855     m_aColMapping.push_back(14);
856     m_aColMapping.push_back(6);
857     m_aColMapping.push_back(17);
858     m_aColMapping.push_back(18);
859 
860     m_aColMapping.push_back(11);
861     m_aColMapping.push_back(29);
862     m_aColMapping.push_back(9);
863     m_aColMapping.push_back(18);
864     m_aColMapping.push_back(18);
865 
866     m_aColMapping.push_back(15);
867     m_aColMapping.push_back(7);
868     m_aColMapping.push_back(11);
869 
870     TInt2IntMap aMap;
871     aMap[adEmpty]           = ADOS::MapADOType2Jdbc(adEmpty);
872     aMap[adTinyInt]         = ADOS::MapADOType2Jdbc(adTinyInt);
873     aMap[adSmallInt]        = ADOS::MapADOType2Jdbc(adSmallInt);
874     aMap[adInteger]         = ADOS::MapADOType2Jdbc(adInteger);
875     aMap[adBigInt]          = ADOS::MapADOType2Jdbc(adBigInt);
876     aMap[adUnsignedTinyInt] = ADOS::MapADOType2Jdbc(adUnsignedTinyInt);
877     aMap[adUnsignedSmallInt]= ADOS::MapADOType2Jdbc(adUnsignedSmallInt);
878     aMap[adUnsignedInt]     = ADOS::MapADOType2Jdbc(adUnsignedInt);
879     aMap[adUnsignedBigInt]  = ADOS::MapADOType2Jdbc(adUnsignedBigInt);
880     aMap[adSingle]          = ADOS::MapADOType2Jdbc(adSingle);
881     aMap[adDouble]          = ADOS::MapADOType2Jdbc(adDouble);
882     aMap[adCurrency]        = ADOS::MapADOType2Jdbc(adCurrency);
883     aMap[adDecimal]         = ADOS::MapADOType2Jdbc(adDecimal);
884     aMap[adNumeric]         = ADOS::MapADOType2Jdbc(adNumeric);
885     aMap[adBoolean]         = ADOS::MapADOType2Jdbc(adBoolean);
886     aMap[adError]           = ADOS::MapADOType2Jdbc(adError);
887     aMap[adUserDefined]     = ADOS::MapADOType2Jdbc(adUserDefined);
888     aMap[adVariant]         = ADOS::MapADOType2Jdbc(adVariant);
889     aMap[adIDispatch]       = ADOS::MapADOType2Jdbc(adIDispatch);
890     aMap[adIUnknown]        = ADOS::MapADOType2Jdbc(adIUnknown);
891     aMap[adGUID]            = ADOS::MapADOType2Jdbc(adGUID);
892     aMap[adDate]            = ADOS::MapADOType2Jdbc(adDate);
893     aMap[adDBDate]          = ADOS::MapADOType2Jdbc(adDBDate);
894     aMap[adDBTime]          = ADOS::MapADOType2Jdbc(adDBTime);
895     aMap[adDBTimeStamp]     = ADOS::MapADOType2Jdbc(adDBTimeStamp);
896     aMap[adBSTR]            = ADOS::MapADOType2Jdbc(adBSTR);
897     aMap[adChar]            = ADOS::MapADOType2Jdbc(adChar);
898     aMap[adVarChar]         = ADOS::MapADOType2Jdbc(adVarChar);
899     aMap[adLongVarChar]     = ADOS::MapADOType2Jdbc(adLongVarChar);
900     aMap[adWChar]           = ADOS::MapADOType2Jdbc(adWChar);
901     aMap[adVarWChar]        = ADOS::MapADOType2Jdbc(adVarWChar);
902     aMap[adLongVarWChar]    = ADOS::MapADOType2Jdbc(adLongVarWChar);
903     aMap[adBinary]          = ADOS::MapADOType2Jdbc(adBinary);
904     aMap[adVarBinary]       = ADOS::MapADOType2Jdbc(adVarBinary);
905     aMap[adLongVarBinary]   = ADOS::MapADOType2Jdbc(adLongVarBinary);
906     aMap[adChapter]         = ADOS::MapADOType2Jdbc(adChapter);
907     aMap[adFileTime]        = ADOS::MapADOType2Jdbc(adFileTime);
908     aMap[adPropVariant]     = ADOS::MapADOType2Jdbc(adPropVariant);
909     aMap[adVarNumeric]      = ADOS::MapADOType2Jdbc(adVarNumeric);
910 //  aMap[adArray]           = ADOS::MapADOType2Jdbc(adArray);
911 
912     m_aValueRange[12] = aMap;
913 
914     ::std::map< sal_Int32,::rtl::OUString> aMap2;
915     aMap2[0] = ::rtl::OUString::createFromAscii("YES");
916     aMap2[1] = ::rtl::OUString::createFromAscii("NO");
917     m_aIntValueRange[18] = aMap2;
918 
919     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
920     pMetaData->setColumnsMap();
921     m_xMetaData = pMetaData;
922 }
923 // -------------------------------------------------------------------------
924 void ODatabaseMetaDataResultSet::setTablesMap()
925 {
926 
927     for(sal_Int32 i=1;i<5;i++)
928         m_aColMapping.push_back(i);
929     m_aColMapping.push_back(6);
930 
931     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
932     pMetaData->setTablesMap();
933     m_xMetaData = pMetaData;
934 }
935 // -------------------------------------------------------------------------
936 void ODatabaseMetaDataResultSet::setProcedureColumnsMap()
937 {
938 
939     for(sal_Int32 i=1;i<5;i++)
940         m_aColMapping.push_back(i);
941     m_aColMapping.push_back(6);
942     m_aColMapping.push_back(10);
943     m_aColMapping.push_back(16);
944     m_aColMapping.push_back(13);
945     m_aColMapping.push_back(11);
946     m_aColMapping.push_back(12);
947 
948     m_aColMapping.push_back(9);
949     m_aColMapping.push_back(14);
950 
951     TInt2IntMap aMap;
952     aMap[DBTYPE_EMPTY] = DataType::SQLNULL;
953     aMap[DBTYPE_NULL] = DataType::SQLNULL;
954     aMap[DBTYPE_I2] = DataType::SMALLINT;
955     aMap[DBTYPE_I4] = DataType::INTEGER;
956     aMap[DBTYPE_R4] = DataType::FLOAT;
957     aMap[DBTYPE_R8] = DataType::DOUBLE;
958     aMap[DBTYPE_CY] = DataType::BIGINT;
959     aMap[DBTYPE_DATE] = DataType::DATE;
960     aMap[DBTYPE_BSTR] = DataType::VARCHAR;
961     aMap[DBTYPE_IDISPATCH] = DataType::OBJECT;
962     aMap[DBTYPE_ERROR] = DataType::OTHER;
963     aMap[DBTYPE_BOOL] = DataType::BIT;
964     aMap[DBTYPE_VARIANT] = DataType::STRUCT;
965     aMap[DBTYPE_IUNKNOWN] = DataType::OTHER;
966     aMap[DBTYPE_DECIMAL] = DataType::DECIMAL;
967     aMap[DBTYPE_UI1] = DataType::TINYINT;
968     aMap[DBTYPE_ARRAY] = DataType::ARRAY;
969     aMap[DBTYPE_BYREF] = DataType::REF;
970     aMap[DBTYPE_I1] = DataType::CHAR;
971     aMap[DBTYPE_UI2] = DataType::SMALLINT;
972     aMap[DBTYPE_UI4] = DataType::INTEGER;
973 
974     // aMap[The] = ;
975     // aMap[in] = ;
976     aMap[DBTYPE_I8] = DataType::BIGINT;
977     aMap[DBTYPE_UI8] = DataType::BIGINT;
978     aMap[DBTYPE_GUID] = DataType::OTHER;
979     aMap[DBTYPE_VECTOR] = DataType::OTHER;
980     aMap[DBTYPE_FILETIME] = DataType::OTHER;
981     aMap[DBTYPE_RESERVED] = DataType::OTHER;
982 
983     // aMap[The] = ;
984     aMap[DBTYPE_BYTES] = DataType::VARBINARY;
985     aMap[DBTYPE_STR] = DataType::LONGVARCHAR;
986     aMap[DBTYPE_WSTR] = DataType::LONGVARCHAR;
987     aMap[DBTYPE_NUMERIC] = DataType::NUMERIC;
988     aMap[DBTYPE_UDT] = DataType::OTHER;
989     aMap[DBTYPE_DBDATE] = DataType::DATE;
990     aMap[DBTYPE_DBTIME] = DataType::TIME;
991     aMap[DBTYPE_DBTIMESTAMP] = DataType::TIMESTAMP;
992     aMap[DBTYPE_HCHAPTER] = DataType::OTHER;
993     aMap[DBTYPE_PROPVARIANT] = DataType::OTHER;
994     aMap[DBTYPE_VARNUMERIC] = DataType::NUMERIC;
995 
996     m_aValueRange[10] = aMap;
997 
998     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
999     pMetaData->setProcedureColumnsMap();
1000     m_xMetaData = pMetaData;
1001 }
1002 // -------------------------------------------------------------------------
1003 void ODatabaseMetaDataResultSet::setPrimaryKeysMap()
1004 {
1005 
1006     sal_Int32 i=1;
1007     for(;i<5;i++)
1008         m_aColMapping.push_back(i);
1009     m_aColMapping.push_back(7);
1010     m_aColMapping.push_back(8);
1011 
1012     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
1013     pMetaData->setProcedureColumnsMap();
1014     m_xMetaData = pMetaData;
1015 }
1016 // -------------------------------------------------------------------------
1017 void ODatabaseMetaDataResultSet::setIndexInfoMap()
1018 {
1019 
1020     sal_Int32 i=1;
1021     for(;i<4;i++)
1022         m_aColMapping.push_back(i);
1023     m_aColMapping.push_back(8);
1024     m_aColMapping.push_back(4);
1025     m_aColMapping.push_back(6);
1026     m_aColMapping.push_back(10);
1027     m_aColMapping.push_back(17);
1028     m_aColMapping.push_back(18);
1029     m_aColMapping.push_back(21);
1030     m_aColMapping.push_back(22);
1031     m_aColMapping.push_back(23);
1032     m_aColMapping.push_back(24);
1033 
1034     TInt2IntMap aMap;
1035     aMap[DBPROPVAL_IT_HASH] = IndexType::HASHED;
1036     aMap[DBPROPVAL_IT_CONTENT] = IndexType::OTHER;
1037     aMap[DBPROPVAL_IT_OTHER] = IndexType::OTHER;
1038     aMap[DBPROPVAL_IT_BTREE] = IndexType::OTHER;
1039 
1040     m_aValueRange[10] = aMap;
1041 
1042     TInt2IntMap aMap2;
1043     aMap[0] = 1;
1044     aMap[1] = 0;
1045     m_aValueRange[8] = aMap2;
1046 
1047     ::std::map< sal_Int32,::rtl::OUString> aMap3;
1048     aMap3[0]                    = ::rtl::OUString();
1049     aMap3[DB_COLLATION_ASC]     = ::rtl::OUString::createFromAscii("A");
1050     aMap3[DB_COLLATION_DESC]    = ::rtl::OUString::createFromAscii("D");
1051 
1052     m_aIntValueRange[21] = aMap3;
1053 
1054     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
1055     pMetaData->setIndexInfoMap();
1056     m_xMetaData = pMetaData;
1057 }
1058 // -------------------------------------------------------------------------
1059 void ODatabaseMetaDataResultSet::setTablePrivilegesMap()
1060 {
1061 
1062     sal_Int32 i=3;
1063     for(;i<6;i++)
1064         m_aColMapping.push_back(i);
1065     m_aColMapping.push_back(1);
1066     m_aColMapping.push_back(2);
1067     m_aColMapping.push_back(6);
1068     m_aColMapping.push_back(7);
1069 
1070     ::std::map< sal_Int32,::rtl::OUString> aMap;
1071     aMap[0] = ::rtl::OUString::createFromAscii("YES");
1072     aMap[1] = ::rtl::OUString::createFromAscii("NO");
1073     m_aIntValueRange[7] = aMap;
1074 
1075 
1076     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
1077     pMetaData->setTablePrivilegesMap();
1078     m_xMetaData = pMetaData;
1079 }
1080 // -------------------------------------------------------------------------
1081 void ODatabaseMetaDataResultSet::setCrossReferenceMap()
1082 {
1083 
1084     sal_Int32 i=1;
1085     for(;i<5;i++)
1086         m_aColMapping.push_back(i);
1087     for(i=7;i<11;i++)
1088         m_aColMapping.push_back(i);
1089 
1090     m_aColMapping.push_back(13);
1091     m_aColMapping.push_back(14);
1092     m_aColMapping.push_back(15);
1093     m_aColMapping.push_back(17);
1094     m_aColMapping.push_back(16);
1095     m_aColMapping.push_back(18);
1096 
1097     ::std::map< ::rtl::OUString,sal_Int32> aMap;
1098     aMap[ ::rtl::OUString::createFromAscii("CASCADE")] = KeyRule::CASCADE;
1099     aMap[ ::rtl::OUString::createFromAscii("RESTRICT")] = KeyRule::RESTRICT;
1100     aMap[ ::rtl::OUString::createFromAscii("SET NULL")] = KeyRule::SET_NULL;
1101     aMap[ ::rtl::OUString::createFromAscii("SET DEFAULT")] = KeyRule::SET_DEFAULT;
1102     aMap[ ::rtl::OUString::createFromAscii("NO ACTION")] = KeyRule::NO_ACTION;
1103 
1104     m_aStrValueRange[14] = aMap;
1105     m_aStrValueRange[15] = aMap;
1106 
1107     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
1108     pMetaData->setCrossReferenceMap();
1109     m_xMetaData = pMetaData;
1110 }
1111 // -------------------------------------------------------------------------
1112 void ODatabaseMetaDataResultSet::setTypeInfoMap(sal_Bool _bJetEngine)
1113 {
1114     sal_Int32 i=1;
1115     for(;i<19;i++)
1116         m_aColMapping.push_back(i);
1117 
1118     ::std::map< ::rtl::OUString,sal_Int32> aMap1;
1119     aMap1[ ::rtl::OUString()] = 10;
1120 
1121     m_aStrValueRange[18] = aMap1;
1122 
1123     TInt2IntMap aMap;
1124     aMap[adEmpty]           = ADOS::MapADOType2Jdbc(adEmpty);
1125     aMap[adTinyInt]         = ADOS::MapADOType2Jdbc(adTinyInt);
1126     aMap[adSmallInt]        = ADOS::MapADOType2Jdbc(adSmallInt);
1127     aMap[adInteger]         = ADOS::MapADOType2Jdbc(adInteger);
1128     aMap[adBigInt]          = ADOS::MapADOType2Jdbc(adBigInt);
1129     aMap[adUnsignedTinyInt] = ADOS::MapADOType2Jdbc(adUnsignedTinyInt);
1130     aMap[adUnsignedSmallInt]= ADOS::MapADOType2Jdbc(adUnsignedSmallInt);
1131     aMap[adUnsignedInt]     = ADOS::MapADOType2Jdbc(adUnsignedInt);
1132     aMap[adUnsignedBigInt]  = ADOS::MapADOType2Jdbc(adUnsignedBigInt);
1133     aMap[adSingle]          = ADOS::MapADOType2Jdbc(adSingle);
1134     aMap[adDouble]          = ADOS::MapADOType2Jdbc(adDouble);
1135     aMap[adCurrency]        = ADOS::MapADOType2Jdbc(adCurrency);
1136     aMap[adDecimal]         = ADOS::MapADOType2Jdbc(adDecimal);
1137     aMap[adNumeric]         = ADOS::MapADOType2Jdbc(adNumeric);
1138     aMap[adBoolean]         = ADOS::MapADOType2Jdbc(adBoolean);
1139     aMap[adError]           = ADOS::MapADOType2Jdbc(adError);
1140     aMap[adUserDefined]     = ADOS::MapADOType2Jdbc(adUserDefined);
1141     aMap[adVariant]         = ADOS::MapADOType2Jdbc(adVariant);
1142     aMap[adIDispatch]       = ADOS::MapADOType2Jdbc(adIDispatch);
1143     aMap[adIUnknown]        = ADOS::MapADOType2Jdbc(adIUnknown);
1144     aMap[adGUID]            = ADOS::MapADOType2Jdbc(adGUID);
1145     aMap[adDate]            = _bJetEngine ? ADOS::MapADOType2Jdbc(adDBTimeStamp) : ADOS::MapADOType2Jdbc(adDate);
1146     aMap[adDBDate]          = ADOS::MapADOType2Jdbc(adDBDate);
1147     aMap[adDBTime]          = ADOS::MapADOType2Jdbc(adDBTime);
1148     aMap[adDBTimeStamp]     = ADOS::MapADOType2Jdbc(adDBTimeStamp);
1149     aMap[adBSTR]            = ADOS::MapADOType2Jdbc(adBSTR);
1150     aMap[adChar]            = ADOS::MapADOType2Jdbc(adChar);
1151     aMap[adVarChar]         = ADOS::MapADOType2Jdbc(adVarChar);
1152     aMap[adLongVarChar]     = ADOS::MapADOType2Jdbc(adLongVarChar);
1153     aMap[adWChar]           = ADOS::MapADOType2Jdbc(adWChar);
1154     aMap[adVarWChar]        = ADOS::MapADOType2Jdbc(adVarWChar);
1155     aMap[adLongVarWChar]    = ADOS::MapADOType2Jdbc(adLongVarWChar);
1156     aMap[adBinary]          = ADOS::MapADOType2Jdbc(adBinary);
1157     aMap[adVarBinary]       = ADOS::MapADOType2Jdbc(adVarBinary);
1158     aMap[adLongVarBinary]   = ADOS::MapADOType2Jdbc(adLongVarBinary);
1159     aMap[adChapter]         = ADOS::MapADOType2Jdbc(adChapter);
1160     aMap[adFileTime]        = ADOS::MapADOType2Jdbc(adFileTime);
1161     aMap[adPropVariant]     = ADOS::MapADOType2Jdbc(adPropVariant);
1162     aMap[adVarNumeric]      = ADOS::MapADOType2Jdbc(adVarNumeric);
1163 //  aMap[adArray]           = ADOS::MapADOType2Jdbc(adArray);
1164 
1165     m_aValueRange[2] = aMap;
1166 
1167     TInt2IntMap aColumnValueMapping;
1168     aColumnValueMapping[VARIANT_FALSE]      = ColumnValue::NO_NULLS;
1169     aColumnValueMapping[VARIANT_TRUE]       = ColumnValue::NULLABLE;
1170     m_aValueRange[7] = aColumnValueMapping;
1171 
1172     // now adjust the column mapping
1173     // OJ 24.01.2002  96860
1174     TInt2IntMap aSerachMapping;
1175     aSerachMapping[DB_UNSEARCHABLE]     = ColumnSearch::NONE;
1176     aSerachMapping[DB_LIKE_ONLY]        = ColumnSearch::CHAR;
1177     aSerachMapping[DB_ALL_EXCEPT_LIKE]  = ColumnSearch::BASIC;
1178     aSerachMapping[DB_SEARCHABLE]       = ColumnSearch::FULL;
1179 
1180     m_aValueRange[9] = aSerachMapping;
1181 
1182     TInt2IntMap aCurrencyMapping;
1183     m_aValueRange[11] = aCurrencyMapping;
1184 
1185     ODatabaseMetaDataResultSetMetaData* pMetaData = new ODatabaseMetaDataResultSetMetaData(m_pRecordSet,this);
1186     pMetaData->setTypeInfoMap();
1187     m_xMetaData = pMetaData;
1188 }
1189 // -----------------------------------------------------------------------------
1190 void SAL_CALL ODatabaseMetaDataResultSet::acquire() throw()
1191 {
1192     ODatabaseMetaDataResultSet_BASE::acquire();
1193 }
1194 // -----------------------------------------------------------------------------
1195 void SAL_CALL ODatabaseMetaDataResultSet::release() throw()
1196 {
1197     ODatabaseMetaDataResultSet_BASE::release();
1198 }
1199 // -----------------------------------------------------------------------------
1200 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL ODatabaseMetaDataResultSet::getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException)
1201 {
1202     return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
1203 }
1204 // -----------------------------------------------------------------------------
1205 OLEVariant ODatabaseMetaDataResultSet::getValue(sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
1206 {
1207     ::osl::MutexGuard aGuard( m_aMutex );
1208     checkDisposed(ODatabaseMetaDataResultSet_BASE::rBHelper.bDisposed);
1209 
1210     checkRecordSet();
1211 
1212     WpADOField aField = ADOS::getField(m_pRecordSet,columnIndex);
1213     aField.get_Value(m_aValue);
1214     return m_aValue;
1215 }
1216 // -----------------------------------------------------------------------------
1217 
1218 
1219