1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_dbaccess.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "TokenWriter.hxx" 32*cdf0e10cSrcweir #include <com/sun/star/sdbc/XColumnLocate.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp> 34*cdf0e10cSrcweir #include "dbu_misc.hrc" 35*cdf0e10cSrcweir #include "sqlmessage.hxx" 36*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 37*cdf0e10cSrcweir #include "dbustrings.hrc" 38*cdf0e10cSrcweir #include <com/sun/star/sdbc/XRowUpdate.hpp> 39*cdf0e10cSrcweir #include <functional> 40*cdf0e10cSrcweir #include <rtl/logfile.hxx> 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir using namespace dbaui; 43*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 44*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 45*cdf0e10cSrcweir using namespace ::com::sun::star::container; 46*cdf0e10cSrcweir using namespace ::com::sun::star::util; 47*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 48*cdf0e10cSrcweir using namespace ::com::sun::star::sdb; 49*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 50*cdf0e10cSrcweir // using namespace ::com::sun::star::sdbcx; 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir // export data 53*cdf0e10cSrcweir ORowSetImportExport::ORowSetImportExport( Window* _pParent, 54*cdf0e10cSrcweir const Reference< XResultSetUpdate >& _xResultSetUpdate, 55*cdf0e10cSrcweir const ::svx::ODataAccessDescriptor& _aDataDescriptor, 56*cdf0e10cSrcweir const Reference< XMultiServiceFactory >& _rM, 57*cdf0e10cSrcweir const String& rExchange 58*cdf0e10cSrcweir ) 59*cdf0e10cSrcweir : ODatabaseImportExport(_aDataDescriptor,_rM,NULL,rExchange) 60*cdf0e10cSrcweir ,m_xTargetResultSetUpdate(_xResultSetUpdate) 61*cdf0e10cSrcweir ,m_xTargetRowUpdate(_xResultSetUpdate,UNO_QUERY) 62*cdf0e10cSrcweir ,m_pParent(_pParent) 63*cdf0e10cSrcweir ,m_bAlreadyAsked(sal_False) 64*cdf0e10cSrcweir { 65*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORowSetImportExport::ORowSetImportExport" ); 66*cdf0e10cSrcweir OSL_ENSURE(_pParent,"Window can't be null!"); 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 69*cdf0e10cSrcweir void ORowSetImportExport::initialize() 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORowSetImportExport::initialize" ); 72*cdf0e10cSrcweir ODatabaseImportExport::initialize(); 73*cdf0e10cSrcweir // do namemapping 74*cdf0e10cSrcweir Reference<XColumnLocate> xColumnLocate(m_xResultSet,UNO_QUERY); 75*cdf0e10cSrcweir OSL_ENSURE(xColumnLocate.is(),"The rowset normally should support this"); 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir m_xTargetResultSetMetaData = Reference<XResultSetMetaDataSupplier>(m_xTargetResultSetUpdate,UNO_QUERY)->getMetaData(); 78*cdf0e10cSrcweir if(!m_xTargetResultSetMetaData.is() || !xColumnLocate.is() || !m_xResultSetMetaData.is() ) 79*cdf0e10cSrcweir throw SQLException(String(ModuleRes(STR_UNEXPECTED_ERROR)),*this,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")) ,0,Any()); 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir sal_Int32 nCount = m_xTargetResultSetMetaData->getColumnCount(); 82*cdf0e10cSrcweir m_aColumnMapping.reserve(nCount); 83*cdf0e10cSrcweir m_aColumnTypes.reserve(nCount); 84*cdf0e10cSrcweir for (sal_Int32 i = 1;i <= nCount; ++i) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir sal_Int32 nPos = -1; // -1 means column is autoincrement or doesn't exists 87*cdf0e10cSrcweir if(!m_xTargetResultSetMetaData->isAutoIncrement(i)) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir try 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir ::rtl::OUString sColumnName = m_xTargetResultSetMetaData->getColumnName(i); 92*cdf0e10cSrcweir nPos = xColumnLocate->findColumn(sColumnName); 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir catch(const SQLException&) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir if(m_xTargetResultSetMetaData->isNullable(i)) 97*cdf0e10cSrcweir nPos = 0; // column doesn't exists but we could set it to null 98*cdf0e10cSrcweir } 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir m_aColumnMapping.push_back(nPos); 102*cdf0e10cSrcweir if(nPos > 0) 103*cdf0e10cSrcweir m_aColumnTypes.push_back(m_xResultSetMetaData->getColumnType(nPos)); 104*cdf0e10cSrcweir else 105*cdf0e10cSrcweir m_aColumnTypes.push_back(DataType::OTHER); 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 109*cdf0e10cSrcweir sal_Bool ORowSetImportExport::Write() 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORowSetImportExport::Write" ); 112*cdf0e10cSrcweir return sal_True; 113*cdf0e10cSrcweir } 114*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 115*cdf0e10cSrcweir sal_Bool ORowSetImportExport::Read() 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORowSetImportExport::Read" ); 118*cdf0e10cSrcweir // check if there is any column to copy 119*cdf0e10cSrcweir if(::std::find_if(m_aColumnMapping.begin(),m_aColumnMapping.end(), 120*cdf0e10cSrcweir ::std::bind2nd(::std::greater<sal_Int32>(),0)) == m_aColumnMapping.end()) 121*cdf0e10cSrcweir return sal_False; 122*cdf0e10cSrcweir sal_Int32 nCurrentRow = 0; 123*cdf0e10cSrcweir sal_Int32 nRowFilterIndex = 0; 124*cdf0e10cSrcweir sal_Bool bContinue = sal_True; 125*cdf0e10cSrcweir if(m_aSelection.getLength()) 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir const Any* pBegin = m_aSelection.getConstArray(); 128*cdf0e10cSrcweir const Any* pEnd = pBegin + m_aSelection.getLength(); 129*cdf0e10cSrcweir for(;pBegin != pEnd && bContinue;++pBegin) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir sal_Int32 nPos = -1; 132*cdf0e10cSrcweir *pBegin >>= nPos; 133*cdf0e10cSrcweir OSL_ENSURE(nPos != -1,"Invalid posiotion!"); 134*cdf0e10cSrcweir bContinue = (m_xResultSet.is() && m_xResultSet->absolute(nPos) && insertNewRow()); 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir else 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir Reference<XPropertySet> xProp(m_xResultSet,UNO_QUERY); 140*cdf0e10cSrcweir sal_Int32 nRowCount = 0; 141*cdf0e10cSrcweir if ( xProp.is() && xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_ISROWCOUNTFINAL) ) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir sal_Bool bFinal = sal_False; 144*cdf0e10cSrcweir xProp->getPropertyValue(PROPERTY_ISROWCOUNTFINAL) >>= bFinal; 145*cdf0e10cSrcweir if ( !bFinal ) 146*cdf0e10cSrcweir m_xResultSet->afterLast(); 147*cdf0e10cSrcweir xProp->getPropertyValue(PROPERTY_ROWCOUNT) >>= nRowCount; 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir if ( !nRowCount ) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir m_xResultSet->afterLast(); 152*cdf0e10cSrcweir nRowCount = m_xResultSet->getRow(); 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir OSL_ENSURE(nRowCount,"RowCount is 0!"); 155*cdf0e10cSrcweir m_xResultSet->beforeFirst(); 156*cdf0e10cSrcweir while(m_xResultSet.is() && m_xResultSet->next() && bContinue && nRowCount ) 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir --nRowCount; 159*cdf0e10cSrcweir ++nCurrentRow; 160*cdf0e10cSrcweir if(!m_pRowMarker || m_pRowMarker[nRowFilterIndex] == nCurrentRow) 161*cdf0e10cSrcweir { 162*cdf0e10cSrcweir ++nRowFilterIndex; 163*cdf0e10cSrcweir bContinue = insertNewRow(); 164*cdf0e10cSrcweir } 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir } 167*cdf0e10cSrcweir return sal_True; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 170*cdf0e10cSrcweir sal_Bool ORowSetImportExport::insertNewRow() 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "ORowSetImportExport::insertNewRow" ); 173*cdf0e10cSrcweir try 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir m_xTargetResultSetUpdate->moveToInsertRow(); 176*cdf0e10cSrcweir sal_Int32 i = 1; 177*cdf0e10cSrcweir ::std::vector<sal_Int32>::iterator aEnd = m_aColumnMapping.end(); 178*cdf0e10cSrcweir for (::std::vector<sal_Int32>::iterator aIter = m_aColumnMapping.begin(); aIter != aEnd ;++aIter,++i ) 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir if(*aIter > 0) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir Any aValue; 183*cdf0e10cSrcweir switch(m_aColumnTypes[i-1]) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir case DataType::CHAR: 186*cdf0e10cSrcweir case DataType::VARCHAR: 187*cdf0e10cSrcweir aValue <<= m_xRow->getString(*aIter); 188*cdf0e10cSrcweir break; 189*cdf0e10cSrcweir case DataType::DECIMAL: 190*cdf0e10cSrcweir case DataType::NUMERIC: 191*cdf0e10cSrcweir aValue <<= m_xRow->getDouble(*aIter); 192*cdf0e10cSrcweir break; 193*cdf0e10cSrcweir case DataType::BIGINT: 194*cdf0e10cSrcweir aValue <<= m_xRow->getLong(*aIter); 195*cdf0e10cSrcweir break; 196*cdf0e10cSrcweir case DataType::FLOAT: 197*cdf0e10cSrcweir aValue <<= m_xRow->getFloat(*aIter); 198*cdf0e10cSrcweir break; 199*cdf0e10cSrcweir case DataType::DOUBLE: 200*cdf0e10cSrcweir aValue <<= m_xRow->getDouble(*aIter); 201*cdf0e10cSrcweir break; 202*cdf0e10cSrcweir case DataType::LONGVARCHAR: 203*cdf0e10cSrcweir aValue <<= m_xRow->getString(*aIter); 204*cdf0e10cSrcweir break; 205*cdf0e10cSrcweir case DataType::LONGVARBINARY: 206*cdf0e10cSrcweir aValue <<= m_xRow->getBytes(*aIter); 207*cdf0e10cSrcweir break; 208*cdf0e10cSrcweir case DataType::DATE: 209*cdf0e10cSrcweir aValue <<= m_xRow->getDate(*aIter); 210*cdf0e10cSrcweir break; 211*cdf0e10cSrcweir case DataType::TIME: 212*cdf0e10cSrcweir aValue <<= m_xRow->getTime(*aIter); 213*cdf0e10cSrcweir break; 214*cdf0e10cSrcweir case DataType::TIMESTAMP: 215*cdf0e10cSrcweir aValue <<= m_xRow->getTimestamp(*aIter); 216*cdf0e10cSrcweir break; 217*cdf0e10cSrcweir case DataType::BIT: 218*cdf0e10cSrcweir case DataType::BOOLEAN: 219*cdf0e10cSrcweir aValue <<= m_xRow->getBoolean(*aIter); 220*cdf0e10cSrcweir break; 221*cdf0e10cSrcweir case DataType::TINYINT: 222*cdf0e10cSrcweir aValue <<= m_xRow->getByte(*aIter); 223*cdf0e10cSrcweir break; 224*cdf0e10cSrcweir case DataType::SMALLINT: 225*cdf0e10cSrcweir aValue <<= m_xRow->getShort(*aIter); 226*cdf0e10cSrcweir break; 227*cdf0e10cSrcweir case DataType::INTEGER: 228*cdf0e10cSrcweir aValue <<= m_xRow->getInt(*aIter); 229*cdf0e10cSrcweir break; 230*cdf0e10cSrcweir case DataType::REAL: 231*cdf0e10cSrcweir aValue <<= m_xRow->getDouble(*aIter); 232*cdf0e10cSrcweir break; 233*cdf0e10cSrcweir case DataType::BINARY: 234*cdf0e10cSrcweir case DataType::VARBINARY: 235*cdf0e10cSrcweir aValue <<= m_xRow->getBytes(*aIter); 236*cdf0e10cSrcweir break; 237*cdf0e10cSrcweir case DataType::BLOB: 238*cdf0e10cSrcweir aValue <<= m_xRow->getBlob(*aIter); 239*cdf0e10cSrcweir break; 240*cdf0e10cSrcweir case DataType::CLOB: 241*cdf0e10cSrcweir aValue <<= m_xRow->getClob(*aIter); 242*cdf0e10cSrcweir break; 243*cdf0e10cSrcweir default: 244*cdf0e10cSrcweir OSL_ENSURE(0,"Unknown type"); 245*cdf0e10cSrcweir } 246*cdf0e10cSrcweir if(m_xRow->wasNull()) 247*cdf0e10cSrcweir m_xTargetRowUpdate->updateNull(i); 248*cdf0e10cSrcweir else 249*cdf0e10cSrcweir m_xTargetRowUpdate->updateObject(i,aValue); 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir else if(*aIter == 0)//now we have know that we to set this column to null 252*cdf0e10cSrcweir m_xTargetRowUpdate->updateNull(i); 253*cdf0e10cSrcweir } 254*cdf0e10cSrcweir m_xTargetResultSetUpdate->insertRow(); 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir catch(const SQLException&) 257*cdf0e10cSrcweir { 258*cdf0e10cSrcweir if(!m_bAlreadyAsked) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir String sAskIfContinue = String(ModuleRes(STR_ERROR_OCCURED_WHILE_COPYING)); 261*cdf0e10cSrcweir OSQLWarningBox aDlg( m_pParent, sAskIfContinue, WB_YES_NO | WB_DEF_YES ); 262*cdf0e10cSrcweir if(aDlg.Execute() == RET_YES) 263*cdf0e10cSrcweir m_bAlreadyAsked = sal_True; 264*cdf0e10cSrcweir else 265*cdf0e10cSrcweir return sal_False; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir } 268*cdf0e10cSrcweir return sal_True; 269*cdf0e10cSrcweir } 270*cdf0e10cSrcweir // ----------------------------------------------------------------------------- 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir 273*cdf0e10cSrcweir 274