1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef DBACCESS_CORE_API_ROWSETCACHE_HXX
#define DBACCESS_CORE_API_ROWSETCACHE_HXX
#include <connectivity/CommonTools.hxx>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/sdbc/XPreparedStatement.hpp>
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp>
#include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp>
#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
#include <com/sun/star/sdbc/XWarningsSupplier.hpp>
#include <com/sun/star/sdb/XResultSetAccess.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <com/sun/star/sdbc/XColumnLocate.hpp>
#include <com/sun/star/sdbcx/XRowLocate.hpp>
#include <com/sun/star/sdbc/XRowUpdate.hpp>
#include <com/sun/star/sdbc/XResultSetUpdate.hpp>
#include <com/sun/star/sdb/XRowSetApproveBroadcaster.hpp>
#include <com/sun/star/sdbc/ResultSetType.hpp>
#include <com/sun/star/sdbcx/XDeleteRows.hpp>
#include <cppuhelper/compbase11.hxx>
#include <comphelper/propertycontainer.hxx>
#include <comphelper/componentcontext.hxx>
#include <cppuhelper/implbase5.hxx>
#include <comphelper/proparrhlp.hxx>
#include "RowSetRow.hxx"
#include "RowSetCacheIterator.hxx"
namespace connectivity
{
class OSQLParseNode;
}
namespace dbaccess
{
class OCacheSet;
class ORowSetDataColumns;
class ORowSetCacheClone;
class ORowSetCache
{
friend class ORowSetBase;
friend class ORowSet;
friend class ORowSetClone;
friend class ORowSetCacheIterator;
typedef ::std::vector< TORowSetOldRowHelperRef > TOldRowSetRows;
::std::map<sal_Int32,sal_Int32> m_aKeyColumns;
//the set can be static, bookmarkable or keyset
::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet> m_xSet;
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > m_xMetaData; // must be before m_aInsertRow
::comphelper::ComponentContext m_aContext;
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow> m_xCacheSet;
OCacheSet* m_pCacheSet; // is a bookmarkable, keyset or static resultset
ORowSetMatrix* m_pMatrix; // represent the table struct
ORowSetMatrix::iterator m_aMatrixIter; // represent a row of the table
ORowSetMatrix::iterator m_aMatrixEnd; // present the row behind the last row of the table
ORowSetCacheMap m_aCacheIterators;
TOldRowSetRows m_aOldRows;
ORowSetMatrix* m_pInsertMatrix; // represent the rows which should be inserted normally this is only one
ORowSetMatrix::iterator m_aInsertRow; // represent a insert row
sal_Int32 m_nLastColumnIndex; // the last column ask for, used for wasNull()
connectivity::OSQLTable m_aUpdateTable; // used for updates/deletes and inserts
sal_Int32 m_nFetchSize;
sal_Int32 m_nRowCount;
sal_Int32 m_nPrivileges;
sal_Int32 m_nPosition; // 0 means beforefirst
sal_Int32 m_nStartPos; // start pos of the window zero based
sal_Int32 m_nEndPos; // end pos of the window zero based
sal_Bool m_bRowCountFinal ;
sal_Bool m_bBeforeFirst ;
sal_Bool m_bAfterLast ;
sal_Bool m_bUpdated ;
sal_Bool& m_bModified ; // points to the rowset member m_bModified
sal_Bool& m_bNew ; // points to the rowset member m_bNew
sal_Bool fill(ORowSetMatrix::iterator& _aIter,const ORowSetMatrix::iterator& _aEnd,sal_Int32& _nPos,sal_Bool _bCheck);
sal_Bool reFillMatrix(sal_Int32 _nNewStartPos,sal_Int32 nNewEndPos);
sal_Bool fillMatrix(sal_Int32 &_nNewStartPos,sal_Int32 _nNewEndPos);
sal_Bool moveWindow();
// returns true when a keyset needs to be created.
sal_Bool impl_createBookmarkSet_nothrow(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet >& _xRs);
void firePropertyChange(sal_Int32 _nColumnIndex,const ::connectivity::ORowSetValue& _rOldValue);
void rotateCacheIterator(ORowSetMatrix::difference_type _nDist);
void updateValue(sal_Int32 columnIndex
,const connectivity::ORowSetValue& x
,ORowSetValueVector::Vector& io_aRow
,::std::vector<sal_Int32>& o_ChangedColumns
);
void impl_updateRowFromCache_throw(ORowSetValueVector::Vector& io_aRow
,::std::vector<sal_Int32>& o_ChangedColumns
);
// checks and set the flags isAfterLast isLast and position when afterlast is true
void checkPositionFlags();
void checkUpdateConditions(sal_Int32 columnIndex);
sal_Bool checkJoin( const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer >& _xComposer,
const ::rtl::OUString& _sUpdateTableName);
sal_Bool checkInnerJoin(const ::connectivity::OSQLParseNode *pNode
,const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection
,const ::rtl::OUString& _sUpdateTableName);
// clears the insert row
void clearInsertRow();
ORowSetMatrix::iterator calcPosition() const;
protected:
ORowSetMatrix::iterator& getEnd() { return m_aMatrixEnd;}
// is called when after a moveToInsertRow a movement (next, etc) was called
void cancelRowModification();
public:
ORowSetCache(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet >& _xRs,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer >& _xAnalyzer,
const ::comphelper::ComponentContext& _rContext,
const ::rtl::OUString& _rUpdateTableName,
sal_Bool& _bModified,
sal_Bool& _bNew,
const ORowSetValueVector& _aParameterValueForCache,
const ::rtl::OUString& i_sRowSetFilter,
sal_Int32 i_nMaxRows);
~ORowSetCache();
// called from the rowset when a updateXXX was called for the first time
void setUpdateIterator(const ORowSetMatrix::iterator& _rOriginalRow);
ORowSetCacheIterator createIterator(ORowSetBase* _pRowSet);
void deleteIterator(const ORowSetBase* _pRowSet);
// sets the size of the matrix
void setFetchSize(sal_Int32 _nSize);
TORowSetOldRowHelperRef registerOldRow();
void deregisterOldRow(const TORowSetOldRowHelperRef& _rRow);
// ::com::sun::star::sdbc::XResultSetMetaDataSupplier
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > getMetaData( );
// ::com::sun::star::sdbcx::XRowLocate
::com::sun::star::uno::Any getBookmark( );
sal_Bool moveToBookmark( const ::com::sun::star::uno::Any& bookmark );
sal_Bool moveRelativeToBookmark( const ::com::sun::star::uno::Any& bookmark, sal_Int32 rows );
sal_Int32 compareBookmarks( const ::com::sun::star::uno::Any& first, const ::com::sun::star::uno::Any& second );
sal_Bool hasOrderedBookmarks( );
sal_Int32 hashBookmark( const ::com::sun::star::uno::Any& bookmark );
// ::com::sun::star::sdbc::XRowUpdate
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
);
void updateObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x,ORowSetValueVector::Vector& io_aRow ,::std::vector<sal_Int32>& o_ChangedColumns);
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);
void updateNull(sal_Int32 columnIndex
,ORowSetValueVector::Vector& io_aRow
,::std::vector<sal_Int32>& o_ChangedColumns
);
// ::com::sun::star::sdbc::XResultSet
sal_Bool next( );
sal_Bool isBeforeFirst( );
sal_Bool isAfterLast( );
sal_Bool isFirst( );
sal_Bool isLast( );
sal_Bool beforeFirst( );
sal_Bool afterLast( );
sal_Bool first( );
sal_Bool last( );
sal_Int32 getRow( );
sal_Bool absolute( sal_Int32 row );
sal_Bool relative( sal_Int32 rows );
sal_Bool previous( );
void refreshRow( );
sal_Bool rowUpdated( );
sal_Bool rowInserted( );
// ::com::sun::star::sdbc::XResultSetUpdate
sal_Bool insertRow(::std::vector< ::com::sun::star::uno::Any >& o_aBookmarks);
void resetInsertRow(sal_Bool _bClearInsertRow);
void updateRow( ORowSetMatrix::iterator& _rUpdateRow,::std::vector< ::com::sun::star::uno::Any >& o_aBookmarks );
bool deleteRow();
void cancelRowUpdates( );
void moveToInsertRow( );
const ::std::map<sal_Int32,sal_Int32>& getKeyColumns() const { return m_aKeyColumns; }
bool isResultSetChanged() const;
void reset(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>& _xDriverSet);
};
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|