1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
27 #ifndef DBACCESS_CORE_API_ROWSETCACHE_HXX
28 #define DBACCESS_CORE_API_ROWSETCACHE_HXX
30 #ifndef _CONNECTIVITY_COMMONTOOLS_HXX_
31 #include <connectivity/CommonTools.hxx>
33 #ifndef _COM_SUN_STAR_LANG_XSERVICEINFO_HPP_
34 #include <com/sun/star/lang/XServiceInfo.hpp>
36 #ifndef _COM_SUN_STAR_SDBC_XPREPAREDSTATEMENT_HPP_
37 #include <com/sun/star/sdbc/XPreparedStatement.hpp>
39 #ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_
40 #include <com/sun/star/sdbc/XConnection.hpp>
42 #ifndef _COM_SUN_STAR_SDB_XSINGLESELECTQUERYANALYZER_HPP_
43 #include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp>
45 #ifndef _COM_SUN_STAR_SDB_XSINGLESELECTQUERYANALYZER_HPP_
46 #include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp>
48 #ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
49 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
51 #ifndef _COM_SUN_STAR_SDBC_XWARNINGSSUPPLIER_HPP_
52 #include <com/sun/star/sdbc/XWarningsSupplier.hpp>
54 #ifndef _COM_SUN_STAR_SDB_XRESULTSETACCESS_HPP_
55 #include <com/sun/star/sdb/XResultSetAccess.hpp>
57 #ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
58 #include <com/sun/star/sdbc/XRow.hpp>
60 #ifndef _COM_SUN_STAR_SDBC_XCOLUMNLOCATE_HPP_
61 #include <com/sun/star/sdbc/XColumnLocate.hpp>
63 #ifndef _COM_SUN_STAR_SDBCX_XROWLOCATE_HPP_
64 #include <com/sun/star/sdbcx/XRowLocate.hpp>
66 #ifndef _COM_SUN_STAR_SDBC_XROWUPDATE_HPP_
67 #include <com/sun/star/sdbc/XRowUpdate.hpp>
69 #ifndef _COM_SUN_STAR_SDBC_XRESULTSETUPDATE_HPP_
70 #include <com/sun/star/sdbc/XResultSetUpdate.hpp>
72 #ifndef _COM_SUN_STAR_SDB_XROWSETAPPROVEBROADCASTER_HPP_
73 #include <com/sun/star/sdb/XRowSetApproveBroadcaster.hpp>
75 #ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_
76 #include <com/sun/star/sdbc/ResultSetType.hpp>
78 #ifndef _COM_SUN_STAR_SDBCX_XDELETEROWS_HPP_
79 #include <com/sun/star/sdbcx/XDeleteRows.hpp>
81 #ifndef _CPPUHELPER_COMPBASE11_HXX_
82 #include <cppuhelper/compbase11.hxx>
84 #ifndef _COMPHELPER_PROPERTYCONTAINER_HXX_
85 #include <comphelper/propertycontainer.hxx>
87 #ifndef COMPHELPER_COMPONENTCONTEXT_HXX
88 #include <comphelper/componentcontext.hxx>
90 #ifndef _CPPUHELPER_IMPLBASE5_HXX_
91 #include <cppuhelper/implbase5.hxx>
93 #ifndef _COMPHELPER_PROPERTY_ARRAY_HELPER_HXX_
94 #include <comphelper/proparrhlp.hxx>
96 #ifndef DBACCESS_CORE_API_ROWSETROW_HXX
97 #include "RowSetRow.hxx"
99 #ifndef DBACCESS_ROWSETCACHEITERATOR_HXX
100 #include "RowSetCacheIterator.hxx"
103 namespace connectivity
110 class ORowSetDataColumns
;
111 class ORowSetCacheClone
;
115 friend class ORowSetBase
;
116 friend class ORowSet
;
117 friend class ORowSetClone
;
118 friend class ORowSetCacheIterator
;
120 typedef ::std::vector
< TORowSetOldRowHelperRef
> TOldRowSetRows
;
122 ::std::map
<sal_Int32
,sal_Int32
> m_aKeyColumns
;
123 //the set can be static, bookmarkable or keyset
124 ::com::sun::star::uno::WeakReference
< ::com::sun::star::sdbc::XResultSet
> m_xSet
;
125 ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XResultSetMetaData
> m_xMetaData
; // must be before m_aInsertRow
126 ::comphelper::ComponentContext m_aContext
;
128 ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XRow
> m_xCacheSet
;
130 OCacheSet
* m_pCacheSet
; // is a bookmarkable, keyset or static resultset
131 ORowSetMatrix
* m_pMatrix
; // represent the table struct
132 ORowSetMatrix::iterator m_aMatrixIter
; // represent a row of the table
133 ORowSetMatrix::iterator m_aMatrixEnd
; // present the row behind the last row of the table
134 ORowSetCacheMap m_aCacheIterators
;
135 TOldRowSetRows m_aOldRows
;
137 ORowSetMatrix
* m_pInsertMatrix
; // represent the rows which should be inserted normally this is only one
138 ORowSetMatrix::iterator m_aInsertRow
; // represent a insert row
140 // ORowSetRow m_aInsertRow; // present the row that should be inserted
141 sal_Int32 m_nLastColumnIndex
; // the last column ask for, used for wasNull()
143 connectivity::OSQLTable m_aUpdateTable
; // used for updates/deletes and inserts
145 sal_Int32 m_nFetchSize
;
146 sal_Int32 m_nRowCount
;
147 sal_Int32 m_nPrivileges
;
148 sal_Int32 m_nPosition
; // 0 means beforefirst
150 sal_Int32 m_nStartPos
; // start pos of the window zero based
151 sal_Int32 m_nEndPos
; // end pos of the window zero based
153 sal_Bool m_bRowCountFinal
;
154 sal_Bool m_bBeforeFirst
;
155 sal_Bool m_bAfterLast
;
156 sal_Bool m_bUpdated
;
157 sal_Bool
& m_bModified
; // points to the rowset member m_bModified
158 sal_Bool
& m_bNew
; // points to the rowset member m_bNew
160 sal_Bool
fill(ORowSetMatrix::iterator
& _aIter
,const ORowSetMatrix::iterator
& _aEnd
,sal_Int32
& _nPos
,sal_Bool _bCheck
);
161 sal_Bool
reFillMatrix(sal_Int32 _nNewStartPos
,sal_Int32 nNewEndPos
);
162 sal_Bool
fillMatrix(sal_Int32
&_nNewStartPos
,sal_Int32 _nNewEndPos
);
163 sal_Bool
moveWindow();
164 // returns true when a keyset needs to be created.
165 sal_Bool
impl_createBookmarkSet_nothrow(const ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XResultSet
>& _xRs
);
167 void firePropertyChange(sal_Int32 _nColumnIndex
,const ::connectivity::ORowSetValue
& _rOldValue
);
169 void rotateCacheIterator(ORowSetMatrix::difference_type _nDist
);
170 void updateValue(sal_Int32 columnIndex
171 ,const connectivity::ORowSetValue
& x
172 ,ORowSetValueVector::Vector
& io_aRow
173 ,::std::vector
<sal_Int32
>& o_ChangedColumns
176 void impl_updateRowFromCache_throw(ORowSetValueVector::Vector
& io_aRow
177 ,::std::vector
<sal_Int32
>& o_ChangedColumns
179 // checks and set the flags isAfterLast isLast and position when afterlast is true
180 void checkPositionFlags();
181 void checkUpdateConditions(sal_Int32 columnIndex
);
182 sal_Bool
checkJoin( const ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XConnection
>& _xConnection
,
183 const ::com::sun::star::uno::Reference
< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer
>& _xComposer
,
184 const ::rtl::OUString
& _sUpdateTableName
);
185 sal_Bool
checkInnerJoin(const ::connectivity::OSQLParseNode
*pNode
186 ,const ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XConnection
>& _xConnection
187 ,const ::rtl::OUString
& _sUpdateTableName
);
189 // clears the insert row
190 void clearInsertRow();
191 ORowSetMatrix::iterator
calcPosition() const;
194 ORowSetMatrix::iterator
& getEnd() { return m_aMatrixEnd
;}
195 // is called when after a moveToInsertRow a movement (next, etc) was called
196 void cancelRowModification();
198 ORowSetCache(const ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XResultSet
>& _xRs
,
199 const ::com::sun::star::uno::Reference
< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer
>& _xAnalyzer
,
200 const ::comphelper::ComponentContext
& _rContext
,
201 const ::rtl::OUString
& _rUpdateTableName
,
202 sal_Bool
& _bModified
,
204 const ORowSetValueVector
& _aParameterValueForCache
,
205 const ::rtl::OUString
& i_sRowSetFilter
,
206 sal_Int32 i_nMaxRows
);
210 // called from the rowset when a updateXXX was called for the first time
211 void setUpdateIterator(const ORowSetMatrix::iterator
& _rOriginalRow
);
212 ORowSetCacheIterator
createIterator(ORowSetBase
* _pRowSet
);
213 void deleteIterator(const ORowSetBase
* _pRowSet
);
214 // sets the size of the matrix
215 void setFetchSize(sal_Int32 _nSize
);
217 TORowSetOldRowHelperRef
registerOldRow();
218 void deregisterOldRow(const TORowSetOldRowHelperRef
& _rRow
);
220 // ::com::sun::star::sdbc::XResultSetMetaDataSupplier
221 ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XResultSetMetaData
> getMetaData( );
223 // ::com::sun::star::sdbcx::XRowLocate
224 ::com::sun::star::uno::Any
getBookmark( );
225 sal_Bool
moveToBookmark( const ::com::sun::star::uno::Any
& bookmark
);
226 sal_Bool
moveRelativeToBookmark( const ::com::sun::star::uno::Any
& bookmark
, sal_Int32 rows
);
227 sal_Int32
compareBookmarks( const ::com::sun::star::uno::Any
& first
, const ::com::sun::star::uno::Any
& second
);
228 sal_Bool
hasOrderedBookmarks( );
229 sal_Int32
hashBookmark( const ::com::sun::star::uno::Any
& bookmark
);
231 // ::com::sun::star::sdbc::XRowUpdate
232 void updateCharacterStream( sal_Int32 columnIndex
, const ::com::sun::star::uno::Reference
< ::com::sun::star::io::XInputStream
>& x
, sal_Int32 length
,ORowSetValueVector::Vector
& io_aRow
,::std::vector
<sal_Int32
>& o_ChangedColumns
234 void updateObject( sal_Int32 columnIndex
, const ::com::sun::star::uno::Any
& x
,ORowSetValueVector::Vector
& io_aRow
,::std::vector
<sal_Int32
>& o_ChangedColumns
);
235 void updateNumericObject( sal_Int32 columnIndex
, const ::com::sun::star::uno::Any
& x
, sal_Int32 scale
,ORowSetValueVector::Vector
& io_aRow
,::std::vector
<sal_Int32
>& o_ChangedColumns
);
236 void updateNull(sal_Int32 columnIndex
237 ,ORowSetValueVector::Vector
& io_aRow
238 ,::std::vector
<sal_Int32
>& o_ChangedColumns
241 // ::com::sun::star::sdbc::XResultSet
243 sal_Bool
isBeforeFirst( );
244 sal_Bool
isAfterLast( );
247 sal_Bool
beforeFirst( );
248 sal_Bool
afterLast( );
252 sal_Bool
absolute( sal_Int32 row
);
253 sal_Bool
relative( sal_Int32 rows
);
254 sal_Bool
previous( );
256 sal_Bool
rowUpdated( );
257 sal_Bool
rowInserted( );
259 // ::com::sun::star::sdbc::XResultSetUpdate
260 sal_Bool
insertRow(::std::vector
< ::com::sun::star::uno::Any
>& o_aBookmarks
);
261 void resetInsertRow(sal_Bool _bClearInsertRow
);
263 void updateRow( ORowSetMatrix::iterator
& _rUpdateRow
,::std::vector
< ::com::sun::star::uno::Any
>& o_aBookmarks
);
265 void cancelRowUpdates( );
266 void moveToInsertRow( );
268 const ::std::map
<sal_Int32
,sal_Int32
>& getKeyColumns() const { return m_aKeyColumns
; }
269 bool isResultSetChanged() const;
270 void reset(const ::com::sun::star::uno::Reference
< ::com::sun::star::sdbc::XResultSet
>& _xDriverSet
);