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]
