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 #ifndef DBA_DATABASEDATAPROVIDER_HXX_INCLUDED 24 #define DBA_DATABASEDATAPROVIDER_HXX_INCLUDED 25 26 #include "sal/config.h" 27 28 #include "com/sun/star/uno/XComponentContext.hpp" 29 #include "com/sun/star/lang/XServiceInfo.hpp" 30 #include "com/sun/star/chart2/data/XDatabaseDataProvider.hpp" 31 #include "com/sun/star/chart2/XInternalDataProvider.hpp" 32 #include <com/sun/star/chart/XComplexDescriptionAccess.hpp> 33 #include <com/sun/star/sdbc/XRowSet.hpp> 34 #include <com/sun/star/sdbc/XParameters.hpp> 35 #include <com/sun/star/container/XChild.hpp> 36 37 #include "cppuhelper/compbase4.hxx" 38 #include "cppuhelper/basemutex.hxx" 39 #include "cppuhelper/propertysetmixin.hxx" 40 #include <cppuhelper/implementationentry.hxx> 41 42 #include <comphelper/sequence.hxx> 43 44 #include "connectivity/parameters.hxx" 45 #include "connectivity/filtermanager.hxx" 46 47 48 namespace dbaccess 49 { 50 51 class DatabaseDataSource; 52 typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::chart2::data::XDatabaseDataProvider 53 , ::com::sun::star::container::XChild 54 , ::com::sun::star::chart::XComplexDescriptionAccess 55 , ::com::sun::star::lang::XServiceInfo > TDatabaseDataProvider; 56 57 class DatabaseDataProvider: private ::cppu::BaseMutex, 58 public TDatabaseDataProvider, 59 public ::cppu::PropertySetMixin< ::com::sun::star::chart2::data::XDatabaseDataProvider > 60 { 61 public: 62 explicit DatabaseDataProvider(::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > const & context); 63 64 // ::com::sun::star::lang::XServiceInfo - static methods 65 static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void); 66 static ::rtl::OUString getImplementationName_Static(void); 67 static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > 68 SAL_CALL Create(::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > const & context); 69 70 private: 71 // ::com::sun::star::uno::XInterface: 72 virtual ::com::sun::star::uno::Any SAL_CALL queryInterface(::com::sun::star::uno::Type const & type); acquire()73 virtual void SAL_CALL acquire() throw () 74 { TDatabaseDataProvider::acquire(); } release()75 virtual void SAL_CALL release() throw () 76 { TDatabaseDataProvider::release(); } 77 78 // ::com::sun::star::lang::XServiceInfo 79 virtual ::rtl::OUString SAL_CALL getImplementationName( ); 80 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ); 81 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ); 82 83 // ::com::sun::star::chart2::data::XDataProvider: 84 virtual ::sal_Bool SAL_CALL createDataSourcePossible(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > & aArguments); 85 virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSource > SAL_CALL createDataSource(const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > & aArguments); 86 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL detectArguments(const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSource > & xDataSource); 87 virtual ::sal_Bool SAL_CALL createDataSequenceByRangeRepresentationPossible(const ::rtl::OUString & aRangeRepresentation); 88 virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > SAL_CALL createDataSequenceByRangeRepresentation(const ::rtl::OUString & aRangeRepresentation); 89 virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection(); 90 91 // ::com::sun::star::chart2::data::XRangeXMLConversion: 92 virtual ::rtl::OUString SAL_CALL convertRangeToXML(const ::rtl::OUString & aRangeRepresentation); 93 virtual ::rtl::OUString SAL_CALL convertRangeFromXML(const ::rtl::OUString & aXMLRange); 94 95 // ::com::sun::star::lang::XInitialization: 96 virtual void SAL_CALL initialize(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > & aArguments); 97 98 // ::com::sun::star::beans::XPropertySet: 99 virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(); 100 virtual void SAL_CALL setPropertyValue(const ::rtl::OUString & aPropertyName, const ::com::sun::star::uno::Any & aValue); 101 virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue(const ::rtl::OUString & PropertyName); 102 virtual void SAL_CALL addPropertyChangeListener(const ::rtl::OUString & aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener > & xListener); 103 virtual void SAL_CALL removePropertyChangeListener(const ::rtl::OUString & aPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener > & aListener); 104 virtual void SAL_CALL addVetoableChangeListener(const ::rtl::OUString & PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener > & aListener); 105 virtual void SAL_CALL removeVetoableChangeListener(const ::rtl::OUString & PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener > & aListener); 106 107 // ::com::sun::star::chart2::data::XDatabaseDataProvider: 108 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getMasterFields(); 109 virtual void SAL_CALL setMasterFields(const ::com::sun::star::uno::Sequence< ::rtl::OUString > & the_value); 110 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getDetailFields(); 111 virtual void SAL_CALL setDetailFields(const ::com::sun::star::uno::Sequence< ::rtl::OUString > & the_value); 112 virtual ::rtl::OUString SAL_CALL getCommand(); 113 virtual void SAL_CALL setCommand(const ::rtl::OUString & the_value); 114 virtual ::sal_Int32 SAL_CALL getCommandType(); 115 virtual void SAL_CALL setCommandType(::sal_Int32 the_value); 116 virtual ::rtl::OUString SAL_CALL getFilter(); 117 virtual void SAL_CALL setFilter(const ::rtl::OUString & the_value); 118 virtual ::sal_Bool SAL_CALL getApplyFilter(); 119 virtual void SAL_CALL setApplyFilter( ::sal_Bool _applyfilter ); 120 virtual ::rtl::OUString SAL_CALL getHavingClause(); 121 virtual void SAL_CALL setHavingClause( const ::rtl::OUString& _havingclause ); 122 virtual ::rtl::OUString SAL_CALL getGroupBy(); 123 virtual void SAL_CALL setGroupBy( const ::rtl::OUString& _groupby ); 124 virtual ::rtl::OUString SAL_CALL getOrder(); 125 virtual void SAL_CALL setOrder( const ::rtl::OUString& _order ); 126 virtual ::sal_Bool SAL_CALL getEscapeProcessing(); 127 virtual void SAL_CALL setEscapeProcessing(::sal_Bool the_value); 128 virtual ::sal_Int32 SAL_CALL getRowLimit(); 129 virtual void SAL_CALL setRowLimit( ::sal_Int32 _rowlimit ); 130 virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getActiveConnection(); 131 virtual void SAL_CALL setActiveConnection(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > & the_value); 132 virtual ::rtl::OUString SAL_CALL getDataSourceName(); 133 virtual void SAL_CALL setDataSourceName( const ::rtl::OUString& _datasourcename ); 134 135 // com::sun::star::sdbc::XParameters 136 virtual void SAL_CALL setNull(sal_Int32 parameterIndex, sal_Int32 sqlType); 137 virtual void SAL_CALL setObjectNull(sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName); 138 virtual void SAL_CALL setBoolean(sal_Int32 parameterIndex, sal_Bool x); 139 virtual void SAL_CALL setByte(sal_Int32 parameterIndex, sal_Int8 x); 140 virtual void SAL_CALL setShort(sal_Int32 parameterIndex, sal_Int16 x); 141 virtual void SAL_CALL setInt(sal_Int32 parameterIndex, sal_Int32 x); 142 virtual void SAL_CALL setLong(sal_Int32 parameterIndex, sal_Int64 x); 143 virtual void SAL_CALL setFloat(sal_Int32 parameterIndex, float x); 144 virtual void SAL_CALL setDouble(sal_Int32 parameterIndex, double x); 145 virtual void SAL_CALL setString(sal_Int32 parameterIndex, const ::rtl::OUString& x); 146 virtual void SAL_CALL setBytes(sal_Int32 parameterIndex, const ::com::sun::star::uno::Sequence< sal_Int8 >& x); 147 virtual void SAL_CALL setDate(sal_Int32 parameterIndex, const ::com::sun::star::util::Date& x); 148 virtual void SAL_CALL setTime(sal_Int32 parameterIndex, const ::com::sun::star::util::Time& x); 149 virtual void SAL_CALL setTimestamp(sal_Int32 parameterIndex, const ::com::sun::star::util::DateTime& x); 150 virtual void SAL_CALL setBinaryStream(sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream>& x, sal_Int32 length); 151 virtual void SAL_CALL setCharacterStream(sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream>& x, sal_Int32 length); 152 virtual void SAL_CALL setObject(sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x); 153 virtual void SAL_CALL setObjectWithInfo(sal_Int32 parameterIndex, const ::com::sun::star::uno::Any& x, sal_Int32 targetSqlType, sal_Int32 scale); 154 virtual void SAL_CALL setRef(sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef>& x); 155 virtual void SAL_CALL setBlob(sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob>& x); 156 virtual void SAL_CALL setClob(sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob>& x); 157 virtual void SAL_CALL setArray(sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray>& x); 158 virtual void SAL_CALL clearParameters(); 159 160 // com::sun::star::sdbc::XRowSet 161 virtual void SAL_CALL execute(); 162 virtual void SAL_CALL addRowSetListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSetListener>& _rxListener); 163 virtual void SAL_CALL removeRowSetListener(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSetListener>& _rxListener); 164 165 // com::sun::star::sdbc::XResultSet 166 virtual sal_Bool SAL_CALL next(); 167 virtual sal_Bool SAL_CALL isBeforeFirst(); 168 virtual sal_Bool SAL_CALL isAfterLast(); 169 virtual sal_Bool SAL_CALL isFirst(); 170 virtual sal_Bool SAL_CALL isLast(); 171 virtual void SAL_CALL beforeFirst(); 172 virtual void SAL_CALL afterLast(); 173 virtual sal_Bool SAL_CALL first(); 174 virtual sal_Bool SAL_CALL last(); 175 virtual sal_Int32 SAL_CALL getRow(); 176 virtual sal_Bool SAL_CALL absolute(sal_Int32 row); 177 virtual sal_Bool SAL_CALL relative(sal_Int32 rows); 178 virtual sal_Bool SAL_CALL previous(); 179 virtual void SAL_CALL refreshRow(); 180 virtual sal_Bool SAL_CALL rowUpdated(); 181 virtual sal_Bool SAL_CALL rowInserted(); 182 virtual sal_Bool SAL_CALL rowDeleted(); 183 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getStatement(); 184 185 // container::XChild 186 virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getParent( ); 187 virtual void SAL_CALL setParent( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& Parent ); 188 189 // ____ XComplexDescriptionAccess ____ 190 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL getComplexRowDescriptions(); 191 virtual void SAL_CALL setComplexRowDescriptions( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > >& aRowDescriptions ); 192 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL getComplexColumnDescriptions(); 193 virtual void SAL_CALL setComplexColumnDescriptions( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > >& aColumnDescriptions ); 194 195 // ____ XChartDataArray (base of XComplexDescriptionAccess) ____ 196 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > > SAL_CALL getData(); 197 virtual void SAL_CALL setData( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > >& aData ); 198 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRowDescriptions(); 199 virtual void SAL_CALL setRowDescriptions( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aRowDescriptions ); 200 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getColumnDescriptions(); 201 virtual void SAL_CALL setColumnDescriptions( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aColumnDescriptions ); 202 203 // ____ XChartData (base of XChartDataArray) ____ 204 virtual void SAL_CALL addChartDataChangeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener ); 205 virtual void SAL_CALL removeChartDataChangeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener ); 206 virtual double SAL_CALL getNotANumber(); 207 virtual ::sal_Bool SAL_CALL isNotANumber(double nNumber ); 208 private: 209 DatabaseDataProvider(DatabaseDataProvider &); // not defined 210 void operator =(DatabaseDataProvider &); // not defined 211 ~DatabaseDataProvider()212 virtual ~DatabaseDataProvider() {} 213 214 // This function is called upon disposing the component, 215 // if your component needs special work when it becomes 216 // disposed, do it here. 217 virtual void SAL_CALL disposing(); 218 219 void impl_fillRowSet_throw(); 220 void impl_executeRowSet_throw(::osl::ResettableMutexGuard& _rClearForNotifies); 221 bool impl_fillParameters_nothrow( ::osl::ResettableMutexGuard& _rClearForNotifies); 222 void impl_fillInternalDataProvider_throw(sal_Bool _bHasCategories,const ::com::sun::star::uno::Sequence< ::rtl::OUString >& i_aColumnNames); 223 void impl_invalidateParameter_nothrow(); 224 ::com::sun::star::uno::Any impl_getNumberFormatKey_nothrow(const ::rtl::OUString & _sRangeRepresentation) const; 225 set(const::rtl::OUString & _sProperty,const T & _Value,T & _member)226 template <typename T> void set( const ::rtl::OUString& _sProperty 227 ,const T& _Value 228 ,T& _member) 229 { 230 BoundListeners l; 231 { 232 ::osl::MutexGuard aGuard(m_aMutex); 233 if ( _member != _Value ) 234 { 235 prepareSet(_sProperty, ::com::sun::star::uno::makeAny(_member), ::com::sun::star::uno::makeAny(_Value), &l); 236 _member = _Value; 237 } 238 } 239 l.notify(); 240 } 241 242 ::dbtools::ParameterManager m_aParameterManager; 243 ::dbtools::FilterManager m_aFilterManager; 244 ::std::map< ::rtl::OUString, ::com::sun::star::uno::Any> m_aNumberFormats; 245 246 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext; 247 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > m_xActiveConnection; 248 ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > m_xRowSet; 249 ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XInternalDataProvider > m_xInternal; 250 ::com::sun::star::uno::Reference< ::com::sun::star::chart::XComplexDescriptionAccess > m_xComplexDescriptionAccess; 251 ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XRangeXMLConversion> m_xRangeConversion; 252 ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler> m_xHandler; 253 // the object doin' most of the work - an SDB-rowset 254 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XAggregation> m_xAggregate; 255 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xAggregateSet; 256 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> m_xParent; 257 ::com::sun::star::uno::Sequence< ::rtl::OUString > m_MasterFields; 258 ::com::sun::star::uno::Sequence< ::rtl::OUString > m_DetailFields; 259 260 ::rtl::OUString m_Command; 261 ::rtl::OUString m_DataSourceName; 262 ::sal_Int32 m_CommandType; 263 sal_Int32 m_RowLimit; 264 ::rtl::OUString m_Filter; 265 ::rtl::OUString m_HavingClause; 266 ::rtl::OUString m_Order; 267 ::rtl::OUString m_GroupBy; 268 ::sal_Bool m_EscapeProcessing; 269 ::sal_Bool m_ApplyFilter; 270 }; 271 272 } // namespace dbaccess 273 274 #endif // DBA_DATABASEDATAPROVIDER_HXX_INCLUDED 275