Tag: cws_src680_oj14
User: oj      
Date: 2006/07/04 01:11:58

Modified:
   dba/dbaccess/source/ui/misc/DExport.cxx

Log:
 RESYNC: (1.28-1.32); FILE MERGED

File Changes:

Directory: /dba/dbaccess/source/ui/misc/
========================================

File [changed]: DExport.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/misc/DExport.cxx?r1=1.26.4.2&r2=1.26.4.3
Delta lines:  +375 -239
-----------------------
--- DExport.cxx 20 Mar 2006 13:59:57 -0000      1.26.4.2
+++ DExport.cxx 4 Jul 2006 08:11:55 -0000       1.26.4.3
@@ -59,9 +59,6 @@
 #ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
 #include <com/sun/star/sdb/CommandType.hpp>
 #endif
-#ifndef _COM_SUN_STAR_SDBC_XROWSET_HPP_
-#include <com/sun/star/sdbc/XRowSet.hpp>
-#endif
 #ifndef _COM_SUN_STAR_SDBC_XRESULTSETMETADATASUPPLIER_HPP_
 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
 #endif
@@ -83,6 +80,12 @@
 #ifndef _DBHELPER_DBCONVERSION_HXX_
 #include <connectivity/dbconversion.hxx>
 #endif
+#ifndef _SFXHTML_HXX
+#include <sfx2/sfxhtml.hxx>
+#endif
+#ifndef _NUMUNO_HXX
+#include <svtools/numuno.hxx>
+#endif
 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
 #include <connectivity/dbtools.hxx>
 #endif
@@ -105,8 +108,8 @@
 #ifndef _TOOLS_DEBUG_HXX
 #include <tools/debug.hxx>
 #endif
-#ifndef _ISOLANG_HXX 
-#include <tools/isolang.hxx>
+#ifndef INCLUDED_I18NPOOL_MSLANGID_HXX
+#include <i18npool/mslangid.hxx>
 #endif
 #ifndef _COM_SUN_STAR_AWT_FONTDESCRIPTOR_HPP_
 #include <com/sun/star/awt/FontDescriptor.hpp>
@@ -144,13 +147,14 @@
 #ifndef _DBAUI_SQLMESSAGE_HXX_
 #include "sqlmessage.hxx"
 #endif
+#ifndef DBAUI_UPDATEHELPERIMPL_HXX
+#include "UpdateHelperImpl.hxx"
+#endif
 #ifndef _SV_MSGBOX_HXX
 #include <vcl/msgbox.hxx>
 #endif
 
 
-#define CONTAINER_ENTRY_NOTFOUND    ((ULONG)0xFFFFFFFF)
-
 using namespace dbaui;
 using namespace utl;
 using namespace ::com::sun::star::uno;
@@ -167,41 +171,40 @@
 // ==========================================================================
 // ODatabaseExport
 // ==========================================================================
-DBG_NAME(ODatabaseExport); 
+DBG_NAME(ODatabaseExport)
 ODatabaseExport::ODatabaseExport(sal_Int32 nRows,
                                                                 const 
TPositions &_rColumnPositions,
                                                                 const 
Reference< XNumberFormatter >& _rxNumberF,
                                                                 const 
Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM,
                                                                 const 
TColumnVector* pList,
-                                                                const 
OTypeInfoMap* _pInfoMap)
-       :m_pColumnList(pList)
+                                 const OTypeInfoMap* _pInfoMap,
+                                 sal_Bool _bAutoIncrementEnabled)
+    :m_vColumns(_rColumnPositions)
+    ,m_aDestColumns(sal_True)
+    ,m_xFormatter(_rxNumberF)
+    ,m_xFactory(_rM)
+    ,m_pFormatter(NULL)
+       ,m_pTypeInfo()
+    ,m_pColumnList(pList)
        ,m_pInfoMap(_pInfoMap)
        ,m_nColumnPos(0)
        ,m_nRows(1)
        ,m_nRowCount(0)
+       ,m_nDefToken( gsl_getSystemTextEncoding() )
        ,m_bError(FALSE)
        ,m_bInTbl(FALSE)
-       ,m_xFormatter(_rxNumberF)
        ,m_bHead(TRUE)
        ,m_bDontAskAgain(FALSE)
