Tag: cws_src680_dba30
User: fs      
Date: 06/05/08 04:26:12

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

Log:
 RESYNC: (1.29-1.31); 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.16.3&r2=1.26.16.4
Delta lines:  +315 -166
-----------------------
--- DExport.cxx 20 Apr 2006 06:52:24 -0000      1.26.16.3
+++ DExport.cxx 8 May 2006 11:26:09 -0000       1.26.16.4
@@ -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
@@ -144,6 +147,9 @@
 #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
@@ -173,8 +179,10 @@
                                                                 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_pFormatter(NULL)
+    ,m_pColumnList(pList)
        ,m_pInfoMap(_pInfoMap)
        ,m_nColumnPos(0)
        ,m_nRows(1)
@@ -184,7 +192,7 @@
        ,m_xFormatter(_rxNumberF)
        ,m_bHead(TRUE)
        ,m_bDontAskAgain(FALSE)
-       ,m_bIsAutoIncrement(FALSE)
+       ,m_bIsAutoIncrement(_bAutoIncrementEnabled)
        ,m_aDestColumns(sal_True)
        ,m_xFactory(_rM)
        ,m_pTypeInfo()
@@ -230,6 +238,7 @@
                                                                 const 
TColumnVector* pList,
                                                                 const 
OTypeInfoMap* _pInfoMap)
        :m_xConnection(_rxConnection)
+    ,m_pFormatter(NULL)
        ,m_pColumnList(NULL)
        ,m_pInfoMap(NULL)
        ,m_nColumnPos(0)
@@ -359,6 +368,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,23 +386,40 @@
                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;
+            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 != CONTAINER_ENTRY_NOTFOUND)
                        {
 //                                     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
                                                {
@@ -422,22 +449,37 @@
                                                                }
                                                        }
                                                }
+                            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< XNumberFormatsSupplier > xSupplier = 
m_xFormatter->getNumberFormatsSupplier();
+                            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();
                }
        }
 }
@@ -451,18 +493,28 @@
 
        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);
+            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 +615,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 +626,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 +755,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 +866,99 @@
        } // 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 != 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*)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();
+       const ::rtl::OUString* pEnd       = pIter + 
aDestColumnNames.getLength();
+       ::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 != 
CONTAINER_ENTRY_NOTFOUND && aFind->first != 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