summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/misc/TableCopyHelper.cxx
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2005-01-21 16:19:46 +0000
committerKurt Zenker <kz@openoffice.org>2005-01-21 16:19:46 +0000
commit4494db00d08efead68bfbd753270944329221925 (patch)
tree49a6a128c42db93e39c6f01cd173560042de2f84 /dbaccess/source/ui/misc/TableCopyHelper.cxx
parent7f4eba1de77c3b2ae27538b2429364d31763f7a8 (diff)
INTEGRATION: CWS dba22 (1.1.2); FILE ADDED
2005/01/10 08:36:51 oj 1.1.2.2: compile error 2005/01/03 12:50:04 oj 1.1.2.1: #i39146# renable DnD in beamer
Diffstat (limited to 'dbaccess/source/ui/misc/TableCopyHelper.cxx')
-rw-r--r--dbaccess/source/ui/misc/TableCopyHelper.cxx887
1 files changed, 887 insertions, 0 deletions
diff --git a/dbaccess/source/ui/misc/TableCopyHelper.cxx b/dbaccess/source/ui/misc/TableCopyHelper.cxx
new file mode 100644
index 000000000000..97011e855dc0
--- /dev/null
+++ b/dbaccess/source/ui/misc/TableCopyHelper.cxx
@@ -0,0 +1,887 @@
+/*************************************************************************
+ *
+ * $RCSfile: TableCopyHelper.cxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: kz $ $Date: 2005-01-21 17:19:46 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the License); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an AS IS basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): Ocke Janssen
+ *
+ *
+ ************************************************************************/
+#ifndef DBUI_TABLECOPYHELPER_HXX
+#include "TableCopyHelper.hxx"
+#endif
+#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
+#include "dbustrings.hrc"
+#endif
+#ifndef _DBAUI_SQLMESSAGE_HXX_
+#include "sqlmessage.hxx"
+#endif
+#ifndef _SV_MSGBOX_HXX
+#include <vcl/msgbox.hxx>
+#endif
+#ifndef DBAUI_WIZ_COPYTABLEDIALOG_HXX
+#include "WCopyTable.hxx"
+#endif
+#ifndef DBAUI_GENERICCONTROLLER_HXX
+#include "genericcontroller.hxx"
+#endif
+#ifndef DBAUI_WIZARD_CPAGE_HXX
+#include "WCPage.hxx"
+#endif
+#ifndef DBAUI_WIZ_EXTENDPAGES_HXX
+#include "WExtendPages.hxx"
+#endif
+#ifndef DBAUI_WIZ_NAMEMATCHING_HXX
+#include "WNameMatch.hxx"
+#endif
+#ifndef DBAUI_WIZ_COLUMNSELECT_HXX
+#include "WColumnSelect.hxx"
+#endif
+#ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#endif
+#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
+
+#ifndef DBAUI_RTFREADER_HXX
+#include "RtfReader.hxx"
+#endif
+#ifndef DBAUI_HTMLREADER_HXX
+#include "HtmlReader.hxx"
+#endif
+#ifndef DBAUI_TOKENWRITER_HXX
+#include "TokenWriter.hxx"
+#endif
+#ifndef DBAUI_TOOLS_HXX
+#include "UITools.hxx"
+#endif
+#ifndef DBAUI_DATAVIEW_HXX
+#include "dataview.hxx"
+#endif
+#ifndef _DBU_RESOURCE_HRC_
+#include "dbu_resource.hrc"
+#endif
+#ifndef _UNOTOOLS_UCBHELPER_HXX
+#include <unotools/ucbhelper.hxx>
+#endif
+#ifndef _URLOBJ_HXX
+#include <tools/urlobj.hxx>
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_XVIEWSSUPPLIER_HPP_
+#include <com/sun/star/sdbcx/XViewsSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDB_XQUERYDEFINITIONSSUPPLIER_HPP_
+#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
+#include <com/sun/star/sdb/SQLContext.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XPARAMETERS_HPP_
+#include <com/sun/star/sdbc/XParameters.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
+#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
+#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
+#include <com/sun/star/sdb/XQueriesSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XCOLUMNLOCATE_HPP_
+#include <com/sun/star/sdbc/XColumnLocate.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_XROWLOCATE_HPP_
+#include <com/sun/star/sdbcx/XRowLocate.hpp>
+#endif
+#ifndef _SV_WAITOBJ_HXX
+#include <vcl/waitobj.hxx>
+#endif
+#ifndef _COM_SUN_STAR_SDB_XSQLQUERYCOMPOSERFACTORY_HPP_
+#include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
+#endif
+#ifndef _UNOTOOLS_TEMPFILE_HXX
+#include <unotools/tempfile.hxx>
+#endif
+
+#ifndef DBAUI_DBEXCHANGE_HXX
+#include "dbexchange.hxx"
+#endif
+//........................................................................
+namespace dbaui
+{
+//........................................................................
+using namespace ::dbtools;
+using namespace ::svx;
+// using namespace ::svtools;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::task;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::container;
+using namespace ::com::sun::star::sdb;
+using namespace ::com::sun::star::sdbc;
+using namespace ::com::sun::star::sdbcx;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::ucb;
+
+ // -----------------------------------------------------------------------------
+#define FILL_PARAM(type,method) \
+{ \
+ type nValue = xRow->g##method(i); \
+ if ( !xRow->wasNull() ) \
+ xParameter->s##method(nPos,nValue); \
+ else \
+ xParameter->setNull(nPos,aColumnTypes[i]); \
+}
+// -----------------------------------------------------------------------------
+namespace
+{
+void insertRows(const Reference<XResultSet>& xSrcRs,
+ const ODatabaseExport::TPositions& _rvColumns,
+ const Reference<XPropertySet>& _xDestTable,
+ const Reference<XDatabaseMetaData>& _xMetaData,
+ sal_Bool bIsAutoIncrement,
+ const Sequence<Any>& _aSelection,
+ sal_Bool _bBookmarkSelection,
+ Window* _pParent
+ ) throw(SQLException, RuntimeException)
+{
+ Reference< XResultSetMetaDataSupplier> xSrcMetaSup(xSrcRs,UNO_QUERY);
+ Reference<XRow> xRow(xSrcRs,UNO_QUERY);
+ Reference< XRowLocate > xRowLocate( xSrcRs, UNO_QUERY );
+ sal_Bool bUseSelection = _aSelection.getLength() > 0;
+
+ if ( !xRow.is() || ( bUseSelection && _bBookmarkSelection && !xRowLocate.is() ) )
+ {
+ DBG_ERROR( "insertRows: bad arguments!" );
+ return;
+ }
+
+ ::rtl::OUString aSql(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INSERT INTO ")));
+ ::rtl::OUString sComposedTableName = ::dbtools::composeTableName(_xMetaData,_xDestTable,sal_True,::dbtools::eInDataManipulation);
+
+ aSql += sComposedTableName;
+ aSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ( "));
+ // set values and column names
+ ::rtl::OUString aValues(RTL_CONSTASCII_USTRINGPARAM(" VALUES ( "));
+ static ::rtl::OUString aPara(RTL_CONSTASCII_USTRINGPARAM("?,"));
+ static ::rtl::OUString aComma(RTL_CONSTASCII_USTRINGPARAM(","));
+
+ ::rtl::OUString aQuote;
+ if ( _xMetaData.is() )
+ aQuote = _xMetaData->getIdentifierQuoteString();
+
+ Reference<XColumnsSupplier> xColsSup(_xDestTable,UNO_QUERY);
+ OSL_ENSURE(xColsSup.is(),"OTableCopyHelper::insertRows: No columnsSupplier!");
+ if(!xColsSup.is())
+ return;
+
+ // we a vector which all types
+ Reference< XResultSetMetaData> xMeta = xSrcMetaSup->getMetaData();
+ sal_Int32 nCount = xMeta->getColumnCount();
+ ::std::vector<sal_Int32> aColumnTypes;
+ aColumnTypes.reserve(nCount+1);
+ aColumnTypes.push_back(-1); // just to avoid a everytime i-1 call
+
+ for(sal_Int32 k=1;k <= nCount;++k)
+ aColumnTypes.push_back(xMeta->getColumnType(k));
+
+ // create sql string and set column types
+ Reference<XNameAccess> xNameAccess = xColsSup->getColumns();
+ Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
+ if ( aSeq.getLength() == 0 )
+ {
+ return;
+ }
+ const ::rtl::OUString* pBegin = aSeq.getConstArray();
+ const ::rtl::OUString* pEnd = pBegin + aSeq.getLength();
+ ::std::vector< ::rtl::OUString> aInsertList;
+ aInsertList.resize(aSeq.getLength()+1);
+ sal_Int32 i = 0;
+ for(sal_uInt32 j=0; j < aInsertList.size() ;++i,++j)
+ {
+ ODatabaseExport::TPositions::const_iterator aFind = ::std::find_if(_rvColumns.begin(),_rvColumns.end(),
+ ::std::compose1(::std::bind2nd(::std::equal_to<sal_Int32>(),i+1),::std::select2nd<ODatabaseExport::TPositions::value_type>()));
+ if ( _rvColumns.end() != aFind && aFind->second != CONTAINER_ENTRY_NOTFOUND && aFind->first != CONTAINER_ENTRY_NOTFOUND )
+ {
+ aInsertList[aFind->first] = ::dbtools::quoteName( aQuote,*(pBegin+i));
+ }
+ }
+
+ i = 1;
+ // create the sql string
+ for (::std::vector< ::rtl::OUString>::iterator aInsertIter = aInsertList.begin(); aInsertIter != aInsertList.end(); ++aInsertIter)
+ {
+ if ( aInsertIter->getLength() )
+ {
+ aSql += *aInsertIter;
+ aSql += aComma;
+ aValues += aPara;
+ }
+ }
+
+ aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")));
+ aValues = aValues.replaceAt(aValues.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")));
+
+ aSql += aValues;
+ // now create,fill and execute the prepared statement
+ Reference< XPreparedStatement > xPrep(_xMetaData->getConnection()->prepareStatement(aSql));
+ Reference< XParameters > xParameter(xPrep,UNO_QUERY);
+
+
+ sal_Int32 nRowCount = 0;
+ const Any* pSelBegin = _aSelection.getConstArray();
+ const Any* pSelEnd = pSelBegin + _aSelection.getLength();
+ sal_Bool bNext = sal_True;
+ sal_Bool bAlreadyAsked = sal_False;
+ do // loop as long as there are more rows or the selection ends
+ {
+ if ( bUseSelection )
+ {
+ if ( pSelBegin != pSelEnd )
+ {
+ if ( _bBookmarkSelection )
+ {
+ xRowLocate->moveToBookmark( *pSelBegin );
+ }
+ else
+ {
+ sal_Int32 nPos = 0;
+ *pSelBegin >>= nPos;
+ bNext = xSrcRs->absolute( nPos );
+ }
+ ++pSelBegin;
+ }
+ else
+ bNext = sal_False;
+ }
+ else
+ bNext = xSrcRs->next();
+ if ( bNext )
+ {
+ ++nRowCount;
+ sal_Bool bInsertAutoIncrement = sal_True;
+ ODatabaseExport::TPositions::const_iterator aPosIter = _rvColumns.begin();
+ SQLExceptionInfo aInfo;
+ try
+ {
+ for(sal_Int32 i = 1;aPosIter != _rvColumns.end();++aPosIter)
+ {
+ sal_Int32 nPos = aPosIter->first;
+ if ( nPos == CONTAINER_ENTRY_NOTFOUND )
+ {
+ ++i; // otherwise we don't get the correct value when only the 2nd source column was selected
+ continue;
+ }
+ if ( bIsAutoIncrement && bInsertAutoIncrement )
+ {
+ xParameter->setInt(1,nRowCount);
+ bInsertAutoIncrement = sal_False;
+ continue;
+ }
+ // we have to check here against 1 because the parameters are 1 based
+ OSL_ENSURE( i >= 1 && i < (sal_Int32)aColumnTypes.size(),"Index out of range for column types!");
+ switch(aColumnTypes[i])
+ {
+ case DataType::CHAR:
+ case DataType::VARCHAR:
+ case DataType::LONGVARCHAR:
+ FILL_PARAM( ::rtl::OUString, etString)
+ break;
+ case DataType::DECIMAL:
+ case DataType::NUMERIC:
+ case DataType::DOUBLE:
+ case DataType::REAL:
+ FILL_PARAM( double, etDouble)
+ break;
+ case DataType::BIGINT:
+ FILL_PARAM( sal_Int64, etLong)
+ break;
+ case DataType::FLOAT:
+ FILL_PARAM( float, etFloat)
+ break;
+ case DataType::LONGVARBINARY:
+ case DataType::BINARY:
+ case DataType::VARBINARY:
+ FILL_PARAM( Sequence< sal_Int8 >, etBytes)
+ break;
+ case DataType::DATE:
+ FILL_PARAM( ::com::sun::star::util::Date, etDate)
+ break;
+ case DataType::TIME:
+ FILL_PARAM( ::com::sun::star::util::Time, etTime)
+ break;
+ case DataType::TIMESTAMP:
+ FILL_PARAM( ::com::sun::star::util::DateTime, etTimestamp)
+ break;
+ case DataType::BIT:
+ FILL_PARAM( sal_Bool, etBoolean)
+ break;
+ case DataType::TINYINT:
+ FILL_PARAM( sal_Int8, etByte)
+ break;
+ case DataType::SMALLINT:
+ FILL_PARAM( sal_Int16, etShort)
+ break;
+ case DataType::INTEGER:
+ FILL_PARAM( sal_Int32, etInt)
+ break;
+ default:
+ OSL_ENSURE(0,"Unknown type");
+ }
+ ++i;
+ }
+ xPrep->executeUpdate();
+ }
+ catch(SQLContext& e) { aInfo = e; }
+ catch(SQLWarning& e) { aInfo = e; }
+ catch(SQLException& e) { aInfo = e; }
+
+ if ( aInfo.isValid() && !bAlreadyAsked )
+ {
+ String sAskIfContinue = String(ModuleRes(STR_ERROR_OCCURED_WHILE_COPYING));
+ String sTitle = String(ModuleRes(STR_STAT_WARNING));
+ OSQLMessageBox aDlg(_pParent,sTitle,sAskIfContinue,WB_YES_NO|WB_DEF_YES,OSQLMessageBox::Warning);
+ if ( aDlg.Execute() == RET_YES )
+ bAlreadyAsked = sal_True;
+ else
+ {
+ SQLException e;
+ switch( aInfo.getType() )
+ {
+ case SQLExceptionInfo::SQL_EXCEPTION:
+ throw *(const SQLException*)aInfo;
+ break;
+ case SQLExceptionInfo::SQL_WARNING:
+ throw *(const SQLWarning*)aInfo;
+ break;
+ case SQLExceptionInfo::SQL_CONTEXT:
+ throw *(const SQLContext*)aInfo;
+ break;
+ }
+ }
+ }
+ }
+ }
+ while( bNext );
+}
+// -----------------------------------------------------------------------------
+Reference<XResultSet> createResultSet( OGenericUnoController* _pBrowser,sal_Bool bDispose,
+ sal_Int32 _nCommandType,Reference<XConnection>& _xSrcConnection,
+ const Reference<XPropertySet>& xSourceObject,
+ Reference<XStatement> &xStmt,Reference<XPreparedStatement> &xPrepStmt)
+{
+ Reference<XResultSet> xSrcRs;
+ ::rtl::OUString sSql;
+ if(_nCommandType == CommandType::TABLE)
+ {
+ sSql = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT "));
+ // we need to create the sql stmt with column names
+ // otherwise it is possible that names don't match
+ ::rtl::OUString sQuote = _xSrcConnection->getMetaData()->getIdentifierQuoteString();
+ static ::rtl::OUString sComma = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(","));
+
+ Reference<XColumnsSupplier> xSrcColsSup(xSourceObject,UNO_QUERY);
+ OSL_ENSURE(xSrcColsSup.is(),"No source columns!");
+ Reference<XNameAccess> xNameAccess = xSrcColsSup->getColumns();
+ Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
+ const ::rtl::OUString* pBegin = aSeq.getConstArray();
+ const ::rtl::OUString* pEnd = pBegin + aSeq.getLength();
+ for(;pBegin != pEnd;++pBegin)
+ {
+ sSql += ::dbtools::quoteName( sQuote,*pBegin);
+ sSql += sComma;
+ }
+ sSql = sSql.replaceAt(sSql.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ")));
+ sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FROM "));
+ sal_Bool bUseCatalogInSelect = ::dbtools::isDataSourcePropertyEnabled(_xSrcConnection,PROPERTY_USECATALOGINSELECT,sal_True);
+ sal_Bool bUseSchemaInSelect = ::dbtools::isDataSourcePropertyEnabled(_xSrcConnection,PROPERTY_USESCHEMAINSELECT,sal_True);
+ ::rtl::OUString sComposedName = ::dbtools::composeTableName(_xSrcConnection->getMetaData(),xSourceObject,sal_True,::dbtools::eInDataManipulation,bUseCatalogInSelect,bUseSchemaInSelect);
+ sSql += sComposedName;
+ xStmt = _xSrcConnection->createStatement();
+ if( xStmt.is() )
+ xSrcRs = xStmt->executeQuery(sSql);
+ }
+ else
+ {
+ xSourceObject->getPropertyValue(PROPERTY_COMMAND) >>= sSql;
+ xPrepStmt = _xSrcConnection->prepareStatement(sSql);
+ if( xPrepStmt.is() )
+ {
+ // look if we have to fill in some parameters
+ // create and fill a composer
+ Reference< XMultiServiceFactory > xFactory( _xSrcConnection, UNO_QUERY );
+ Reference< XSingleSelectQueryComposer > xComposer;
+ if ( xFactory.is() )
+ xComposer.set( xFactory->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY );
+ if ( xComposer.is() )
+ {
+ try
+ {
+ xComposer->setQuery(sSql);
+ Reference< XInteractionHandler > xHandler(_pBrowser->getORB()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.InteractionHandler"))), UNO_QUERY);
+ ::dbtools::askForParameters(xComposer,Reference<XParameters>(xPrepStmt,UNO_QUERY),_xSrcConnection,xHandler);
+ xSrcRs = xPrepStmt->executeQuery();
+ }
+ catch(SQLContext&)
+ {
+ if(bDispose)
+ ::comphelper::disposeComponent(_xSrcConnection);
+ throw;
+ }
+ catch(SQLWarning&)
+ {
+ if(bDispose)
+ ::comphelper::disposeComponent(_xSrcConnection);
+ throw;
+ }
+ catch(SQLException&)
+ {
+ if(bDispose)
+ ::comphelper::disposeComponent(_xSrcConnection);
+ throw;
+ }
+ catch (Exception&)
+ {
+ xComposer = NULL;
+ }
+ }
+ }
+ }
+ return xSrcRs;
+}
+}
+// -----------------------------------------------------------------------------
+OTableCopyHelper::OTableCopyHelper(OGenericUnoController* _pControler) : m_pController(_pControler)
+{
+}
+// -----------------------------------------------------------------------------
+void OTableCopyHelper::pasteTable( SotFormatStringId _nFormatId
+ ,const TransferableDataHelper& _rTransData
+ ,const ::rtl::OUString& _sDestDataSourceName
+ ,const Reference<XConnection>& _xConnection)
+{
+ if ( _nFormatId == SOT_FORMATSTR_ID_DBACCESS_TABLE || _nFormatId == SOT_FORMATSTR_ID_DBACCESS_QUERY )
+ {
+ if ( ODataAccessObjectTransferable::canExtractObjectDescriptor(_rTransData.GetDataFlavorExVector()) )
+ {
+ ::svx::ODataAccessDescriptor aPasteData = ODataAccessObjectTransferable::extractObjectDescriptor(_rTransData);
+ pasteTable( aPasteData,_sDestDataSourceName,_xConnection);
+ }
+ }
+ else if ( _rTransData.HasFormat(_nFormatId) )
+ {
+ try
+ {
+ DropDescriptor aTrans;
+ if ( _nFormatId != SOT_FORMAT_RTF )
+ const_cast<TransferableDataHelper&>(_rTransData).GetSotStorageStream(_rTransData.HasFormat(SOT_FORMATSTR_ID_HTML) ? SOT_FORMATSTR_ID_HTML : SOT_FORMATSTR_ID_HTML_SIMPLE,aTrans.aHtmlRtfStorage);
+ else
+ const_cast<TransferableDataHelper&>(_rTransData).GetSotStorageStream(SOT_FORMAT_RTF,aTrans.aHtmlRtfStorage);
+
+ aTrans.nType = E_TABLE;
+ aTrans.bHtml = SOT_FORMATSTR_ID_HTML == _nFormatId || SOT_FORMATSTR_ID_HTML_SIMPLE == _nFormatId;
+ if ( !copyTagTable(aTrans,sal_False,_xConnection) )
+ m_pController->showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*m_pController,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
+ }
+ catch(SQLContext& e) { m_pController->showError(SQLExceptionInfo(e)); }
+ catch(SQLWarning& e) { m_pController->showError(SQLExceptionInfo(e)); }
+ catch(SQLException& e) { m_pController->showError(SQLExceptionInfo(e)); }
+ catch(Exception& )
+ {
+ OSL_ENSURE(sal_False, "OTableCopyHelper::pasteTable: caught a generic exception!");
+ }
+ }
+ else
+ m_pController->showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*m_pController,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
+}
+// -----------------------------------------------------------------------------
+void OTableCopyHelper::pasteTable( const TransferableDataHelper& _rTransData
+ ,const ::rtl::OUString& _sDestDataSourceName
+ ,const Reference<XConnection>& _xConnection)
+{
+ if ( _rTransData.HasFormat(SOT_FORMATSTR_ID_DBACCESS_TABLE) || _rTransData.HasFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY) )
+ pasteTable( SOT_FORMATSTR_ID_DBACCESS_TABLE,_rTransData,_sDestDataSourceName,_xConnection);
+ else if ( _rTransData.HasFormat(SOT_FORMATSTR_ID_HTML) )
+ pasteTable( SOT_FORMATSTR_ID_HTML,_rTransData,_sDestDataSourceName,_xConnection);
+ else if ( _rTransData.HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE) )
+ pasteTable( SOT_FORMATSTR_ID_HTML_SIMPLE,_rTransData,_sDestDataSourceName,_xConnection);
+ else if ( _rTransData.HasFormat(SOT_FORMAT_RTF) )
+ pasteTable( SOT_FORMAT_RTF,_rTransData,_sDestDataSourceName,_xConnection);
+}
+// -----------------------------------------------------------------------------
+void OTableCopyHelper::pasteTable( ::svx::ODataAccessDescriptor& _rPasteData
+ ,const ::rtl::OUString& _sDestDataSourceName
+ ,const Reference<XConnection>& _xDestConnection)
+{
+ Reference<XConnection> xSrcConnection;
+ Reference<XResultSet> xSrcRs; // the source resultset may be empty
+ Sequence< Any > aSelection;
+ sal_Bool bBookmarkSelection;
+ ::rtl::OUString sCommand,
+ sSrcDataSourceName = _rPasteData.getDataSource();
+
+ _rPasteData[daCommand] >>= sCommand;
+ if ( _rPasteData.has(daConnection) )
+ _rPasteData[daConnection] >>= xSrcConnection;
+ if ( _rPasteData.has(daSelection) )
+ _rPasteData[daSelection] >>= aSelection;
+ if ( _rPasteData.has(daBookmarkSelection) )
+ _rPasteData[daBookmarkSelection] >>= bBookmarkSelection;
+ if ( _rPasteData.has(daCursor) )
+ _rPasteData[daCursor] >>= xSrcRs;
+
+ // paste into the tables
+ sal_Int32 nCommandType = CommandType::COMMAND;
+ if ( _rPasteData.has(daCommandType) )
+ _rPasteData[daCommandType] >>= nCommandType;
+
+ insertTable( nCommandType
+ ,xSrcConnection
+ ,xSrcRs
+ ,aSelection
+ ,bBookmarkSelection
+ ,sCommand
+ ,sSrcDataSourceName
+ ,_sDestDataSourceName
+ ,_xDestConnection);
+}
+// -----------------------------------------------------------------------------
+void OTableCopyHelper::insertTable(sal_Int32 _nCommandType
+ ,const Reference<XConnection>& _xSrcConnection
+ ,const Reference<XResultSet>& _xSrcRs // the source resultset may be empty
+ ,const Sequence< Any >& _aSelection
+ ,sal_Bool _bBookmarkSelection
+ ,const ::rtl::OUString& _sCommand
+ ,const ::rtl::OUString& _sSrcDataSourceName
+ ,const ::rtl::OUString& _sDestDataSourceName
+ ,const Reference<XConnection>& _xDestConnection)
+{
+ try
+ {
+ if ( CommandType::QUERY == _nCommandType || CommandType::TABLE == _nCommandType )
+ {
+ // first get the dest connection
+ Reference<XConnection> xSrcConnection; // supports the service sdb::connection
+ if ( !_xDestConnection.is() )
+ return;
+
+ xSrcConnection = _xSrcConnection;
+ Reference<XResultSet> xSrcRs = _xSrcRs;
+
+
+ // get the source connection
+ sal_Bool bDispose = sal_False;
+ if ( _sSrcDataSourceName == _sDestDataSourceName )
+ xSrcConnection = _xDestConnection;
+ else if ( !xSrcConnection.is() )
+ {
+ OSL_ENSURE(0,"Error: connection should not be null!");
+ /*
+ Reference< XEventListener> xEvt(static_cast< ::cppu::OWeakObject*>(m_pController), UNO_QUERY);
+ m_pController->showError(::dbaui::createConnection(m_xDataSource,m_pController->getORB(),xEvt,xSrcConnection));
+ bDispose = sal_True;
+ */
+ }
+ Reference<XNameAccess> xNameAccess;
+ sal_Bool bTable = sal_True;
+ switch(_nCommandType)
+ {
+ case CommandType::TABLE:
+ {
+ // only for tables
+ Reference<XTablesSupplier> xSup(xSrcConnection,UNO_QUERY);
+ if(xSup.is())
+ xNameAccess = xSup->getTables();
+ }
+ break;
+ case CommandType::QUERY:
+ {
+ Reference<XQueriesSupplier> xSup(xSrcConnection,UNO_QUERY);
+ if ( xSup.is() )
+ xNameAccess = xSup->getQueries();
+ bTable = sal_False;
+ }
+ break;
+ }
+
+ // check if this name really exists in the name access
+ if ( xNameAccess.is() && xNameAccess->hasByName( _sCommand ) )
+ {
+ Reference<XPropertySet> xSourceObject(xNameAccess->getByName( _sCommand ),UNO_QUERY);
+
+ sal_Bool bIsView = sal_False;
+ if ( bTable ) // we only have to check if this table has as type VIEW
+ {
+ static ::rtl::OUString sVIEW = ::rtl::OUString::createFromAscii("VIEW");
+ bIsView = ::comphelper::getString(xSourceObject->getPropertyValue(PROPERTY_TYPE)) == sVIEW;
+ }
+
+ OCopyTableWizard aWizard(m_pController->getView(),
+ xSourceObject,
+ xSrcConnection,
+ _xDestConnection,
+ getNumberFormatter(_xDestConnection,m_pController->getORB()),
+ m_pController->getORB());
+ aWizard.fillTypeInfo();
+ aWizard.loadData();
+ OCopyTable* pPage1 = new OCopyTable(&aWizard,COPY, bIsView,OCopyTableWizard::WIZARD_DEF_DATA);
+ OWizNameMatching* pPage2 = new OWizNameMatching(&aWizard);
+ OWizColumnSelect* pPage3 = new OWizColumnSelect(&aWizard);
+ OWizNormalExtend* pPage4 = new OWizNormalExtend(&aWizard);
+
+ aWizard.AddWizardPage(pPage1);
+ aWizard.AddWizardPage(pPage2);
+ aWizard.AddWizardPage(pPage3);
+ aWizard.AddWizardPage(pPage4);
+ aWizard.ActivatePage();
+
+ if (aWizard.Execute() == RET_OK)
+ {
+ WaitObject aWO(m_pController->getView());
+ Reference<XPropertySet> xTable;
+ switch(aWizard.getCreateStyle())
+ {
+ case OCopyTableWizard::WIZARD_DEF:
+ case OCopyTableWizard::WIZARD_DEF_DATA:
+ {
+ xTable = aWizard.createTable();
+ if(!xTable.is())
+ break;
+ if(OCopyTableWizard::WIZARD_DEF == aWizard.getCreateStyle())
+ break;
+ } // run through
+ case OCopyTableWizard::WIZARD_APPEND_DATA:
+ {
+
+ if(!xTable.is())
+ xTable = aWizard.createTable();
+ if(!xTable.is())
+ break;
+
+ Reference<XStatement> xStmt; // needed to hold a reference to the statement
+ Reference<XPreparedStatement> xPrepStmt;// needed to hold a reference to the statement
+
+ ODatabaseExport::TPositions aColumnMapping = aWizard.GetColumnPositions();
+ // create the sql stmt
+ if ( !xSrcRs.is() ) // if not already exists
+ xSrcRs = createResultSet(m_pController,
+ bDispose,
+ _nCommandType,
+ xSrcConnection,
+ xSourceObject,
+ xStmt,
+ xPrepStmt);
+ else
+ {
+ // here I use the ResultSet directly so I have to adjust
+ // the column mapping given by the wizard, because the resultset could use
+ // another order of the columns
+ Reference< XColumnLocate> xLocate(xSrcRs,UNO_QUERY);
+ Reference<XColumnsSupplier> xSrcColsSup(xSourceObject,UNO_QUERY);
+ OSL_ENSURE(xSrcColsSup.is(),"No source columns!");
+ Reference<XNameAccess> xNameAccess = xSrcColsSup->getColumns();
+ Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
+ const ::rtl::OUString* pBegin = aSeq.getConstArray();
+ const ::rtl::OUString* pEnd = pBegin + aSeq.getLength();
+
+ ODatabaseExport::TPositions aNewColMapping;
+ aNewColMapping.resize( aColumnMapping.size() ,ODatabaseExport::TPositions::value_type(CONTAINER_ENTRY_NOTFOUND,CONTAINER_ENTRY_NOTFOUND) );
+
+ for(sal_Int32 k = 0;pBegin != pEnd;++pBegin,++k)
+ {
+ sal_Int32 nColPos = xLocate->findColumn(*pBegin) -1;
+ if ( nColPos >= 0 )
+ // aNewColMapping[k] = aColumnMapping[nColPos];
+ aNewColMapping[nColPos] = aColumnMapping[k];
+ }
+ aColumnMapping = aNewColMapping;
+ // position the resultset before the first row
+ if ( !xSrcRs->isBeforeFirst() )
+ xSrcRs->beforeFirst();
+ }
+ // now insert the rows into the new table
+ // we couldn't use the rowset here because it could happen that we haven't a primary key
+ insertRows( xSrcRs,
+ aColumnMapping,
+ xTable,
+ _xDestConnection->getMetaData(),
+ aWizard.isAutoincrementEnabled(),
+ _aSelection,
+ _bBookmarkSelection,
+ m_pController->getView());
+ }
+ break;
+ case OCopyTableWizard::WIZARD_DEF_VIEW:
+ xTable = aWizard.createView();
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ switch(_nCommandType)
+ {
+ case CommandType::TABLE:
+ break;
+ case CommandType::QUERY:
+ break;
+ }
+ m_pController->showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*m_pController,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
+ }
+ if ( bDispose )
+ ::comphelper::disposeComponent(xSrcConnection);
+ }
+ else
+ DBG_ERROR("OTableCopyHelper::pasteTable: invalid call (no supported format found)!");
+ }
+ catch(SQLContext& e) { m_pController->showError(SQLExceptionInfo(e)); }
+ catch(SQLWarning& e) { m_pController->showError(SQLExceptionInfo(e)); }
+ catch(SQLException& e) { m_pController->showError(SQLExceptionInfo(e)); }
+ catch(Exception& )
+ {
+ OSL_ENSURE(sal_False, "OTableCopyHelper::pasteTable: caught a generic exception!");
+ }
+}
+// -----------------------------------------------------------------------------
+sal_Bool OTableCopyHelper::copyTagTable(OTableCopyHelper::DropDescriptor& _rDesc, sal_Bool _bCheck,const Reference<XConnection>& _xConnection)
+{
+ Reference<XEventListener> xEvt;
+ ODatabaseImportExport* pImport = NULL;
+ if ( _rDesc.bHtml )
+ pImport = new OHTMLImportExport(_xConnection,getNumberFormatter(_xConnection,m_pController->getORB()),m_pController->getORB());
+ else
+ pImport = new ORTFImportExport(_xConnection,getNumberFormatter(_xConnection,m_pController->getORB()),m_pController->getORB());
+
+ xEvt = pImport;
+ SvStream* pStream = (SvStream*)(SotStorageStream*)_rDesc.aHtmlRtfStorage;
+ if ( _bCheck )
+ pImport->enableCheckOnly();
+
+ pImport->setStream(pStream);
+ return pImport->Read();
+}
+// -----------------------------------------------------------------------------
+sal_Bool OTableCopyHelper::isTableFormat(const TransferableDataHelper& _rClipboard) const
+{
+ sal_Bool bTableFormat = _rClipboard.HasFormat(SOT_FORMATSTR_ID_DBACCESS_TABLE)
+ || _rClipboard.HasFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY)
+ || _rClipboard.HasFormat(SOT_FORMAT_RTF)
+ || _rClipboard.HasFormat(SOT_FORMATSTR_ID_HTML)
+ || _rClipboard.HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE);
+
+ return bTableFormat;
+}
+// -----------------------------------------------------------------------------
+sal_Bool OTableCopyHelper::copyTagTable(const TransferableDataHelper& _aDroppedData
+ ,DropDescriptor& _rAsyncDrop
+ ,const Reference<XConnection>& _xConnection)
+{
+ sal_Bool bRet = sal_False;
+ sal_Bool bHtml = _aDroppedData.HasFormat(SOT_FORMATSTR_ID_HTML) || _aDroppedData.HasFormat(SOT_FORMATSTR_ID_HTML_SIMPLE);
+ if ( bHtml || _aDroppedData.HasFormat(SOT_FORMAT_RTF) )
+ {
+ if ( bHtml )
+ const_cast<TransferableDataHelper&>(_aDroppedData).GetSotStorageStream(_aDroppedData.HasFormat(SOT_FORMATSTR_ID_HTML) ? SOT_FORMATSTR_ID_HTML : SOT_FORMATSTR_ID_HTML_SIMPLE,_rAsyncDrop.aHtmlRtfStorage);
+ else
+ const_cast<TransferableDataHelper&>(_aDroppedData).GetSotStorageStream(SOT_FORMAT_RTF,_rAsyncDrop.aHtmlRtfStorage);
+
+ _rAsyncDrop.bHtml = bHtml;
+ _rAsyncDrop.bError = !copyTagTable(_rAsyncDrop,sal_True,_xConnection);
+
+ if ( bRet = (!_rAsyncDrop.bError && _rAsyncDrop.aHtmlRtfStorage.Is()) )
+ {
+ // now we need to copy the stream
+ ::utl::TempFile aTmp;
+ aTmp.EnableKillingFile(sal_False);
+ _rAsyncDrop.aUrl = aTmp.GetURL();
+ SotStorageStreamRef aNew = new SotStorageStream( aTmp.GetFileName() );
+ _rAsyncDrop.aHtmlRtfStorage->Seek(STREAM_SEEK_TO_BEGIN);
+ _rAsyncDrop.aHtmlRtfStorage->CopyTo( aNew );
+ aNew->Commit();
+ _rAsyncDrop.aHtmlRtfStorage = aNew;
+ }
+ else
+ _rAsyncDrop.aHtmlRtfStorage = NULL;
+ }
+ return bRet;
+}
+// -----------------------------------------------------------------------------
+void OTableCopyHelper::asyncCopyTagTable( DropDescriptor& _rDesc
+ ,const ::rtl::OUString& _sDestDataSourceName
+ ,const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection)
+{
+ if ( _rDesc.aHtmlRtfStorage.Is() )
+ {
+ copyTagTable(_rDesc,sal_False,_xConnection);
+ _rDesc.aHtmlRtfStorage = NULL;
+ // we now have to delete the temp file created in executeDrop
+ INetURLObject aURL;
+ aURL.SetURL(_rDesc.aUrl);
+ ::utl::UCBContentHelper::Kill(aURL.GetMainURL(INetURLObject::NO_DECODE));
+ }
+ else if ( !_rDesc.bError )
+ pasteTable(_rDesc.aDroppedData,_sDestDataSourceName,_xConnection);
+ else
+ m_pController->showError(SQLException(String(ModuleRes(STR_NO_TABLE_FORMAT_INSIDE)),*m_pController,::rtl::OUString::createFromAscii("S1000") ,0,Any()));
+}
+//........................................................................
+} // namespace dbaui
+//........................................................................
+