1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbaccess.hxx"
26 
27 #include "dbu_misc.hrc"
28 #include "dbustrings.hrc"
29 #include "moduledbu.hxx"
30 #include "sqlmessage.hxx"
31 #include "UITools.hxx"
32 #include "WColumnSelect.hxx"
33 #include "WCopyTable.hxx"
34 #include "WCPage.hxx"
35 #include "WExtendPages.hxx"
36 #include "WizardPages.hrc"
37 #include "WNameMatch.hxx"
38 #include "WTypeSelect.hxx"
39 
40 /** === begin UNO includes === **/
41 #include <com/sun/star/sdb/application/CopyTableOperation.hpp>
42 #include <com/sun/star/sdb/SQLContext.hpp>
43 #include <com/sun/star/sdbc/ColumnValue.hpp>
44 #include <com/sun/star/sdbc/DataType.hpp>
45 #include <com/sun/star/sdbc/XResultSet.hpp>
46 #include <com/sun/star/sdbc/XRow.hpp>
47 #include <com/sun/star/sdbcx/KeyType.hpp>
48 #include <com/sun/star/sdbcx/XAppend.hpp>
49 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
50 #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
51 #include <com/sun/star/sdbcx/XKeysSupplier.hpp>
52 #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
53 #include <com/sun/star/sdbcx/XViewsSupplier.hpp>
54 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
55 /** === end UNO includes === **/
56 
57 #include <comphelper/extract.hxx>
58 #include <comphelper/types.hxx>
59 #include <comphelper/interaction.hxx>
60 #include <connectivity/dbtools.hxx>
61 #include <connectivity/dbmetadata.hxx>
62 #include <connectivity/dbexception.hxx>
63 
64 #include <rtl/logfile.hxx>
65 #include <rtl/ustrbuf.hxx>
66 #include <tools/debug.hxx>
67 #include <tools/diagnose_ex.h>
68 #include <vcl/lstbox.hxx>
69 #include <vcl/msgbox.hxx>
70 #include <vcl/waitobj.hxx>
71 
72 #include <functional>
73 
74 using namespace ::dbaui;
75 using namespace ::com::sun::star::uno;
76 using namespace ::com::sun::star::beans;
77 using namespace ::com::sun::star::container;
78 using namespace ::com::sun::star::util;
79 using namespace ::com::sun::star::sdb;
80 using namespace ::com::sun::star::sdbc;
81 using namespace ::com::sun::star::sdbcx;
82 using namespace ::com::sun::star::lang;
83 using namespace ::com::sun::star::task;
84 using namespace dbtools;
85 
86 namespace CopyTableOperation = ::com::sun::star::sdb::application::CopyTableOperation;
87 
88 #define MAX_PAGES	4	// max. Pages die angezeigt werden
89 
90 DBG_NAME(OCopyTableWizard)
91 namespace
92 {
93     //....................................................................
clearColumns(ODatabaseExport::TColumns & _rColumns,ODatabaseExport::TColumnVector & _rColumnsVec)94 	void clearColumns(ODatabaseExport::TColumns& _rColumns, ODatabaseExport::TColumnVector& _rColumnsVec)
95 	{
96 		ODatabaseExport::TColumns::iterator aIter = _rColumns.begin();
97 		ODatabaseExport::TColumns::iterator aEnd  = _rColumns.end();
98 
99 		for(;aIter != aEnd;++aIter)
100 			delete aIter->second;
101 
102 		_rColumnsVec.clear();
103 		_rColumns.clear();
104 	}
105 }
106 
107 //========================================================================
108 //= ICopyTableSourceObject
109 //========================================================================
110 //------------------------------------------------------------------------
~ICopyTableSourceObject()111 ICopyTableSourceObject::~ICopyTableSourceObject()
112 {
113 }
114 
115 //========================================================================
116 //= ObjectCopySource
117 //========================================================================
118 //------------------------------------------------------------------------
ObjectCopySource(const Reference<XConnection> & _rxConnection,const Reference<XPropertySet> & _rxObject)119 ObjectCopySource::ObjectCopySource( const Reference< XConnection >& _rxConnection, const Reference< XPropertySet >& _rxObject )
120     :m_xConnection( _rxConnection, UNO_SET_THROW )
121     ,m_xMetaData( _rxConnection->getMetaData(), UNO_SET_THROW )
122     ,m_xObject( _rxObject, UNO_SET_THROW )
123     ,m_xObjectPSI( _rxObject->getPropertySetInfo(), UNO_SET_THROW )
124     ,m_xObjectColumns( Reference< XColumnsSupplier >( _rxObject, UNO_QUERY_THROW )->getColumns(), UNO_SET_THROW )
125 {
126 }
127 
128 //------------------------------------------------------------------------
getQualifiedObjectName() const129 ::rtl::OUString ObjectCopySource::getQualifiedObjectName() const
130 {
131     ::rtl::OUString sName;
132 
133 	if ( !m_xObjectPSI->hasPropertyByName( PROPERTY_COMMAND ) )
134 		sName = ::dbtools::composeTableName( m_xMetaData, m_xObject, ::dbtools::eInDataManipulation, false, false, false );
135 	else
136 		m_xObject->getPropertyValue( PROPERTY_NAME ) >>= sName;
137     return sName;
138 }
139 
140 //------------------------------------------------------------------------
isView() const141 bool ObjectCopySource::isView() const
142 {
143 	bool bIsView = false;
144     try
145     {
146         if ( m_xObjectPSI->hasPropertyByName( PROPERTY_TYPE ) )
147         {
148             ::rtl::OUString sObjectType;
149             OSL_VERIFY( m_xObject->getPropertyValue( PROPERTY_TYPE ) >>= sObjectType );
150             bIsView = sObjectType.equalsAscii( "VIEW" );
151         }
152     }
153     catch( const Exception& )
154     {
155     	DBG_UNHANDLED_EXCEPTION();
156     }
157     return bIsView;
158 }
159 
160 //------------------------------------------------------------------------
copyUISettingsTo(const Reference<XPropertySet> & _rxObject) const161 void ObjectCopySource::copyUISettingsTo( const Reference< XPropertySet >& _rxObject ) const
162 {
163     const ::rtl::OUString aCopyProperties[] = {
164         PROPERTY_FONT, PROPERTY_ROW_HEIGHT, PROPERTY_TEXTCOLOR,PROPERTY_TEXTLINECOLOR,PROPERTY_TEXTEMPHASIS,PROPERTY_TEXTRELIEF
165     };
166     for ( size_t i=0; i < sizeof( aCopyProperties ) / sizeof( aCopyProperties[0] ); ++i )
167     {
168 		if ( m_xObjectPSI->hasPropertyByName( aCopyProperties[i] ) )
169 			_rxObject->setPropertyValue( aCopyProperties[i], m_xObject->getPropertyValue( aCopyProperties[i] ) );
170     }
171 }
172 //------------------------------------------------------------------------
copyFilterAndSortingTo(const Reference<XConnection> & _xConnection,const Reference<XPropertySet> & _rxObject) const173 void ObjectCopySource::copyFilterAndSortingTo( const Reference< XConnection >& _xConnection,const Reference< XPropertySet >& _rxObject ) const
174 {
175     ::std::pair< ::rtl::OUString, ::rtl::OUString > aProperties[] = {
176                  ::std::pair< ::rtl::OUString, ::rtl::OUString >(PROPERTY_FILTER,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" AND ")))
177                 ,::std::pair< ::rtl::OUString, ::rtl::OUString >(PROPERTY_ORDER,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ORDER BY ")))
178     };
179 
180     size_t i = 0;
181 
182     try
183     {
184         const String sSourceName = (::dbtools::composeTableNameForSelect(m_xConnection,m_xObject) + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")));
185         const ::rtl::OUString sTargetName = ::dbtools::composeTableNameForSelect(_xConnection,_rxObject);
186         const String sTargetNameTemp = (sTargetName + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")));
187 
188         ::rtl::OUString sStatement(RTL_CONSTASCII_USTRINGPARAM("SELECT * FROM "));
189         sStatement += sTargetName;
190         sStatement += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" WHERE 0=1"));
191 
192 
193         for ( i=0; i < sizeof( aProperties ) / sizeof( aProperties[0] ); ++i )
194         {
195 		    if ( m_xObjectPSI->hasPropertyByName( aProperties[i].first ) )
196             {
197                 ::rtl::OUString sFilter;
198                 m_xObject->getPropertyValue( aProperties[i].first ) >>= sFilter;
199                 if ( sFilter.getLength() )
200                 {
201                     sStatement += aProperties[i].second;
202                     String sReplace = sFilter;
203                     sReplace.SearchAndReplace(sSourceName,sTargetNameTemp);
204                     sFilter = sReplace;
205                     _rxObject->setPropertyValue( aProperties[i].first, makeAny(sFilter) );
206                     sStatement += sFilter;
207                 }
208             }
209         }
210 
211         _xConnection->createStatement()->executeQuery(sStatement);
212 
213 		if ( m_xObjectPSI->hasPropertyByName( PROPERTY_APPLYFILTER ) )
214 			_rxObject->setPropertyValue( PROPERTY_APPLYFILTER, m_xObject->getPropertyValue( PROPERTY_APPLYFILTER ) );
215     }
216     catch(Exception&)
217     {
218     }
219 }
220 //------------------------------------------------------------------------
getColumnNames() const221 Sequence< ::rtl::OUString > ObjectCopySource::getColumnNames() const
222 {
223     return m_xObjectColumns->getElementNames();
224 }
225 
226 //------------------------------------------------------------------------
getPrimaryKeyColumnNames() const227 Sequence< ::rtl::OUString > ObjectCopySource::getPrimaryKeyColumnNames() const
228 {
229     const Reference<XNameAccess> xPrimaryKeyColumns = getPrimaryKeyColumns_throw(m_xObject);
230     Sequence< ::rtl::OUString > aKeyColNames;
231     if ( xPrimaryKeyColumns.is() )
232         aKeyColNames = xPrimaryKeyColumns->getElementNames();
233     return aKeyColNames;
234 }
235 
236 //------------------------------------------------------------------------
createFieldDescription(const::rtl::OUString & _rColumnName) const237 OFieldDescription* ObjectCopySource::createFieldDescription( const ::rtl::OUString& _rColumnName ) const
238 {
239     Reference< XPropertySet > xColumn( m_xObjectColumns->getByName( _rColumnName ), UNO_QUERY_THROW );
240     return new OFieldDescription( xColumn );
241 }
242 //------------------------------------------------------------------------
getSelectStatement() const243 ::rtl::OUString ObjectCopySource::getSelectStatement() const
244 {
245     ::rtl::OUString sSelectStatement;
246     if ( m_xObjectPSI->hasPropertyByName( PROPERTY_COMMAND ) )
247     {   // query
248         OSL_VERIFY( m_xObject->getPropertyValue( PROPERTY_COMMAND ) >>= sSelectStatement );
249     }
250     else
251     {   // table
252         ::rtl::OUStringBuffer aSQL;
253         aSQL.appendAscii( "SELECT " );
254 
255         // we need to create the sql stmt with column names
256         // otherwise it is possible that names don't match
257         const ::rtl::OUString sQuote = m_xMetaData->getIdentifierQuoteString();
258 
259         Sequence< ::rtl::OUString > aColumnNames = getColumnNames();
260         const ::rtl::OUString* pColumnName = aColumnNames.getConstArray();
261         const ::rtl::OUString* pEnd = pColumnName + aColumnNames.getLength();
262         for ( ; pColumnName != pEnd; )
263         {
264             aSQL.append( ::dbtools::quoteName( sQuote, *pColumnName++ ) );
265 
266             if ( pColumnName == pEnd )
267                 aSQL.appendAscii( " " );
268             else
269                 aSQL.appendAscii( ", " );
270         }
271 
272         aSQL.appendAscii( "FROM " );
273         aSQL.append( ::dbtools::composeTableNameForSelect( m_xConnection, m_xObject ) );
274 
275         sSelectStatement = aSQL.makeStringAndClear();
276     }
277 
278     return sSelectStatement;
279 }
280 
281 //------------------------------------------------------------------------
getPreparedSelectStatement() const282 ::utl::SharedUNOComponent< XPreparedStatement > ObjectCopySource::getPreparedSelectStatement() const
283 {
284     ::utl::SharedUNOComponent< XPreparedStatement > xStatement(
285         m_xConnection->prepareStatement( getSelectStatement() ),
286         ::utl::SharedUNOComponent< XPreparedStatement >::TakeOwnership
287     );
288     return xStatement;
289 }
290 
291 //========================================================================
292 //= NamedTableCopySource
293 //========================================================================
294 //------------------------------------------------------------------------
NamedTableCopySource(const Reference<XConnection> & _rxConnection,const::rtl::OUString & _rTableName)295 NamedTableCopySource::NamedTableCopySource( const Reference< XConnection >& _rxConnection, const ::rtl::OUString& _rTableName )
296     :m_xConnection( _rxConnection, UNO_SET_THROW )
297     ,m_xMetaData( _rxConnection->getMetaData(), UNO_SET_THROW )
298     ,m_sTableName( _rTableName )
299     ,m_aColumnInfo()
300 {
301     ::dbtools::qualifiedNameComponents( m_xMetaData, m_sTableName, m_sTableCatalog, m_sTableSchema, m_sTableBareName, ::dbtools::eComplete );
302     impl_ensureColumnInfo_throw();
303 }
304 
305 //------------------------------------------------------------------------
getQualifiedObjectName() const306 ::rtl::OUString NamedTableCopySource::getQualifiedObjectName() const
307 {
308     return m_sTableName;
309 }
310 
311 //------------------------------------------------------------------------
isView() const312 bool NamedTableCopySource::isView() const
313 {
314     ::rtl::OUString sTableType;
315     try
316     {
317         Reference< XResultSet > xTableDesc( m_xMetaData->getTables( makeAny( m_sTableCatalog ), m_sTableSchema, m_sTableBareName,
318             Sequence< ::rtl::OUString >() ) );
319         Reference< XRow > xTableDescRow( xTableDesc, UNO_QUERY_THROW );
320         OSL_VERIFY( xTableDesc->next() );
321         sTableType = xTableDescRow->getString( 4 );
322         OSL_ENSURE( !xTableDescRow->wasNull(), "NamedTableCopySource::isView: invalid table type!" );
323     }
324     catch( const Exception& )
325     {
326 	    DBG_UNHANDLED_EXCEPTION();
327     }
328     return sTableType.equalsAscii( "VIEW" );
329 }
330 
331 //------------------------------------------------------------------------
copyUISettingsTo(const Reference<XPropertySet> &) const332 void NamedTableCopySource::copyUISettingsTo( const Reference< XPropertySet >& /*_rxObject*/ ) const
333 {
334     // not supported: we do not have UI settings to copy
335 }
336 // -----------------------------------------------------------------------------
copyFilterAndSortingTo(const Reference<XConnection> &,const Reference<XPropertySet> &) const337 void NamedTableCopySource::copyFilterAndSortingTo( const Reference< XConnection >& ,const Reference< XPropertySet >& /*_rxObject*/ ) const
338 {
339 }
340 //------------------------------------------------------------------------
impl_ensureColumnInfo_throw()341 void NamedTableCopySource::impl_ensureColumnInfo_throw()
342 {
343     if ( !m_aColumnInfo.empty() )
344         return;
345 
346     Reference< XResultSetMetaDataSupplier > xStatementMetaSupp( impl_ensureStatement_throw().getTyped(), UNO_QUERY_THROW );
347     Reference< XResultSetMetaData > xStatementMeta( xStatementMetaSupp->getMetaData(), UNO_SET_THROW );
348 
349     sal_Int32 nColCount( xStatementMeta->getColumnCount() );
350     for ( sal_Int32 i = 1; i <= nColCount; ++i )
351     {
352         OFieldDescription aDesc;
353 
354         aDesc.SetName(          xStatementMeta->getColumnName(      i ) );
355         aDesc.SetHelpText(      xStatementMeta->getColumnLabel(     i ) );
356         aDesc.SetTypeValue(     xStatementMeta->getColumnType(      i ) );
357         aDesc.SetTypeName(      xStatementMeta->getColumnTypeName(  i ) );
358         aDesc.SetPrecision(     xStatementMeta->getPrecision(       i ) );
359         aDesc.SetScale(         xStatementMeta->getScale(           i ) );
360         aDesc.SetIsNullable(    xStatementMeta->isNullable(         i ) );
361         aDesc.SetCurrency(      xStatementMeta->isCurrency(         i ) );
362         aDesc.SetAutoIncrement( xStatementMeta->isAutoIncrement(    i ) );
363 
364         m_aColumnInfo.push_back( aDesc );
365     }
366 }
367 
368 //------------------------------------------------------------------------
impl_ensureStatement_throw()369 ::utl::SharedUNOComponent< XPreparedStatement > NamedTableCopySource::impl_ensureStatement_throw()
370 {
371     if ( !m_xStatement.is() )
372         m_xStatement.set( m_xConnection->prepareStatement( getSelectStatement() ), UNO_SET_THROW );
373     return m_xStatement;
374 }
375 
376 //------------------------------------------------------------------------
getColumnNames() const377 Sequence< ::rtl::OUString > NamedTableCopySource::getColumnNames() const
378 {
379     Sequence< ::rtl::OUString > aNames( m_aColumnInfo.size() );
380     for (   ::std::vector< OFieldDescription >::const_iterator col = m_aColumnInfo.begin();
381             col != m_aColumnInfo.end();
382             ++col
383         )
384         aNames[ col - m_aColumnInfo.begin() ] = col->GetName();
385 
386     return aNames;
387 }
388 
389 //------------------------------------------------------------------------
getPrimaryKeyColumnNames() const390 Sequence< ::rtl::OUString > NamedTableCopySource::getPrimaryKeyColumnNames() const
391 {
392     Sequence< ::rtl::OUString > aPKColNames;
393 
394     try
395     {
396         Reference< XResultSet > xPKDesc( m_xMetaData->getPrimaryKeys( makeAny( m_sTableCatalog ), m_sTableSchema, m_sTableBareName ) );
397         Reference< XRow > xPKDescRow( xPKDesc, UNO_QUERY_THROW );
398         while ( xPKDesc->next() )
399         {
400             sal_Int32 len( aPKColNames.getLength() );
401             aPKColNames.realloc( len + 1 );
402             aPKColNames[ len ] = xPKDescRow->getString( 4 );    // COLUMN_NAME
403         }
404     }
405     catch( const Exception& )
406     {
407     	DBG_UNHANDLED_EXCEPTION();
408     }
409 
410     return aPKColNames;
411 }
412 
413 //------------------------------------------------------------------------
createFieldDescription(const::rtl::OUString & _rColumnName) const414 OFieldDescription* NamedTableCopySource::createFieldDescription( const ::rtl::OUString& _rColumnName ) const
415 {
416     for (   ::std::vector< OFieldDescription >::const_iterator col = m_aColumnInfo.begin();
417             col != m_aColumnInfo.end();
418             ++col
419         )
420         if ( col->GetName() == _rColumnName )
421             return new OFieldDescription( *col );
422 
423     return NULL;
424 }
425 //------------------------------------------------------------------------
getSelectStatement() const426 ::rtl::OUString NamedTableCopySource::getSelectStatement() const
427 {
428     ::rtl::OUStringBuffer aSQL;
429     aSQL.appendAscii( "SELECT * FROM " );
430 
431     aSQL.append( ::dbtools::composeTableNameForSelect( m_xConnection, m_sTableCatalog, m_sTableSchema, m_sTableBareName ) );
432 
433     return aSQL.makeStringAndClear();
434 }
435 
436 //------------------------------------------------------------------------
getPreparedSelectStatement() const437 ::utl::SharedUNOComponent< XPreparedStatement > NamedTableCopySource::getPreparedSelectStatement() const
438 {
439     return const_cast< NamedTableCopySource* >( this )->impl_ensureStatement_throw();
440 }
441 
442 // ========================================================
443 // DummyCopySource
444 // ========================================================
445 class DummyCopySource : public ICopyTableSourceObject
446 {
447 public:
DummyCopySource()448     DummyCopySource() { }
449 
450     static const DummyCopySource& Instance();
451 
452     // ICopyTableSourceObject overridables
453     virtual ::rtl::OUString     getQualifiedObjectName() const;
454     virtual bool                isView() const;
455     virtual void                copyUISettingsTo( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxObject ) const;
456     virtual void                copyFilterAndSortingTo(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxObject ) const;
457     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString >
458                                 getColumnNames() const;
459     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString >
460                                 getPrimaryKeyColumnNames() const;
461     virtual OFieldDescription*  createFieldDescription( const ::rtl::OUString& _rColumnName ) const;
462     virtual ::rtl::OUString     getSelectStatement() const;
463     virtual ::utl::SharedUNOComponent< XPreparedStatement >
464                                 getPreparedSelectStatement() const;
465 };
466 
467 //------------------------------------------------------------------------
Instance()468 const DummyCopySource& DummyCopySource::Instance()
469 {
470     static DummyCopySource s_aTheInstance;
471     return s_aTheInstance;
472 }
473 
474 //------------------------------------------------------------------------
getQualifiedObjectName() const475 ::rtl::OUString DummyCopySource::getQualifiedObjectName() const
476 {
477     OSL_ENSURE( false, "DummyCopySource::getQualifiedObjectName: not to be called!" );
478     return ::rtl::OUString();
479 }
480 
481 //------------------------------------------------------------------------
isView() const482 bool DummyCopySource::isView() const
483 {
484     OSL_ENSURE( false, "DummyCopySource::isView: not to be called!" );
485     return false;
486 }
487 
488 //------------------------------------------------------------------------
copyUISettingsTo(const Reference<XPropertySet> &) const489 void DummyCopySource::copyUISettingsTo( const Reference< XPropertySet >& /*_rxObject*/ ) const
490 {
491     // no support
492 }
493 // -----------------------------------------------------------------------------
copyFilterAndSortingTo(const Reference<XConnection> &,const Reference<XPropertySet> &) const494 void DummyCopySource::copyFilterAndSortingTo( const Reference< XConnection >& ,const Reference< XPropertySet >& /*_rxObject*/ ) const
495 {
496 }
497 //------------------------------------------------------------------------
getColumnNames() const498 Sequence< ::rtl::OUString > DummyCopySource::getColumnNames() const
499 {
500     return Sequence< ::rtl::OUString >();
501 }
502 
503 //------------------------------------------------------------------------
getPrimaryKeyColumnNames() const504 Sequence< ::rtl::OUString > DummyCopySource::getPrimaryKeyColumnNames() const
505 {
506     OSL_ENSURE( false, "DummyCopySource::getPrimaryKeyColumnNames: not to be called!" );
507     return Sequence< ::rtl::OUString >();
508 }
509 
510 //------------------------------------------------------------------------
createFieldDescription(const::rtl::OUString &) const511 OFieldDescription* DummyCopySource::createFieldDescription( const ::rtl::OUString& /*_rColumnName*/ ) const
512 {
513     OSL_ENSURE( false, "DummyCopySource::createFieldDescription: not to be called!" );
514     return NULL;
515 }
516 //------------------------------------------------------------------------
getSelectStatement() const517 ::rtl::OUString DummyCopySource::getSelectStatement() const
518 {
519     OSL_ENSURE( false, "DummyCopySource::getSelectStatement: not to be called!" );
520     return ::rtl::OUString();
521 }
522 
523 //------------------------------------------------------------------------
getPreparedSelectStatement() const524 ::utl::SharedUNOComponent< XPreparedStatement > DummyCopySource::getPreparedSelectStatement() const
525 {
526     OSL_ENSURE( false, "DummyCopySource::getPreparedSelectStatement: not to be called!" );
527     return ::utl::SharedUNOComponent< XPreparedStatement >();
528 }
529 
530 //------------------------------------------------------------------------
531 namespace
532 {
lcl_canCreateViewFor_nothrow(const Reference<XConnection> & _rxConnection)533     bool lcl_canCreateViewFor_nothrow( const Reference< XConnection >& _rxConnection )
534     {
535 	    Reference< XViewsSupplier > xSup( _rxConnection, UNO_QUERY );
536 	    Reference< XDataDescriptorFactory > xViewFac;
537 	    if ( xSup.is() )
538 		    xViewFac.set( xSup->getViews(), UNO_QUERY );
539         return xViewFac.is();
540     }
541 
lcl_sameConnection_throw(const Reference<XConnection> & _rxLHS,const Reference<XConnection> & _rxRHS)542     bool lcl_sameConnection_throw( const Reference< XConnection >& _rxLHS, const Reference< XConnection >& _rxRHS )
543     {
544         Reference< XDatabaseMetaData > xMetaLHS( _rxLHS->getMetaData(), UNO_QUERY_THROW );
545         Reference< XDatabaseMetaData > xMetaRHS( _rxRHS->getMetaData(), UNO_QUERY_THROW );
546         return xMetaLHS->getURL().equals( xMetaRHS->getURL() );
547     }
548 }
549 
550 //========================================================================
551 //= OCopyTableWizard
552 //========================================================================
553 //------------------------------------------------------------------------
OCopyTableWizard(Window * pParent,const::rtl::OUString & _rDefaultName,sal_Int16 _nOperation,const ICopyTableSourceObject & _rSourceObject,const Reference<XConnection> & _xSourceConnection,const Reference<XConnection> & _xConnection,const Reference<XMultiServiceFactory> & _rxORB,const Reference<XInteractionHandler> & _xInteractionHandler)554 OCopyTableWizard::OCopyTableWizard( Window * pParent, const ::rtl::OUString& _rDefaultName, sal_Int16 _nOperation,
555         const ICopyTableSourceObject& _rSourceObject, const Reference< XConnection >& _xSourceConnection,
556         const Reference< XConnection >& _xConnection, const Reference< XMultiServiceFactory >& _rxORB,
557         const Reference< XInteractionHandler>&   _xInteractionHandler)
558 	: WizardDialog( pParent, ModuleRes(WIZ_RTFCOPYTABLE))
559     ,m_pbHelp( this , ModuleRes(PB_HELP))
560 	,m_pbCancel( this , ModuleRes(PB_CANCEL))
561 	,m_pbPrev( this , ModuleRes(PB_PREV))
562 	,m_pbNext( this , ModuleRes(PB_NEXT))
563 	,m_pbFinish( this , ModuleRes(PB_OK))
564 	,m_mNameMapping(_xConnection->getMetaData().is() && _xConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers())
565     ,m_xDestConnection( _xConnection )
566 	,m_rSourceObject( _rSourceObject )
567     ,m_xFormatter( getNumberFormatter( _xConnection, _rxORB ) )
568 	,m_xFactory(_rxORB)
569     ,m_xInteractionHandler(_xInteractionHandler)
570 	,m_sTypeNames(ModuleRes(STR_TABLEDESIGN_DBFIELDTYPES))
571 	,m_nPageCount(0)
572 	,m_bDeleteSourceColumns(sal_True)
573     ,m_bInterConnectionCopy( _xSourceConnection != _xConnection )
574     ,m_sName( _rDefaultName )
575 	,m_nOperation( _nOperation )
576     ,m_ePressed( WIZARD_NONE )
577     ,m_bCreatePrimaryKeyColumn(sal_False)
578 {
579     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::OCopyTableWizard" );
580 	DBG_CTOR(OCopyTableWizard,NULL);
581 	construct();
582 
583     // extract table name
584     ::rtl::OUString sInitialTableName( _rDefaultName );
585 	try
586 	{
587         m_sSourceName = m_rSourceObject.getQualifiedObjectName();
588         OSL_ENSURE( m_sSourceName.getLength() > 0, "OCopyTableWizard::OCopyTableWizard: unable to retrieve the source object's name!" );
589 
590         if ( !sInitialTableName.getLength() )
591             sInitialTableName = m_sSourceName;
592 
593         if ( !m_sName.getLength() )
594         {
595 		    if ( _xSourceConnection == m_xDestConnection )
596 		    {
597 			    Reference< XTablesSupplier > xSup( m_xDestConnection, UNO_QUERY_THROW );
598 			    m_sName = ::dbtools::createUniqueName( xSup->getTables(), sInitialTableName, sal_False );
599 		    }
600 		    else
601 			    m_sName = sInitialTableName;
602         }
603 	}
604 	catch ( const Exception& )
605 	{
606         m_sName = sInitialTableName;
607 	}
608 
609 	::dbaui::fillTypeInfo( _xSourceConnection, m_sTypeNames, m_aTypeInfo, m_aTypeInfoIndex );
610 	::dbaui::fillTypeInfo( m_xDestConnection, m_sTypeNames, m_aDestTypeInfo, m_aDestTypeInfoIndex );
611     impl_loadSourceData();
612 
613     bool bAllowViews = true;
614     // if the source is a, don't allow creating views #100644# (oj)
615     // (fs: Hmm? A SELECT * FROM <view> would be created, where #100644# claims this is nonsense. Why?
616     if ( m_rSourceObject.isView() )
617         bAllowViews = false;
618     // no views if the target connection does not support creating them
619     if ( !lcl_canCreateViewFor_nothrow( m_xDestConnection ) )
620         bAllowViews = false;
621     // no views if we're copying to a different database
622     if ( !lcl_sameConnection_throw( _xSourceConnection, m_xDestConnection ) )
623         bAllowViews = false;
624 
625 	if ( m_bInterConnectionCopy )
626 	{
627 		Reference< XDatabaseMetaData > xSrcMeta = _xSourceConnection->getMetaData();
628 		::rtl::OUString sCatalog;
629 		::rtl::OUString sSchema;
630 		::rtl::OUString sTable;
631 		::dbtools::qualifiedNameComponents(	xSrcMeta,
632 											m_sName,
633 											sCatalog,
634 											sSchema,
635 											sTable,
636 											::dbtools::eInDataManipulation);
637 
638 		m_sName = ::dbtools::composeTableName(m_xDestConnection->getMetaData(),sCatalog,sSchema,sTable,sal_False,::dbtools::eInTableDefinitions);
639 	}
640 
641 	OCopyTable* pPage1( new OCopyTable( this ) );
642     pPage1->disallowUseHeaderLine();
643     if ( !bAllowViews )
644         pPage1->disallowViews();
645 	pPage1->setCreateStyleAction();
646 	AddWizardPage(pPage1);
647 
648     AddWizardPage( new OWizNameMatching( this ) );
649 	AddWizardPage( new OWizColumnSelect( this ) );
650 	AddWizardPage( new OWizNormalExtend( this ) );
651 	ActivatePage();
652 }
653 
654 // -----------------------------------------------------------------------------
OCopyTableWizard(Window * pParent,const::rtl::OUString & _rDefaultName,sal_Int16 _nOperation,const ODatabaseExport::TColumns & _rSourceColumns,const ODatabaseExport::TColumnVector & _rSourceColVec,const Reference<XConnection> & _xConnection,const Reference<XNumberFormatter> & _xFormatter,TypeSelectionPageFactory _pTypeSelectionPageFactory,SvStream & _rTypeSelectionPageArg,const Reference<XMultiServiceFactory> & _rM)655 OCopyTableWizard::OCopyTableWizard( Window* pParent, const ::rtl::OUString& _rDefaultName, sal_Int16 _nOperation,
656         const ODatabaseExport::TColumns& _rSourceColumns, const ODatabaseExport::TColumnVector& _rSourceColVec,
657         const Reference< XConnection >& _xConnection, const Reference< XNumberFormatter >&	_xFormatter,
658         TypeSelectionPageFactory _pTypeSelectionPageFactory, SvStream& _rTypeSelectionPageArg, const Reference< XMultiServiceFactory >& _rM )
659 	:WizardDialog( pParent, ModuleRes(WIZ_RTFCOPYTABLE))
660 	,m_vSourceColumns(_rSourceColumns)
661     ,m_pbHelp( this , ModuleRes(PB_HELP))
662 	,m_pbCancel( this , ModuleRes(PB_CANCEL))
663 	,m_pbPrev( this , ModuleRes(PB_PREV))
664 	,m_pbNext( this , ModuleRes(PB_NEXT))
665 	,m_pbFinish( this , ModuleRes(PB_OK))
666 	,m_mNameMapping(_xConnection->getMetaData().is() && _xConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers())
667     ,m_xDestConnection( _xConnection )
668     ,m_rSourceObject( DummyCopySource::Instance() )
669 	,m_xFormatter(_xFormatter)
670 	,m_xFactory(_rM)
671 	,m_sTypeNames(ModuleRes(STR_TABLEDESIGN_DBFIELDTYPES))
672 	,m_nPageCount(0)
673 	,m_bDeleteSourceColumns(sal_False)
674     ,m_bInterConnectionCopy( false )
675 	,m_sName(_rDefaultName)
676     ,m_nOperation( _nOperation )
677     ,m_ePressed( WIZARD_NONE )
678 	,m_bCreatePrimaryKeyColumn(sal_False)
679 {
680     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::OCopyTableWizard" );
681 	DBG_CTOR(OCopyTableWizard,NULL);
682 	construct();
683     ODatabaseExport::TColumnVector::const_iterator aIter = _rSourceColVec.begin();
684     ODatabaseExport::TColumnVector::const_iterator aEnd = _rSourceColVec.end();
685     for (; aIter != aEnd ; ++aIter)
686     {
687         m_vSourceVec.push_back(m_vSourceColumns.find((*aIter)->first));
688     }
689 
690 	::dbaui::fillTypeInfo( _xConnection, m_sTypeNames, m_aTypeInfo, m_aTypeInfoIndex );
691 	::dbaui::fillTypeInfo( _xConnection, m_sTypeNames, m_aDestTypeInfo, m_aDestTypeInfoIndex );
692 
693     m_xInteractionHandler.set( m_xFactory->createInstance( SERVICE_TASK_INTERACTION_HANDLER ), UNO_QUERY);
694 
695     OCopyTable* pPage1( new OCopyTable( this ) );
696     pPage1->disallowViews();
697 	pPage1->setCreateStyleAction();
698     AddWizardPage( pPage1 );
699 
700     AddWizardPage( new OWizNameMatching( this ) );
701 	AddWizardPage( new OWizColumnSelect( this ) );
702     AddWizardPage( (*_pTypeSelectionPageFactory)( this, _rTypeSelectionPageArg ) );
703 
704     ActivatePage();
705 }
706 
707 // -----------------------------------------------------------------------------
construct()708 void OCopyTableWizard::construct()
709 {
710     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::construct" );
711     AddButton( &m_pbHelp, WIZARDDIALOG_BUTTON_STDOFFSET_X );
712 	AddButton( &m_pbCancel, WIZARDDIALOG_BUTTON_STDOFFSET_X );
713     AddButton( &m_pbPrev );
714 	AddButton( &m_pbNext, WIZARDDIALOG_BUTTON_STDOFFSET_X );
715 	AddButton( &m_pbFinish );
716 
717 	m_pbPrev.SetClickHdl( LINK( this, OCopyTableWizard, ImplPrevHdl ) );
718 	m_pbNext.SetClickHdl( LINK( this, OCopyTableWizard, ImplNextHdl ) );
719 	m_pbFinish.SetClickHdl( LINK( this, OCopyTableWizard, ImplOKHdl ) );
720 
721 	SetActivatePageHdl( LINK( this, OCopyTableWizard, ImplActivateHdl ) );
722 
723 	SetPrevButton( &m_pbPrev );
724 	SetNextButton( &m_pbNext );
725 
726 	ShowButtonFixedLine( sal_True );
727 
728 	m_pbNext.GrabFocus();
729 
730 	if (m_vDestColumns.size())
731 		// source is a html or rtf table
732 		m_pbNext.SetStyle(m_pbFinish.GetStyle() | WB_DEFBUTTON);
733 	else
734 		m_pbFinish.SetStyle(m_pbFinish.GetStyle() | WB_DEFBUTTON);
735 
736 	FreeResource();
737 
738 	m_pTypeInfo = TOTypeInfoSP(new OTypeInfo());
739 	m_pTypeInfo->aUIName = m_sTypeNames.GetToken(TYPE_OTHER);
740 	m_bAddPKFirstTime = sal_True;
741 }
742 //------------------------------------------------------------------------
~OCopyTableWizard()743 OCopyTableWizard::~OCopyTableWizard()
744 {
745 	DBG_DTOR(OCopyTableWizard,NULL);
746 	for ( ;; )
747     {
748         TabPage *pPage = GetPage(0);
749         if ( pPage == NULL )
750             break;
751 		RemovePage( pPage );
752 		delete pPage;
753 	}
754 
755 	if ( m_bDeleteSourceColumns )
756 		clearColumns(m_vSourceColumns,m_vSourceVec);
757 
758 	clearColumns(m_vDestColumns,m_aDestVec);
759 
760 	// clear the type information
761 	m_aTypeInfoIndex.clear();
762 	m_aTypeInfo.clear();
763 	m_aDestTypeInfoIndex.clear();
764 }
765 // -----------------------------------------------------------------------
IMPL_LINK(OCopyTableWizard,ImplPrevHdl,PushButton *,EMPTYARG)766 IMPL_LINK( OCopyTableWizard, ImplPrevHdl, PushButton*, EMPTYARG )
767 {
768 	m_ePressed = WIZARD_PREV;
769 	if ( GetCurLevel() )
770 	{
771 		if ( getOperation() != CopyTableOperation::AppendData )
772 		{
773 			if(GetCurLevel() == 2)
774 				ShowPage(GetCurLevel()-2);
775 			else
776 				ShowPrevPage();
777 		}
778 		else
779 			ShowPrevPage();
780 	}
781 	return 0;
782 }
783 
784 // -----------------------------------------------------------------------
785 
IMPL_LINK(OCopyTableWizard,ImplNextHdl,PushButton *,EMPTYARG)786 IMPL_LINK( OCopyTableWizard, ImplNextHdl, PushButton*, EMPTYARG )
787 {
788 	m_ePressed = WIZARD_NEXT;
789 	if ( GetCurLevel() < MAX_PAGES )
790 	{
791 		if ( getOperation() != CopyTableOperation::AppendData )
792 		{
793 			if(GetCurLevel() == 0)
794 				ShowPage(GetCurLevel()+2);
795 			else
796 				ShowNextPage();
797 		}
798 		else
799 			ShowNextPage();
800 	}
801 	return 0;
802 }
803 // -----------------------------------------------------------------------
CheckColumns(sal_Int32 & _rnBreakPos)804 sal_Bool OCopyTableWizard::CheckColumns(sal_Int32& _rnBreakPos)
805 {
806     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::CheckColumns" );
807 	sal_Bool bRet = sal_True;
808 	m_vColumnPos.clear();
809 	m_vColumnTypes.clear();
810 
811 	OSL_ENSURE( m_xDestConnection.is(), "OCopyTableWizard::CheckColumns: No connection!" );
812 	//////////////////////////////////////////////////////////////////////
813 	// Wenn Datenbank PrimaryKeys verarbeiten kann, PrimaryKey anlegen
814 	if ( m_xDestConnection.is() )
815 	{
816 		sal_Bool bPKeyAllowed = supportsPrimaryKey();
817 
818 		sal_Bool bContainsColumns = !m_vDestColumns.empty();
819 
820 		if ( bPKeyAllowed && shouldCreatePrimaryKey() )
821 		{
822 			// add extra column for the primary key
823 			TOTypeInfoSP pTypeInfo = queryPrimaryKeyType(m_aDestTypeInfo);
824 			if ( pTypeInfo.get() )
825 			{
826 				if ( m_bAddPKFirstTime )
827 				{
828 					OFieldDescription* pField = new OFieldDescription();
829 					pField->SetName(m_aKeyName);
830 					pField->FillFromTypeInfo(pTypeInfo,sal_True,sal_True);
831 					pField->SetPrimaryKey(sal_True);
832 					m_bAddPKFirstTime = sal_False;
833 					insertColumn(0,pField);
834 				}
835 				m_vColumnPos.push_back(ODatabaseExport::TPositions::value_type(1,1));
836 				m_vColumnTypes.push_back(pTypeInfo->nType);
837 			}
838 		}
839 
840 		if ( bContainsColumns )
841 		{	// we have dest columns so look for the matching column
842 			ODatabaseExport::TColumnVector::const_iterator aSrcIter = m_vSourceVec.begin();
843             ODatabaseExport::TColumnVector::const_iterator aSrcEnd = m_vSourceVec.end();
844 			for(;aSrcIter != aSrcEnd;++aSrcIter)
845 			{
846 				ODatabaseExport::TColumns::iterator aDestIter = m_vDestColumns.find(m_mNameMapping[(*aSrcIter)->first]);
847 
848 				if ( aDestIter != m_vDestColumns.end() )
849 				{
850 					ODatabaseExport::TColumnVector::const_iterator aFind = ::std::find(m_aDestVec.begin(),m_aDestVec.end(),aDestIter);
851 					sal_Int32 nPos = (aFind - m_aDestVec.begin())+1;
852 					m_vColumnPos.push_back(ODatabaseExport::TPositions::value_type(nPos,nPos));
853 					m_vColumnTypes.push_back((*aFind)->second->GetType());
854 				}
855 				else
856 				{
857 					m_vColumnPos.push_back( ODatabaseExport::TPositions::value_type( COLUMN_POSITION_NOT_FOUND, COLUMN_POSITION_NOT_FOUND ) );
858 					m_vColumnTypes.push_back(0);
859 				}
860 			}
861 		}
862 		else
863 		{
864             Reference< XDatabaseMetaData > xMetaData( m_xDestConnection->getMetaData() );
865 			::rtl::OUString sExtraChars = xMetaData->getExtraNameCharacters();
866 			sal_Int32 nMaxNameLen		= getMaxColumnNameLength();
867 
868 			ODatabaseExport::TColumnVector::const_iterator aSrcIter = m_vSourceVec.begin();
869             ODatabaseExport::TColumnVector::const_iterator aSrcEnd = m_vSourceVec.end();
870 			for(_rnBreakPos=0;aSrcIter != aSrcEnd && bRet ;++aSrcIter,++_rnBreakPos)
871 			{
872 				OFieldDescription* pField = new OFieldDescription(*(*aSrcIter)->second);
873 				pField->SetName(convertColumnName(TExportColumnFindFunctor(&m_vDestColumns),(*aSrcIter)->first,sExtraChars,nMaxNameLen));
874 				TOTypeInfoSP pType = convertType((*aSrcIter)->second->getSpecialTypeInfo(),bRet);
875 				pField->SetType(pType);
876 				if ( !bPKeyAllowed )
877 					pField->SetPrimaryKey(sal_False);
878 
879 				// now create a column
880 				insertColumn(m_vDestColumns.size(),pField);
881 				m_vColumnPos.push_back(ODatabaseExport::TPositions::value_type(m_vDestColumns.size(),m_vDestColumns.size()));
882 				m_vColumnTypes.push_back((*aSrcIter)->second->GetType());
883 			}
884 		}
885 	}
886 	return bRet;
887 }
888 // -----------------------------------------------------------------------
IMPL_LINK(OCopyTableWizard,ImplOKHdl,OKButton *,EMPTYARG)889 IMPL_LINK( OCopyTableWizard, ImplOKHdl, OKButton*, EMPTYARG )
890 {
891 	m_ePressed = WIZARD_FINISH;
892 	sal_Bool bFinish = DeactivatePage() != 0;
893 
894 	if(bFinish)
895 	{
896 		WaitObject aWait(this);
897 		switch(getOperation())
898 		{
899 			case CopyTableOperation::CopyDefinitionAndData:
900 			case CopyTableOperation::CopyDefinitionOnly:
901 			{
902 				sal_Bool bOnFirstPage = GetCurLevel() == 0;
903 				if ( bOnFirstPage )
904 				{
905 					// we came from the first page so we have to clear
906 					// all column information already collected
907 					clearDestColumns();
908 					m_mNameMapping.clear();
909 				}
910 				sal_Int32 nBreakPos = 0;
911 				sal_Bool bCheckOk = CheckColumns(nBreakPos);
912 				if ( bOnFirstPage && !bCheckOk )
913 				{
914 					showColumnTypeNotSupported(m_vSourceVec[nBreakPos-1]->first);
915 					OWizTypeSelect* pPage = static_cast<OWizTypeSelect*>(GetPage(3));
916 					if ( pPage )
917 					{
918                         m_mNameMapping.clear();
919 						pPage->setDisplayRow(nBreakPos);
920 						ShowPage(3);
921 						return 0;
922 					}
923 				}
924                 if ( m_xDestConnection.is() )
925 	            {
926                     if ( supportsPrimaryKey() )
927                     {
928                         ODatabaseExport::TColumns::iterator aFind = ::std::find_if(m_vDestColumns.begin(),m_vDestColumns.end()
929                             ,::std::compose1(::std::mem_fun(&OFieldDescription::IsPrimaryKey),::std::select2nd<ODatabaseExport::TColumns::value_type>()));
930                         if ( aFind == m_vDestColumns.end() && m_xInteractionHandler.is() )
931                         {
932 
933                             String sTitle(ModuleRes(STR_TABLEDESIGN_NO_PRIM_KEY_HEAD));
934 			                String sMsg(ModuleRes(STR_TABLEDESIGN_NO_PRIM_KEY));
935                             SQLContext aError;
936                             aError.Message = sMsg;
937                             ::rtl::Reference< ::comphelper::OInteractionRequest > xRequest( new ::comphelper::OInteractionRequest( makeAny( aError ) ) );
938                             ::rtl::Reference< ::comphelper::OInteractionApprove > xYes = new ::comphelper::OInteractionApprove;
939                             xRequest->addContinuation( xYes.get() );
940                             xRequest->addContinuation( new ::comphelper::OInteractionDisapprove );
941                             ::rtl::Reference< ::comphelper::OInteractionAbort > xAbort = new ::comphelper::OInteractionAbort;
942                             xRequest->addContinuation( xAbort.get() );
943 
944                             m_xInteractionHandler->handle( xRequest.get() );
945 
946                             if ( xYes->wasSelected() )
947                             {
948                                 OCopyTable* pPage = static_cast<OCopyTable*>(GetPage(0));
949                                 m_bCreatePrimaryKeyColumn = sal_True;
950                                 m_aKeyName = pPage->GetKeyName();
951                                 if ( !m_aKeyName.getLength() )
952                                     m_aKeyName = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ID" ) );
953                                 m_aKeyName = createUniqueName( m_aKeyName );
954                                 sal_Int32 nBreakPos2 = 0;
955 			                    CheckColumns(nBreakPos2);
956                             }
957                             else if ( xAbort->wasSelected() )
958                             {
959                                 ShowPage(3);
960                                 return 0;
961                             }
962                         }
963                     }
964                 }
965 				break;
966 			}
967 			case CopyTableOperation::AppendData:
968 			case CopyTableOperation::CreateAsView:
969 				break;
970 			default:
971 			{
972 				OSL_ENSURE(sal_False, "OCopyTableWizard::ImplOKHdl: invalid creation style!");
973 			}
974 		}
975 
976 		EndDialog(RET_OK);
977 	}
978 	return bFinish;
979 }
980 //------------------------------------------------------------------------
shouldCreatePrimaryKey() const981 sal_Bool OCopyTableWizard::shouldCreatePrimaryKey() const
982 {
983     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::shouldCreatePrimaryKey" );
984 	return m_bCreatePrimaryKeyColumn;
985 }
986 
987 // -----------------------------------------------------------------------
setCreatePrimaryKey(bool _bDoCreate,const::rtl::OUString & _rSuggestedName)988 void OCopyTableWizard::setCreatePrimaryKey( bool _bDoCreate, const ::rtl::OUString& _rSuggestedName )
989 {
990     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::setCreatePrimaryKey" );
991     m_bCreatePrimaryKeyColumn = _bDoCreate;
992     if ( _rSuggestedName.getLength() )
993         m_aKeyName = _rSuggestedName;
994 
995     OCopyTable* pSettingsPage = dynamic_cast< OCopyTable* >( GetPage( 0 ) );
996     OSL_ENSURE( pSettingsPage, "OCopyTableWizard::setCreatePrimaryKey: page should have been added in the ctor!" );
997     if ( pSettingsPage )
998         pSettingsPage->setCreatePrimaryKey( _bDoCreate, _rSuggestedName );
999 }
1000 
1001 // -----------------------------------------------------------------------
IMPL_LINK(OCopyTableWizard,ImplActivateHdl,WizardDialog *,EMPTYARG)1002 IMPL_LINK( OCopyTableWizard, ImplActivateHdl, WizardDialog*, EMPTYARG )
1003 {
1004 	OWizardPage* pCurrent = (OWizardPage*)GetPage(GetCurLevel());
1005 	if(pCurrent)
1006 	{
1007 		sal_Bool bFirstTime = pCurrent->IsFirstTime();
1008 		if(bFirstTime)
1009 			pCurrent->Reset();
1010 
1011 		CheckButtons();
1012 
1013 		SetText(pCurrent->GetTitle());
1014 
1015 		Invalidate();
1016 	}
1017 	return 0;
1018 }
1019 // -----------------------------------------------------------------------
CheckButtons()1020 void OCopyTableWizard::CheckButtons()
1021 {
1022     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::CheckButtons" );
1023 	if(GetCurLevel() == 0) // erste Seite hat kein PrevButton
1024 	{
1025 		if(m_nPageCount > 1)
1026 			m_pbNext.Enable(sal_True);
1027 		else
1028 			m_pbNext.Enable(sal_False);
1029 
1030 		m_pbPrev.Enable(sal_False);
1031 	}
1032 	else if(GetCurLevel() == m_nPageCount-1) // letzte Seite hat keinen Next Button
1033 	{
1034 		m_pbNext.Enable(sal_False);
1035 		m_pbPrev.Enable(sal_True);
1036 	}
1037 	else
1038 	{
1039 		m_pbPrev.Enable(sal_True);
1040 		// next has already his state
1041 	}
1042 }
1043 // -----------------------------------------------------------------------
EnableButton(Wizard_Button_Style eStyle,sal_Bool bEnable)1044 void OCopyTableWizard::EnableButton(Wizard_Button_Style eStyle,sal_Bool bEnable)
1045 {
1046     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::EnableButton" );
1047 //	CheckButtons();
1048 	Button* pButton;
1049 	if(eStyle == WIZARD_NEXT)
1050 		pButton = &m_pbNext;
1051 	else if(eStyle == WIZARD_PREV)
1052 		pButton = &m_pbPrev;
1053 	else
1054 		pButton = &m_pbFinish;
1055 	pButton->Enable(bEnable);
1056 
1057 }
1058 // -----------------------------------------------------------------------
DeactivatePage()1059 long OCopyTableWizard::DeactivatePage()
1060 {
1061     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::DeactivatePage" );
1062 	OWizardPage* pPage = (OWizardPage*)GetPage(GetCurLevel());
1063 	return pPage ? pPage->LeavePage() : sal_False;
1064 }
1065 // -----------------------------------------------------------------------
AddWizardPage(OWizardPage * pPage)1066 void OCopyTableWizard::AddWizardPage(OWizardPage* pPage)
1067 {
1068     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::AddWizardPage" );
1069 	AddPage(pPage);
1070 	++m_nPageCount;
1071 }
1072 // -----------------------------------------------------------------------------
insertColumn(sal_Int32 _nPos,OFieldDescription * _pField)1073 void OCopyTableWizard::insertColumn(sal_Int32 _nPos,OFieldDescription* _pField)
1074 {
1075     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::insertColumn" );
1076 	OSL_ENSURE(_pField,"FieldDescrioption is null!");
1077 	if ( _pField )
1078 	{
1079 		ODatabaseExport::TColumns::iterator aFind = m_vDestColumns.find(_pField->GetName());
1080 		if ( aFind != m_vDestColumns.end() )
1081 		{
1082 			delete aFind->second;
1083 			m_vDestColumns.erase(aFind);
1084 		}
1085 
1086 		m_aDestVec.insert(m_aDestVec.begin() + _nPos,
1087 			m_vDestColumns.insert(ODatabaseExport::TColumns::value_type(_pField->GetName(),_pField)).first);
1088         m_mNameMapping[_pField->GetName()] = _pField->GetName();
1089 	}
1090 }
1091 // -----------------------------------------------------------------------------
replaceColumn(sal_Int32 _nPos,OFieldDescription * _pField,const::rtl::OUString & _sOldName)1092 void OCopyTableWizard::replaceColumn(sal_Int32 _nPos,OFieldDescription* _pField,const ::rtl::OUString& _sOldName)
1093 {
1094     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::replaceColumn" );
1095 	OSL_ENSURE(_pField,"FieldDescrioption is null!");
1096 	if ( _pField )
1097 	{
1098 		m_vDestColumns.erase(_sOldName);
1099 		OSL_ENSURE( m_vDestColumns.find(_pField->GetName()) == m_vDestColumns.end(),"Column with that name already exist!");
1100 
1101 		m_aDestVec[_nPos] =
1102 			m_vDestColumns.insert(ODatabaseExport::TColumns::value_type(_pField->GetName(),_pField)).first;
1103 	}
1104 }
1105 // -----------------------------------------------------------------------------
impl_loadSourceData()1106 void OCopyTableWizard::impl_loadSourceData()
1107 {
1108     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::impl_loadSourceData" );
1109     loadData( m_rSourceObject, m_vSourceColumns, m_vSourceVec );
1110 }
1111 
1112 // -----------------------------------------------------------------------------
loadData(const ICopyTableSourceObject & _rSourceObject,ODatabaseExport::TColumns & _rColumns,ODatabaseExport::TColumnVector & _rColVector)1113 void OCopyTableWizard::loadData(  const ICopyTableSourceObject& _rSourceObject, ODatabaseExport::TColumns& _rColumns, ODatabaseExport::TColumnVector& _rColVector )
1114 {
1115     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::loadData" );
1116     ODatabaseExport::TColumns::iterator colEnd = _rColumns.end();
1117 	for ( ODatabaseExport::TColumns::iterator col = _rColumns.begin(); col != colEnd; ++col )
1118 		delete col->second;
1119 
1120 	_rColVector.clear();
1121 	_rColumns.clear();
1122 
1123 	OFieldDescription* pActFieldDescr = NULL;
1124 	String aType;
1125 	::rtl::OUString sCreateParam(RTL_CONSTASCII_USTRINGPARAM("x"));
1126 	//////////////////////////////////////////////////////////////////////
1127 	// ReadOnly-Flag
1128 	// Bei Drop darf keine Zeile editierbar sein.
1129 	// Bei Add duerfen nur die leeren Zeilen editierbar sein.
1130 	// Bei Add und Drop koennen alle Zeilen editiert werden.
1131 	Sequence< ::rtl::OUString > aColumns( _rSourceObject.getColumnNames() );
1132 	const ::rtl::OUString* pColumn      = aColumns.getConstArray();
1133 	const ::rtl::OUString* pColumnEnd   = pColumn + aColumns.getLength();
1134 
1135 	for ( ; pColumn != pColumnEnd; ++pColumn )
1136 	{
1137 		// get the properties of the column
1138 		pActFieldDescr = _rSourceObject.createFieldDescription( *pColumn );
1139         OSL_ENSURE( pActFieldDescr, "OCopyTableWizard::loadData: illegal field description!" );
1140         if ( !pActFieldDescr )
1141             continue;
1142 
1143 		sal_Int32 nType			  = pActFieldDescr->GetType();
1144 		sal_Int32 nScale		  = pActFieldDescr->GetScale();
1145 		sal_Int32 nPrecision	  = pActFieldDescr->GetPrecision();
1146 		sal_Bool bAutoIncrement   = pActFieldDescr->IsAutoIncrement();
1147 		::rtl::OUString sTypeName = pActFieldDescr->GetTypeName();
1148 
1149 		// search for type
1150 		sal_Bool bForce;
1151 		TOTypeInfoSP pTypeInfo = ::dbaui::getTypeInfoFromType(m_aTypeInfo,nType,sTypeName,sCreateParam,nPrecision,nScale,bAutoIncrement,bForce);
1152 		if ( !pTypeInfo.get() )
1153 			pTypeInfo = m_pTypeInfo;
1154 
1155 		pActFieldDescr->FillFromTypeInfo(pTypeInfo,sal_True,sal_False);
1156 		_rColVector.push_back(_rColumns.insert(ODatabaseExport::TColumns::value_type(pActFieldDescr->GetName(),pActFieldDescr)).first);
1157 	}
1158 
1159     // determine which coumns belong to the primary key
1160     Sequence< ::rtl::OUString > aPrimaryKeyColumns( _rSourceObject.getPrimaryKeyColumnNames() );
1161     const ::rtl::OUString* pKeyColName  = aPrimaryKeyColumns.getConstArray();
1162     const ::rtl::OUString* pKeyColEnd   = pKeyColName + aPrimaryKeyColumns.getLength();
1163 
1164     for( ; pKeyColName != pKeyColEnd; ++pKeyColName )
1165     {
1166         ODatabaseExport::TColumns::iterator keyPos = _rColumns.find( *pKeyColName );
1167         if ( keyPos != _rColumns.end() )
1168         {
1169             keyPos->second->SetPrimaryKey( sal_True );
1170             keyPos->second->SetIsNullable( ColumnValue::NO_NULLS );
1171         }
1172     }
1173 }
1174 // -----------------------------------------------------------------------------
clearDestColumns()1175 void OCopyTableWizard::clearDestColumns()
1176 {
1177     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::clearDestColumns" );
1178 	clearColumns(m_vDestColumns,m_aDestVec);
1179     m_bAddPKFirstTime = sal_True;
1180     m_mNameMapping.clear();
1181 }
1182 
1183 // -----------------------------------------------------------------------------
appendColumns(Reference<XColumnsSupplier> & _rxColSup,const ODatabaseExport::TColumnVector * _pVec,sal_Bool _bKeyColumns) const1184 void OCopyTableWizard::appendColumns( Reference<XColumnsSupplier>& _rxColSup, const ODatabaseExport::TColumnVector* _pVec, sal_Bool _bKeyColumns) const
1185 {
1186     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::appendColumns" );
1187 	// now append the columns
1188 	OSL_ENSURE(_rxColSup.is(),"No columns supplier");
1189 	if(!_rxColSup.is())
1190 		return;
1191 	Reference<XNameAccess> xColumns = _rxColSup->getColumns();
1192 	OSL_ENSURE(xColumns.is(),"No columns");
1193 	Reference<XDataDescriptorFactory> xColumnFactory(xColumns,UNO_QUERY);
1194 
1195 	Reference<XAppend> xAppend(xColumns,UNO_QUERY);
1196 	OSL_ENSURE(xAppend.is(),"No XAppend Interface!");
1197 
1198 	ODatabaseExport::TColumnVector::const_iterator aIter = _pVec->begin();
1199     ODatabaseExport::TColumnVector::const_iterator aEnd = _pVec->end();
1200 	for(;aIter != aEnd;++aIter)
1201 	{
1202 		OFieldDescription* pField = (*aIter)->second;
1203 		if(!pField)
1204 			continue;
1205 
1206 		Reference<XPropertySet> xColumn;
1207 		if(pField->IsPrimaryKey() || !_bKeyColumns)
1208 			xColumn = xColumnFactory->createDataDescriptor();
1209 		if(xColumn.is())
1210 		{
1211 			if(!_bKeyColumns)
1212 				dbaui::setColumnProperties(xColumn,pField);
1213 			else
1214 				xColumn->setPropertyValue(PROPERTY_NAME,makeAny(pField->GetName()));
1215 
1216 			xAppend->appendByDescriptor(xColumn);
1217 			xColumn = NULL;
1218 			// now only the settings are missing
1219 			if(xColumns->hasByName(pField->GetName()))
1220 			{
1221                 xColumn.set(xColumns->getByName(pField->GetName()),UNO_QUERY);
1222                 OSL_ENSURE(xColumn.is(),"OCopyTableWizard::appendColumns: Column is NULL!");
1223 				if ( xColumn.is() )
1224 					pField->copyColumnSettingsTo(xColumn);
1225 			}
1226 			else
1227 			{
1228 				OSL_ENSURE(sal_False, "OCopyTableWizard::appendColumns: invalid field name!");
1229 			}
1230 
1231 		}
1232 	}
1233 }
1234 // -----------------------------------------------------------------------------
appendKey(Reference<XKeysSupplier> & _rxSup,const ODatabaseExport::TColumnVector * _pVec) const1235 void OCopyTableWizard::appendKey( Reference<XKeysSupplier>& _rxSup, const ODatabaseExport::TColumnVector* _pVec) const
1236 {
1237     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::appendKey" );
1238 	if(!_rxSup.is())
1239 		return; // the database doesn't support keys
1240 	OSL_ENSURE(_rxSup.is(),"No XKeysSupplier!");
1241 	Reference<XDataDescriptorFactory> xKeyFactory(_rxSup->getKeys(),UNO_QUERY);
1242 	OSL_ENSURE(xKeyFactory.is(),"No XDataDescriptorFactory Interface!");
1243 	if ( !xKeyFactory.is() )
1244 		return;
1245 	Reference<XAppend> xAppend(xKeyFactory,UNO_QUERY);
1246 	OSL_ENSURE(xAppend.is(),"No XAppend Interface!");
1247 
1248 	Reference<XPropertySet> xKey = xKeyFactory->createDataDescriptor();
1249 	OSL_ENSURE(xKey.is(),"Key is null!");
1250 	xKey->setPropertyValue(PROPERTY_TYPE,makeAny(KeyType::PRIMARY));
1251 
1252 	Reference<XColumnsSupplier> xColSup(xKey,UNO_QUERY);
1253 	if(xColSup.is())
1254 	{
1255 		appendColumns(xColSup,_pVec,sal_True);
1256 		Reference<XNameAccess> xColumns = xColSup->getColumns();
1257 		if(xColumns.is() && xColumns->getElementNames().getLength())
1258 			xAppend->appendByDescriptor(xKey);
1259 	}
1260 
1261 }
1262 // -----------------------------------------------------------------------------
createView() const1263 Reference< XPropertySet > OCopyTableWizard::createView() const
1264 {
1265     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::createView" );
1266     ::rtl::OUString sCommand( m_rSourceObject.getSelectStatement() );
1267     OSL_ENSURE( sCommand.getLength(), "OCopyTableWizard::createView: no statement in the source object!" );
1268         // there are legitimate cases in which getSelectStatement does not provide a statement,
1269         // but in all those cases, this method here should never be called.
1270     return ::dbaui::createView( m_sName, m_xDestConnection, sCommand );
1271 }
1272 // -----------------------------------------------------------------------------
createTable()1273 Reference< XPropertySet > OCopyTableWizard::createTable()
1274 {
1275     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::createTable" );
1276     Reference< XPropertySet > xTable;
1277 
1278 	Reference<XTablesSupplier> xSup( m_xDestConnection, UNO_QUERY );
1279 	Reference< XNameAccess > xTables;
1280 	if(xSup.is())
1281 		xTables = xSup->getTables();
1282 	if ( getOperation() != CopyTableOperation::AppendData )
1283 	{
1284 		Reference<XDataDescriptorFactory> xFact(xTables,UNO_QUERY);
1285 		OSL_ENSURE(xFact.is(),"No XDataDescriptorFactory available!");
1286 		if(!xFact.is())
1287 			return NULL;
1288 
1289 		xTable = xFact->createDataDescriptor();
1290 		OSL_ENSURE(xTable.is(),"Could not create a new object!");
1291 		if(!xTable.is())
1292 			return NULL;
1293 
1294 		::rtl::OUString sCatalog,sSchema,sTable;
1295         Reference< XDatabaseMetaData> xMetaData = m_xDestConnection->getMetaData();
1296 		::dbtools::qualifiedNameComponents(xMetaData,
1297 											m_sName,
1298 											sCatalog,
1299 											sSchema,
1300 											sTable,
1301 											::dbtools::eInDataManipulation);
1302 
1303         if ( !sCatalog.getLength() && xMetaData->supportsCatalogsInTableDefinitions() )
1304         {
1305             sCatalog = m_xDestConnection->getCatalog();
1306         }
1307 
1308         if ( !sSchema.getLength() && xMetaData->supportsSchemasInTableDefinitions() )
1309         {
1310             sSchema = xMetaData->getUserName();
1311         }
1312 
1313 		xTable->setPropertyValue(PROPERTY_CATALOGNAME,makeAny(sCatalog));
1314 		xTable->setPropertyValue(PROPERTY_SCHEMANAME,makeAny(sSchema));
1315 		xTable->setPropertyValue(PROPERTY_NAME,makeAny(sTable));
1316 
1317 		Reference< XColumnsSupplier > xSuppDestinationColumns( xTable, UNO_QUERY );
1318 		// now append the columns
1319 		const ODatabaseExport::TColumnVector* pVec = getDestVector();
1320 		appendColumns( xSuppDestinationColumns, pVec );
1321 		// now append the primary key
1322 		Reference<XKeysSupplier> xKeySup(xTable,UNO_QUERY);
1323 		appendKey(xKeySup,pVec);
1324 
1325 		Reference<XAppend> xAppend(xTables,UNO_QUERY);
1326 		if(xAppend.is())
1327 			xAppend->appendByDescriptor(xTable);
1328 
1329 		//	xTable = NULL;
1330 		// we need to reget the table because after appending it it is no longer valid
1331 		if(xTables->hasByName(m_sName))
1332 			xTables->getByName(m_sName) >>= xTable;
1333 		else
1334 		{
1335 			::rtl::OUString sComposedName(
1336                 ::dbtools::composeTableName( m_xDestConnection->getMetaData(), xTable, ::dbtools::eInDataManipulation, false, false, false ) );
1337 			if(xTables->hasByName(sComposedName))
1338 			{
1339 				xTables->getByName(sComposedName) >>= xTable;
1340 				m_sName = sComposedName;
1341 			}
1342 			else
1343 				xTable = NULL;
1344 		}
1345 		if(xTable.is())
1346 		{
1347             xSuppDestinationColumns.set( xTable, UNO_QUERY_THROW );
1348 			// insert new table name into table filter
1349 			::dbaui::appendToFilter( m_xDestConnection, m_sName, GetFactory(), this );
1350 
1351             // copy ui settings
1352             m_rSourceObject.copyUISettingsTo( xTable );
1353             //copy filter and sorting
1354             m_rSourceObject.copyFilterAndSortingTo(m_xDestConnection,xTable);
1355 			// set column mappings
1356 			Reference<XNameAccess> xNameAccess = xSuppDestinationColumns->getColumns();
1357 			Sequence< ::rtl::OUString> aSeq = xNameAccess->getElementNames();
1358 			const ::rtl::OUString* pIter = aSeq.getConstArray();
1359 			const ::rtl::OUString* pEnd	  = pIter + aSeq.getLength();
1360 
1361 			::std::vector<int> aAlreadyFound(m_vColumnPos.size(),0);
1362 
1363 			for(sal_Int32 nNewPos=1;pIter != pEnd;++pIter,++nNewPos)
1364 			{
1365 				ODatabaseExport::TColumns::const_iterator aDestIter = m_vDestColumns.find(*pIter);
1366 
1367 				if ( aDestIter != m_vDestColumns.end() )
1368 				{
1369 					ODatabaseExport::TColumnVector::const_iterator aFind = ::std::find(m_aDestVec.begin(),m_aDestVec.end(),aDestIter);
1370 					sal_Int32 nPos = (aFind - m_aDestVec.begin())+1;
1371 
1372 					ODatabaseExport::TPositions::iterator aPosFind = ::std::find_if(
1373                         m_vColumnPos.begin(),
1374                         m_vColumnPos.end(),
1375 						::std::compose1(    ::std::bind2nd( ::std::equal_to< sal_Int32 >(), nPos ),
1376                                             ::std::select1st< ODatabaseExport::TPositions::value_type >()
1377                         )
1378                     );
1379 
1380 					if ( m_vColumnPos.end() != aPosFind )
1381 					{
1382 						aPosFind->second = nNewPos;
1383 						OSL_ENSURE( m_vColumnTypes.size() > size_t( aPosFind - m_vColumnPos.begin() ),
1384                             "Invalid index for vector!" );
1385 						m_vColumnTypes[ aPosFind - m_vColumnPos.begin() ] = (*aFind)->second->GetType();
1386 					}
1387 				}
1388 			}
1389 		}
1390 	}
1391 	else if(xTables.is() && xTables->hasByName(m_sName))
1392 		xTables->getByName(m_sName) >>= xTable;
1393 
1394 	return xTable;
1395 }
1396 
1397 // -----------------------------------------------------------------------------
supportsPrimaryKey(const Reference<XConnection> & _rxConnection)1398 bool OCopyTableWizard::supportsPrimaryKey( const Reference< XConnection >& _rxConnection )
1399 {
1400     OSL_PRECOND( _rxConnection.is(), "OCopyTableWizard::supportsPrimaryKey: invalid connection!" );
1401 	if ( !_rxConnection.is() )
1402         return false;
1403 
1404     ::dbtools::DatabaseMetaData aMetaData( _rxConnection );
1405     return aMetaData.supportsPrimaryKeys();
1406 }
1407 
1408 // -----------------------------------------------------------------------------
supportsViews(const Reference<XConnection> & _rxConnection)1409 bool OCopyTableWizard::supportsViews( const Reference< XConnection >& _rxConnection )
1410 {
1411     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::supportsViews" );
1412     OSL_PRECOND( _rxConnection.is(), "OCopyTableWizard::supportsViews: invalid connection!" );
1413     if ( !_rxConnection.is() )
1414         return false;
1415 
1416     bool bSupportsViews( false );
1417     try
1418     {
1419         Reference< XDatabaseMetaData > xMetaData( _rxConnection->getMetaData(), UNO_SET_THROW );
1420 	    Reference< XViewsSupplier > xViewSups( _rxConnection, UNO_QUERY );
1421         bSupportsViews = xViewSups.is();
1422 	    if ( !bSupportsViews )
1423 	    {
1424 		    try
1425 		    {
1426 			    Reference< XResultSet > xRs( xMetaData->getTableTypes(), UNO_SET_THROW );
1427                 Reference< XRow > xRow( xRs, UNO_QUERY_THROW );
1428 				while ( xRs->next() )
1429 				{
1430 					::rtl::OUString sValue = xRow->getString( 1 );
1431 					if ( !xRow->wasNull() && sValue.equalsIgnoreAsciiCaseAscii( "View" ) )
1432 					{
1433 						bSupportsViews = true;
1434 						break;
1435 					}
1436 				}
1437 		    }
1438 		    catch( const SQLException& )
1439 		    {
1440                 DBG_UNHANDLED_EXCEPTION();
1441 		    }
1442 	    }
1443     }
1444     catch( const Exception& )
1445     {
1446     	DBG_UNHANDLED_EXCEPTION();
1447     }
1448     return bSupportsViews;
1449 }
1450 
1451 // -----------------------------------------------------------------------------
getMaxColumnNameLength() const1452 sal_Int32 OCopyTableWizard::getMaxColumnNameLength() const
1453 {
1454     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::getMaxColumnNameLength" );
1455 	sal_Int32 nLen = 0;
1456 	if ( m_xDestConnection.is() )
1457 	{
1458 		try
1459 		{
1460 			Reference< XDatabaseMetaData > xMetaData( m_xDestConnection->getMetaData(), UNO_SET_THROW );
1461 			nLen = xMetaData->getMaxColumnNameLength();
1462 		}
1463 		catch(const Exception&)
1464 		{
1465             DBG_UNHANDLED_EXCEPTION();
1466 		}
1467 	}
1468 	return nLen;
1469 }
1470 // -----------------------------------------------------------------------------
setOperation(const sal_Int16 _nOperation)1471 void OCopyTableWizard::setOperation( const sal_Int16 _nOperation )
1472 {
1473     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::setOperation" );
1474 	m_nOperation = _nOperation;
1475 }
1476 // -----------------------------------------------------------------------------
getOperation() const1477 sal_Int16 OCopyTableWizard::getOperation() const
1478 {
1479     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::getOperation" );
1480 	return m_nOperation;
1481 }
1482 // -----------------------------------------------------------------------------
convertColumnName(const TColumnFindFunctor & _rCmpFunctor,const::rtl::OUString & _sColumnName,const::rtl::OUString & _sExtraChars,sal_Int32 _nMaxNameLen)1483 ::rtl::OUString OCopyTableWizard::convertColumnName(const TColumnFindFunctor&	_rCmpFunctor,
1484 													const ::rtl::OUString&	_sColumnName,
1485 													const ::rtl::OUString&	_sExtraChars,
1486 													sal_Int32				_nMaxNameLen)
1487 {
1488     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::convertColumnName" );
1489 	::rtl::OUString sAlias = _sColumnName;
1490 	if ( isSQL92CheckEnabled( m_xDestConnection ) )
1491 		sAlias = ::dbtools::convertName2SQLName(_sColumnName,_sExtraChars);
1492 	if((_nMaxNameLen && sAlias.getLength() > _nMaxNameLen) || _rCmpFunctor(sAlias))
1493 	{
1494 		sal_Int32 nDiff = 1;
1495 		do
1496 		{
1497 			++nDiff;
1498 			if(_nMaxNameLen && sAlias.getLength() >= _nMaxNameLen)
1499 				sAlias = sAlias.copy(0,sAlias.getLength() - (sAlias.getLength()-_nMaxNameLen+nDiff));
1500 
1501 			::rtl::OUString sName(sAlias);
1502 			sal_Int32 nPos = 1;
1503 			sName += ::rtl::OUString::valueOf(nPos);
1504 
1505 			while(_rCmpFunctor(sName))
1506 			{
1507 				sName = sAlias;
1508 				sName += ::rtl::OUString::valueOf(++nPos);
1509 			}
1510 			sAlias = sName;
1511 			// we have to check again, it could happen that the name is already to long
1512 		}
1513 		while(_nMaxNameLen && sAlias.getLength() > _nMaxNameLen);
1514 	}
1515 	OSL_ENSURE(m_mNameMapping.find(_sColumnName) == m_mNameMapping.end(),"name doubled!");
1516 	m_mNameMapping[_sColumnName] = sAlias;
1517 	return sAlias;
1518 }
1519 
1520 // -----------------------------------------------------------------------------
removeColumnNameFromNameMap(const::rtl::OUString & _sName)1521 void OCopyTableWizard::removeColumnNameFromNameMap(const ::rtl::OUString& _sName)
1522 {
1523     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::removeColumnNameFromNameMap" );
1524     m_mNameMapping.erase(_sName);
1525 }
1526 
1527 // -----------------------------------------------------------------------------
supportsType(sal_Int32 _nDataType,sal_Int32 & _rNewDataType)1528 sal_Bool OCopyTableWizard::supportsType(sal_Int32 _nDataType,sal_Int32& _rNewDataType)
1529 {
1530     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::supportsType" );
1531 	sal_Bool bRet = m_aDestTypeInfo.find(_nDataType) != m_aDestTypeInfo.end();
1532 	if ( bRet )
1533 		_rNewDataType = _nDataType;
1534 	return bRet;
1535 }
1536 
1537 // -----------------------------------------------------------------------------
convertType(const TOTypeInfoSP & _pType,sal_Bool & _bNotConvert)1538 TOTypeInfoSP OCopyTableWizard::convertType(const TOTypeInfoSP& _pType,sal_Bool& _bNotConvert)
1539 {
1540     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::convertType" );
1541 	if ( !m_bInterConnectionCopy )
1542         // no need to convert if the source and destination connection are the same
1543 		return _pType;
1544 
1545 	sal_Bool bForce;
1546 	TOTypeInfoSP pType = ::dbaui::getTypeInfoFromType(m_aDestTypeInfo,_pType->nType,_pType->aTypeName,_pType->aCreateParams,_pType->nPrecision,_pType->nMaximumScale,_pType->bAutoIncrement,bForce);
1547 	if ( !pType.get() || bForce )
1548 	{ // no type found so we have to find the correct one ourself
1549 		sal_Int32 nDefaultType = DataType::VARCHAR;
1550 		switch(_pType->nType)
1551 		{
1552 			case DataType::TINYINT:
1553 				if(supportsType(DataType::SMALLINT,nDefaultType))
1554 					break;
1555 				// run through
1556 			case DataType::SMALLINT:
1557 				if(supportsType(DataType::INTEGER,nDefaultType))
1558 					break;
1559 				// run through
1560 			case DataType::INTEGER:
1561 				if(supportsType(DataType::FLOAT,nDefaultType))
1562 					break;
1563 				// run through
1564 			case DataType::FLOAT:
1565 				if(supportsType(DataType::REAL,nDefaultType))
1566 					break;
1567 				// run through
1568 			case DataType::DATE:
1569 			case DataType::TIME:
1570 				if( DataType::DATE == _pType->nType || DataType::TIME == _pType->nType )
1571 				{
1572 					if(supportsType(DataType::TIMESTAMP,nDefaultType))
1573 						break;
1574 				}
1575 				// run through
1576 			case DataType::TIMESTAMP:
1577 			case DataType::REAL:
1578 			case DataType::BIGINT:
1579 				if ( supportsType(DataType::DOUBLE,nDefaultType) )
1580 					break;
1581 				// run through
1582 			case DataType::DOUBLE:
1583 				if ( supportsType(DataType::NUMERIC,nDefaultType) )
1584 					break;
1585 				// run through
1586 			case DataType::NUMERIC:
1587 				supportsType(DataType::DECIMAL,nDefaultType);
1588 				break;
1589 			case DataType::DECIMAL:
1590 				if ( supportsType(DataType::NUMERIC,nDefaultType) )
1591 					break;
1592 				if ( supportsType(DataType::DOUBLE,nDefaultType) )
1593 					break;
1594 				break;
1595 			case DataType::VARCHAR:
1596 				if ( supportsType(DataType::LONGVARCHAR,nDefaultType) )
1597 					break;
1598 				break;
1599 			case DataType::LONGVARCHAR:
1600 				if ( supportsType(DataType::CLOB,nDefaultType) )
1601 					break;
1602 				break;
1603             case DataType::BINARY:
1604 				if ( supportsType(DataType::VARBINARY,nDefaultType) )
1605 					break;
1606 				break;
1607             case DataType::VARBINARY:
1608 				if ( supportsType(DataType::LONGVARBINARY,nDefaultType) )
1609 					break;
1610 				break;
1611             case DataType::LONGVARBINARY:
1612 				if ( supportsType(DataType::BLOB,nDefaultType) )
1613 					break;
1614                 if ( supportsType(DataType::LONGVARCHAR,nDefaultType) )
1615 					break;
1616                 if ( supportsType(DataType::CLOB,nDefaultType) )
1617 					break;
1618 				break;
1619 			default:
1620 				nDefaultType = DataType::VARCHAR;
1621 		}
1622 		pType = ::dbaui::getTypeInfoFromType(m_aDestTypeInfo,nDefaultType,_pType->aTypeName,_pType->aCreateParams,_pType->nPrecision,_pType->nMaximumScale,_pType->bAutoIncrement,bForce);
1623 		if ( !pType.get() )
1624 		{
1625 			_bNotConvert = sal_False;
1626 			::rtl::OUString sCreate(RTL_CONSTASCII_USTRINGPARAM("x"));
1627 			pType = ::dbaui::getTypeInfoFromType(m_aDestTypeInfo,DataType::VARCHAR,_pType->aTypeName,sCreate,50,0,sal_False,bForce);
1628 			if ( !pType.get() )
1629 				pType = m_pTypeInfo;
1630 		}
1631 		else if ( bForce )
1632 			_bNotConvert = sal_False;
1633 	}
1634 	return pType;
1635 }
1636 // -----------------------------------------------------------------------------
createUniqueName(const::rtl::OUString & _sName)1637 ::rtl::OUString OCopyTableWizard::createUniqueName(const ::rtl::OUString& _sName)
1638 {
1639     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::createUniqueName" );
1640 	::rtl::OUString sName = _sName;
1641     Sequence< ::rtl::OUString > aColumnNames( m_rSourceObject.getColumnNames() );
1642 	if ( aColumnNames.getLength() )
1643 		sName = ::dbtools::createUniqueName( aColumnNames, sName, sal_False );
1644 	else
1645 	{
1646 		if ( m_vSourceColumns.find(sName) != m_vSourceColumns.end())
1647 		{
1648 			sal_Int32 nPos = 0;
1649 			while(m_vSourceColumns.find(sName) != m_vSourceColumns.end())
1650 			{
1651 				sName = _sName;
1652 				sName += ::rtl::OUString::valueOf(++nPos);
1653 			}
1654 		}
1655 	}
1656 	return sName;
1657 }
1658 // -----------------------------------------------------------------------------
showColumnTypeNotSupported(const::rtl::OUString & _rColumnName)1659 void OCopyTableWizard::showColumnTypeNotSupported(const ::rtl::OUString& _rColumnName)
1660 {
1661     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OCopyTableWizard::showColumnTypeNotSupported" );
1662 	String sMessage( ModuleRes( STR_UNKNOWN_TYPE_FOUND ) );
1663 	sMessage.SearchAndReplaceAscii("#1",_rColumnName);
1664     showError(sMessage);
1665 }
1666 //-------------------------------------------------------------------------------
showError(const::rtl::OUString & _sErrorMesage)1667 void OCopyTableWizard::showError(const ::rtl::OUString& _sErrorMesage)
1668 {
1669     SQLExceptionInfo aInfo(_sErrorMesage);
1670     showError(aInfo.get());
1671 }
1672 //-------------------------------------------------------------------------------
showError(const Any & _aError)1673 void OCopyTableWizard::showError(const Any& _aError)
1674 {
1675     if ( _aError.hasValue() && m_xInteractionHandler.is() )
1676     {
1677         try
1678         {
1679             ::rtl::Reference< ::comphelper::OInteractionRequest > xRequest( new ::comphelper::OInteractionRequest( _aError ) );
1680             m_xInteractionHandler->handle( xRequest.get() );
1681         }
1682         catch( const Exception& )
1683         {
1684         	DBG_UNHANDLED_EXCEPTION();
1685         }
1686     }
1687 }
1688 
1689