1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 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. 14 * 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). 20 * 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. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_dbaccess.hxx" 30 #ifndef DBACCESS_CORE_API_BOOKMARKSET_HXX 31 #include "BookmarkSet.hxx" 32 #endif 33 #ifndef _DBA_CORE_RESOURCE_HXX_ 34 #include "core_resource.hxx" 35 #endif 36 #ifndef _DBA_CORE_RESOURCE_HRC_ 37 #include "core_resource.hrc" 38 #endif 39 #ifndef _COM_SUN_STAR_SDBC_XRESULTSETUPDATE_HPP_ 40 #include <com/sun/star/sdbc/XResultSetUpdate.hpp> 41 #endif 42 #ifndef _DBHELPER_DBEXCEPTION_HXX_ 43 #include <connectivity/dbexception.hxx> 44 #endif 45 #include <rtl/logfile.hxx> 46 47 #include <limits> 48 49 using namespace dbaccess; 50 using namespace ::connectivity; 51 using namespace ::dbtools; 52 using namespace ::com::sun::star::uno; 53 using namespace ::com::sun::star::beans; 54 using namespace ::com::sun::star::sdbc; 55 // using namespace ::com::sun::star::sdb; 56 using namespace ::com::sun::star::sdbcx; 57 using namespace ::com::sun::star::container; 58 using namespace ::com::sun::star::lang; 59 // using namespace ::cppu; 60 using namespace ::osl; 61 62 void OBookmarkSet::construct(const Reference< XResultSet>& _xDriverSet,const ::rtl::OUString& i_sRowSetFilter) 63 { 64 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::construct" ); 65 OCacheSet::construct(_xDriverSet,i_sRowSetFilter); 66 m_xRowLocate.set(_xDriverSet,UNO_QUERY); 67 } 68 // ----------------------------------------------------------------------------- 69 Any SAL_CALL OBookmarkSet::getBookmark() throw(SQLException, RuntimeException) 70 { 71 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::getBookmark" ); 72 return m_xRowLocate->getBookmark(); 73 } 74 // ------------------------------------------------------------------------- 75 sal_Bool SAL_CALL OBookmarkSet::moveToBookmark( const Any& bookmark ) throw(SQLException, RuntimeException) 76 { 77 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::moveToBookmark" ); 78 return m_xRowLocate->moveToBookmark(bookmark); 79 } 80 // ------------------------------------------------------------------------- 81 sal_Bool SAL_CALL OBookmarkSet::moveRelativeToBookmark( const Any& bookmark, sal_Int32 rows ) throw(SQLException, RuntimeException) 82 { 83 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::moveRelativeToBookmark" ); 84 return m_xRowLocate->moveRelativeToBookmark(bookmark,rows); 85 } 86 // ------------------------------------------------------------------------- 87 sal_Int32 SAL_CALL OBookmarkSet::compareBookmarks( const Any& _first, const Any& _second ) throw(SQLException, RuntimeException) 88 { 89 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::compareBookmarks" ); 90 return m_xRowLocate->compareBookmarks(_first,_second); 91 } 92 // ------------------------------------------------------------------------- 93 sal_Bool SAL_CALL OBookmarkSet::hasOrderedBookmarks( ) throw(SQLException, RuntimeException) 94 { 95 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::hasOrderedBookmarks" ); 96 return m_xRowLocate->hasOrderedBookmarks(); 97 } 98 // ------------------------------------------------------------------------- 99 sal_Int32 SAL_CALL OBookmarkSet::hashBookmark( const Any& bookmark ) throw(SQLException, RuntimeException) 100 { 101 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::hashBookmark" ); 102 return m_xRowLocate->hashBookmark(bookmark); 103 } 104 // ------------------------------------------------------------------------- 105 // ::com::sun::star::sdbcx::XDeleteRows 106 Sequence< sal_Int32 > SAL_CALL OBookmarkSet::deleteRows( const Sequence< Any >& rows ,const connectivity::OSQLTable& /*_xTable*/) throw(SQLException, RuntimeException) 107 { 108 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::deleteRows" ); 109 Reference< ::com::sun::star::sdbcx::XDeleteRows> xDeleteRow(m_xRowLocate,UNO_QUERY); 110 if(xDeleteRow.is()) 111 { 112 return xDeleteRow->deleteRows(rows); 113 } 114 return Sequence< sal_Int32 >(); 115 } 116 // ------------------------------------------------------------------------- 117 void SAL_CALL OBookmarkSet::insertRow( const ORowSetRow& _rInsertRow,const connectivity::OSQLTable& /*_xTable*/ ) throw(SQLException, RuntimeException) 118 { 119 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::insertRow" ); 120 Reference<XRowUpdate> xUpdRow(m_xRowLocate,UNO_QUERY); 121 if(!xUpdRow.is()) 122 ::dbtools::throwSQLException( DBACORE_RESSTRING( RID_STR_NO_XROWUPDATE ), SQL_GENERAL_ERROR, *this ); 123 124 Reference<XResultSetUpdate> xUpd(m_xRowLocate,UNO_QUERY); 125 if(xUpd.is()) 126 { 127 xUpd->moveToInsertRow(); 128 sal_Int32 i = 1; 129 connectivity::ORowVector< ORowSetValue > ::Vector::iterator aEnd = _rInsertRow->get().end(); 130 for(connectivity::ORowVector< ORowSetValue > ::Vector::iterator aIter = _rInsertRow->get().begin()+1;aIter != aEnd;++aIter,++i) 131 { 132 aIter->setSigned(m_aSignedFlags[i-1]); 133 updateColumn(i,xUpdRow,*aIter); 134 } 135 xUpd->insertRow(); 136 (*_rInsertRow->get().begin()) = m_xRowLocate->getBookmark(); 137 } 138 else 139 ::dbtools::throwSQLException( DBACORE_RESSTRING( RID_STR_NO_XRESULTSETUPDATE ), SQL_GENERAL_ERROR, *this ); 140 } 141 // ------------------------------------------------------------------------- 142 void SAL_CALL OBookmarkSet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow& _rOrginalRow,const connectivity::OSQLTable& /*_xTable*/ ) throw(SQLException, RuntimeException) 143 { 144 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::updateRow" ); 145 // OCacheSet::updateRow( _rInsertRow,_rOrginalRow,_xTable); 146 Reference<XRowUpdate> xUpdRow(m_xRowLocate,UNO_QUERY); 147 if(!xUpdRow.is()) 148 ::dbtools::throwSQLException( DBACORE_RESSTRING( RID_STR_NO_XROWUPDATE ), SQL_GENERAL_ERROR, *this ); 149 150 sal_Int32 i = 1; 151 connectivity::ORowVector< ORowSetValue > ::Vector::const_iterator aOrgIter = _rOrginalRow->get().begin()+1; 152 connectivity::ORowVector< ORowSetValue > ::Vector::iterator aEnd = _rInsertRow->get().end(); 153 for(connectivity::ORowVector< ORowSetValue > ::Vector::iterator aIter = _rInsertRow->get().begin()+1;aIter != aEnd;++aIter,++i,++aOrgIter) 154 { 155 aIter->setSigned(aOrgIter->isSigned()); 156 updateColumn(i,xUpdRow,*aIter); 157 } 158 159 160 Reference<XResultSetUpdate> xUpd(m_xRowLocate,UNO_QUERY); 161 if(xUpd.is()) 162 xUpd->updateRow(); 163 else 164 ::dbtools::throwSQLException( DBACORE_RESSTRING( RID_STR_NO_XRESULTSETUPDATE ), SQL_GENERAL_ERROR, *this ); 165 } 166 // ------------------------------------------------------------------------- 167 void SAL_CALL OBookmarkSet::deleteRow(const ORowSetRow& /*_rDeleteRow*/ ,const connectivity::OSQLTable& /*_xTable*/ ) throw(SQLException, RuntimeException) 168 { 169 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::deleteRow" ); 170 Reference<XResultSetUpdate> xUpd(m_xRowLocate,UNO_QUERY); 171 172 xUpd->deleteRow(); 173 } 174 // ------------------------------------------------------------------------- 175 void SAL_CALL OBookmarkSet::cancelRowUpdates( ) throw(SQLException, RuntimeException) 176 { 177 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::cancelRowUpdates" ); 178 } 179 // ------------------------------------------------------------------------- 180 void SAL_CALL OBookmarkSet::moveToInsertRow( ) throw(SQLException, RuntimeException) 181 { 182 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::moveToInsertRow" ); 183 Reference<XResultSetUpdate> xUpd(m_xRowLocate,UNO_QUERY); 184 if(xUpd.is()) 185 xUpd->moveToInsertRow(); 186 } 187 // ------------------------------------------------------------------------- 188 void SAL_CALL OBookmarkSet::moveToCurrentRow( ) throw(SQLException, RuntimeException) 189 { 190 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::moveToCurrentRow" ); 191 } 192 // ------------------------------------------------------------------------- 193 void OBookmarkSet::fillValueRow(ORowSetRow& _rRow,sal_Int32 _nPosition) 194 { 195 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::fillValueRow" ); 196 OCacheSet::fillValueRow(_rRow,_nPosition); 197 } 198 // ------------------------------------------------------------------------- 199 void OBookmarkSet::updateColumn(sal_Int32 nPos,Reference< XRowUpdate > _xParameter,const ORowSetValue& _rValue) 200 { 201 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OBookmarkSet::updateColumn" ); 202 if(_rValue.isBound() && _rValue.isModified()) 203 { 204 if(_rValue.isNull()) 205 _xParameter->updateNull(nPos); 206 else 207 { 208 209 switch(_rValue.getTypeKind()) 210 { 211 case DataType::DECIMAL: 212 case DataType::NUMERIC: 213 _xParameter->updateNumericObject(nPos,_rValue.makeAny(),m_xSetMetaData->getScale(nPos)); 214 break; 215 case DataType::CHAR: 216 case DataType::VARCHAR: 217 //case DataType::DECIMAL: 218 //case DataType::NUMERIC: 219 _xParameter->updateString(nPos,_rValue); 220 break; 221 case DataType::BIGINT: 222 if ( _rValue.isSigned() ) 223 _xParameter->updateLong(nPos,_rValue); 224 else 225 _xParameter->updateString(nPos,_rValue); 226 break; 227 case DataType::BIT: 228 case DataType::BOOLEAN: 229 _xParameter->updateBoolean(nPos,_rValue); 230 break; 231 case DataType::TINYINT: 232 if ( _rValue.isSigned() ) 233 _xParameter->updateByte(nPos,_rValue); 234 else 235 _xParameter->updateShort(nPos,_rValue); 236 break; 237 case DataType::SMALLINT: 238 if ( _rValue.isSigned() ) 239 _xParameter->updateShort(nPos,_rValue); 240 else 241 _xParameter->updateInt(nPos,_rValue); 242 break; 243 case DataType::INTEGER: 244 if ( _rValue.isSigned() ) 245 _xParameter->updateInt(nPos,_rValue); 246 else 247 _xParameter->updateLong(nPos,_rValue); 248 break; 249 case DataType::FLOAT: 250 _xParameter->updateFloat(nPos,_rValue); 251 break; 252 case DataType::DOUBLE: 253 case DataType::REAL: 254 _xParameter->updateDouble(nPos,_rValue); 255 break; 256 case DataType::DATE: 257 _xParameter->updateDate(nPos,_rValue); 258 break; 259 case DataType::TIME: 260 _xParameter->updateTime(nPos,_rValue); 261 break; 262 case DataType::TIMESTAMP: 263 _xParameter->updateTimestamp(nPos,_rValue); 264 break; 265 case DataType::BINARY: 266 case DataType::VARBINARY: 267 case DataType::LONGVARBINARY: 268 _xParameter->updateBytes(nPos,_rValue); 269 break; 270 case DataType::BLOB: 271 case DataType::CLOB: 272 _xParameter->updateObject(nPos,_rValue.getAny()); 273 break; 274 } 275 } 276 } 277 } 278 279