From e1c5fca182e970cb7ce1e3921ba85eb394fcb62b Mon Sep 17 00:00:00 2001 From: Lionel Elie Mamane Date: Wed, 17 Jun 2015 14:32:29 +0200 Subject: parameter handling: fix confusion between column name and realname Change-Id: I81fd45276183b911e4560ca785221894ea2ebc88 Reviewed-on: https://gerrit.libreoffice.org/16340 Tested-by: Jenkins Reviewed-by: Michael Stahl --- connectivity/source/commontools/parameters.cxx | 34 ++++++++++++++++++-------- include/connectivity/parameters.hxx | 3 ++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/connectivity/source/commontools/parameters.cxx b/connectivity/source/commontools/parameters.cxx index 8459ae933c9a..1f94a59f1ede 100644 --- a/connectivity/source/commontools/parameters.cxx +++ b/connectivity/source/commontools/parameters.cxx @@ -105,6 +105,8 @@ namespace dbtools m_aMasterFields.realloc( 0 ); m_aDetailFields.realloc( 0 ); m_sIdentifierQuoteString.clear(); + m_sSpecialCharacters.clear(); + m_xConnectionMetadata.clear(); ::std::vector< bool > aEmptyArray; m_aParametersVisited.swap( aEmptyArray ); m_bUpToDate = false; @@ -208,24 +210,32 @@ namespace dbtools OUString ParameterManager::createFilterConditionFromColumnLink( - const OUString& _rMasterColumn, const OUString& _rDetailLink, OUString& _rNewParamName ) + const OUString &_rMasterColumn, const Reference < XPropertySet > &xDetailField, OUString &o_rNewParamName ) { OUString sFilter; - // format is: // = : - sFilter = quoteName( m_sIdentifierQuoteString, _rDetailLink ); - sFilter += " = :"; + { + OUString tblName; + xDetailField->getPropertyValue("TableName") >>= tblName; + if (!tblName.isEmpty()) + sFilter = ::dbtools::quoteTableName( m_xConnectionMetadata, tblName, ::dbtools::eInDataManipulation ) + "."; + } + { + OUString colName; + xDetailField->getPropertyValue("RealName") >>= colName; + sFilter += quoteName( m_sIdentifierQuoteString, colName ) + " = :"; + } // generate a parameter name which is not already used - _rNewParamName = "link_from_"; - _rNewParamName += convertName2SQLName( _rMasterColumn, m_sSpecialCharacters ); - while ( m_aParameterInformation.find( _rNewParamName ) != m_aParameterInformation.end() ) + o_rNewParamName = "link_from_"; + o_rNewParamName += convertName2SQLName( _rMasterColumn, m_sSpecialCharacters ); + while ( m_aParameterInformation.find( o_rNewParamName ) != m_aParameterInformation.end() ) { - _rNewParamName += "_"; + o_rNewParamName += "_"; } - return sFilter += _rNewParamName; + return sFilter += o_rNewParamName; } @@ -279,8 +289,11 @@ namespace dbtools // does the detail name denote a column? if ( _rxColumns->hasByName( *pDetailFields ) ) { + Reference< XPropertySet > xDetailField(_rxColumns->getByName( *pDetailFields ), UNO_QUERY); + assert(xDetailField.is()); + OUString sNewParamName; - const OUString sFilterCondition = createFilterConditionFromColumnLink( *pMasterFields, *pDetailFields, sNewParamName ); + const OUString sFilterCondition = createFilterConditionFromColumnLink( *pMasterFields, xDetailField, sNewParamName ); OSL_PRECOND( !sNewParamName.isEmpty(), "ParameterManager::classifyLinks: createFilterConditionFromColumnLink returned nonsense!" ); // remember meta information about this new parameter @@ -754,6 +767,7 @@ namespace dbtools xMeta = xConnection->getMetaData(); if ( xMeta.is() ) { + m_xConnectionMetadata = xMeta; m_sIdentifierQuoteString = xMeta->getIdentifierQuoteString(); m_sSpecialCharacters = xMeta->getExtraNameCharacters(); } diff --git a/include/connectivity/parameters.hxx b/include/connectivity/parameters.hxx index dce18c73556f..ce4995985513 100644 --- a/include/connectivity/parameters.hxx +++ b/include/connectivity/parameters.hxx @@ -126,6 +126,7 @@ namespace dbtools OUString m_sIdentifierQuoteString; OUString m_sSpecialCharacters; + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > m_xConnectionMetadata; ::std::vector< bool > m_aParametersVisited; @@ -244,7 +245,7 @@ namespace dbtools OUString createFilterConditionFromColumnLink( const OUString& /* [in] */ _rMasterColumn, - const OUString& /* [in] */ _rDetailColumn, + const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& /* [in] */ xDetailColumn, OUString& /* [out] */ _rNewParamName ); -- cgit v1.2.3