-       ,m_bIsAutoIncrement(FALSE)
-       ,m_aDestColumns(sal_True)
-       ,m_xFactory(_rM)
-       ,m_pTypeInfo()
-       ,m_vColumnSize(0)
-       ,m_vFormatKey(0)
-       ,m_vColumns(_rColumnPositions)
+    ,m_bIsAutoIncrement(_bAutoIncrementEnabled)
        ,m_bFoundTable(sal_False)
        ,m_bCheckOnly(sal_False)
 {
        DBG_CTOR(ODatabaseExport,NULL); 
 
-       m_nDefToken = gsl_getSystemTextEncoding();
-
        m_nRows += nRows;
        sal_Int32 nCount = 0;
        for(sal_Int32 j=0;j < (sal_Int32)m_vColumns.size();++j)
-               if(m_vColumns[j].first != CONTAINER_ENTRY_NOTFOUND)
+               if ( m_vColumns[j].first != COLUMN_POSITION_NOT_FOUND )
                        ++nCount;
 
        m_vColumnSize.resize(nCount);
@@ -215,7 +218,7 @@
        try
        {
                SvtSysLocale aSysLocale;
-               m_nLocale = aSysLocale.GetLocaleData().getLocale();
+               m_aLocale = aSysLocale.GetLocaleData().getLocale();
        }
        catch(Exception&)
        {
@@ -229,21 +232,23 @@
                                                                 const 
Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM,
                                                                 const 
TColumnVector* pList,
                                                                 const 
OTypeInfoMap* _pInfoMap)
-       :m_xConnection(_rxConnection)
+    :m_aDestColumns(_rxConnection->getMetaData().is() && 
_rxConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers() == sal_True)
+    ,m_xConnection(_rxConnection)
+       ,m_xFormatter(_rxNumberF)
+       ,m_xFactory(_rM)
+    ,m_pFormatter(NULL)
+    ,m_pTypeInfo()
        ,m_pColumnList(NULL)
        ,m_pInfoMap(NULL)
        ,m_nColumnPos(0)
        ,m_nRows(1)
        ,m_nRowCount(0)
+       ,m_nDefToken( gsl_getSystemTextEncoding() )
        ,m_bError(sal_False)
        ,m_bInTbl(sal_False)
-       ,m_xFormatter(_rxNumberF)
        ,m_bHead(TRUE)
        ,m_bDontAskAgain(sal_False)
        ,m_bIsAutoIncrement(sal_False)
-       ,m_aDestColumns(_rxConnection->getMetaData().is() && 
_rxConnection->getMetaData()->supportsMixedCaseQuotedIdentifiers() == sal_True)
-       ,m_xFactory(_rM)
-       ,m_pTypeInfo()
        ,m_bFoundTable(sal_False)
        ,m_bCheckOnly(sal_False)
 {
@@ -251,13 +256,12 @@
        try
        {
                SvtSysLocale aSysLocale;
-               m_nLocale = aSysLocale.GetLocaleData().getLocale();
+               m_aLocale = aSysLocale.GetLocaleData().getLocale();
        }
        catch(Exception&)
        {
        }
 
-       m_nDefToken = gsl_getSystemTextEncoding();
        Reference<XTablesSupplier> xTablesSup(m_xConnection,UNO_QUERY);
        if(xTablesSup.is())
                m_xTables = xTablesSup->getTables();
@@ -336,9 +340,6 @@
                                ++nPos;
                                aValue.fill(nPos,aTypes[nPos],xRow);
                                m_pTypeInfo->nMaximumScale      = aValue;
-                               nPos = 18;
-                               aValue.fill(nPos,aTypes[nPos],xRow);
-                               m_pTypeInfo->nNumPrecRadix      = aValue;
 
                                // check if values are less than zero like it 
happens in a oracle jdbc driver
                                if( m_pTypeInfo->nPrecision < 0)
@@ -347,8 +348,6 @@
                                        m_pTypeInfo->nMinimumScale = 0;
                                if( m_pTypeInfo->nMaximumScale < 0)
                                        m_pTypeInfo->nMaximumScale = 0;
-                               if( m_pTypeInfo->nNumPrecRadix < 0)
-                                       m_pTypeInfo->nNumPrecRadix = 10;
                                break;
                        }
                }
