xref: /AOO41X/main/dbaccess/source/ui/misc/WCopyTable.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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