xref: /AOO41X/main/dbaccess/source/core/api/RowSetBase.hxx (revision 2e2212a7c22e96cf6f6fab0dd042c34a45a64bd6)
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 DBACCESS_CORE_API_ROWSETBASE_HXX
24 #define DBACCESS_CORE_API_ROWSETBASE_HXX
25 
26 #ifndef _CPPUHELPER_IMPLBASE10_HXX_
27 #include <cppuhelper/implbase10.hxx>
28 #endif
29 #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
30 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
31 #endif
32 #ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
33 #include <com/sun/star/sdbc/XRow.hpp>
34 #endif
35 #ifndef _COM_SUN_STAR_SDBC_XCOLUMNLOCATE_HPP_
36 #include <com/sun/star/sdbc/XColumnLocate.hpp>
37 #endif
38 #ifndef _COM_SUN_STAR_SDBC_XCLOSEABLE_HPP_
39 #include <com/sun/star/sdbc/XCloseable.hpp>
40 #endif
41 #ifndef _COM_SUN_STAR_SDBCX_XROWLOCATE_HPP_
42 #include <com/sun/star/sdbcx/XRowLocate.hpp>
43 #endif
44 #ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
45 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
46 #endif
47 #ifndef _COM_SUN_STAR_SDBC_XWARNINGSSUPPLIER_HPP_
48 #include <com/sun/star/sdbc/XWarningsSupplier.hpp>
49 #endif
50 #ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
51 #include <com/sun/star/lang/XServiceInfo.hpp>
52 #endif
53 #ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_
54 #include <com/sun/star/lang/XUnoTunnel.hpp>
55 #endif
56 #ifndef _CPPUHELPER_INTERFACECONTAINER_H_
57 #include <cppuhelper/interfacecontainer.h>
58 #endif
59 #ifndef CONNECTIVITY_SQLERROR_HXX
60 #include <connectivity/sqlerror.hxx>
61 #endif
62 #ifndef _CONNECTIVITY_COMMONTOOLS_HXX_
63 #include <connectivity/CommonTools.hxx>
64 #endif
65 #ifndef COMPHELPER_PROPERTYSTATECONTAINER_HXX
66 #include <comphelper/propertystatecontainer.hxx>
67 #endif
68 #ifndef _COMPHELPER_PROPERTY_ARRAY_HELPER_HXX_
69 #include <comphelper/proparrhlp.hxx>
70 #endif
71 #ifndef _COM_SUN_STAR_SDBC_XROWSET_HPP_
72 #include <com/sun/star/sdbc/XRowSet.hpp>
73 #endif
74 #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
75 #include <com/sun/star/util/XNumberFormatTypes.hpp>
76 #endif
77 #ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
78 #include <com/sun/star/container/XNameAccess.hpp>
79 #endif
80 #ifndef DBACCESS_CORE_API_ROWSETROW_HXX
81 #include "RowSetRow.hxx"
82 #endif
83 #ifndef _COMPHELPER_BROADCASTHELPER_HXX_
84 #include <comphelper/broadcasthelper.hxx>
85 #endif
86 #ifndef DBACCESS_ROWSETCACHEITERATOR_HXX
87 #include "RowSetCacheIterator.hxx"
88 #endif
89 #include "core_resource.hxx"
90 #include <comphelper/componentcontext.hxx>
91 
92 #include <functional>
93 
94 
95 namespace com { namespace sun { namespace star {
96     namespace sdb { struct RowChangeEvent; }
97     namespace lang { struct Locale; }
98 } } }
99 
100 namespace dbaccess
101 {
102     class OEmptyCollection;
103 
104     typedef ::cppu::ImplHelper10<               ::com::sun::star::sdbcx::XRowLocate,
105                                                 ::com::sun::star::sdbc::XRow,
106                                                 ::com::sun::star::sdbc::XResultSetMetaDataSupplier,
107                                                 ::com::sun::star::sdbc::XWarningsSupplier,
108                                                 ::com::sun::star::sdbc::XColumnLocate,
109                                                 ::com::sun::star::sdbcx::XColumnsSupplier,
110                                                 ::com::sun::star::lang::XServiceInfo,
111                                                 ::com::sun::star::sdbc::XRowSet,
112                                                 ::com::sun::star::sdbc::XCloseable,
113                                                 ::com::sun::star::lang::XUnoTunnel> ORowSetBase_BASE;
114 
115     class ORowSetCache;
116     class ORowSetDataColumns;
117     class ORowSetCacheIterator;
118     class ORowSetDataColumn;
119     class ORowSetBase : public ORowSetBase_BASE,
120                         public ::comphelper::OPropertyStateContainer,
121                         public ::comphelper::OPropertyArrayUsageHelper<ORowSetBase> // this class hold the static property info
122     {
123         OModuleClient                           m_aModuleClient;
124     protected:
125         typedef ::std::vector<ORowSetDataColumn*>   TDataColumns;
126         ::osl::Mutex*                           m_pMutex;           // this the mutex form the rowset itself
127         ::osl::Mutex                            m_aRowCountMutex, // mutex for rowcount changes
128                                                 // we need a extra mutex for columns to prevend deadlock when setting new values
129                                                 // for a row
130                                                 m_aColumnsMutex;
131 
132         ::com::sun::star::uno::Any              m_aBookmark;
133         ORowSetCacheIterator                    m_aCurrentRow;      // contains the actual fetched row
134         TORowSetOldRowHelperRef                 m_aOldRow;
135         TDataColumns                            m_aDataColumns;     // holds the columns as m_pColumns but know the implementation class
136         connectivity::ORowSetValue              m_aEmptyValue;      // only for error case
137 
138         ::cppu::OWeakObject*                    m_pMySelf;          // set by derived classes
139         ORowSetCache*                           m_pCache;           // the cache is used by the rowset and his clone (shared)
140         ORowSetDataColumns*                     m_pColumns;         // represent the select columns
141         ::cppu::OBroadcastHelper&               m_rBHelper;         // must be set from the derived classes
142         // is used when the formatkey for database types is set
143         ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatTypes>   m_xNumberFormatTypes;
144         OEmptyCollection*                                                               m_pEmptyCollection;
145 
146         ::comphelper::ComponentContext          m_aContext;
147         ::connectivity::SQLError                m_aErrors;
148 
149         sal_Int32                               m_nLastColumnIndex; // the last column ask for, used for wasNull()
150         sal_Int32                               m_nDeletedPosition; // is set only when a row was deleted
151         sal_Int32                               m_nResultSetType;   // fetch property
152         sal_Int32                               m_nResultSetConcurrency;
153         sal_Bool                                m_bClone;           // I'm clone or not
154         sal_Bool                                m_bIgnoreResult ;
155         sal_Bool                                m_bBeforeFirst  : 1;
156         sal_Bool                                m_bAfterLast    : 1;
157         sal_Bool                                m_bIsInsertRow  : 1;
158 
159     protected:
160         ORowSetBase(
161             const ::comphelper::ComponentContext& _rContext,
162             ::cppu::OBroadcastHelper& _rBHelper,
163             ::osl::Mutex* _pMutex
164         );
165 
166         // fire a notification for all that are listening on column::VALUE property
167         void firePropertyChange(const ORowSetRow& _rOldRow);
168         // fire a change for one column
169         // _nPos starts at zero
170         void firePropertyChange(sal_Int32 _nPos,const ::connectivity::ORowSetValue& _rNewValue);
171 
172         // fire if rowcount changed
173         virtual void fireRowcount();
174         // notify row changed
175         virtual sal_Bool notifyAllListenersCursorBeforeMove(::osl::ResettableMutexGuard& _rGuard);
176         // notify cursor moved
177         virtual void notifyAllListenersCursorMoved(::osl::ResettableMutexGuard& _rGuard);
178         // notify all that rowset changed
179         virtual void notifyAllListeners(::osl::ResettableMutexGuard& _rGuard);
180 
181         // cancel the insertion, if necessary (means if we're on the insert row)
182         virtual void        doCancelModification( ) = 0;
183         // return <TRUE/> if and only if we're using the insert row (means: we're updating _or_ inserting)
184         virtual sal_Bool    isModification( ) = 0;
185         // return <TRUE/> if and only if the current row is modified
186         // TODO: isn't this the same as isModification?
187         virtual sal_Bool    isModified( ) = 0;
188         // return <TRUE/> if and only if the current row is the insert row
189         virtual sal_Bool    isNew( ) = 0;
190         // notify the change of a boolean property
191         void fireProperty( sal_Int32 _nProperty, sal_Bool _bNew, sal_Bool _bOld );
192 
193     // OPropertyStateContainer
194         virtual void getPropertyDefaultByHandle( sal_Int32 _nHandle, ::com::sun::star::uno::Any& _rDefault ) const;
195         virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue,sal_Int32 nHandle) const;
196 
197         enum CursorMoveDirection
198         {
199             /// denotes a cursor move forward
200             MOVE_FORWARD,
201             /// denotes a cursor  move backwards
202             MOVE_BACKWARD,
203             /// denotes no cursor move at all, used when the current row is to be refreshed only
204             MOVE_NONE_REFRESH_ONLY
205         };
206         /** positions the cache in preparation of a cursor move
207 
208             Normally, the cache is simply moved to our bookmark (m_aBookmark). If however the current
209             row is deleted, then the cache is properly positioned for a following cursor movement in the
210             given direction.
211 
212             @param _ePrepareForDirection
213                 the direction into which the cursor should be moved after the call. If we're currently not on
214                 a deleted row, this parameter is ignored, since in this case the cache is simply moved to
215                 m_aBookmark.</br>
216                 If, however, we're currently on a deleted row, this is used to properly position the cache
217                 using <member>m_nDeletedPosition</member>.<br/>
218                 In this case, MOVE_NONE_REFRESH_ONLY is not supported. This is because the deleted row
219                 (to which the RowSet currently points to) is not present in the cache. So, you cannot move the
220                 cache to this row.
221         */
222         void positionCache( CursorMoveDirection _ePrepareForDirection );
223 
224         // returns a value of a column of the current row
225         const connectivity::ORowSetValue& getValue(sal_Int32 columnIndex);
226         // the cache has to be checked before calling this method
227         const connectivity::ORowSetValue& impl_getValue(sal_Int32 columnIndex);
228         // sets the current and the bookmark
229         void setCurrentRow( sal_Bool _bMoved, sal_Bool _bDoNotify, const ORowSetRow& _rOldValues, ::osl::ResettableMutexGuard& _rGuard);
230         void checkPositioningAllowed() throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
231         // checks  if the cache is null
232         void checkCache();
233         // sets the bookmark to Any()
234         // m_aCurrentRow to end of matrix
235         // m_aOldRow to NULL
236         void movementFailed();
237 
238         ORowSetRow getOldRow(sal_Bool _bWasNew);
239         /** move the cache the postion defined by the member functor
240             @param  _aCheckFunctor
241                 Return <TRUE/> when we already stand on the row we want to.
242             @param  _aMovementFunctor
243                 The mehtod used to move.
244             @return
245                 <TRUE/> if movement was successful.
246         */
247         sal_Bool SAL_CALL move( ::std::mem_fun_t<sal_Bool,ORowSetBase>& _aCheckFunctor,
248                                 ::std::mem_fun_t<sal_Bool,ORowSetCache>& _aMovementFunctor);
249 
250         /** same meaning as isFirst. Only need by mem_fun
251             @return
252                 <TRUE/> if so.
253         */
254         sal_Bool isOnFirst();
255         /** same meaning as isLast. Only need by mem_fun
256             @return
257                 <TRUE/> if so.
258         */
259         sal_Bool isOnLast();
260 
261         /** returns the current row count
262 
263             This function takes into account that we might actually be positioned on a
264             deleted row, so that m_pCache->m_nRowCount does not really reflect the actual
265             count.
266 
267             @precond
268                 Our mutext is locked.
269         */
270         sal_Int32   impl_getRowCount() const;
271 
272         // the checkCache has to be called before calling this methods
273         sal_Bool    impl_wasNull();
274         sal_Int32   impl_getRow();
275         sal_Bool    impl_rowDeleted();
276 
277     public:
278         virtual ~ORowSetBase();
279 
280     // OComponentHelper
281         virtual void SAL_CALL disposing(void);
282 
283     // com::sun::star::beans::XPropertySet
getPropertySetInfo()284         virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException)
285         {
286             return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
287         }
288 
289     // comphelper::OPropertyArrayUsageHelper
290         virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
291 
292     // cppu::OPropertySetHelper
293         virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
294 
295     // com::sun::star::lang::XTypeProvider
296         virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException);
297 
298     // com::sun::star::uno::XInterface
299         virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw (::com::sun::star::uno::RuntimeException);
300 
301     // ::com::sun::star::sdbc::XWarningsSupplier
302         virtual ::com::sun::star::uno::Any SAL_CALL getWarnings(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
303         virtual void SAL_CALL clearWarnings(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
304 
305     // ::com::sun::star::sdbc::XResultSetMetaDataSupplier
306         virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
307 
308     // ::com::sun::star::sdbc::XColumnLocate
309         virtual sal_Int32 SAL_CALL findColumn( const ::rtl::OUString& columnName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
310 
311     // ::com::sun::star::sdbcx::XColumnsSupplier
312         virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > SAL_CALL getColumns(  ) throw(::com::sun::star::uno::RuntimeException);
313 
314     // ::com::sun::star::sdbc::XRow
315         virtual sal_Bool SAL_CALL wasNull(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
316         virtual ::rtl::OUString SAL_CALL getString( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
317         virtual sal_Bool SAL_CALL getBoolean( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
318         virtual sal_Int8 SAL_CALL getByte( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
319         virtual sal_Int16 SAL_CALL getShort( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
320         virtual sal_Int32 SAL_CALL getInt( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
321         virtual sal_Int64 SAL_CALL getLong( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
322         virtual float SAL_CALL getFloat( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
323         virtual double SAL_CALL getDouble( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
324         virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getBytes( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
325         virtual ::com::sun::star::util::Date SAL_CALL getDate( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
326         virtual ::com::sun::star::util::Time SAL_CALL getTime( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
327         virtual ::com::sun::star::util::DateTime SAL_CALL getTimestamp( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
328         virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getBinaryStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
329         virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getCharacterStream( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
330         virtual ::com::sun::star::uno::Any SAL_CALL getObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
331         virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRef > SAL_CALL getRef( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
332         virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XBlob > SAL_CALL getBlob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
333         virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob > SAL_CALL getClob( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
334         virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray > SAL_CALL getArray( sal_Int32 columnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
335 
336     // ::com::sun::star::sdbcx::XRowLocate
337         virtual ::com::sun::star::uno::Any SAL_CALL getBookmark(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
338         virtual sal_Bool SAL_CALL moveToBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
339         virtual sal_Bool SAL_CALL moveRelativeToBookmark( const ::com::sun::star::uno::Any& bookmark, sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
340         virtual sal_Int32 SAL_CALL compareBookmarks( const ::com::sun::star::uno::Any& first, const ::com::sun::star::uno::Any& second ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
341         virtual sal_Bool SAL_CALL hasOrderedBookmarks(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
342         virtual sal_Int32 SAL_CALL hashBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
343 
344     // ::com::sun::star::sdbc::XResultSet
345         virtual sal_Bool SAL_CALL next(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
346         virtual sal_Bool SAL_CALL isBeforeFirst(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
347         virtual sal_Bool SAL_CALL isAfterLast(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
348         virtual sal_Bool SAL_CALL isFirst(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
349         virtual sal_Bool SAL_CALL isLast(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
350         virtual void SAL_CALL beforeFirst(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
351         virtual void SAL_CALL afterLast(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
352         virtual sal_Bool SAL_CALL first(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
353         virtual sal_Bool SAL_CALL last(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
354         virtual sal_Int32 SAL_CALL getRow(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
355         virtual sal_Bool SAL_CALL absolute( sal_Int32 row ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
356         virtual sal_Bool SAL_CALL relative( sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
357         virtual sal_Bool SAL_CALL previous(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
358         virtual void SAL_CALL refreshRow(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
359         virtual sal_Bool SAL_CALL rowUpdated(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
360         virtual sal_Bool SAL_CALL rowInserted(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
361         virtual sal_Bool SAL_CALL rowDeleted(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
362         virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getStatement(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
363 
364     // ::com::sun::star::sdbc::XRowSet
365         virtual void SAL_CALL execute(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) = 0;
366         virtual void SAL_CALL addRowSetListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSetListener >& listener ) throw(::com::sun::star::uno::RuntimeException) = 0;
367         virtual void SAL_CALL removeRowSetListener( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSetListener >& listener ) throw(::com::sun::star::uno::RuntimeException) = 0;
368 
369         // is called when the rowset is going to delete this bookmark _rBookmark
370         void onDeleteRow( const ::com::sun::star::uno::Any& _rBookmark );
371         // is called when the rowset has deleted this bookmark _rBookmark
372         void onDeletedRow( const ::com::sun::star::uno::Any& _rBookmark, sal_Int32 _nPos );
373 
374         // ==========================================================
375         // granular access control
GrantNotifierAccessdbaccess::ORowSetBase::GrantNotifierAccess376         struct GrantNotifierAccess { friend class ORowSetNotifier; private: GrantNotifierAccess () { } };
377 
378         // cancel the insertion, if necessary (means if we're on the insert row)
doCancelModification(const GrantNotifierAccess &)379         inline  void        doCancelModification( const GrantNotifierAccess& ) { doCancelModification(); }
isModification(const GrantNotifierAccess &)380         inline  sal_Bool    isModification( const GrantNotifierAccess& ) { return isModification(); }
isModified(const GrantNotifierAccess &)381         inline  sal_Bool    isModified( const GrantNotifierAccess& ) { return isModified(); }
isNew(const GrantNotifierAccess &)382         inline  sal_Bool    isNew( const GrantNotifierAccess& ) { return isNew(); }
isInsertRow()383         inline  sal_Bool    isInsertRow() { return m_bIsInsertRow; } // isNew() || isModified(); }
fireProperty(sal_Int32 _nProperty,sal_Bool _bNew,sal_Bool _bOld,const GrantNotifierAccess &)384         inline  void        fireProperty( sal_Int32 _nProperty, sal_Bool _bNew, sal_Bool _bOld, const GrantNotifierAccess& )
385         {
386             fireProperty( _nProperty, _bNew, _bOld );
387         }
firePropertyChange(sal_Int32 _nPos,const::connectivity::ORowSetValue & _rNewValue,const GrantNotifierAccess &)388         inline  void firePropertyChange(sal_Int32 _nPos,const ::connectivity::ORowSetValue& _rNewValue, const GrantNotifierAccess& )
389         {
390             firePropertyChange(_nPos,_rNewValue);
391         }
392         using ::comphelper::OPropertyStateContainer::getFastPropertyValue;
393 
getMutex() const394         ::osl::Mutex*   getMutex() const { return m_pMutex; }
395     };
396 
397     // ========================================================================
398     /** eases the handling of the doCancelModification and notifyCancelInsert methods
399 
400         <p>The class can only be used on the stack, within a method of ORowSetBase (or derivees)</p>
401     */
402     struct ORowSetNotifierImpl;
403     class ORowSetNotifier
404     {
405     private:
406         ::std::auto_ptr<ORowSetNotifierImpl> m_pImpl;
407         ORowSetBase*    m_pRowSet;
408             // not aquired! This is not necessary because this class here is to be used on the stack within
409             // a method of ORowSetBase (or derivees)
410         sal_Bool        m_bWasNew;
411         sal_Bool        m_bWasModified;
412 
413 #ifdef DBG_UTIL
414         sal_Bool        m_bNotifyCalled;
415 #endif
416 
417     public:
418         /** constructs the object, and cancels the insertion
419 
420             @see ORowSetBase::doCancelModification
421         */
422         ORowSetNotifier( ORowSetBase* m_pRowSet );
423 
424         /** use this one to consturct an vector for change value notification
425         */
426         ORowSetNotifier( ORowSetBase* m_pRowSet,const ORowSetValueVector::Vector& i_aRow );
427 
428         // destructs the object. <member>fire</member> has to be called before.
429         ~ORowSetNotifier( );
430 
431         /** notifies the insertion
432 
433             <p>This has <em>not</em> been put into the destructor by intention!<br/>
434 
435             The destructor is called during stack unwinding in case of an exception, so if we would do
436             listener notification there, this would have the potential of another exception during stack
437             unwinding, which would terminate the application.</p>
438 
439             @see ORowSetBase::notifyCancelInsert
440         */
441         void    fire();
442 
443         /** notifies value change events and notifies IsModified
444             @param  i_aChangedColumns   the index of the changed value columns
445             @param  i_aRow              the old values
446             @see ORowSetBase::notifyCancelInsert
447         */
448         void    firePropertyChange();
449 
450         /** use this one to store the inde of the changed column values
451         */
452         ::std::vector<sal_Int32>& getChangedColumns() const;
453         ::std::vector<com::sun::star::uno::Any>& getChangedBookmarks() const;
454 
455     };
456 
457 } // end of namespace
458 
459 #endif // DBACCESS_CORE_API_ROWSETBASE_HXX
460 
461