@@ -359,6 +358,7 @@
 ODatabaseExport::~ODatabaseExport()
 {
        DBG_DTOR(ODatabaseExport,NULL); 
+    m_pFormatter = NULL;
        ODatabaseExport::TColumns::iterator aIter = m_aDestColumns.begin();
        ODatabaseExport::TColumns::iterator aEnd  = m_aDestColumns.end();
 
@@ -376,45 +376,62 @@
                OFieldDescription* pField = m_vDestVector[m_nColumnPos]->second;
                if(pField)
                {
-                       OSL_ENSURE((m_bIsAutoIncrement ? m_nColumnPos+1 : 
m_nColumnPos) < static_cast<sal_Int32>(m_vColumns.size()),"Illegal index for 
vector");
-                       sal_Int32 nPos = m_vColumns[m_bIsAutoIncrement ? 
m_nColumnPos+1 : m_nColumnPos].first;
-                       if(nPos != CONTAINER_ENTRY_NOTFOUND)
+            sal_Int32 nNewPos = m_bIsAutoIncrement ? m_nColumnPos+1 : 
m_nColumnPos;
+            OSL_ENSURE((nNewPos) < 
static_cast<sal_Int32>(m_vColumns.size()),"Illegal index for vector");
+            
+            sal_Int32 nPos = m_vColumns[nNewPos].first;
+            if ( nPos != COLUMN_POSITION_NOT_FOUND )
                        {
 //                                     if(m_nDefToken != LANGUAGE_DONTKNOW) // 
falls Sprache anders als Systemsprache
 //                                             
m_pNF->ChangeIntl((LanguageType)m_nDefToken);
 
                                if(!m_sTextToken.Len() && 
m_xResultSetMetaData->isNullable(nPos))
-                                       m_xRowUpdate->updateNull(nPos);
+                    m_pUpdateHelper->updateNull(nPos,pField->GetType());
                                else
                                {
                                        sal_Int32 nNumberFormat = 0;
                                        double fOutNumber = 0.0;
-                                       OSL_ENSURE((m_bIsAutoIncrement ? 
m_nColumnPos+1 : m_nColumnPos) < 
static_cast<sal_Int32>(m_vColumnTypes.size()),"Illegal index for vector");
-                                       if (m_vColumnTypes[m_bIsAutoIncrement ? 
m_nColumnPos+1 : m_nColumnPos] != DataType::VARCHAR)
+                    OSL_ENSURE((nNewPos) < 
static_cast<sal_Int32>(m_vColumnTypes.size()),"Illegal index for vector");
+                    if (m_vColumnTypes[nNewPos] != DataType::VARCHAR)
+                    {
+                        Reference< XNumberFormatsSupplier >  xSupplier = 
m_xFormatter->getNumberFormatsSupplier();
+                        Reference<XPropertySet> xNumberFormatSettings = 
xSupplier->getNumberFormatSettings();
+                        com::sun::star::util::Date aNullDate;
+                        
xNumberFormatSettings->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NullDate")))
 >>= aNullDate;
+
+                        ensureFormatter();
+                        if ( m_pFormatter && m_sNumToken.Len() )
+                        {
+                            LanguageType eNumLang;
+                            sal_uInt32 nNumberFormat2;
+                            fOutNumber = 
SfxHTMLParser::GetTableDataOptionsValNum(nNumberFormat2,eNumLang,m_sTextToken,m_sNumToken,*m_pFormatter);
+                            nNumberFormat = 
static_cast<sal_Int32>(nNumberFormat2);
+                        }
+                        else
                                        {
-                                               Reference<XNumberFormatTypes> 
xNumType(m_xFormatter->getNumberFormatsSupplier()->getNumberFormats(),UNO_QUERY);
+                            Reference<XNumberFormatTypes> 
xNumType(xSupplier->getNumberFormats(),UNO_QUERY);
 
                                                try
                                                {
-                                                       nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::DATETIME,m_nLocale),m_sTextToken);
+                                nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::DATETIME,m_aLocale),m_sTextToken);
                                                }
                                                catch(Exception&)
                                                {
                                                        try
                                                        {
-                                                               nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::DATE,m_nLocale),m_sTextToken);
+                                    nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::DATE,m_aLocale),m_sTextToken);
                                                        }
                                                        catch(Exception&)
                                                        {
                                                                try
                                                                {
-                                                                       
nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::TIME,m_nLocale),m_sTextToken);
+                                        nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::TIME,m_aLocale),m_sTextToken);
                                                                }
                                                                
catch(Exception&)
                                                                {
                                                                        try
                                                                        {
-                                                                               
nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::NUMBER,m_nLocale),m_sTextToken);
+                                            nNumberFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::NUMBER,m_aLocale),m_sTextToken);
                                                                        }
                                                                        
