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 // MARKER(update_precomp.py): autogen include statement, do not remove
24 #include "precompiled_dbaccess.hxx"
25
26 #include "DatabaseDataProvider.hxx"
27 #include "dbastrings.hrc"
28 #include "cppuhelper/implbase1.hxx"
29 #include <comphelper/types.hxx>
30 #include <comphelper/namedvaluecollection.hxx>
31 #include <connectivity/FValue.hxx>
32 #include <connectivity/dbtools.hxx>
33 #include <rtl/ustrbuf.hxx>
34 #include <rtl/math.hxx>
35 #include <tools/diagnose_ex.h>
36
37 #include <com/sun/star/task/XInteractionHandler.hpp>
38 #include <com/sun/star/sdb/XCompletedExecution.hpp>
39 #include <com/sun/star/sdb/CommandType.hpp>
40 #include <com/sun/star/sdbc/DataType.hpp>
41 #include <com/sun/star/sdbc/XRow.hpp>
42 #include <com/sun/star/sdbc/XResultSet.hpp>
43 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
44 #include <com/sun/star/sdbc/XResultSetMetaData.hpp>
45 #include <com/sun/star/sdbc/XColumnLocate.hpp>
46 #include <com/sun/star/beans/NamedValue.hpp>
47 #include <com/sun/star/chart/ChartDataRowSource.hpp>
48 #include <com/sun/star/chart/XChartDataArray.hpp>
49 #include <com/sun/star/chart/XDateCategories.hpp>
50
51 #include <vector>
52 #include <list>
53
54 namespace dbaccess
55 {
56 using namespace ::com::sun::star;
57 using ::com::sun::star::sdbc::SQLException;
58 using ::com::sun::star::uno::Reference;
59 using ::com::sun::star::uno::RuntimeException;
60 // -----------------------------------------------------------------------------
DatabaseDataProvider(uno::Reference<uno::XComponentContext> const & context)61 DatabaseDataProvider::DatabaseDataProvider(uno::Reference< uno::XComponentContext > const & context) :
62 TDatabaseDataProvider(m_aMutex),
63 ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >(
64 context, static_cast< Implements >(
65 IMPLEMENTS_PROPERTY_SET), uno::Sequence< ::rtl::OUString >()),
66 m_aParameterManager( m_aMutex, uno::Reference< lang::XMultiServiceFactory >(context->getServiceManager(),uno::UNO_QUERY) ),
67 m_aFilterManager( uno::Reference< lang::XMultiServiceFactory >(context->getServiceManager(),uno::UNO_QUERY) ),
68 m_xContext(context),
69 m_CommandType(sdb::CommandType::COMMAND), // #i94114
70 m_RowLimit(0),
71 m_EscapeProcessing(sal_True),
72 m_ApplyFilter(sal_True)
73 {
74 m_xInternal.set( m_xContext->getServiceManager()->createInstanceWithContext(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.chart.InternalDataProvider")),m_xContext ), uno::UNO_QUERY );
75 m_xRangeConversion.set(m_xInternal,uno::UNO_QUERY);
76 m_xComplexDescriptionAccess.set(m_xInternal,uno::UNO_QUERY);
77
78 osl_incrementInterlockedCount( &m_refCount );
79 {
80 m_xRowSet.set( m_xContext->getServiceManager()->createInstanceWithContext(SERVICE_SDB_ROWSET,m_xContext ), uno::UNO_QUERY );
81 m_xAggregate.set(m_xRowSet,uno::UNO_QUERY);
82 m_xAggregateSet.set(m_xRowSet,uno::UNO_QUERY);
83 uno::Reference<beans::XPropertySet> xProp(static_cast< ::cppu::OWeakObject* >( this ),uno::UNO_QUERY);
84 m_aFilterManager.initialize( m_xAggregateSet );
85 m_aParameterManager.initialize( xProp, m_xAggregate );
86 m_xAggregateSet->setPropertyValue(PROPERTY_COMMAND_TYPE,uno::makeAny(m_CommandType));
87 m_xAggregateSet->setPropertyValue(PROPERTY_ESCAPE_PROCESSING,uno::makeAny(m_EscapeProcessing));
88 }
89 osl_decrementInterlockedCount( &m_refCount );
90 }
91 // -----------------------------------------------------------------------------
disposing()92 void SAL_CALL DatabaseDataProvider::disposing()
93 {
94 lang::EventObject aEvt(static_cast<XWeak*>(this));
95 m_aParameterManager.disposing( aEvt );
96
97 m_aParameterManager.dispose(); // (to free any references it may have to me)
98 m_aFilterManager.dispose(); // (dito)
99
100 m_xParent.clear();
101 m_xAggregateSet.clear();
102 m_xAggregate.clear();
103 m_xRangeConversion.clear();
104 ::comphelper::disposeComponent(m_xRowSet);
105 ::comphelper::disposeComponent(m_xInternal);
106 m_xActiveConnection.clear();
107 }
108 // -----------------------------------------------------------------------------
queryInterface(uno::Type const & type)109 uno::Any DatabaseDataProvider::queryInterface(uno::Type const & type) throw (uno::RuntimeException)
110 {
111 return TDatabaseDataProvider::queryInterface(type);
112 }
113 // -----------------------------------------------------------------------------
114
115 //------------------------------------------------------------------------------
getImplementationName_Static()116 rtl::OUString DatabaseDataProvider::getImplementationName_Static( ) throw(uno::RuntimeException)
117 {
118 return rtl::OUString::createFromAscii("com.sun.star.comp.chart2.data.DatabaseDataProvider");
119 }
120 // -----------------------------------------------------------------------------
121 // -------------------------------------------------------------------------
122 // XServiceInfo
getImplementationName()123 ::rtl::OUString SAL_CALL DatabaseDataProvider::getImplementationName( ) throw(uno::RuntimeException)
124 {
125 return getImplementationName_Static();
126 }
127 // -----------------------------------------------------------------------------
128 // -------------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)129 sal_Bool SAL_CALL DatabaseDataProvider::supportsService( const ::rtl::OUString& _rServiceName ) throw(uno::RuntimeException)
130 {
131 return ::comphelper::findValue(getSupportedServiceNames(), _rServiceName, sal_True).getLength() != 0;
132 }
133 // -----------------------------------------------------------------------------
134 //------------------------------------------------------------------------------
getSupportedServiceNames_Static()135 uno::Sequence< ::rtl::OUString > DatabaseDataProvider::getSupportedServiceNames_Static( ) throw (uno::RuntimeException)
136 {
137 uno::Sequence< rtl::OUString > aSNS( 1 );
138 aSNS[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.data.DatabaseDataProvider"));
139 return aSNS;
140 }
141 // -----------------------------------------------------------------------------
getSupportedServiceNames()142 uno::Sequence< ::rtl::OUString > SAL_CALL DatabaseDataProvider::getSupportedServiceNames( ) throw(uno::RuntimeException)
143 {
144 return getSupportedServiceNames_Static();
145 }
146 // -----------------------------------------------------------------------------
Create(uno::Reference<uno::XComponentContext> const & context)147 uno::Reference< uno::XInterface > DatabaseDataProvider::Create(uno::Reference< uno::XComponentContext > const & context)
148 {
149 return *(new DatabaseDataProvider(context)) ;
150 }
151 // -----------------------------------------------------------------------------
152 // lang::XInitialization:
initialize(const uno::Sequence<uno::Any> & aArguments)153 void SAL_CALL DatabaseDataProvider::initialize(const uno::Sequence< uno::Any > & aArguments) throw (uno::RuntimeException, uno::Exception)
154 {
155 osl::MutexGuard g(m_aMutex);
156 const uno::Any* pIter = aArguments.getConstArray();
157 const uno::Any* pEnd = pIter + aArguments.getLength();
158 for(;pIter != pEnd;++pIter)
159 {
160 if ( !m_xActiveConnection.is() )
161 (*pIter) >>= m_xActiveConnection;
162 else if ( !m_xHandler.is() )
163 (*pIter) >>= m_xHandler;
164 }
165 m_xAggregateSet->setPropertyValue( PROPERTY_ACTIVE_CONNECTION, uno::makeAny( m_xActiveConnection ) );
166 }
167 // -----------------------------------------------------------------------------
168
169 // chart2::data::XDataProvider:
createDataSourcePossible(const uno::Sequence<beans::PropertyValue> & _aArguments)170 ::sal_Bool SAL_CALL DatabaseDataProvider::createDataSourcePossible(const uno::Sequence< beans::PropertyValue > & _aArguments) throw (uno::RuntimeException)
171 {
172 //::osl::ResettableMutexGuard aClearForNotifies(m_aMutex);
173 const beans::PropertyValue* pArgIter = _aArguments.getConstArray();
174 const beans::PropertyValue* pArgEnd = pArgIter + _aArguments.getLength();
175 for(;pArgIter != pArgEnd;++pArgIter)
176 {
177 if ( pArgIter->Name.equalsAscii("DataRowSource") )
178 {
179 ::com::sun::star::chart::ChartDataRowSource eRowSource = ::com::sun::star::chart::ChartDataRowSource_COLUMNS;
180 pArgIter->Value >>= eRowSource;
181 if ( eRowSource != ::com::sun::star::chart::ChartDataRowSource_COLUMNS )
182 return sal_False;
183 } // if ( pArgIter->Name.equalsAscii("DataRowSource") )
184 else if ( pArgIter->Name.equalsAscii("CellRangeRepresentation") )
185 {
186 ::rtl::OUString sRange;
187 pArgIter->Value >>= sRange;
188 if ( !sRange.equalsAscii("all") )
189 return sal_False;
190 }
191 else if ( pArgIter->Name.equalsAscii("FirstCellAsLabel") )
192 {
193 sal_Bool bFirstCellAsLabel = sal_True;
194 pArgIter->Value >>= bFirstCellAsLabel;
195 if ( !bFirstCellAsLabel )
196 return sal_False;
197 }
198 }
199 return sal_True;
200 }
201 // -----------------------------------------------------------------------------
202 // -----------------------------------------------------------------------------
createDataSource(const uno::Sequence<beans::PropertyValue> & _aArguments)203 uno::Reference< chart2::data::XDataSource > SAL_CALL DatabaseDataProvider::createDataSource(const uno::Sequence< beans::PropertyValue > & _aArguments) throw (uno::RuntimeException, lang::IllegalArgumentException)
204 {
205 osl::ResettableMutexGuard aClearForNotifies(m_aMutex);
206 if ( createDataSourcePossible(_aArguments) )
207 {
208 try
209 {
210 uno::Reference< chart::XChartDataArray> xChartData( m_xInternal, uno::UNO_QUERY_THROW );
211 xChartData->setData( uno::Sequence< uno::Sequence< double > >() );
212 xChartData->setColumnDescriptions( uno::Sequence< ::rtl::OUString >() );
213 if ( m_xInternal->hasDataByRangeRepresentation( ::rtl::OUString::valueOf( sal_Int32(0) ) ) )
214 m_xInternal->deleteSequence(0);
215 }
216 catch( const uno::Exception& )
217 {
218 DBG_UNHANDLED_EXCEPTION();
219 }
220
221 ::comphelper::NamedValueCollection aArgs( _aArguments );
222 const sal_Bool bHasCategories = aArgs.getOrDefault( "HasCategories", sal_True );
223 uno::Sequence< ::rtl::OUString > aColumnNames =
224 aArgs.getOrDefault( "ColumnDescriptions", uno::Sequence< ::rtl::OUString >() );
225
226 bool bRet = false;
227 if ( m_Command.getLength() != 0 && m_xActiveConnection.is() )
228 {
229 try
230 {
231 impl_fillRowSet_throw();
232 impl_executeRowSet_throw(aClearForNotifies);
233 impl_fillInternalDataProvider_throw(bHasCategories,aColumnNames);
234 bRet = true;
235 }
236 catch(const uno::Exception& /*e*/)
237 {
238 }
239 }
240 if ( !bRet ) // no command set or an error occured, use Internal data handler
241 {
242 uno::Reference< lang::XInitialization> xIni(m_xInternal,uno::UNO_QUERY);
243 if ( xIni.is() )
244 {
245 uno::Sequence< uno::Any > aInitArgs(1);
246 beans::NamedValue aParam(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CreateDefaultData")),uno::makeAny(sal_True));
247 aInitArgs[0] <<= aParam;
248 xIni->initialize(aInitArgs);
249 }
250 }
251
252 }
253 return m_xInternal->createDataSource(_aArguments);
254 }
255 // -----------------------------------------------------------------------------
256
detectArguments(const uno::Reference<chart2::data::XDataSource> & _xDataSource)257 uno::Sequence< beans::PropertyValue > SAL_CALL DatabaseDataProvider::detectArguments(const uno::Reference< chart2::data::XDataSource > & _xDataSource) throw (uno::RuntimeException)
258 {
259 ::comphelper::NamedValueCollection aArguments;
260 aArguments.put( "CellRangeRepresentation", uno::Any( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "all" ) ) ) );
261 aArguments.put( "DataRowSource", uno::makeAny( chart::ChartDataRowSource_COLUMNS ) );
262 // internal data always contains labels and categories
263 aArguments.put( "FirstCellAsLabel", uno::makeAny( sal_True ) );
264
265 sal_Bool bHasCategories = sal_False;
266 if( _xDataSource.is())
267 {
268 uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aSequences(_xDataSource->getDataSequences());
269 const sal_Int32 nCount( aSequences.getLength());
270 for( sal_Int32 nIdx=0; nIdx<nCount; ++nIdx )
271 {
272 if( aSequences[nIdx].is() )
273 {
274 uno::Reference< beans::XPropertySet > xSeqProp( aSequences[nIdx]->getValues(), uno::UNO_QUERY );
275 ::rtl::OUString aRole;
276 if ( xSeqProp.is()
277 && ( xSeqProp->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Role" ) ) ) >>= aRole )
278 && aRole.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "categories" ) )
279 )
280 {
281 bHasCategories = sal_True;
282 break;
283 }
284 }
285 }
286 }
287 aArguments.put( "HasCategories", uno::makeAny( bHasCategories ) );
288 return aArguments.getPropertyValues();
289 }
290 // -----------------------------------------------------------------------------
291
createDataSequenceByRangeRepresentationPossible(const::rtl::OUString &)292 ::sal_Bool SAL_CALL DatabaseDataProvider::createDataSequenceByRangeRepresentationPossible(const ::rtl::OUString & /*aRangeRepresentation*/) throw (uno::RuntimeException)
293 {
294 return sal_True;
295 }
296 // -----------------------------------------------------------------------------
impl_getNumberFormatKey_nothrow(const::rtl::OUString & _sRangeRepresentation) const297 uno::Any DatabaseDataProvider::impl_getNumberFormatKey_nothrow(const ::rtl::OUString & _sRangeRepresentation) const
298 {
299 ::std::map< ::rtl::OUString,com::sun::star::uno::Any>::const_iterator aFind = m_aNumberFormats.find(_sRangeRepresentation);
300 if ( aFind != m_aNumberFormats.end() )
301 return aFind->second;
302 return uno::makeAny(sal_Int32(0));
303 }
304 // -----------------------------------------------------------------------------
createDataSequenceByRangeRepresentation(const::rtl::OUString & _sRangeRepresentation)305 uno::Reference< chart2::data::XDataSequence > SAL_CALL DatabaseDataProvider::createDataSequenceByRangeRepresentation(const ::rtl::OUString & _sRangeRepresentation) throw (uno::RuntimeException, lang::IllegalArgumentException)
306 {
307 osl::MutexGuard g(m_aMutex);
308 uno::Reference< chart2::data::XDataSequence > xData = m_xInternal->createDataSequenceByRangeRepresentation(_sRangeRepresentation);;
309 uno::Reference<beans::XPropertySet> xProp(xData,uno::UNO_QUERY);
310 const static ::rtl::OUString s_sNumberFormatKey(RTL_CONSTASCII_USTRINGPARAM("NumberFormatKey"));
311 if ( xProp.is() && xProp->getPropertySetInfo()->hasPropertyByName(s_sNumberFormatKey) )
312 {
313 xProp->setPropertyValue(s_sNumberFormatKey,impl_getNumberFormatKey_nothrow(_sRangeRepresentation));
314 }
315 return xData;
316 }
317
getComplexRowDescriptions()318 uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL DatabaseDataProvider::getComplexRowDescriptions() throw (uno::RuntimeException)
319 {
320 return m_xComplexDescriptionAccess->getComplexRowDescriptions();
321 }
setComplexRowDescriptions(const uno::Sequence<uno::Sequence<::rtl::OUString>> & aRowDescriptions)322 void SAL_CALL DatabaseDataProvider::setComplexRowDescriptions( const uno::Sequence< uno::Sequence< ::rtl::OUString > >& aRowDescriptions ) throw (uno::RuntimeException)
323 {
324 m_xComplexDescriptionAccess->setComplexRowDescriptions(aRowDescriptions);
325 }
getComplexColumnDescriptions()326 uno::Sequence< uno::Sequence< rtl::OUString > > SAL_CALL DatabaseDataProvider::getComplexColumnDescriptions() throw (uno::RuntimeException)
327 {
328 return m_xComplexDescriptionAccess->getComplexColumnDescriptions();
329 }
setComplexColumnDescriptions(const uno::Sequence<uno::Sequence<rtl::OUString>> & aColumnDescriptions)330 void SAL_CALL DatabaseDataProvider::setComplexColumnDescriptions( const uno::Sequence< uno::Sequence< rtl::OUString > >& aColumnDescriptions ) throw (uno::RuntimeException)
331 {
332 m_xComplexDescriptionAccess->setComplexColumnDescriptions(aColumnDescriptions);
333 }
334 // ____ XChartDataArray ____
getData()335 uno::Sequence< uno::Sequence< double > > SAL_CALL DatabaseDataProvider::getData() throw (uno::RuntimeException)
336 {
337 return m_xComplexDescriptionAccess->getData();
338 }
339
setData(const uno::Sequence<uno::Sequence<double>> & rDataInRows)340 void SAL_CALL DatabaseDataProvider::setData( const uno::Sequence< uno::Sequence< double > >& rDataInRows ) throw (uno::RuntimeException)
341 {
342 m_xComplexDescriptionAccess->setData(rDataInRows);
343 }
344
setRowDescriptions(const uno::Sequence<rtl::OUString> & aRowDescriptions)345 void SAL_CALL DatabaseDataProvider::setRowDescriptions( const uno::Sequence< rtl::OUString >& aRowDescriptions ) throw (uno::RuntimeException)
346 {
347 m_xComplexDescriptionAccess->setRowDescriptions(aRowDescriptions);
348 }
349
setColumnDescriptions(const uno::Sequence<rtl::OUString> & aColumnDescriptions)350 void SAL_CALL DatabaseDataProvider::setColumnDescriptions( const uno::Sequence< rtl::OUString >& aColumnDescriptions ) throw (uno::RuntimeException)
351 {
352 m_xComplexDescriptionAccess->setColumnDescriptions(aColumnDescriptions);
353 }
354
getRowDescriptions()355 uno::Sequence< rtl::OUString > SAL_CALL DatabaseDataProvider::getRowDescriptions() throw (uno::RuntimeException)
356 {
357 return m_xComplexDescriptionAccess->getRowDescriptions();
358 }
359
getColumnDescriptions()360 uno::Sequence< rtl::OUString > SAL_CALL DatabaseDataProvider::getColumnDescriptions() throw (uno::RuntimeException)
361 {
362 return m_xComplexDescriptionAccess->getColumnDescriptions();
363 }
364
365 // ____ XChartData (base of XChartDataArray) ____
addChartDataChangeEventListener(const uno::Reference<::com::sun::star::chart::XChartDataChangeEventListener> & x)366 void SAL_CALL DatabaseDataProvider::addChartDataChangeEventListener(const uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& x) throw (uno::RuntimeException)
367 {
368 m_xComplexDescriptionAccess->addChartDataChangeEventListener(x);
369 }
370
removeChartDataChangeEventListener(const uno::Reference<::com::sun::star::chart::XChartDataChangeEventListener> & x)371 void SAL_CALL DatabaseDataProvider::removeChartDataChangeEventListener(const uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& x) throw (uno::RuntimeException)
372 {
373 m_xComplexDescriptionAccess->removeChartDataChangeEventListener(x);
374 }
375
getNotANumber()376 double SAL_CALL DatabaseDataProvider::getNotANumber() throw (uno::RuntimeException)
377 {
378 return m_xComplexDescriptionAccess->getNotANumber();
379 }
380
isNotANumber(double nNumber)381 ::sal_Bool SAL_CALL DatabaseDataProvider::isNotANumber( double nNumber ) throw (uno::RuntimeException)
382 {
383 return m_xComplexDescriptionAccess->isNotANumber(nNumber);
384 }
385
386 // -----------------------------------------------------------------------------
387
getRangeSelection()388 uno::Reference< sheet::XRangeSelection > SAL_CALL DatabaseDataProvider::getRangeSelection() throw (uno::RuntimeException)
389 {
390 // TODO: Exchange the default return implementation for "getRangeSelection" !!!
391 // Exchange the default return implementation.
392 // NOTE: Default initialized polymorphic structs can cause problems because of
393 // missing default initialization of primitive types of some C++ compilers or
394 // different Any initialization in Java and C++ polymorphic structs.
395 return uno::Reference< sheet::XRangeSelection >();
396 }
397 // -----------------------------------------------------------------------------
398 // chart2::data::XRangeXMLConversion:
convertRangeToXML(const::rtl::OUString & _sRangeRepresentation)399 ::rtl::OUString SAL_CALL DatabaseDataProvider::convertRangeToXML(const ::rtl::OUString & _sRangeRepresentation) throw (uno::RuntimeException, lang::IllegalArgumentException)
400 {
401 osl::MutexGuard g(m_aMutex);
402 return m_xRangeConversion->convertRangeToXML(_sRangeRepresentation);
403 }
404 // -----------------------------------------------------------------------------
405
convertRangeFromXML(const::rtl::OUString & _sXMLRange)406 ::rtl::OUString SAL_CALL DatabaseDataProvider::convertRangeFromXML(const ::rtl::OUString & _sXMLRange) throw (uno::RuntimeException, lang::IllegalArgumentException)
407 {
408 osl::MutexGuard g(m_aMutex);
409 return m_xRangeConversion->convertRangeFromXML(_sXMLRange);
410 }
411 // -----------------------------------------------------------------------------
412
413 // com.sun.star.beans.XPropertySet:
getPropertySetInfo()414 uno::Reference< beans::XPropertySetInfo > SAL_CALL DatabaseDataProvider::getPropertySetInfo() throw (uno::RuntimeException)
415 {
416 return ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::getPropertySetInfo();
417 }
418 // -----------------------------------------------------------------------------
419
setPropertyValue(const::rtl::OUString & aPropertyName,const uno::Any & aValue)420 void SAL_CALL DatabaseDataProvider::setPropertyValue(const ::rtl::OUString & aPropertyName, const uno::Any & aValue) throw (uno::RuntimeException, beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException)
421 {
422 ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::setPropertyValue(aPropertyName, aValue);
423 }
424 // -----------------------------------------------------------------------------
425
getPropertyValue(const::rtl::OUString & aPropertyName)426 uno::Any SAL_CALL DatabaseDataProvider::getPropertyValue(const ::rtl::OUString & aPropertyName) throw (uno::RuntimeException, beans::UnknownPropertyException, lang::WrappedTargetException)
427 {
428 return ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::getPropertyValue(aPropertyName);
429 }
430 // -----------------------------------------------------------------------------
431
addPropertyChangeListener(const::rtl::OUString & aPropertyName,const uno::Reference<beans::XPropertyChangeListener> & xListener)432 void SAL_CALL DatabaseDataProvider::addPropertyChangeListener(const ::rtl::OUString & aPropertyName, const uno::Reference< beans::XPropertyChangeListener > & xListener) throw (uno::RuntimeException, beans::UnknownPropertyException, lang::WrappedTargetException)
433 {
434 ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::addPropertyChangeListener(aPropertyName, xListener);
435 }
436 // -----------------------------------------------------------------------------
437
removePropertyChangeListener(const::rtl::OUString & aPropertyName,const uno::Reference<beans::XPropertyChangeListener> & xListener)438 void SAL_CALL DatabaseDataProvider::removePropertyChangeListener(const ::rtl::OUString & aPropertyName, const uno::Reference< beans::XPropertyChangeListener > & xListener) throw (uno::RuntimeException, beans::UnknownPropertyException, lang::WrappedTargetException)
439 {
440 ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::removePropertyChangeListener(aPropertyName, xListener);
441 }
442 // -----------------------------------------------------------------------------
443
addVetoableChangeListener(const::rtl::OUString & aPropertyName,const uno::Reference<beans::XVetoableChangeListener> & xListener)444 void SAL_CALL DatabaseDataProvider::addVetoableChangeListener(const ::rtl::OUString & aPropertyName, const uno::Reference< beans::XVetoableChangeListener > & xListener) throw (uno::RuntimeException, beans::UnknownPropertyException, lang::WrappedTargetException)
445 {
446 ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::addVetoableChangeListener(aPropertyName, xListener);
447 }
448 // -----------------------------------------------------------------------------
449
removeVetoableChangeListener(const::rtl::OUString & aPropertyName,const uno::Reference<beans::XVetoableChangeListener> & xListener)450 void SAL_CALL DatabaseDataProvider::removeVetoableChangeListener(const ::rtl::OUString & aPropertyName, const uno::Reference< beans::XVetoableChangeListener > & xListener) throw (uno::RuntimeException, beans::UnknownPropertyException, lang::WrappedTargetException)
451 {
452 ::cppu::PropertySetMixin< chart2::data::XDatabaseDataProvider >::removeVetoableChangeListener(aPropertyName, xListener);
453 }
454 // -----------------------------------------------------------------------------
455
456 // chart2::data::XDatabaseDataProvider:
getMasterFields()457 uno::Sequence< ::rtl::OUString > SAL_CALL DatabaseDataProvider::getMasterFields() throw (uno::RuntimeException)
458 {
459 osl::MutexGuard g(m_aMutex);
460 return m_MasterFields;
461 }
462 // -----------------------------------------------------------------------------
463
setMasterFields(const uno::Sequence<::rtl::OUString> & the_value)464 void SAL_CALL DatabaseDataProvider::setMasterFields(const uno::Sequence< ::rtl::OUString > & the_value) throw (uno::RuntimeException)
465 {
466 impl_invalidateParameter_nothrow();
467 set(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MasterFields")),the_value,m_MasterFields);
468 }
469 // -----------------------------------------------------------------------------
470
getDetailFields()471 uno::Sequence< ::rtl::OUString > SAL_CALL DatabaseDataProvider::getDetailFields() throw (uno::RuntimeException)
472 {
473 osl::MutexGuard g(m_aMutex);
474 return m_DetailFields;
475 }
476 // -----------------------------------------------------------------------------
477
setDetailFields(const uno::Sequence<::rtl::OUString> & the_value)478 void SAL_CALL DatabaseDataProvider::setDetailFields(const uno::Sequence< ::rtl::OUString > & the_value) throw (uno::RuntimeException)
479 {
480 set(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DetailFields")),the_value,m_DetailFields);
481 }
482 // -----------------------------------------------------------------------------
getCommand()483 ::rtl::OUString SAL_CALL DatabaseDataProvider::getCommand() throw (uno::RuntimeException)
484 {
485 osl::MutexGuard g(m_aMutex);
486 return m_Command;
487 }
488 // -----------------------------------------------------------------------------
489
setCommand(const::rtl::OUString & the_value)490 void SAL_CALL DatabaseDataProvider::setCommand(const ::rtl::OUString & the_value) throw (uno::RuntimeException)
491 {
492 {
493 osl::MutexGuard g(m_aMutex);
494 impl_invalidateParameter_nothrow();
495 m_xAggregateSet->setPropertyValue( PROPERTY_COMMAND, uno::makeAny( the_value ) );
496 }
497 set(PROPERTY_COMMAND,the_value,m_Command);
498 }
499 // -----------------------------------------------------------------------------
500
getCommandType()501 ::sal_Int32 SAL_CALL DatabaseDataProvider::getCommandType() throw (uno::RuntimeException)
502 {
503 osl::MutexGuard g(m_aMutex);
504 return m_CommandType;
505 }
506 // -----------------------------------------------------------------------------
507
setCommandType(::sal_Int32 the_value)508 void SAL_CALL DatabaseDataProvider::setCommandType(::sal_Int32 the_value) throw (uno::RuntimeException)
509 {
510 {
511 osl::MutexGuard g(m_aMutex);
512 m_xAggregateSet->setPropertyValue( PROPERTY_COMMAND_TYPE, uno::makeAny( the_value ) );
513 }
514 set(PROPERTY_COMMAND_TYPE,the_value,m_CommandType);
515 }
516 // -----------------------------------------------------------------------------
517
getFilter()518 ::rtl::OUString SAL_CALL DatabaseDataProvider::getFilter() throw (uno::RuntimeException)
519 {
520 osl::MutexGuard g(m_aMutex);
521 return m_aFilterManager.getFilterComponent( dbtools::FilterManager::fcPublicFilter );
522 }
523 // -----------------------------------------------------------------------------
524
setFilter(const::rtl::OUString & the_value)525 void SAL_CALL DatabaseDataProvider::setFilter(const ::rtl::OUString & the_value) throw (uno::RuntimeException)
526 {
527 {
528 osl::MutexGuard g(m_aMutex);
529 m_aFilterManager.setFilterComponent( dbtools::FilterManager::fcPublicFilter, the_value );
530 }
531 set(PROPERTY_FILTER,the_value,m_Filter);
532 }
533 // -----------------------------------------------------------------------------
getApplyFilter()534 ::sal_Bool SAL_CALL DatabaseDataProvider::getApplyFilter() throw (RuntimeException)
535 {
536 osl::MutexGuard g(m_aMutex);
537 return m_ApplyFilter;
538 }
539 // -----------------------------------------------------------------------------
setApplyFilter(::sal_Bool the_value)540 void SAL_CALL DatabaseDataProvider::setApplyFilter( ::sal_Bool the_value ) throw (RuntimeException)
541 {
542 {
543 osl::MutexGuard g(m_aMutex);
544 m_xAggregateSet->setPropertyValue( PROPERTY_APPLYFILTER, uno::makeAny( the_value ) );
545 }
546 set(PROPERTY_APPLYFILTER,the_value,m_ApplyFilter);
547 }
548 // -----------------------------------------------------------------------------
getHavingClause()549 ::rtl::OUString SAL_CALL DatabaseDataProvider::getHavingClause() throw (uno::RuntimeException)
550 {
551 osl::MutexGuard g(m_aMutex);
552 return m_HavingClause;
553 }
554 // -----------------------------------------------------------------------------
setHavingClause(const::rtl::OUString & the_value)555 void SAL_CALL DatabaseDataProvider::setHavingClause( const ::rtl::OUString& the_value ) throw (beans::UnknownPropertyException, uno::RuntimeException)
556 {
557 {
558 osl::MutexGuard g(m_aMutex);
559 m_xAggregateSet->setPropertyValue( PROPERTY_HAVING_CLAUSE, uno::makeAny( the_value ) );
560 }
561 set(PROPERTY_HAVING_CLAUSE,the_value,m_HavingClause);
562 }
563 // -----------------------------------------------------------------------------
getGroupBy()564 ::rtl::OUString SAL_CALL DatabaseDataProvider::getGroupBy() throw (uno::RuntimeException)
565 {
566 osl::MutexGuard g(m_aMutex);
567 return m_GroupBy;
568 }
569 // -----------------------------------------------------------------------------
setGroupBy(const::rtl::OUString & the_value)570 void SAL_CALL DatabaseDataProvider::setGroupBy( const ::rtl::OUString& the_value ) throw (beans::UnknownPropertyException, uno::RuntimeException)
571 {
572 {
573 osl::MutexGuard g(m_aMutex);
574 m_xAggregateSet->setPropertyValue( PROPERTY_GROUP_BY, uno::makeAny( the_value ) );
575 }
576 set(PROPERTY_GROUP_BY,the_value,m_GroupBy);
577 }
578 // -----------------------------------------------------------------------------
getOrder()579 ::rtl::OUString SAL_CALL DatabaseDataProvider::getOrder() throw (uno::RuntimeException)
580 {
581 osl::MutexGuard g(m_aMutex);
582 return m_Order;
583 }
584 // -----------------------------------------------------------------------------
setOrder(const::rtl::OUString & the_value)585 void SAL_CALL DatabaseDataProvider::setOrder( const ::rtl::OUString& the_value ) throw (uno::RuntimeException)
586 {
587 {
588 osl::MutexGuard g(m_aMutex);
589 m_xAggregateSet->setPropertyValue( PROPERTY_ORDER, uno::makeAny( the_value ) );
590 }
591 set(PROPERTY_ORDER,the_value,m_Order);
592 }
593 // -----------------------------------------------------------------------------
getEscapeProcessing()594 ::sal_Bool SAL_CALL DatabaseDataProvider::getEscapeProcessing() throw (uno::RuntimeException)
595 {
596 osl::MutexGuard g(m_aMutex);
597 return m_EscapeProcessing;
598 }
599 // -----------------------------------------------------------------------------
600
setEscapeProcessing(::sal_Bool the_value)601 void SAL_CALL DatabaseDataProvider::setEscapeProcessing(::sal_Bool the_value) throw (uno::RuntimeException)
602 {
603 set(PROPERTY_ESCAPE_PROCESSING,the_value,m_EscapeProcessing);
604 }
605 // -----------------------------------------------------------------------------
getRowLimit()606 ::sal_Int32 SAL_CALL DatabaseDataProvider::getRowLimit() throw (uno::RuntimeException)
607 {
608 osl::MutexGuard g(m_aMutex);
609 return m_RowLimit;
610 }
611 // -----------------------------------------------------------------------------
612
setRowLimit(::sal_Int32 the_value)613 void SAL_CALL DatabaseDataProvider::setRowLimit(::sal_Int32 the_value) throw (uno::RuntimeException)
614 {
615 set(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RowLimit")),the_value,m_RowLimit);
616 }
617 // -----------------------------------------------------------------------------
getActiveConnection()618 uno::Reference< sdbc::XConnection > SAL_CALL DatabaseDataProvider::getActiveConnection() throw (uno::RuntimeException)
619 {
620 osl::MutexGuard g(m_aMutex);
621 return m_xActiveConnection;
622 }
623 // -----------------------------------------------------------------------------
624
setActiveConnection(const uno::Reference<sdbc::XConnection> & the_value)625 void SAL_CALL DatabaseDataProvider::setActiveConnection(const uno::Reference< sdbc::XConnection > & the_value) throw (uno::RuntimeException, lang::IllegalArgumentException)
626 {
627 if ( !the_value.is() )
628 throw lang::IllegalArgumentException();
629 set(PROPERTY_ACTIVE_CONNECTION,the_value,m_xActiveConnection);
630 }
631 // -----------------------------------------------------------------------------
getDataSourceName()632 ::rtl::OUString SAL_CALL DatabaseDataProvider::getDataSourceName() throw (uno::RuntimeException)
633 {
634 osl::MutexGuard g(m_aMutex);
635 return m_DataSourceName;
636 }
637 // -----------------------------------------------------------------------------
638
setDataSourceName(const::rtl::OUString & the_value)639 void SAL_CALL DatabaseDataProvider::setDataSourceName(const ::rtl::OUString& the_value) throw (uno::RuntimeException)
640 {
641 set(PROPERTY_DATASOURCENAME,the_value,m_DataSourceName);
642 }
643 // -----------------------------------------------------------------------------
impl_executeRowSet_throw(::osl::ResettableMutexGuard & _rClearForNotifies)644 void DatabaseDataProvider::impl_executeRowSet_throw(::osl::ResettableMutexGuard& _rClearForNotifies)
645 {
646 if ( impl_fillParameters_nothrow(_rClearForNotifies) )
647 m_xRowSet->execute();
648 }
649
650 // -----------------------------------------------------------------------------
651 namespace
652 {
653 struct ColumnDescription
654 {
655 ::rtl::OUString sName;
656 sal_Int32 nResultSetPosition;
657 sal_Int32 nDataType;
658
ColumnDescriptiondbaccess::__anon03592e6b0111::ColumnDescription659 ColumnDescription()
660 :sName()
661 ,nResultSetPosition( 0 )
662 ,nDataType( sdbc::DataType::VARCHAR )
663 {
664 }
ColumnDescriptiondbaccess::__anon03592e6b0111::ColumnDescription665 explicit ColumnDescription( const ::rtl::OUString& i_rName )
666 :sName( i_rName )
667 ,nResultSetPosition( 0 )
668 ,nDataType( sdbc::DataType::VARCHAR )
669 {
670 }
671 };
672
673 struct CreateColumnDescription : public ::std::unary_function< ::rtl::OUString, ColumnDescription >
674 {
operator ()dbaccess::__anon03592e6b0111::CreateColumnDescription675 ColumnDescription operator()( const ::rtl::OUString& i_rName )
676 {
677 return ColumnDescription( i_rName );
678 }
679 };
680
681 struct SelectColumnName : public ::std::unary_function< ColumnDescription, ::rtl::OUString >
682 {
operator ()dbaccess::__anon03592e6b0111::SelectColumnName683 const ::rtl::OUString& operator()( const ColumnDescription& i_rColumn )
684 {
685 return i_rColumn.sName;
686 }
687 };
688 }
689
690 // -----------------------------------------------------------------------------
impl_fillInternalDataProvider_throw(sal_Bool _bHasCategories,const uno::Sequence<::rtl::OUString> & i_aColumnNames)691 void DatabaseDataProvider::impl_fillInternalDataProvider_throw(sal_Bool _bHasCategories,const uno::Sequence< ::rtl::OUString >& i_aColumnNames)
692 {
693 // clear the data before fill the new one
694 uno::Reference< sdbcx::XColumnsSupplier > xColSup(m_xRowSet,uno::UNO_QUERY_THROW);
695 uno::Reference< container::XNameAccess > xColumns( xColSup->getColumns(), uno::UNO_SET_THROW );
696 const uno::Sequence< ::rtl::OUString > aRowSetColumnNames( xColumns->getElementNames() );
697
698 typedef ::std::vector< ColumnDescription > ColumnDescriptions;
699 ColumnDescriptions aColumns;
700 bool bFirstColumnIsCategory = _bHasCategories;
701 if ( i_aColumnNames.getLength() )
702 {
703 // some normalizations ...
704 uno::Sequence< ::rtl::OUString > aImposedColumnNames( i_aColumnNames );
705
706 // strangely, there exist documents where the ColumnDescriptions end with a number of empty strings. /me
707 // thinks they're generated when you have a chart based on a result set with n columns, but remove some
708 // of those columns from the chart - it looks like a bug in the report XML export to me.
709 // So, get rid of the "trailing" empty columns
710 sal_Int32 nLastNonEmptyColName = aImposedColumnNames.getLength() - 1;
711 for ( ; nLastNonEmptyColName >= 0; --nLastNonEmptyColName )
712 {
713 if ( aImposedColumnNames[ nLastNonEmptyColName ].getLength() != 0 )
714 break;
715 }
716 aImposedColumnNames.realloc( nLastNonEmptyColName + 1 );
717
718 // second, for X-Y-charts the ColumnDescriptions exported by chart miss the name of the first (non-category)
719 // column. This, this results in a ColumnDescriptions array like <"", "col2", "col3">, where you'd expect
720 // <"col1", "col2", "col3">.
721 // Fix this with some heuristics:
722 if ( ( aImposedColumnNames.getLength() > 0 ) && ( aImposedColumnNames[0].getLength() == 0 ) )
723 {
724 const sal_Int32 nAssumedRowSetColumnIndex = _bHasCategories ? 1 : 0;
725 if ( nAssumedRowSetColumnIndex < aRowSetColumnNames.getLength() )
726 aImposedColumnNames[0] = aRowSetColumnNames[ nAssumedRowSetColumnIndex ];
727 }
728
729 const sal_Int32 nCount = aImposedColumnNames.getLength();
730 for ( sal_Int32 i = 0 ; i < nCount; ++i )
731 {
732 const ::rtl::OUString sColumnName( aImposedColumnNames[i] );
733 if ( !xColumns->hasByName( sColumnName ) )
734 continue;
735
736 if ( _bHasCategories && aColumns.empty() )
737 {
738 if ( aRowSetColumnNames.getLength() )
739 aColumns.push_back( ColumnDescription( aRowSetColumnNames[0] ) );
740 else
741 aColumns.push_back( ColumnDescription( sColumnName ) );
742 bFirstColumnIsCategory = true;
743 }
744 aColumns.push_back( ColumnDescription( sColumnName ) );
745 }
746 }
747 if ( aColumns.empty() )
748 {
749 aColumns.resize( aRowSetColumnNames.getLength() );
750 ::std::transform(
751 aRowSetColumnNames.getConstArray(),
752 aRowSetColumnNames.getConstArray() + aRowSetColumnNames.getLength(),
753 aColumns.begin(),
754 CreateColumnDescription()
755 );
756 }
757
758 // fill the data
759 uno::Reference< sdbc::XResultSet> xRes( m_xRowSet, uno::UNO_QUERY_THROW );
760 uno::Reference< sdbc::XRow> xRow( m_xRowSet,uno::UNO_QUERY_THROW );
761 uno::Reference< sdbc::XResultSetMetaDataSupplier > xSuppMeta( m_xRowSet,uno::UNO_QUERY_THROW );
762 uno::Reference< sdbc::XResultSetMetaData > xResultSetMetaData( xSuppMeta->getMetaData(), uno::UNO_SET_THROW );
763 uno::Reference< sdbc::XColumnLocate > xColumnLocate( m_xRowSet, uno::UNO_QUERY_THROW );
764
765 for ( ColumnDescriptions::iterator col = aColumns.begin();
766 col != aColumns.end();
767 ++col
768 )
769 {
770 col->nResultSetPosition = xColumnLocate->findColumn( col->sName );
771
772 const uno::Reference< beans::XPropertySet > xColumn( xColumns->getByName( col->sName ), uno::UNO_QUERY_THROW );
773 const uno::Any aNumberFormat( xColumn->getPropertyValue( PROPERTY_NUMBERFORMAT ) );
774 OSL_VERIFY( xColumn->getPropertyValue( PROPERTY_TYPE ) >>= col->nDataType );
775
776 const sal_Int32 columnIndex = col - aColumns.begin();
777 const ::rtl::OUString sRangeName = ::rtl::OUString::valueOf( columnIndex );
778 m_aNumberFormats.insert( ::std::map< ::rtl::OUString, uno::Any >::value_type( sRangeName, aNumberFormat ) );
779 }
780
781 ::std::vector< ::rtl::OUString > aRowLabels;
782 ::std::vector< ::std::vector< double > > aDataValues;
783 sal_Int32 nRowCount = 0;
784 ::connectivity::ORowSetValue aValue;
785 while( xRes->next() && (!m_RowLimit || nRowCount < m_RowLimit) )
786 {
787 ++nRowCount;
788
789 aValue.fill( aColumns[0].nResultSetPosition, aColumns[0].nDataType, xRow );
790 aRowLabels.push_back( aValue.getString() );
791
792 ::std::vector< double > aRow;
793 for ( ColumnDescriptions::const_iterator col = aColumns.begin();
794 col != aColumns.end();
795 ++col
796 )
797 {
798 if ( bFirstColumnIsCategory && ( col == aColumns.begin() ) )
799 continue;
800
801 aValue.fill( col->nResultSetPosition, col->nDataType, xRow );
802 if ( aValue.isNull() )
803 {
804 double nValue;
805 ::rtl::math::setNan( &nValue );
806 aRow.push_back( nValue );
807 }
808 else
809 aRow.push_back( aValue.getDouble() );
810 }
811
812 aDataValues.push_back( aRow );
813 }
814
815 // insert default data when no rows exist
816 if ( !nRowCount )
817 {
818 nRowCount = 3;
819 const double fDefaultData[ ] =
820 { 9.10, 3.20, 4.54,
821 2.40, 8.80, 9.65,
822 3.10, 1.50, 3.70,
823 4.30, 9.02, 6.20 };
824 for(sal_Int32 h = 0,k = 0; h < nRowCount; ++h,++k )
825 {
826 aRowLabels.push_back(::rtl::OUString::valueOf(h+1));
827 ::std::vector< double > aRow;
828 const sal_Int32 nSize = sizeof(fDefaultData)/sizeof(fDefaultData[0]);
829 for (size_t j = 0; j < (aColumns.size()-1); ++j,++k)
830 {
831 if ( k >= nSize )
832 k = 0;
833 aRow.push_back(fDefaultData[k]);
834 } // for (sal_Int32 j = 0,k = 0; j < (aColumns.size()-1); ++j,++k)
835 aDataValues.push_back(aRow);
836 }
837 } // if ( !nRowCount )
838
839 uno::Reference< chart::XChartDataArray> xData(m_xInternal,uno::UNO_QUERY);
840 xData->setRowDescriptions(uno::Sequence< ::rtl::OUString >(&(*aRowLabels.begin()),aRowLabels.size()));
841
842 const size_t nOffset = bFirstColumnIsCategory ? 1 : 0;
843 uno::Sequence< ::rtl::OUString > aColumnDescriptions( aColumns.size() - nOffset );
844 ::std::transform(
845 aColumns.begin() + nOffset,
846 aColumns.end(),
847 aColumnDescriptions.getArray(),
848 SelectColumnName()
849 );
850 xData->setColumnDescriptions( aColumnDescriptions );
851
852 uno::Sequence< uno::Sequence< double > > aData(aDataValues.size());
853 uno::Sequence< double >* pDataIter = aData.getArray();
854 uno::Sequence< double >* pDataEnd = pDataIter + aData.getLength();
855 for(sal_Int32 i= 0;pDataIter != pDataEnd; ++pDataIter,++i )
856 {
857 if ( !aDataValues[i].empty() )
858 *pDataIter = uno::Sequence< double >(&(*(aDataValues[i]).begin()),(aDataValues[i]).size());
859 }
860 xData->setData(aData);
861 }
862 // -----------------------------------------------------------------------------
impl_fillRowSet_throw()863 void DatabaseDataProvider::impl_fillRowSet_throw()
864 {
865 m_xAggregateSet->setPropertyValue( PROPERTY_FILTER, uno::makeAny( getFilter() ) );
866 uno::Reference< sdbc::XParameters> xParam(m_xRowSet,uno::UNO_QUERY_THROW);
867 xParam->clearParameters( );
868 }
869 // -----------------------------------------------------------------------------
impl_fillParameters_nothrow(::osl::ResettableMutexGuard & _rClearForNotifies)870 bool DatabaseDataProvider::impl_fillParameters_nothrow( ::osl::ResettableMutexGuard& _rClearForNotifies)
871 {
872 // do we have to fill the parameters again?
873 if ( !m_aParameterManager.isUpToDate() )
874 m_aParameterManager.updateParameterInfo( m_aFilterManager );
875
876 if ( m_aParameterManager.isUpToDate() )
877 return m_aParameterManager.fillParameterValues( m_xHandler, _rClearForNotifies );
878
879 return true;
880 }
881 // com::sun::star::sdbc::XParameters
882 //------------------------------------------------------------------------------
setNull(sal_Int32 parameterIndex,sal_Int32 sqlType)883 void SAL_CALL DatabaseDataProvider::setNull(sal_Int32 parameterIndex, sal_Int32 sqlType) throw( SQLException, RuntimeException )
884 {
885 m_aParameterManager.setNull(parameterIndex, sqlType);
886 }
887
888 //------------------------------------------------------------------------------
setObjectNull(sal_Int32 parameterIndex,sal_Int32 sqlType,const::rtl::OUString & typeName)889 void SAL_CALL DatabaseDataProvider::setObjectNull(sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName) throw( SQLException, RuntimeException )
890 {
891 m_aParameterManager.setObjectNull(parameterIndex, sqlType, typeName);
892 }
893
894 //------------------------------------------------------------------------------
setBoolean(sal_Int32 parameterIndex,sal_Bool x)895 void SAL_CALL DatabaseDataProvider::setBoolean(sal_Int32 parameterIndex, sal_Bool x) throw( SQLException, RuntimeException )
896 {
897 m_aParameterManager.setBoolean(parameterIndex, x);
898 }
899
900 //------------------------------------------------------------------------------
setByte(sal_Int32 parameterIndex,sal_Int8 x)901 void SAL_CALL DatabaseDataProvider::setByte(sal_Int32 parameterIndex, sal_Int8 x) throw( SQLException, RuntimeException )
902 {
903 m_aParameterManager.setByte(parameterIndex, x);
904 }
905
906 //------------------------------------------------------------------------------
setShort(sal_Int32 parameterIndex,sal_Int16 x)907 void SAL_CALL DatabaseDataProvider::setShort(sal_Int32 parameterIndex, sal_Int16 x) throw( SQLException, RuntimeException )
908 {
909 m_aParameterManager.setShort(parameterIndex, x);
910 }
911
912 //------------------------------------------------------------------------------
setInt(sal_Int32 parameterIndex,sal_Int32 x)913 void SAL_CALL DatabaseDataProvider::setInt(sal_Int32 parameterIndex, sal_Int32 x) throw( SQLException, RuntimeException )
914 {
915 m_aParameterManager.setInt(parameterIndex, x);
916 }
917
918 //------------------------------------------------------------------------------
setLong(sal_Int32 parameterIndex,sal_Int64 x)919 void SAL_CALL DatabaseDataProvider::setLong(sal_Int32 parameterIndex, sal_Int64 x) throw( SQLException, RuntimeException )
920 {
921 m_aParameterManager.setLong(parameterIndex, x);
922 }
923
924 //------------------------------------------------------------------------------
setFloat(sal_Int32 parameterIndex,float x)925 void SAL_CALL DatabaseDataProvider::setFloat(sal_Int32 parameterIndex, float x) throw( SQLException, RuntimeException )
926 {
927 m_aParameterManager.setFloat(parameterIndex, x);
928 }
929
930 //------------------------------------------------------------------------------
setDouble(sal_Int32 parameterIndex,double x)931 void SAL_CALL DatabaseDataProvider::setDouble(sal_Int32 parameterIndex, double x) throw( SQLException, RuntimeException )
932 {
933 m_aParameterManager.setDouble(parameterIndex, x);
934 }
935
936 //------------------------------------------------------------------------------
setString(sal_Int32 parameterIndex,const::rtl::OUString & x)937 void SAL_CALL DatabaseDataProvider::setString(sal_Int32 parameterIndex, const ::rtl::OUString& x) throw( SQLException, RuntimeException )
938 {
939 m_aParameterManager.setString(parameterIndex, x);
940 }
941
942 //------------------------------------------------------------------------------
setBytes(sal_Int32 parameterIndex,const uno::Sequence<sal_Int8> & x)943 void SAL_CALL DatabaseDataProvider::setBytes(sal_Int32 parameterIndex, const uno::Sequence< sal_Int8 >& x) throw( SQLException, RuntimeException )
944 {
945 m_aParameterManager.setBytes(parameterIndex, x);
946 }
947
948 //------------------------------------------------------------------------------
setDate(sal_Int32 parameterIndex,const util::Date & x)949 void SAL_CALL DatabaseDataProvider::setDate(sal_Int32 parameterIndex, const util::Date& x) throw( SQLException, RuntimeException )
950 {
951 m_aParameterManager.setDate(parameterIndex, x);
952 }
953
954 //------------------------------------------------------------------------------
setTime(sal_Int32 parameterIndex,const util::Time & x)955 void SAL_CALL DatabaseDataProvider::setTime(sal_Int32 parameterIndex, const util::Time& x) throw( SQLException, RuntimeException )
956 {
957 m_aParameterManager.setTime(parameterIndex, x);
958 }
959
960 //------------------------------------------------------------------------------
setTimestamp(sal_Int32 parameterIndex,const util::DateTime & x)961 void SAL_CALL DatabaseDataProvider::setTimestamp(sal_Int32 parameterIndex, const util::DateTime& x) throw( SQLException, RuntimeException )
962 {
963 m_aParameterManager.setTimestamp(parameterIndex, x);
964 }
965
966 //------------------------------------------------------------------------------
setBinaryStream(sal_Int32 parameterIndex,const uno::Reference<io::XInputStream> & x,sal_Int32 length)967 void SAL_CALL DatabaseDataProvider::setBinaryStream(sal_Int32 parameterIndex, const uno::Reference<io::XInputStream>& x, sal_Int32 length) throw( SQLException, RuntimeException )
968 {
969 m_aParameterManager.setBinaryStream(parameterIndex, x, length);
970 }
971
972 //------------------------------------------------------------------------------
setCharacterStream(sal_Int32 parameterIndex,const uno::Reference<io::XInputStream> & x,sal_Int32 length)973 void SAL_CALL DatabaseDataProvider::setCharacterStream(sal_Int32 parameterIndex, const uno::Reference<io::XInputStream>& x, sal_Int32 length) throw( SQLException, RuntimeException )
974 {
975 m_aParameterManager.setCharacterStream(parameterIndex, x, length);
976 }
977
978 //------------------------------------------------------------------------------
setObjectWithInfo(sal_Int32 parameterIndex,const uno::Any & x,sal_Int32 targetSqlType,sal_Int32 scale)979 void SAL_CALL DatabaseDataProvider::setObjectWithInfo(sal_Int32 parameterIndex, const uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale) throw( SQLException, RuntimeException )
980 {
981 m_aParameterManager.setObjectWithInfo(parameterIndex, x, targetSqlType, scale);
982 }
983
984 //------------------------------------------------------------------------------
setObject(sal_Int32 parameterIndex,const uno::Any & x)985 void SAL_CALL DatabaseDataProvider::setObject(sal_Int32 parameterIndex, const uno::Any& x) throw( SQLException, RuntimeException )
986 {
987 m_aParameterManager.setObject(parameterIndex, x);
988 }
989
990 //------------------------------------------------------------------------------
setRef(sal_Int32 parameterIndex,const uno::Reference<sdbc::XRef> & x)991 void SAL_CALL DatabaseDataProvider::setRef(sal_Int32 parameterIndex, const uno::Reference<sdbc::XRef>& x) throw( SQLException, RuntimeException )
992 {
993 m_aParameterManager.setRef(parameterIndex, x);
994 }
995
996 //------------------------------------------------------------------------------
setBlob(sal_Int32 parameterIndex,const uno::Reference<sdbc::XBlob> & x)997 void SAL_CALL DatabaseDataProvider::setBlob(sal_Int32 parameterIndex, const uno::Reference<sdbc::XBlob>& x) throw( SQLException, RuntimeException )
998 {
999 m_aParameterManager.setBlob(parameterIndex, x);
1000 }
1001
1002 //------------------------------------------------------------------------------
setClob(sal_Int32 parameterIndex,const uno::Reference<sdbc::XClob> & x)1003 void SAL_CALL DatabaseDataProvider::setClob(sal_Int32 parameterIndex, const uno::Reference<sdbc::XClob>& x) throw( SQLException, RuntimeException )
1004 {
1005 m_aParameterManager.setClob(parameterIndex, x);
1006 }
1007
1008 //------------------------------------------------------------------------------
setArray(sal_Int32 parameterIndex,const Reference<sdbc::XArray> & x)1009 void SAL_CALL DatabaseDataProvider::setArray(sal_Int32 parameterIndex, const Reference<sdbc::XArray>& x) throw( SQLException, RuntimeException )
1010 {
1011 m_aParameterManager.setArray(parameterIndex, x);
1012 }
1013
1014 //------------------------------------------------------------------------------
clearParameters()1015 void SAL_CALL DatabaseDataProvider::clearParameters() throw( SQLException, RuntimeException )
1016 {
1017 m_aParameterManager.clearParameters();
1018 }
1019 //==============================================================================
1020 // com::sun::star::sdbc::XRowSet
1021 //------------------------------------------------------------------------------
execute()1022 void SAL_CALL DatabaseDataProvider::execute() throw( SQLException, RuntimeException )
1023 {
1024 uno::Sequence< beans::PropertyValue > aEmpty;
1025 createDataSource(aEmpty);
1026 }
1027 //------------------------------------------------------------------------------
addRowSetListener(const uno::Reference<sdbc::XRowSetListener> & _rListener)1028 void SAL_CALL DatabaseDataProvider::addRowSetListener(const uno::Reference<sdbc::XRowSetListener>& _rListener) throw( RuntimeException )
1029 {
1030 if (m_xRowSet.is())
1031 m_xRowSet->addRowSetListener(_rListener);
1032 }
1033
1034 //------------------------------------------------------------------------------
removeRowSetListener(const uno::Reference<sdbc::XRowSetListener> & _rListener)1035 void SAL_CALL DatabaseDataProvider::removeRowSetListener(const uno::Reference<sdbc::XRowSetListener>& _rListener) throw( RuntimeException )
1036 {
1037 if (m_xRowSet.is())
1038 m_xRowSet->removeRowSetListener(_rListener);
1039 }
1040 //==============================================================================
1041 // com::sun::star::sdbc::XResultSet
1042 //------------------------------------------------------------------------------
next()1043 sal_Bool SAL_CALL DatabaseDataProvider::next() throw( SQLException, RuntimeException )
1044 {
1045 return m_xRowSet->next();
1046 }
1047
1048 //------------------------------------------------------------------------------
isBeforeFirst()1049 sal_Bool SAL_CALL DatabaseDataProvider::isBeforeFirst() throw( SQLException, RuntimeException )
1050 {
1051 return m_xRowSet->isBeforeFirst();
1052 }
1053
1054 //------------------------------------------------------------------------------
isAfterLast()1055 sal_Bool SAL_CALL DatabaseDataProvider::isAfterLast() throw( SQLException, RuntimeException )
1056 {
1057 return m_xRowSet->isAfterLast();
1058 }
1059
1060 //------------------------------------------------------------------------------
isFirst()1061 sal_Bool SAL_CALL DatabaseDataProvider::isFirst() throw( SQLException, RuntimeException )
1062 {
1063 return m_xRowSet->isFirst();
1064 }
1065
1066 //------------------------------------------------------------------------------
isLast()1067 sal_Bool SAL_CALL DatabaseDataProvider::isLast() throw( SQLException, RuntimeException )
1068 {
1069 return m_xRowSet->isLast();
1070 }
1071
1072 //------------------------------------------------------------------------------
beforeFirst()1073 void SAL_CALL DatabaseDataProvider::beforeFirst() throw( SQLException, RuntimeException )
1074 {
1075 m_xRowSet->beforeFirst();
1076 }
1077
1078 //------------------------------------------------------------------------------
afterLast()1079 void SAL_CALL DatabaseDataProvider::afterLast() throw( SQLException, RuntimeException )
1080 {
1081 m_xRowSet->afterLast();
1082 }
1083
1084 //------------------------------------------------------------------------------
first()1085 sal_Bool SAL_CALL DatabaseDataProvider::first() throw( SQLException, RuntimeException )
1086 {
1087 return m_xRowSet->first();
1088 }
1089
1090 //------------------------------------------------------------------------------
last()1091 sal_Bool SAL_CALL DatabaseDataProvider::last() throw( SQLException, RuntimeException )
1092 {
1093 return m_xRowSet->last();
1094 }
1095
1096 //------------------------------------------------------------------------------
getRow()1097 sal_Int32 SAL_CALL DatabaseDataProvider::getRow() throw( SQLException, RuntimeException )
1098 {
1099 return m_xRowSet->getRow();
1100 }
1101
1102 //------------------------------------------------------------------------------
absolute(sal_Int32 row)1103 sal_Bool SAL_CALL DatabaseDataProvider::absolute(sal_Int32 row) throw( SQLException, RuntimeException )
1104 {
1105 return m_xRowSet->absolute(row);
1106 }
1107
1108 //------------------------------------------------------------------------------
relative(sal_Int32 rows)1109 sal_Bool SAL_CALL DatabaseDataProvider::relative(sal_Int32 rows) throw( SQLException, RuntimeException )
1110 {
1111 return m_xRowSet->relative(rows);
1112 }
1113
1114 //------------------------------------------------------------------------------
previous()1115 sal_Bool SAL_CALL DatabaseDataProvider::previous() throw( SQLException, RuntimeException )
1116 {
1117 return m_xRowSet->previous();
1118 }
1119
1120 //------------------------------------------------------------------------------
refreshRow()1121 void SAL_CALL DatabaseDataProvider::refreshRow() throw( SQLException, RuntimeException )
1122 {
1123 m_xRowSet->refreshRow();
1124 }
1125
1126 //------------------------------------------------------------------------------
rowUpdated()1127 sal_Bool SAL_CALL DatabaseDataProvider::rowUpdated() throw( SQLException, RuntimeException )
1128 {
1129 return m_xRowSet->rowUpdated();
1130 }
1131
1132 //------------------------------------------------------------------------------
rowInserted()1133 sal_Bool SAL_CALL DatabaseDataProvider::rowInserted() throw( SQLException, RuntimeException )
1134 {
1135 return m_xRowSet->rowInserted();
1136 }
1137
1138 //------------------------------------------------------------------------------
rowDeleted()1139 sal_Bool SAL_CALL DatabaseDataProvider::rowDeleted() throw( SQLException, RuntimeException )
1140 {
1141 return m_xRowSet->rowDeleted();
1142 }
1143
1144 //------------------------------------------------------------------------------
getStatement()1145 uno::Reference< uno::XInterface > SAL_CALL DatabaseDataProvider::getStatement() throw( SQLException, RuntimeException )
1146 {
1147 return m_xRowSet->getStatement();
1148 }
1149 // -----------------------------------------------------------------------------
getParent()1150 uno::Reference< uno::XInterface > SAL_CALL DatabaseDataProvider::getParent( ) throw (uno::RuntimeException)
1151 {
1152 return m_xParent;
1153 }
1154 // -----------------------------------------------------------------------------
setParent(const uno::Reference<uno::XInterface> & _xParent)1155 void SAL_CALL DatabaseDataProvider::setParent( const uno::Reference< uno::XInterface >& _xParent ) throw (lang::NoSupportException, uno::RuntimeException)
1156 {
1157 osl::MutexGuard g(m_aMutex);
1158 m_xParent = _xParent;
1159 }
1160 // -----------------------------------------------------------------------------
impl_invalidateParameter_nothrow()1161 void DatabaseDataProvider::impl_invalidateParameter_nothrow()
1162 {
1163 osl::MutexGuard g(m_aMutex);
1164 m_aParameterManager.clearAllParameterInformation();
1165 }
1166 // -----------------------------------------------------------------------------
1167 } // namespace dbaccess
1168