dbaccess/source/core/api/CacheSet.cxx |2
dbaccess/source/core/api/KeySet.cxx| 85 +++--
dbaccess/source/core/api/KeySet.hxx|5 +
dbaccess/source/core/api/OptimisticSet.cxx |2
4 files changed, 65 insertions(+), 29 deletions(-)
New commits:
commit dfcf55a9de3cc928e5612117d0f9f5f3783de2ff
Author: Lionel Elie Mamane
Date: Wed Jan 18 12:30:36 2012 +0100
fdo#44813: make the refresh query filter NULL-safe
diff --git a/dbaccess/source/core/api/KeySet.cxx
b/dbaccess/source/core/api/KeySet.cxx
index 17789ff..b41e68b 100644
--- a/dbaccess/source/core/api/KeySet.cxx
+++ b/dbaccess/source/core/api/KeySet.cxx
@@ -223,22 +223,56 @@ void OKeySet::findTableColumnsMatching_throw( const
Any& i_aTable,
}
SAL_WNODEPRECATED_DECLARATIONS_POP
+namespace
+{
+void appendOneKeyColumnClause( const ::rtl::OUString &tblName, const
::rtl::OUString &colName, ::rtl::OUStringBuffer &o_buf )
+{
+static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM("."));
+static ::rtl::OUString s_sParam0(RTL_CONSTASCII_USTRINGPARAM(" ( TRUE
= ? AND "));
+static ::rtl::OUString s_sParam1(RTL_CONSTASCII_USTRINGPARAM(" = ? OR
TRUE = ? AND "));
+static ::rtl::OUString s_sParam2(RTL_CONSTASCII_USTRINGPARAM(" IS NULL
) "));
+o_buf.append(s_sParam0);
+o_buf.append(tblName);
+o_buf.append(s_sDot);
+o_buf.append(colName);
+o_buf.append(s_sParam1);
+o_buf.append(tblName);
+o_buf.append(s_sDot);
+o_buf.append(colName);
+o_buf.append(s_sParam2);
+}
+}
+
+void OKeySet::setOneKeyColumnParameter( sal_Int32 &nPos, const Reference<
XParameters > &_xParameter, const connectivity::ORowSetValue &_rValue,
sal_Int32 _nType, sal_Int32 _nScale ) const
+{
+if ( _rValue.isNull() )
+{
+_xParameter->setBoolean( nPos++, false );
+// We do the full call so that the right sqlType is passed to setNull
+setParameter( nPos++, _xParameter, _rValue, _nType, _nScale );
+_xParameter->setBoolean( nPos++, true );
+}
+else
+{
+_xParameter->setBoolean( nPos++, true );
+setParameter( nPos++, _xParameter, _rValue, _nType, _nScale );
+_xParameter->setBoolean( nPos++, false );
+}
+}
+
::rtl::OUStringBuffer OKeySet::createKeyFilter()
{
static ::rtl::OUString aAnd(RTL_CONSTASCII_USTRINGPARAM(" AND "));
const ::rtl::OUString aQuote= getIdentifierQuoteString();
::rtl::OUStringBuffer aFilter;
-static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM("."));
-static ::rtl::OUString s_sParam(RTL_CONSTASCII_USTRINGPARAM(" = ?"));
// create the where clause
Reference xMeta = m_xConnection->getMetaData();
SelectColumnsMetaData::iterator aPosEnd = m_pKeyColumnNames->end();
for(SelectColumnsMetaData::iterator aPosIter =
m_pKeyColumnNames->begin();aPosIter != aPosEnd;)
{
-aFilter.append(::dbtools::quoteTableName(
xMeta,aPosIter->second.sTableName,::dbtools::eInDataManipulation));
-aFilter.append(s_sDot);
-aFilter.append(::dbtools::quoteName(
aQuote,aPosIter->second.sRealName));
-aFilter.append(s_sParam);
+appendOneKeyColumnClause(::dbtools::quoteTableName(
xMeta,aPosIter->second.sTableName,::dbtools::eInDataManipulation),
+ ::dbtools::quoteName(
aQuote,aPosIter->second.sRealName),
+ aFilter);
++aPosIter;
if(aPosIter != aPosEnd)
aFilter.append(aAnd);
@@ -276,8 +310,6 @@ void OKeySet::construct(const Reference< XResultSet>&
_xDriverSet,const ::rtl::O
{
static ::rtl::OUString aAnd(RTL_CONSTASCII_USTRINGPARAM(" AND "));
const ::rtl::OUString aQuote= getIdentifierQuoteString();
-static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM("."));
-static ::rtl::OUString s_sParam(RTL_CONSTASCII_USTRINGPARAM(" = ?"));
const ::rtl::OUString* pIter = aSeq.getConstArray();
const ::rtl::OUString* pEnd = pIter + aSeq.getLength();
for(;pIter != pEnd;++pIter)
@@ -294,12 +326,11 @@ void OKeySet::construct(const Reference< XResultSet>&
_xDriverSet,const ::rtl::O
for(SelectColumnsMetaData::iterator aPosIter =
(*m_pForeignColumnNames).begin();aPosIter != aPosEnd;++aPosIter)
{
// look for columns not in the source columns to use them
as filter as well
-if ( aFilter.getLength() )
-aFilter.append(aAnd);
-aFilter.append(::dbtools::quoteName(
aQuote,sSelectTableName));
-aFilter.append(s_sDot);
-aFilter.append(::dbtools::quoteName(
aQuote,aPosIter->second.sRealName));
-aFilter.append(s_sParam);
+if ( aFilter.getLength() )
+aFilter.append(aAnd);
+