catch(Exception&)
                                                                        {
@@ -422,22 +439,36 @@
                                                                }
                                                        }
                                                }
+                            fOutNumber = 
m_xFormatter->convertStringToNumber(nNumberFormat,m_sTextToken);
+                        }
                                                try
                                                {
-                                                       fOutNumber = 
m_xFormatter->convertStringToNumber(nNumberFormat,m_sTextToken);
-                                                       
m_xRowUpdate->updateDouble(nPos,::dbtools::DBTypeConversion::toStandardDbDate(::dbtools::DBTypeConversion::getStandardDate(),fOutNumber));
+                            Reference< XNumberFormats >         xFormats = 
xSupplier->getNumberFormats();
+                            Reference<XPropertySet> xProp = 
xFormats->getByKey(nNumberFormat);
+                            sal_Int16 nType = 0;
+                            xProp->getPropertyValue(PROPERTY_TYPE) >>= nType;
+                            switch(nType)
+                            {
+                                case NumberFormat::DATE:
+                                case NumberFormat::DATETIME:
+                                    fOutNumber = 
::dbtools::DBTypeConversion::toStandardDbDate(aNullDate,fOutNumber);
+                                    break;
+                                default:
+                                    ;
+                            }
+                            
m_pUpdateHelper->updateDouble(nPos,fOutNumber);//::dbtools::DBTypeConversion::getStandardDate()
                                                }
                                                catch(Exception&)
                                                {
-                                                       
m_xRowUpdate->updateString(nPos,m_sTextToken);
+                            m_pUpdateHelper->updateString(nPos,m_sTextToken);
                                                }
 
                                        }
                                        else
-                                               
m_xRowUpdate->updateString(nPos,m_sTextToken);
+                        m_pUpdateHelper->updateString(nPos,m_sTextToken);
                                }
                        }
-                       m_sTextToken.Erase();
+            eraseTokens();
                }
        }
 }
