xref: /trunk/main/dbaccess/source/core/api/WrappedResultSet.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2008 by Sun Microsystems, Inc.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * $RCSfile: BookmarkSet.cxx,v $
10  * $Revision: 1.21 $
11  *
12  * This file is part of OpenOffice.org.
13  *
14  * OpenOffice.org is free software: you can redistribute it and/or modify
15  * it under the terms of the GNU Lesser General Public License version 3
16  * only, as published by the Free Software Foundation.
17  *
18  * OpenOffice.org is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU Lesser General Public License version 3 for more details
22  * (a copy is included in the LICENSE file that accompanied this code).
23  *
24  * You should have received a copy of the GNU Lesser General Public License
25  * version 3 along with OpenOffice.org.  If not, see
26  * <http://www.openoffice.org/license.html>
27  * for a copy of the LGPLv3 License.
28  *
29  ************************************************************************/
30 
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_dbaccess.hxx"
33 #include "WrappedResultSet.hxx"
34 #include "core_resource.hxx"
35 #include "core_resource.hrc"
36 #include <com/sun/star/sdbc/XResultSetUpdate.hpp>
37 #include <connectivity/dbexception.hxx>
38 #include <rtl/logfile.hxx>
39 
40 #include <limits>
41 
42 using namespace dbaccess;
43 using namespace ::connectivity;
44 using namespace ::dbtools;
45 using namespace ::com::sun::star::uno;
46 using namespace ::com::sun::star::beans;
47 using namespace ::com::sun::star::sdbc;
48 //  using namespace ::com::sun::star::sdb;
49 using namespace ::com::sun::star::sdbcx;
50 using namespace ::com::sun::star::container;
51 using namespace ::com::sun::star::lang;
52 //  using namespace ::cppu;
53 using namespace ::osl;
54 
55 void WrappedResultSet::construct(const Reference< XResultSet>& _xDriverSet,const ::rtl::OUString& i_sRowSetFilter)
56 {
57     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::construct" );
58     OCacheSet::construct(_xDriverSet,i_sRowSetFilter);
59     m_xUpd.set(_xDriverSet,UNO_QUERY_THROW);
60     m_xRowLocate.set(_xDriverSet,UNO_QUERY_THROW);
61     m_xUpdRow.set(_xDriverSet,UNO_QUERY_THROW);
62 }
63 // -----------------------------------------------------------------------------
64 Any SAL_CALL WrappedResultSet::getBookmark() throw(SQLException, RuntimeException)
65 {
66     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::getBookmark" );
67     if ( m_xRowLocate.is() )
68     {
69         return m_xRowLocate->getBookmark( );
70     }
71     return makeAny(m_xDriverSet->getRow());
72 }
73 // -------------------------------------------------------------------------
74 sal_Bool SAL_CALL WrappedResultSet::moveToBookmark( const Any& bookmark ) throw(SQLException, RuntimeException)
75 {
76     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::moveToBookmark" );
77     return m_xRowLocate->moveToBookmark( bookmark );
78 }
79 // -------------------------------------------------------------------------
80 sal_Bool SAL_CALL WrappedResultSet::moveRelativeToBookmark( const Any& bookmark, sal_Int32 rows ) throw(SQLException, RuntimeException)
81 {
82     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::moveRelativeToBookmark" );
83     return m_xRowLocate->moveRelativeToBookmark( bookmark,rows );
84 }
85 // -------------------------------------------------------------------------
86 sal_Int32 SAL_CALL WrappedResultSet::compareBookmarks( const Any& _first, const Any& _second ) throw(SQLException, RuntimeException)
87 {
88     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::compareBookmarks" );
89     return m_xRowLocate->compareBookmarks( _first,_second );
90 }
91 // -------------------------------------------------------------------------
92 sal_Bool SAL_CALL WrappedResultSet::hasOrderedBookmarks(  ) throw(SQLException, RuntimeException)
93 {
94     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::hasOrderedBookmarks" );
95     return m_xRowLocate->hasOrderedBookmarks();
96 }
97 // -------------------------------------------------------------------------
98 sal_Int32 SAL_CALL WrappedResultSet::hashBookmark( const Any& bookmark ) throw(SQLException, RuntimeException)
99 {
100     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::hashBookmark" );
101     return m_xRowLocate->hashBookmark(bookmark);
102 }
103 // -------------------------------------------------------------------------
104 // ::com::sun::star::sdbcx::XDeleteRows
105 Sequence< sal_Int32 > SAL_CALL WrappedResultSet::deleteRows( const Sequence< Any >& rows ,const connectivity::OSQLTable& /*_xTable*/) throw(SQLException, RuntimeException)
106 {
107     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::deleteRows" );
108     Reference< ::com::sun::star::sdbcx::XDeleteRows> xDeleteRow(m_xRowLocate,UNO_QUERY);
109     if(xDeleteRow.is())
110     {
111         return xDeleteRow->deleteRows(rows);
112     }
113     return Sequence< sal_Int32 >();
114 }
115 // -------------------------------------------------------------------------
116 void SAL_CALL WrappedResultSet::insertRow( const ORowSetRow& _rInsertRow,const connectivity::OSQLTable& /*_xTable*/ ) throw(SQLException, RuntimeException)
117 {
118     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::insertRow" );
119 
120     m_xUpd->moveToInsertRow();
121     sal_Int32 i = 1;
122     connectivity::ORowVector< ORowSetValue > ::Vector::iterator aEnd = _rInsertRow->get().end();
123     for(connectivity::ORowVector< ORowSetValue > ::Vector::iterator aIter = _rInsertRow->get().begin()+1;aIter != aEnd;++aIter,++i)
124     {
125         aIter->setSigned(m_aSignedFlags[i-1]);
126         updateColumn(i,m_xUpdRow,*aIter);
127     }
128     m_xUpd->insertRow();
129     (*_rInsertRow->get().begin()) = getBookmark();
130 }
131 // -------------------------------------------------------------------------
132 void SAL_CALL WrappedResultSet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow& _rOrginalRow,const connectivity::OSQLTable& /*_xTable*/  ) throw(SQLException, RuntimeException)
133 {
134     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::updateRow" );
135     sal_Int32 i = 1;
136     connectivity::ORowVector< ORowSetValue > ::Vector::const_iterator aOrgIter = _rOrginalRow->get().begin()+1;
137     connectivity::ORowVector< ORowSetValue > ::Vector::iterator aEnd = _rInsertRow->get().end();
138     for(connectivity::ORowVector< ORowSetValue > ::Vector::iterator aIter = _rInsertRow->get().begin()+1;aIter != aEnd;++aIter,++i,++aOrgIter)
139     {
140         aIter->setSigned(aOrgIter->isSigned());
141         updateColumn(i,m_xUpdRow,*aIter);
142     }
143     m_xUpd->updateRow();
144 }
145 // -------------------------------------------------------------------------
146 void SAL_CALL WrappedResultSet::deleteRow(const ORowSetRow& /*_rDeleteRow*/ ,const connectivity::OSQLTable& /*_xTable*/  ) throw(SQLException, RuntimeException)
147 {
148     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::deleteRow" );
149     m_xUpd->deleteRow();
150 }
151 // -------------------------------------------------------------------------
152 void SAL_CALL WrappedResultSet::cancelRowUpdates(  ) throw(SQLException, RuntimeException)
153 {
154     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::cancelRowUpdates" );
155     m_xUpd->cancelRowUpdates();
156 }
157 // -------------------------------------------------------------------------
158 void SAL_CALL WrappedResultSet::moveToInsertRow(  ) throw(SQLException, RuntimeException)
159 {
160     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::moveToInsertRow" );
161     m_xUpd->moveToInsertRow();
162 }
163 // -------------------------------------------------------------------------
164 void SAL_CALL WrappedResultSet::moveToCurrentRow(  ) throw(SQLException, RuntimeException)
165 {
166     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::moveToCurrentRow" );
167     m_xUpd->moveToCurrentRow();
168 }
169 // -------------------------------------------------------------------------
170 void WrappedResultSet::fillValueRow(ORowSetRow& _rRow,sal_Int32 _nPosition)
171 {
172     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::fillValueRow" );
173     OCacheSet::fillValueRow(_rRow,_nPosition);
174 }
175 // -------------------------------------------------------------------------
176 void WrappedResultSet::updateColumn(sal_Int32 nPos,Reference< XRowUpdate > _xParameter,const ORowSetValue& _rValue)
177 {
178     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "WrappedResultSet::updateColumn" );
179     if(_rValue.isBound() && _rValue.isModified())
180     {
181         if(_rValue.isNull())
182             _xParameter->updateNull(nPos);
183         else
184         {
185 
186             switch(_rValue.getTypeKind())
187             {
188                 case DataType::DECIMAL:
189                 case DataType::NUMERIC:
190                     _xParameter->updateNumericObject(nPos,_rValue.makeAny(),m_xSetMetaData->getScale(nPos));
191                     break;
192                 case DataType::CHAR:
193                 case DataType::VARCHAR:
194                 //case DataType::DECIMAL:
195                 //case DataType::NUMERIC:
196                     _xParameter->updateString(nPos,_rValue);
197                     break;
198                 case DataType::BIGINT:
199                     if ( _rValue.isSigned() )
200                         _xParameter->updateLong(nPos,_rValue);
201                     else
202                         _xParameter->updateString(nPos,_rValue);
203                     break;
204                 case DataType::BIT:
205                 case DataType::BOOLEAN:
206                     _xParameter->updateBoolean(nPos,_rValue);
207                     break;
208                 case DataType::TINYINT:
209                     if ( _rValue.isSigned() )
210                         _xParameter->updateByte(nPos,_rValue);
211                     else
212                         _xParameter->updateShort(nPos,_rValue);
213                     break;
214                 case DataType::SMALLINT:
215                     if ( _rValue.isSigned() )
216                         _xParameter->updateShort(nPos,_rValue);
217                     else
218                         _xParameter->updateInt(nPos,_rValue);
219                     break;
220                 case DataType::INTEGER:
221                     if ( _rValue.isSigned() )
222                         _xParameter->updateInt(nPos,_rValue);
223                     else
224                         _xParameter->updateLong(nPos,_rValue);
225                     break;
226                 case DataType::FLOAT:
227                     _xParameter->updateFloat(nPos,_rValue);
228                     break;
229                 case DataType::DOUBLE:
230                 case DataType::REAL:
231                     _xParameter->updateDouble(nPos,_rValue);
232                     break;
233                 case DataType::DATE:
234                     _xParameter->updateDate(nPos,_rValue);
235                     break;
236                 case DataType::TIME:
237                     _xParameter->updateTime(nPos,_rValue);
238                     break;
239                 case DataType::TIMESTAMP:
240                     _xParameter->updateTimestamp(nPos,_rValue);
241                     break;
242                 case DataType::BINARY:
243                 case DataType::VARBINARY:
244                 case DataType::LONGVARBINARY:
245                     _xParameter->updateBytes(nPos,_rValue);
246                     break;
247                 case DataType::BLOB:
248                 case DataType::CLOB:
249                     _xParameter->updateObject(nPos,_rValue.getAny());
250                     break;
251             }
252         }
253     }
254 }
255 
256