1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26
27 #include "NDatabaseMetaData.hxx"
28 #include "NConnection.hxx"
29 #include "NResultSet.hxx"
30 #include "propertyids.hxx"
31 #include "resource/evoab2_res.hrc"
32 #include "TSortIndex.hxx"
33 #include <algorithm>
34
35 #include <com/sun/star/beans/PropertyAttribute.hpp>
36 #include <com/sun/star/lang/DisposedException.hpp>
37 #include <com/sun/star/sdb/ErrorCondition.hpp>
38 #include <com/sun/star/sdbc/DataType.hpp>
39 #include <com/sun/star/sdbc/FetchDirection.hpp>
40 #include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
41 #include <com/sun/star/sdbc/ResultSetType.hpp>
42
43 #include <comphelper/componentcontext.hxx>
44 #include <comphelper/extract.hxx>
45 #include <comphelper/property.hxx>
46 #include <comphelper/sequence.hxx>
47 #include <comphelper/types.hxx>
48 #include <connectivity/dbexception.hxx>
49 #include <connectivity/sqlerror.hxx>
50 #include <cppuhelper/typeprovider.hxx>
51 #include <rtl/string.hxx>
52 #include <tools/diagnose_ex.h>
53 #include <unotools/syslocale.hxx>
54 #include <unotools/intlwrapper.hxx>
55
56 #include <cstring>
57 #include <vector>
58
59 namespace connectivity { namespace evoab {
60
61 using namespace ::comphelper;
62 using namespace com::sun::star;
63 using namespace com::sun::star::uno;
64 using namespace com::sun::star::lang;
65 using namespace com::sun::star::beans;
66 using namespace com::sun::star::sdbc;
67 using namespace com::sun::star::sdbcx;
68 using namespace com::sun::star::container;
69 using namespace com::sun::star::io;
70 namespace ErrorCondition = ::com::sun::star::sdb::ErrorCondition;
71
72 //------------------------------------------------------------------------------
getImplementationName()73 ::rtl::OUString SAL_CALL OEvoabResultSet::getImplementationName( ) throw ( RuntimeException) \
74 {
75 return ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.evoab.ResultSet");
76 }
77 // -------------------------------------------------------------------------
getSupportedServiceNames()78 Sequence< ::rtl::OUString > SAL_CALL OEvoabResultSet::getSupportedServiceNames( ) throw( RuntimeException)
79 {
80 Sequence< ::rtl::OUString > aSupported(1);
81 aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ResultSet");
82 return aSupported;
83 }
84 // -------------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)85 sal_Bool SAL_CALL OEvoabResultSet::supportsService( const ::rtl::OUString& _rServiceName ) throw( RuntimeException)
86 {
87 Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
88 const ::rtl::OUString* pSupported = aSupported.getConstArray();
89 const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
90 for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
91 ;
92
93 return pSupported != pEnd;
94 }
95
96 // -------------------------------------------------------------------------
OEvoabResultSet(OCommonStatement * pStmt,OEvoabConnection * pConnection)97 OEvoabResultSet::OEvoabResultSet( OCommonStatement* pStmt, OEvoabConnection *pConnection )
98 :OResultSet_BASE(m_aMutex)
99 ,::comphelper::OPropertyContainer( OResultSet_BASE::rBHelper )
100 ,m_pStatement(pStmt)
101 ,m_pConnection(pConnection)
102 ,m_xMetaData(NULL)
103 ,m_bWasNull(sal_True)
104 ,m_nFetchSize(0)
105 ,m_nResultSetType(ResultSetType::SCROLL_INSENSITIVE)
106 ,m_nFetchDirection(FetchDirection::FORWARD)
107 ,m_nResultSetConcurrency(ResultSetConcurrency::READ_ONLY)
108 ,m_pContacts(NULL)
109 ,m_nIndex(-1)
110 ,m_nLength(0)
111 {
112 #define REGISTER_PROP( id, member ) \
113 registerProperty( \
114 OMetaConnection::getPropMap().getNameByIndex( id ), \
115 id, \
116 PropertyAttribute::READONLY, \
117 &member, \
118 ::getCppuType( &member ) \
119 );
120
121 REGISTER_PROP( PROPERTY_ID_FETCHSIZE, m_nFetchSize );
122 REGISTER_PROP( PROPERTY_ID_RESULTSETTYPE, m_nResultSetType );
123 REGISTER_PROP( PROPERTY_ID_FETCHDIRECTION, m_nFetchDirection );
124 REGISTER_PROP( PROPERTY_ID_RESULTSETCONCURRENCY, m_nResultSetConcurrency );
125 }
126
127 // -------------------------------------------------------------------------
~OEvoabResultSet()128 OEvoabResultSet::~OEvoabResultSet()
129 {
130 }
131
132 // -------------------------------------------------------------------------
133
134 static ESource *
findSource(const char * name)135 findSource( const char *name )
136 {
137 ESourceList *pSourceList = NULL;
138
139 g_return_val_if_fail (name != NULL, NULL);
140
141 if (!e_book_get_addressbooks (&pSourceList, NULL))
142 pSourceList = NULL;
143
144 for ( GSList *g = e_source_list_peek_groups (pSourceList); g; g = g->next)
145 {
146 for (GSList *s = e_source_group_peek_sources (E_SOURCE_GROUP (g->data)); s; s = s->next)
147 {
148 ESource *pSource = E_SOURCE (s->data);
149 if (!strcmp (e_source_peek_name (pSource), name))
150 return pSource;
151 }
152 }
153 return NULL;
154 }
155
156 static EBook *
openBook(const char * abname)157 openBook( const char *abname )
158 {
159 ESource *pSource = findSource (abname);
160 EBook *pBook = NULL;
161 if (pSource)
162 pBook = e_book_new (pSource, NULL);
163
164 if (pBook && !e_book_open (pBook, TRUE, NULL))
165 {
166 g_object_unref (G_OBJECT (pBook));
167 pBook = NULL;
168 }
169
170 return pBook;
171 }
172
isLDAP(EBook * pBook)173 static bool isLDAP( EBook *pBook )
174 {
175 return pBook && !strncmp( "ldap://", e_book_get_uri( pBook ), 6 );
176 }
177
isLocal(EBook * pBook)178 static bool isLocal( EBook *pBook )
179 {
180 return pBook && !strncmp( "file://", e_book_get_uri( pBook ), 6 );
181 }
182
isAuthRequired(EBook * pBook)183 static bool isAuthRequired( EBook *pBook )
184 {
185 return e_source_get_property( e_book_get_source( pBook ),
186 "auth" ) != NULL;
187 }
188
getUserName(EBook * pBook)189 static rtl::OString getUserName( EBook *pBook )
190 {
191 rtl::OString aName;
192 if( isLDAP( pBook ) )
193 aName = e_source_get_property( e_book_get_source( pBook ), "binddn" );
194 else
195 aName = e_source_get_property( e_book_get_source( pBook ), "user" );
196 return aName;
197 }
198
199 static ::rtl::OUString
valueToOUString(GValue & _rValue)200 valueToOUString( GValue& _rValue )
201 {
202 const char *pStr = g_value_get_string( &_rValue );
203 rtl::OString aStr( pStr ? pStr : "" );
204 ::rtl::OUString sResult( ::rtl::OStringToOUString( aStr, RTL_TEXTENCODING_UTF8 ) );
205 g_value_unset( &_rValue );
206 return sResult;
207 }
208
209 static bool
valueToBool(GValue & _rValue)210 valueToBool( GValue& _rValue )
211 {
212 bool bResult = g_value_get_boolean( &_rValue );
213 g_value_unset( &_rValue );
214 return bResult;
215 }
216
217 static bool
executeQuery(EBook * pBook,EBookQuery * pQuery,GList ** ppList,rtl::OString & rPassword,GError ** pError)218 executeQuery (EBook* pBook, EBookQuery* pQuery, GList **ppList,
219 rtl::OString &rPassword, GError **pError)
220 {
221 ESource *pSource = e_book_get_source( pBook );
222 bool bSuccess = false;
223 bool bAuthSuccess = true;
224
225 *ppList = NULL;
226
227 if( isAuthRequired( pBook ) )
228 {
229 rtl::OString aUser( getUserName( pBook ) );
230 const char *pAuth = e_source_get_property( pSource, "auth" );
231 bAuthSuccess = e_book_authenticate_user( pBook, aUser, rPassword, pAuth, pError );
232 }
233
234 if (bAuthSuccess)
235 bSuccess = e_book_get_contacts( pBook, pQuery, ppList, pError );
236
237 return bSuccess;
238 }
239
240 static int
whichAddress(int value)241 whichAddress(int value)
242 {
243 int fieldEnum;
244 switch (value)
245 {
246 case HOME_ADDR_LINE1:
247 case HOME_ADDR_LINE2:
248 case HOME_CITY:
249 case HOME_STATE:
250 case HOME_COUNTRY:
251 case HOME_ZIP:
252 fieldEnum = e_contact_field_id("address_home");
253 break;
254
255 case WORK_ADDR_LINE1:
256 case WORK_ADDR_LINE2:
257 case WORK_CITY:
258 case WORK_STATE:
259 case WORK_COUNTRY:
260 case WORK_ZIP:
261 fieldEnum = e_contact_field_id("address_work");
262 break;
263
264 case OTHER_ADDR_LINE1:
265 case OTHER_ADDR_LINE2:
266 case OTHER_CITY:
267 case OTHER_STATE:
268 case OTHER_COUNTRY:
269 case OTHER_ZIP:
270 fieldEnum = e_contact_field_id("address_other");
271 break;
272
273 default: fieldEnum = e_contact_field_id("address_home");
274 }
275 return fieldEnum;
276 }
277
278 /*
279 * This function decides the default column values based on the first field of EContactAddress.
280 * The search order is Work->Home->other(defaults).
281 */
282 static EContactAddress *
getDefaultContactAddress(EContact * pContact,int * value)283 getDefaultContactAddress( EContact *pContact,int *value )
284 {
285 EContactAddress *ec = (EContactAddress *)e_contact_get(pContact,whichAddress(WORK_ADDR_LINE1));
286 if ( ec && (strlen(ec->street)>0) )
287 {
288 *value= *value +WORK_ADDR_LINE1 -1;
289 return ec;
290 }
291 else
292 {
293 ec = (EContactAddress *)e_contact_get(pContact,whichAddress(HOME_ADDR_LINE1));
294 if ( ec && (strlen(ec->street)>0) )
295 {
296 *value=*value+HOME_ADDR_LINE1-1;
297 return ec;
298 }
299 }
300
301 *value=*value+OTHER_ADDR_LINE1-1;
302 return (EContactAddress *)e_contact_get(pContact,whichAddress(OTHER_ADDR_LINE1));
303 }
304
305 static EContactAddress*
getContactAddress(EContact * pContact,int * address_enum)306 getContactAddress( EContact *pContact, int * address_enum )
307 {
308 EContactAddress *ec = NULL;
309 switch (*address_enum) {
310
311 case DEFAULT_ADDR_LINE1:
312 case DEFAULT_ADDR_LINE2:
313 case DEFAULT_CITY:
314 case DEFAULT_STATE:
315 case DEFAULT_COUNTRY:
316 case DEFAULT_ZIP:
317 ec = getDefaultContactAddress(pContact,address_enum);break;
318 default:
319 ec = (EContactAddress *)e_contact_get(pContact,whichAddress(*address_enum));
320 }
321 return ec;
322 }
323
324 static bool
handleSplitAddress(EContact * pContact,GValue * pStackValue,int value)325 handleSplitAddress( EContact *pContact,GValue *pStackValue, int value )
326 {
327 EContactAddress *ec = getContactAddress(pContact,&value) ;
328
329 if (ec==NULL)
330 return true;
331
332 switch (value) {
333 case WORK_ADDR_LINE1:
334 g_value_set_string(pStackValue,ec->street ); break;
335 case WORK_ADDR_LINE2:
336 g_value_set_string(pStackValue,ec->po ); break;
337 case WORK_CITY:
338 g_value_set_string(pStackValue,ec->locality ); break;
339 case WORK_STATE:
340 g_value_set_string(pStackValue,ec->region ); break;
341 case WORK_COUNTRY:
342 g_value_set_string(pStackValue,ec->country ); break;
343 case WORK_ZIP:
344 g_value_set_string(pStackValue,ec->code ); break;
345
346 case HOME_ADDR_LINE1:
347 g_value_set_string(pStackValue,ec->street ); break;
348 case HOME_ADDR_LINE2:
349 g_value_set_string(pStackValue,ec->po ); break;
350 case HOME_CITY:
351 g_value_set_string(pStackValue,ec->locality ); break;
352 case HOME_STATE:
353 g_value_set_string(pStackValue,ec->region ); break;
354 case HOME_COUNTRY:
355 g_value_set_string(pStackValue,ec->country ); break;
356 case HOME_ZIP:
357 g_value_set_string(pStackValue,ec->code ); break;
358
359 case OTHER_ADDR_LINE1:
360 g_value_set_string(pStackValue,ec->street ); break;
361 case OTHER_ADDR_LINE2:
362 g_value_set_string(pStackValue,ec->po ); break;
363 case OTHER_CITY:
364 g_value_set_string(pStackValue,ec->locality ); break;
365 case OTHER_STATE:
366 g_value_set_string(pStackValue,ec->region ); break;
367 case OTHER_COUNTRY:
368 g_value_set_string(pStackValue,ec->country ); break;
369 case OTHER_ZIP:
370 g_value_set_string(pStackValue,ec->code ); break;
371
372 }
373
374 return false;
375 }
376 static bool
getValue(EContact * pContact,sal_Int32 nColumnNum,GType nType,GValue * pStackValue,bool & _out_rWasNull)377 getValue( EContact* pContact, sal_Int32 nColumnNum, GType nType, GValue* pStackValue, bool& _out_rWasNull )
378 {
379 const ColumnProperty * pSpecs = evoab::getField( nColumnNum );
380 if ( !pSpecs )
381 return false;
382
383 GParamSpec* pSpec = pSpecs->pField;
384 gboolean bIsSplittedColumn = pSpecs->bIsSplittedValue;
385
386 _out_rWasNull = true;
387 if ( !pSpec || !pContact)
388 return false;
389
390 if ( G_PARAM_SPEC_VALUE_TYPE (pSpec) != nType )
391 {
392
393 OSL_TRACE( "Wrong type (0x%x) (0x%x) '%s'",
394 (int)G_PARAM_SPEC_VALUE_TYPE (pSpec), (int) nType,
395 pSpec->name ? pSpec->name : "<noname>");
396 return false;
397 }
398
399 g_value_init( pStackValue, nType );
400 if ( bIsSplittedColumn )
401 {
402 const SplitEvoColumns* evo_addr( get_evo_addr() );
403 for (int i=0;i<OTHER_ZIP;i++)
404 {
405 if (0 == strcmp (g_param_spec_get_name ((GParamSpec *)pSpec), evo_addr[i].pColumnName))
406 {
407 _out_rWasNull = handleSplitAddress( pContact, pStackValue, evo_addr[i].value );
408 return true;
409 }
410 }
411 }
412 else
413 {
414 g_object_get_property( G_OBJECT (pContact),
415 g_param_spec_get_name ((GParamSpec *) pSpec),
416 pStackValue );
417 if ( G_VALUE_TYPE( pStackValue ) != nType )
418 {
419 OSL_TRACE( "Fetched type mismatch" );
420 g_value_unset( pStackValue );
421 return false;
422 }
423 }
424 _out_rWasNull = false;
425 return true;
426 }
427
428 namespace
429 {
430 struct ComparisonData
431 {
432 const SortDescriptor& rSortOrder;
433 IntlWrapper aIntlWrapper;
434
ComparisonDataconnectivity::evoab::__anon1be2bd1b0111::ComparisonData435 ComparisonData( const SortDescriptor& _rSortOrder, const Reference< XMultiServiceFactory >& _rxFactory )
436 :rSortOrder( _rSortOrder )
437 ,aIntlWrapper( _rxFactory, SvtSysLocale().GetLocaleData().getLocale() )
438 {
439 }
440 };
441 }
442
443 extern "C"
CompareContacts(gconstpointer _lhs,gconstpointer _rhs,gpointer _userData)444 int CompareContacts( gconstpointer _lhs, gconstpointer _rhs, gpointer _userData )
445 {
446 EContact* lhs = static_cast< EContact* >( const_cast< gpointer >( _lhs ) );
447 EContact* rhs = static_cast< EContact* >( const_cast< gpointer >( _rhs ) );
448
449 GValue aLhsValue = { 0, { { 0 } } };
450 GValue aRhsValue = { 0, { { 0 } } };
451 bool bLhsNull = true;
452 bool bRhsNull = true;
453
454 ::rtl::OUString sLhs, sRhs;
455 bool bLhs(false), bRhs(false);
456
457 const ComparisonData& rCompData = *static_cast< const ComparisonData* >( _userData );
458 for ( SortDescriptor::const_iterator sortCol = rCompData.rSortOrder.begin();
459 sortCol != rCompData.rSortOrder.end();
460 ++sortCol
461 )
462 {
463 sal_Int32 nField = sortCol->nField;
464 GType eFieldType = evoab::getGFieldType( nField );
465
466 bool success = getValue( lhs, nField, eFieldType, &aLhsValue, bLhsNull )
467 && getValue( rhs, nField, eFieldType, &aRhsValue, bRhsNull );
468 OSL_ENSURE( success, "CompareContacts: could not retrieve both values!" );
469 if ( !success )
470 return 0;
471
472 if ( bLhsNull && !bRhsNull )
473 return -1;
474 if ( !bLhsNull && bRhsNull )
475 return 1;
476 if ( bLhsNull && bRhsNull )
477 continue;
478
479 if ( eFieldType == G_TYPE_STRING )
480 {
481 sLhs = valueToOUString( aLhsValue );
482 sRhs = valueToOUString( aRhsValue );
483 sal_Int32 nCompResult = rCompData.aIntlWrapper.getCaseCollator()->compareString( sLhs, sRhs );
484 if ( nCompResult != 0 )
485 return nCompResult;
486 continue;
487 }
488
489 bLhs = valueToBool( aLhsValue );
490 bRhs = valueToBool( aRhsValue );
491 if ( bLhs && !bRhs )
492 return -1;
493 if ( !bLhs && bRhs )
494 return 1;
495 continue;
496 }
497
498 return 0;
499 }
500
501 static GList*
sortContacts(GList * _pContactList,const ComparisonData & _rCompData)502 sortContacts( GList* _pContactList, const ComparisonData& _rCompData )
503 {
504 OSL_ENSURE( !_rCompData.rSortOrder.empty(), "sortContacts: no need to call this without any sort order!" );
505 ENSURE_OR_THROW( _rCompData.aIntlWrapper.getCaseCollator(), "no collator for comparing strings" );
506
507 return g_list_sort_with_data( _pContactList, &CompareContacts, const_cast< gpointer >( static_cast< gconstpointer >( &_rCompData ) ) );
508 }
509
510 // -------------------------------------------------------------------------
construct(const QueryData & _rData)511 void OEvoabResultSet::construct( const QueryData& _rData )
512 {
513 ENSURE_OR_THROW( _rData.getQuery(), "internal error: no EBookQuery" );
514
515 EBook *pBook = openBook( ::rtl::OUStringToOString( _rData.sTable, RTL_TEXTENCODING_UTF8 ) );
516 if ( !pBook )
517 m_pConnection->throwGenericSQLException( STR_CANNOT_OPEN_BOOK, *this );
518
519 g_list_free(m_pContacts);
520 m_pContacts = NULL;
521 bool bExecuteQuery = true;
522 switch ( _rData.eFilterType )
523 {
524 case eFilterNone:
525 if ( !isLocal( pBook ) )
526 {
527 SQLError aErrorFactory( m_pConnection->getDriver().getMSFactory() );
528 SQLException aAsException = aErrorFactory.getSQLException( ErrorCondition::DATA_CANNOT_SELECT_UNFILTERED, *this );
529 m_aWarnings.appendWarning( SQLWarning(
530 aAsException.Message,
531 aAsException.Context,
532 aAsException.SQLState,
533 aAsException.ErrorCode,
534 aAsException.NextException
535 ) );
536 bExecuteQuery = false;
537 }
538 break;
539 case eFilterAlwaysFalse:
540 bExecuteQuery = false;
541 break;
542 case eFilterOther:
543 bExecuteQuery = true;
544 break;
545 }
546 if ( bExecuteQuery )
547 {
548 rtl::OString aPassword = m_pConnection->getPassword();
549 executeQuery( pBook, _rData.getQuery(), &m_pContacts, aPassword, NULL );
550 m_pConnection->setPassword( aPassword );
551
552 if ( m_pContacts && !_rData.aSortOrder.empty() )
553 {
554 ComparisonData aCompData( _rData.aSortOrder, getConnection()->getDriver().getMSFactory() );
555 m_pContacts = sortContacts( m_pContacts, aCompData );
556 }
557 }
558 m_nLength = g_list_length( m_pContacts );
559 OSL_TRACE( "Query return %d records", m_nLength );
560 m_nIndex = -1;
561
562 // create our meta data (need the EBookQuery for this)
563 OEvoabResultSetMetaData* pMeta = new OEvoabResultSetMetaData( _rData.sTable );
564 m_xMetaData = pMeta;
565
566 pMeta->setEvoabFields( _rData.xSelectColumns );
567 }
568
569 // -------------------------------------------------------------------------
disposing(void)570 void OEvoabResultSet::disposing(void)
571 {
572 ::comphelper::OPropertyContainer::disposing();
573
574 ::osl::MutexGuard aGuard(m_aMutex);
575 g_list_free(m_pContacts);
576 m_pContacts = NULL;
577 m_pStatement = NULL;
578 m_xMetaData.clear();
579 }
580 // -------------------------------------------------------------------------
queryInterface(const Type & rType)581 Any SAL_CALL OEvoabResultSet::queryInterface( const Type & rType ) throw(RuntimeException)
582 {
583 Any aRet = ::comphelper::OPropertyContainer::queryInterface(rType);
584 if(!aRet.hasValue())
585 aRet = OResultSet_BASE::queryInterface(rType);
586 return aRet;
587 }
588 // -------------------------------------------------------------------------
getTypes()589 Sequence< Type > SAL_CALL OEvoabResultSet::getTypes( ) throw( RuntimeException)
590 {
591 return ::comphelper::concatSequences(
592 OResultSet_BASE::getTypes(),
593 ::comphelper::OPropertyContainer::getTypes()
594 );
595 }
596
597 // -------------------------------------------------------------------------
598 // XRow Interface
599
600 /**
601 * getString:
602 * @nColumnNum: The column index from the table.
603 *
604 * If the equivalent NResultSetMetaData.cxx marks the columntype of
605 * nColumnNum as DataType::VARCHAR this accessor is used.
606 */
getString(sal_Int32 nColumnNum)607 ::rtl::OUString SAL_CALL OEvoabResultSet::getString( sal_Int32 nColumnNum ) throw(SQLException, RuntimeException)
608 {
609 ::osl::MutexGuard aGuard( m_aMutex );
610 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
611 rtl::OUString aResult;
612 if ( m_xMetaData.is())
613 {
614 OEvoabResultSetMetaData *pMeta = (OEvoabResultSetMetaData *) m_xMetaData.get();
615 sal_Int32 nFieldNumber = pMeta->fieldAtColumn(nColumnNum);
616 GValue aValue = { 0, { { 0 } } };
617 if ( getValue( getCur(), nFieldNumber, G_TYPE_STRING, &aValue, m_bWasNull ) )
618 aResult = valueToOUString( aValue );
619 }
620 return aResult;
621 }
622 // -------------------------------------------------------------------------
getBoolean(sal_Int32 nColumnNum)623 sal_Bool SAL_CALL OEvoabResultSet::getBoolean( sal_Int32 nColumnNum ) throw(SQLException, RuntimeException)
624 {
625 ::osl::MutexGuard aGuard( m_aMutex );
626 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
627 sal_Bool bResult = sal_False;
628
629 if ( m_xMetaData.is())
630 {
631 OEvoabResultSetMetaData *pMeta = (OEvoabResultSetMetaData *) m_xMetaData.get();
632 sal_Int32 nFieldNumber = pMeta->fieldAtColumn(nColumnNum);
633 GValue aValue = { 0, { { 0 } } };
634 if ( getValue( getCur(), nFieldNumber, G_TYPE_BOOLEAN, &aValue, m_bWasNull ) )
635 bResult = valueToBool( aValue );
636 }
637 return bResult ? sal_True : sal_False;
638 }
639 // -------------------------------------------------------------------------
getLong(sal_Int32)640 sal_Int64 SAL_CALL OEvoabResultSet::getLong( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
641 {
642 ::dbtools::throwFunctionNotSupportedException( "XRow::getLong", *this );
643 return sal_Int64();
644 }
645 // -------------------------------------------------------------------------
getArray(sal_Int32)646 Reference< XArray > SAL_CALL OEvoabResultSet::getArray( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
647 {
648 ::dbtools::throwFunctionNotSupportedException( "XRow::getArray", *this );
649 return NULL;
650 }
651 // -------------------------------------------------------------------------
getClob(sal_Int32)652 Reference< XClob > SAL_CALL OEvoabResultSet::getClob( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
653 {
654 ::dbtools::throwFunctionNotSupportedException( "XRow::getClob", *this );
655 return NULL;
656 }
657 // -------------------------------------------------------------------------
getBlob(sal_Int32)658 Reference< XBlob > SAL_CALL OEvoabResultSet::getBlob( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
659 {
660 ::dbtools::throwFunctionNotSupportedException( "XRow::getBlob", *this );
661 return NULL;
662 }
663 // -------------------------------------------------------------------------
getRef(sal_Int32)664 Reference< XRef > SAL_CALL OEvoabResultSet::getRef( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
665 {
666 ::dbtools::throwFunctionNotSupportedException( "XRow::getRef", *this );
667 return NULL;
668 }
669 // -------------------------------------------------------------------------
getObject(sal_Int32,const Reference<::com::sun::star::container::XNameAccess> &)670 Any SAL_CALL OEvoabResultSet::getObject( sal_Int32 /*nColumnNum*/, const Reference< ::com::sun::star::container::XNameAccess >& /*typeMap*/ ) throw(SQLException, RuntimeException)
671 {
672 ::dbtools::throwFunctionNotSupportedException( "XRow::getObject", *this );
673 return Any();
674 }
675 // -------------------------------------------------------------------------
getShort(sal_Int32)676 sal_Int16 SAL_CALL OEvoabResultSet::getShort( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
677 {
678 ::dbtools::throwFunctionNotSupportedException( "XRow::getShort", *this );
679 return 0;
680 }
681 // -------------------------------------------------------------------------
getTime(sal_Int32)682 ::com::sun::star::util::Time SAL_CALL OEvoabResultSet::getTime( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
683 {
684 ::dbtools::throwFunctionNotSupportedException( "XRow::getTime", *this );
685 return ::com::sun::star::util::Time();
686 }
687 // -------------------------------------------------------------------------
getTimestamp(sal_Int32)688 util::DateTime SAL_CALL OEvoabResultSet::getTimestamp( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
689 {
690 ::dbtools::throwFunctionNotSupportedException( "XRow::getTimestamp", *this );
691 return ::com::sun::star::util::DateTime();
692 }
693 // -------------------------------------------------------------------------
getBinaryStream(sal_Int32)694 Reference< XInputStream > SAL_CALL OEvoabResultSet::getBinaryStream( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
695 {
696 ::dbtools::throwFunctionNotSupportedException( "XRow::getBinaryStream", *this );
697 return NULL;
698 }
699 // -------------------------------------------------------------------------
getCharacterStream(sal_Int32)700 Reference< XInputStream > SAL_CALL OEvoabResultSet::getCharacterStream( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
701 {
702 ::dbtools::throwFunctionNotSupportedException( "XRow::getCharacterStream", *this );
703 return NULL;
704 }
705 // -------------------------------------------------------------------------
getByte(sal_Int32)706 sal_Int8 SAL_CALL OEvoabResultSet::getByte( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
707 {
708 ::dbtools::throwFunctionNotSupportedException( "XRow::getByte", *this );
709 return 0;
710 }
711 // -------------------------------------------------------------------------
getBytes(sal_Int32)712 Sequence< sal_Int8 > SAL_CALL OEvoabResultSet::getBytes( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
713 {
714 ::dbtools::throwFunctionNotSupportedException( "XRow::getBytes", *this );
715 return Sequence< sal_Int8 >();
716 }
717 // -------------------------------------------------------------------------
getDate(sal_Int32)718 ::com::sun::star::util::Date SAL_CALL OEvoabResultSet::getDate( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
719 {
720 ::dbtools::throwFunctionNotSupportedException( "XRow::getDate", *this );
721 return ::com::sun::star::util::Date();
722 }
723 // -------------------------------------------------------------------------
getDouble(sal_Int32)724 double SAL_CALL OEvoabResultSet::getDouble( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
725 {
726 ::dbtools::throwFunctionNotSupportedException( "XRow::getDouble", *this );
727 return 0;
728 }
729 // -------------------------------------------------------------------------
getFloat(sal_Int32)730 float SAL_CALL OEvoabResultSet::getFloat( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
731 {
732 ::dbtools::throwFunctionNotSupportedException( "XRow::getFloat", *this );
733 return 0;
734 }
735 // -------------------------------------------------------------------------
getInt(sal_Int32)736 sal_Int32 SAL_CALL OEvoabResultSet::getInt( sal_Int32 /*nColumnNum*/ ) throw(SQLException, RuntimeException)
737 {
738 ::dbtools::throwFunctionNotSupportedException( "XRow::getInt", *this );
739 return 0;
740 }
741 // XRow Interface Ends
742 // -------------------------------------------------------------------------
743
744 // XResultSetMetaDataSupplier Interface
getMetaData()745 Reference< XResultSetMetaData > SAL_CALL OEvoabResultSet::getMetaData( ) throw(SQLException, RuntimeException)
746 {
747 ::osl::MutexGuard aGuard( m_aMutex );
748 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
749
750 // the meta data should have been created at construction time
751 ENSURE_OR_THROW( m_xMetaData.is(), "internal error: no meta data" );
752 return m_xMetaData;
753 }
754 // XResultSetMetaDataSupplier Interface Ends
755 // -------------------------------------------------------------------------
756
757 // XResultSet Interface
next()758 sal_Bool SAL_CALL OEvoabResultSet::next( ) throw(SQLException, RuntimeException)
759 {
760 ::osl::MutexGuard aGuard( m_aMutex );
761 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
762 if (m_nIndex+1 < m_nLength) {
763 ++m_nIndex ;
764 return true;
765 }
766 else
767 return false;
768 }
769 // -------------------------------------------------------------------------
wasNull()770 sal_Bool SAL_CALL OEvoabResultSet::wasNull( ) throw(SQLException, RuntimeException)
771 {
772 ::osl::MutexGuard aGuard( m_aMutex );
773 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
774
775 return m_bWasNull;
776 }
777 // -------------------------------------------------------------------------
isBeforeFirst()778 sal_Bool SAL_CALL OEvoabResultSet::isBeforeFirst( ) throw(SQLException, RuntimeException)
779 {
780 ::osl::MutexGuard aGuard( m_aMutex );
781 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
782
783 return m_nIndex < 0;
784 }
785 // -------------------------------------------------------------------------
getRow()786 sal_Int32 SAL_CALL OEvoabResultSet::getRow( ) throw(SQLException, RuntimeException)
787 {
788 ::osl::MutexGuard aGuard( m_aMutex );
789 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
790
791 return m_nIndex;
792 }
793 // -------------------------------------------------------------------------
isAfterLast()794 sal_Bool SAL_CALL OEvoabResultSet::isAfterLast( ) throw(SQLException, RuntimeException)
795 {
796 ::osl::MutexGuard aGuard( m_aMutex );
797 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
798
799 return m_nIndex >= m_nLength;
800 }
801 // -------------------------------------------------------------------------
isFirst()802 sal_Bool SAL_CALL OEvoabResultSet::isFirst( ) throw(SQLException, RuntimeException)
803 {
804 ::osl::MutexGuard aGuard( m_aMutex );
805 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
806
807 return m_nIndex == 0;
808 }
809 // -------------------------------------------------------------------------
isLast()810 sal_Bool SAL_CALL OEvoabResultSet::isLast( ) throw(SQLException, RuntimeException)
811 {
812 ::osl::MutexGuard aGuard( m_aMutex );
813 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
814
815 return m_nIndex == m_nLength - 1;
816 }
817 // -------------------------------------------------------------------------
beforeFirst()818 void SAL_CALL OEvoabResultSet::beforeFirst( ) throw(SQLException, RuntimeException)
819 {
820 ::osl::MutexGuard aGuard( m_aMutex );
821 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
822
823 m_nIndex = -1;
824 }
825 // -------------------------------------------------------------------------
afterLast()826 void SAL_CALL OEvoabResultSet::afterLast( ) throw(SQLException, RuntimeException)
827 {
828 ::osl::MutexGuard aGuard( m_aMutex );
829 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
830
831 m_nIndex = m_nLength;
832 }
833 // -------------------------------------------------------------------------
834
first()835 sal_Bool SAL_CALL OEvoabResultSet::first( ) throw(SQLException, RuntimeException)
836 {
837 ::osl::MutexGuard aGuard( m_aMutex );
838 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
839
840 m_nIndex = 0;
841 return true;
842 }
843 // -------------------------------------------------------------------------
844
last()845 sal_Bool SAL_CALL OEvoabResultSet::last( ) throw(SQLException, RuntimeException)
846 {
847 ::osl::MutexGuard aGuard( m_aMutex );
848 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
849
850 m_nIndex = m_nLength - 1;
851 return true;
852 }
853 // -------------------------------------------------------------------------
absolute(sal_Int32 row)854 sal_Bool SAL_CALL OEvoabResultSet::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
855 {
856 ::osl::MutexGuard aGuard( m_aMutex );
857 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
858 if (row < m_nLength) {
859 m_nIndex = row;
860 return true;
861 }
862 else
863 return false;
864 }
865 // -------------------------------------------------------------------------
relative(sal_Int32 row)866 sal_Bool SAL_CALL OEvoabResultSet::relative( sal_Int32 row ) throw(SQLException, RuntimeException)
867 {
868 ::osl::MutexGuard aGuard( m_aMutex );
869 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
870
871 if ((m_nIndex+row) < m_nLength) {
872 m_nIndex += row;
873 return true;
874 }
875 else
876 return false;
877 }
878 // -------------------------------------------------------------------------
previous()879 sal_Bool SAL_CALL OEvoabResultSet::previous( ) throw(SQLException, RuntimeException)
880 {
881 ::osl::MutexGuard aGuard( m_aMutex );
882 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
883
884 if(m_nIndex > 0) {
885 m_nIndex--;
886 return true;
887 }
888 else
889 return false;
890 }
891 // -------------------------------------------------------------------------
getStatement()892 Reference< XInterface > SAL_CALL OEvoabResultSet::getStatement( ) throw(SQLException, RuntimeException)
893 {
894 ::osl::MutexGuard aGuard( m_aMutex );
895 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
896 ::com::sun::star::uno::WeakReferenceHelper aStatement((OWeakObject*)m_pStatement);
897 return aStatement.get();
898 }
899 // -------------------------------------------------------------------------
900
rowDeleted()901 sal_Bool SAL_CALL OEvoabResultSet::rowDeleted( ) throw(SQLException, RuntimeException)
902 {
903 ::osl::MutexGuard aGuard( m_aMutex );
904 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
905
906 return sal_False;
907 }
908 // -------------------------------------------------------------------------
rowInserted()909 sal_Bool SAL_CALL OEvoabResultSet::rowInserted( ) throw(SQLException, RuntimeException)
910 {
911 ::osl::MutexGuard aGuard( m_aMutex );
912 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
913
914 return sal_False;
915 }
916 // -------------------------------------------------------------------------
rowUpdated()917 sal_Bool SAL_CALL OEvoabResultSet::rowUpdated( ) throw(SQLException, RuntimeException)
918 {
919 ::osl::MutexGuard aGuard( m_aMutex );
920 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
921
922 return sal_False;
923 }
924 // -------------------------------------------------------------------------
refreshRow()925 void SAL_CALL OEvoabResultSet::refreshRow( ) throw(SQLException, RuntimeException)
926 {
927 ::osl::MutexGuard aGuard( m_aMutex );
928 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
929 }
930 //XResult Interface ends
931 // -------------------------------------------------------------------------
932 // XCancellable
933
cancel()934 void SAL_CALL OEvoabResultSet::cancel( ) throw(RuntimeException)
935 {
936 ::osl::MutexGuard aGuard( m_aMutex );
937 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
938 OSL_TRACE("In/Out: OEvoabResultSet::cancel" );
939
940 }
941
942 //XCloseable
close()943 void SAL_CALL OEvoabResultSet::close( ) throw(SQLException, RuntimeException)
944 {
945 {
946 ::osl::MutexGuard aGuard( m_aMutex );
947 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
948 }
949 OSL_TRACE("In/Out: OEvoabResultSet::close" );
950 dispose();
951 }
952
953 // XWarningsSupplier
954 // -------------------------------------------------------------------------
clearWarnings()955 void SAL_CALL OEvoabResultSet::clearWarnings( ) throw(SQLException, RuntimeException)
956 {
957 OSL_TRACE("In/Out: OEvoabResultSet::clearWarnings" );
958 m_aWarnings.clearWarnings();
959 }
960 // -------------------------------------------------------------------------
getWarnings()961 Any SAL_CALL OEvoabResultSet::getWarnings( ) throw(SQLException, RuntimeException)
962 {
963 OSL_TRACE("In/Out: OEvoabResultSet::getWarnings" );
964 return m_aWarnings.getWarnings();
965 }
966 // -------------------------------------------------------------------------
967 //XColumnLocate Interface
findColumn(const::rtl::OUString & columnName)968 sal_Int32 SAL_CALL OEvoabResultSet::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException)
969 {
970 ::osl::MutexGuard aGuard( m_aMutex );
971 checkDisposed(OResultSet_BASE::rBHelper.bDisposed);
972
973 // find the first column with the name columnName
974 Reference< XResultSetMetaData > xMeta = getMetaData();
975 sal_Int32 nLen = xMeta->getColumnCount();
976 sal_Int32 i = 1;
977 for(;i<=nLen;++i)
978 if(xMeta->isCaseSensitive(i) ? columnName == xMeta->getColumnName(i) :
979 columnName.equalsIgnoreAsciiCase(xMeta->getColumnName(i)))
980 break;
981 return i;
982 }
983 // -------------------------------------------------------------------------
984 //XColumnLocate interface ends
985
986 // -------------------------------------------------------------------------
createArrayHelper() const987 ::cppu::IPropertyArrayHelper* OEvoabResultSet::createArrayHelper( ) const
988 {
989 Sequence< Property > aProps;
990 describeProperties( aProps );
991 return new ::cppu::OPropertyArrayHelper( aProps );
992 }
993 // -------------------------------------------------------------------------
getInfoHelper()994 ::cppu::IPropertyArrayHelper & OEvoabResultSet::getInfoHelper()
995 {
996 return *const_cast<OEvoabResultSet*>(this)->getArrayHelper();
997 }
998 // -----------------------------------------------------------------------------
acquire()999 void SAL_CALL OEvoabResultSet::acquire() throw()
1000 {
1001 OResultSet_BASE::acquire();
1002 }
1003 // -----------------------------------------------------------------------------
release()1004 void SAL_CALL OEvoabResultSet::release() throw()
1005 {
1006 OResultSet_BASE::release();
1007 }
1008 // -----------------------------------------------------------------------------
1009 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()1010 OEvoabResultSet::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException)
1011 {
1012 return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
1013 }
1014 // -----------------------------------------------------------------------------
1015
1016 } } // connectivity::evoab
1017