@@ -445,24 +476,33 @@
 sal_Int32 ODatabaseExport::CheckString(const String& aCheckToken, sal_Int32 
_nOldFormat)
 {
        DBG_CHKTHIS(ODatabaseExport,NULL);
-       sal_Int32 F_Index = 0;
        double fOutNumber = 0.0;
        sal_Int32 nFormat = 0;
 
        try
        {
-               Reference<XNumberFormats> xFormats = 
m_xFormatter->getNumberFormatsSupplier()->getNumberFormats();
+        Reference< XNumberFormatsSupplier > xSupplier = 
m_xFormatter->getNumberFormatsSupplier();
+        Reference< XNumberFormats >         xFormats = 
xSupplier->getNumberFormats();
+
+        ensureFormatter();
+        if ( m_pFormatter && m_sNumToken.Len() )
+        {
+            LanguageType eNumLang;
+            sal_uInt32 nNumberFormat2;
+            fOutNumber = 
SfxHTMLParser::GetTableDataOptionsValNum(nNumberFormat2,eNumLang,m_sTextToken,m_sNumToken,*m_pFormatter);
+            //double fOutNumber2 = 
SfxHTMLParser::GetTableDataOptionsValNum(nNumberFormat2,eNumLang,m_sValToken,m_sNumToken,*m_pFormatter);
+            nFormat = static_cast<sal_Int32>(nNumberFormat2);
+        }
+        else
+        {           
                Reference<XNumberFormatTypes> xNumType(xFormats,UNO_QUERY);
-               nFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::ALL,m_nLocale),aCheckToken);
+            nFormat = 
m_xFormatter->detectNumberFormat(xNumType->getStandardFormat(NumberFormat::ALL,m_aLocale),aCheckToken);
+            fOutNumber = 
m_xFormatter->convertStringToNumber(nFormat,aCheckToken);
+
                Reference<XPropertySet> xProp = xFormats->getByKey(nFormat);
                sal_Int16 nType = 0;
                xProp->getPropertyValue(PROPERTY_TYPE) >>= nType;
-               fOutNumber = 
m_xFormatter->convertStringToNumber(nFormat,aCheckToken);
 
-               {
-                       OSL_ENSURE((m_nColumnPos) < 
static_cast<sal_Int32>(m_vColumns.size()),"Illegal index for vector");
-                       OSL_ENSURE(m_vColumns[m_nColumnPos].first < 
static_cast<sal_Int32>(m_vFormatKey.size()),"Illegal index for vector");
-                       m_vFormatKey[m_vColumns[m_nColumnPos].first] = nFormat; 
// wird sp"ater f"ur die Column gebraucht
                        switch(nType)
                        {
                                case NumberFormat::ALL:
@@ -563,8 +603,6 @@
        }
        catch(Exception&)
        {
-               OSL_ENSURE((m_nColumnPos) < 
static_cast<sal_Int32>(m_vColumns.size()),"Illegal index for vector");
-               m_vFormatKey[m_vColumns[m_nColumnPos].first] =  100;
                nFormat = NumberFormat::TEXT; // Text "uberschreibt alles
        }
 
@@ -576,12 +614,18 @@
        DBG_CHKTHIS(ODatabaseExport,NULL);
        if(_pList && _pInfoMap)
        {
+        Reference< XNumberFormatsSupplier > xSupplier = 
m_xFormatter->getNumberFormatsSupplier();
+        Reference< XNumberFormats >         xFormats = 
xSupplier->getNumberFormats();
                TColumnVector::const_iterator aIter = _pList->begin();
-               for(sal_Int32 i=0;aIter != _pList->end();++aIter,++i)
+        TColumnVector::const_iterator aEnd = _pList->end();
+        for(sal_Int32 i= 0;aIter != aEnd;++aIter,++i)
                {
                        sal_Int32 nDataType;
                        sal_Int32 nLength(0),nScale(0);
-                       switch(m_vFormatKey[i])
+            Reference<XPropertySet> xProp = 
xFormats->getByKey(m_vFormatKey[i]);
+                   sal_Int16 nType = 0;
+                   xProp->getPropertyValue(PROPERTY_TYPE) >>= nType;
+                       switch ( nType )
                        {
                                case NumberFormat::ALL:
                                        nDataType  = DataType::DOUBLE;
@@ -699,14 +743,20 @@
                
xProp->setPropertyValue(PROPERTY_IGNORERESULT,::cppu::bool2any(sal_True));
                Reference<XRowSet> xRowSet(xProp,UNO_QUERY);
                xRowSet->execute();
-               Reference< XResultSetMetaDataSupplier> 
xSrcMetaSup(xRowSet,UNO_QUERY);
+
+        Reference< XResultSetMetaDataSupplier> 
xSrcMetaSup(xRowSet,UNO_QUERY_THROW);
                m_xResultSetMetaData = xSrcMetaSup->getMetaData();
+
+        if ( ::dbtools::canInsert(xProp) )
+        {
+            m_pUpdateHelper.reset(new ORowUpdateHelper(xRowSet));
                OSL_ENSURE(m_xResultSetMetaData.is(),"No ResultSetMetaData!");
        }
-       m_xResultSetUpdate.set(xDestSet,UNO_QUERY);
-       m_xRowUpdate.set(xDestSet,UNO_QUERY);
+        else
+            m_pUpdateHelper.reset(new 
OParameterUpdateHelper(createPreparedStatment(m_xConnection->getMetaData(),m_xTable,m_vColumns)));
+       }
 
-       return m_xResultSetUpdate.is() && m_xRowUpdate.is() && 
m_xResultSetMetaData.is();
+       return m_pUpdateHelper.get() != NULL;
 }
 // 
-----------------------------------------------------------------------------
 sal_Bool ODatabaseExport::executeWizard(const ::rtl::OUString& 
_sTableName,const Any& _aTextColor,const FontDescriptor& _rFont)
@@ -804,12 +854,98 @@
        } // if(!m_bDontAskAgain)
 }
 // 
-----------------------------------------------------------------------------
+void ODatabaseExport::adjustFormat()
+{
+    if ( m_sTextToken.Len() )
+       {
+               sal_Int32 nColPos = m_vColumns[m_bIsAutoIncrement ? 
m_nColumnPos+1 : m_nColumnPos].first;
+               if( nColPos != sal::static_int_cast< long 
>(CONTAINER_ENTRY_NOTFOUND))
+               {
+            --nColPos;
+                       m_vFormatKey[nColPos] = 
CheckString(m_sTextToken,m_vFormatKey[nColPos]);
+                       m_vColumnSize[nColPos] = 
::std::max<sal_Int32>((sal_Int32)m_vColumnSize[nColPos],(sal_Int32)m_sTextToken.Len());
+               }
+               eraseTokens();
+       }
+}
+// 
-----------------------------------------------------------------------------
+void ODatabaseExport::eraseTokens()
+{
+    m_sTextToken.Erase();
+    m_sNumToken.Erase();
+    m_sValToken.Erase();
+}
+// 
-----------------------------------------------------------------------------
+void ODatabaseExport::ensureFormatter()
+{
+    if ( !m_pFormatter )
+    {
+        Reference< XNumberFormatsSupplier >  xSupplier = 
m_xFormatter->getNumberFormatsSupplier();
+           Reference< XUnoTunnel > xTunnel(xSupplier,UNO_QUERY);
+           SvNumberFormatsSupplierObj* pSupplierImpl = 
(SvNumberFormatsSupplierObj*)sal::static_int_cast< sal_IntPtr 
>(xTunnel->getSomething(SvNumberFormatsSupplierObj::getUnoTunnelId()));
+           m_pFormatter = pSupplierImpl ? pSupplierImpl->GetNumberFormatter() 
: NULL;
+    }
+}
+// 
-----------------------------------------------------------------------------
+Reference< XPreparedStatement > ODatabaseExport::createPreparedStatment( const 
Reference<XDatabaseMetaData>& _xMetaData
+                                                       ,const 
Reference<XPropertySet>& _xDestTable
+                                                       ,const TPositions& 
_rvColumns)
+{
+    ::rtl::OUString aSql(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INSERT 
INTO ")));
+       ::rtl::OUString sComposedTableName = 
::dbtools::composeTableName(_xMetaData,_xDestTable,sal_True,::dbtools::eInDataManipulation);
 
+       aSql += sComposedTableName;
+       aSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" ( "));
+       // set values and column names
+       ::rtl::OUString aValues(RTL_CONSTASCII_USTRINGPARAM(" VALUES ( "));
+       static ::rtl::OUString aPara(RTL_CONSTASCII_USTRINGPARAM("?,"));
+       static ::rtl::OUString aComma(RTL_CONSTASCII_USTRINGPARAM(","));
 
+       ::rtl::OUString aQuote;
+       if ( _xMetaData.is() )
+               aQuote = _xMetaData->getIdentifierQuoteString();
 
+       Reference<XColumnsSupplier> xDestColsSup(_xDestTable,UNO_QUERY_THROW);
 
+       // create sql string and set column types
+       Sequence< ::rtl::OUString> aDestColumnNames = 
xDestColsSup->getColumns()->getElementNames();
+    if ( aDestColumnNames.getLength() == 0 )
+    {
+        return Reference< XPreparedStatement > ();
+    }
+       const ::rtl::OUString* pIter = aDestColumnNames.getConstArray();
+       ::std::vector< ::rtl::OUString> aInsertList;
+       aInsertList.resize(aDestColumnNames.getLength()+1);
+       sal_Int32 i = 0;
+       for(sal_uInt32 j=0; j < aInsertList.size() ;++i,++j)
+       {
+               ODatabaseExport::TPositions::const_iterator aFind = 
::std::find_if(_rvColumns.begin(),_rvColumns.end(),
+                       
::std::compose1(::std::bind2nd(::std::equal_to<sal_Int32>(),i+1),::std::select2nd<ODatabaseExport::TPositions::value_type>()));
+               if ( _rvColumns.end() != aFind && aFind->second != 
sal::static_int_cast< long >(CONTAINER_ENTRY_NOTFOUND) && aFind->first != 
sal::static_int_cast< long >(CONTAINER_ENTRY_NOTFOUND) )
+               {
+                       aInsertList[aFind->first] = ::dbtools::quoteName( 
aQuote,*(pIter+i));
+               }
+       }
 
+       i = 1;
+       // create the sql string
+       for (::std::vector< ::rtl::OUString>::iterator aInsertIter = 
aInsertList.begin(); aInsertIter != aInsertList.end(); ++aInsertIter)
+       {
+               if ( aInsertIter->getLength() )
+               {
+                       aSql += *aInsertIter;
+                       aSql += aComma;
+                       aValues += aPara;
+               }
+       }
 
+       aSql = 
aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")));
+       aValues = 
aValues.replaceAt(aValues.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")")));
 
+       aSql += aValues;
+       // now create,fill and execute the prepared statement
+       return Reference< XPreparedStatement 
>(_xMetaData->getConnection()->prepareStatement(aSql));
+}
+// 
-----------------------------------------------------------------------------
 
 




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to