[Libreoffice-commits] core.git: 5 commits - dbaccess/source

Lionel Elie Mamane lionel at mamane.lu
Tue Feb 26 22:01:42 PST 2013


 dbaccess/source/core/api/KeySet.cxx        |  189 ++++++++++++++++++-----------
 dbaccess/source/core/api/KeySet.hxx        |   19 ++
 dbaccess/source/core/api/OptimisticSet.cxx |   13 +
 dbaccess/source/core/api/OptimisticSet.hxx |    1 
 4 files changed, 146 insertions(+), 76 deletions(-)

New commits:
commit 8b66c00a0c87f81ecb78b27dbf0a6ded6e94a048
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Wed Feb 27 06:54:28 2013 +0100

    janitorial: simplify test expression without semantics change
    
    The "sComposerFilter != m_sRowSetFilter" could not influence the result.
    Proof.
     The right hand-side of the || is evaluated only when m_sRowSetFilter.isEmpty()
     So the only case where the removed test could have an influence is when
     m_sRowSetFilter.isEmpty().
     However, the right hand-side of the && is evaluated only when !sComposerFilter.isEmpty().
     We have m_sRowSetFilter.isEmpty() and !sComposerFilter.isEmpty().
     In particular, (sComposerFilter != m_sRowSetFilter) is true.
    Qed.
    
    Change-Id: I1484d78cf2d7a5e8ca44f382eb7c440c84d8c10e

diff --git a/dbaccess/source/core/api/OptimisticSet.cxx b/dbaccess/source/core/api/OptimisticSet.cxx
index 546a984..cbfcb62 100644
--- a/dbaccess/source/core/api/OptimisticSet.cxx
+++ b/dbaccess/source/core/api/OptimisticSet.cxx
@@ -157,7 +157,7 @@ void OptimisticSet::makeNewStatement( )
     fillJoinedColumns_throw(m_aSqlIterator.getJoinConditions());
 
     const ::rtl::OUString sComposerFilter = m_xComposer->getFilter();
-    if ( !m_sRowSetFilter.isEmpty() || (!sComposerFilter.isEmpty() && sComposerFilter != m_sRowSetFilter) )
+    if ( !m_sRowSetFilter.isEmpty() || !sComposerFilter.isEmpty() )
     {
         FilterCreator aFilterCreator;
         if ( !sComposerFilter.isEmpty() && sComposerFilter != m_sRowSetFilter )
commit cb9e5e786beef004aedf6d6cc7dbd989bd6a05be
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Wed Feb 27 06:53:34 2013 +0100

    fdo#51976 make "refetch one row" query easier to optimise
    
    Instead of playing tricks with parameters that when filled in force a part of the WHERE clause to have not influence, actually use several different statements and hardcode in each the kind of test to be done
    
    Change-Id: I93e1978f0420bc627a02291f209c788b9b4f2e96

diff --git a/dbaccess/source/core/api/KeySet.cxx b/dbaccess/source/core/api/KeySet.cxx
index 6970db2..6252eec 100644
--- a/dbaccess/source/core/api/KeySet.cxx
+++ b/dbaccess/source/core/api/KeySet.cxx
@@ -64,6 +64,7 @@ using namespace ::com::sun::star::io;
 using namespace ::com::sun::star;
 using namespace ::cppu;
 using namespace ::osl;
+using std::vector;
 
 namespace
 {
@@ -130,8 +131,15 @@ OKeySet::OKeySet(const connectivity::OSQLTable& _xTable,
 
 OKeySet::~OKeySet()
 {
-    tryDispose(m_xStatement);
     tryDispose(m_xSet);
+    // m_xStatement is necessarily one of those
+    const vStatements_t::const_iterator end(m_vStatements.end());
+    for(vStatements_t::iterator i(m_vStatements.begin());
+        i != end;
+        ++i)
+    {
+        tryDispose(i->second);
+    }
 
     m_xComposer = NULL;
 
@@ -221,13 +229,22 @@ SAL_WNODEPRECATED_DECLARATIONS_POP
 
 namespace
 {
-    void appendOneKeyColumnClause( const OUString &tblName, const OUString &colName, OUStringBuffer &o_buf )
+    void appendOneKeyColumnClause( const OUString &tblName, const OUString &colName, const connectivity::ORowSetValue &_rValue, OUStringBuffer &o_buf )
     {
-        static OUString s_sDot(".");
-        static OUString s_sParam0(" ( 1 = ? AND ");
-        static OUString s_sParam1(" = ? OR 1 = ? AND ");
-        static OUString s_sParam2(" IS NULL ) ");
-        o_buf.append(s_sParam0 + tblName + s_sDot + colName + s_sParam1 + tblName + s_sDot + colName + s_sParam2);
+        static const OUString s_sDot(".");
+        OUString fullName;
+        if (tblName.isEmpty())
+            fullName = colName;
+        else
+            fullName = tblName + s_sDot + colName;
+        if ( _rValue.isNull() )
+        {
+            o_buf.append(fullName + " IS NULL ");
+        }
+        else
+        {
+            o_buf.append(fullName + " = ? ");
+        }
     }
 }
 
@@ -235,58 +252,60 @@ void OKeySet::setOneKeyColumnParameter( sal_Int32 &nPos, const Reference< XParam
 {
     if ( _rValue.isNull() )
     {
-        _xParameter->setByte( nPos++, 0 );
-        // We do the full call so that the right sqlType is passed to setNull
-        setParameter( nPos++, _xParameter, _rValue, _nType, _nScale );
-        _xParameter->setByte( nPos++, 1 );
+        // Nothing to do, appendOneKeyColumnClause took care of it,
+        // the "IS NULL" is hardcoded in the query
     }
     else
     {
-        _xParameter->setByte( nPos++, 1 );
         setParameter( nPos++, _xParameter, _rValue, _nType, _nScale );
-        _xParameter->setByte( nPos++, 0 );
     }
 }
 
 OUStringBuffer OKeySet::createKeyFilter()
 {
-    static OUString aAnd(" AND ");
+    connectivity::ORowVector< ORowSetValue >::Vector::const_iterator aIter = m_aKeyIter->second.first->get().begin();
+
+    static const OUString aAnd(" AND ");
     const OUString aQuote    = getIdentifierQuoteString();
     OUStringBuffer aFilter;
     // create the where clause
     Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
-    SelectColumnsMetaData::iterator aPosEnd = m_pKeyColumnNames->end();
-    for(SelectColumnsMetaData::iterator aPosIter = m_pKeyColumnNames->begin();aPosIter != aPosEnd;)
+    SelectColumnsMetaData::const_iterator aPosEnd = m_pKeyColumnNames->end();
+    for(SelectColumnsMetaData::const_iterator aPosIter = m_pKeyColumnNames->begin();aPosIter != aPosEnd; ++aPosIter)
     {
-        appendOneKeyColumnClause(::dbtools::quoteTableName( xMeta,aPosIter->second.sTableName,::dbtools::eInDataManipulation),
-                                 ::dbtools::quoteName( aQuote,aPosIter->second.sRealName),
+        if ( ! aFilter.isEmpty() )
+            aFilter.append(aAnd);
+        appendOneKeyColumnClause(::dbtools::quoteTableName(xMeta, aPosIter->second.sTableName, ::dbtools::eInDataManipulation),
+                                 ::dbtools::quoteName(aQuote, aPosIter->second.sRealName),
+                                 *aIter++,
                                  aFilter);
-        ++aPosIter;
-        if(aPosIter != aPosEnd)
+    }
+    aPosEnd = m_pForeignColumnNames->end();
+    for(SelectColumnsMetaData::const_iterator aPosIter = m_pForeignColumnNames->begin(); aPosIter != aPosEnd; ++aPosIter)
+    {
+        if ( ! aFilter.isEmpty() )
             aFilter.append(aAnd);
+        appendOneKeyColumnClause(::dbtools::quoteTableName(xMeta, aPosIter->second.sTableName, ::dbtools::eInDataManipulation),
+                                 ::dbtools::quoteName(aQuote, aPosIter->second.sRealName),
+                                 *aIter++,
+                                 aFilter);
     }
     return aFilter;
 }
 
-void OKeySet::construct(const Reference< XResultSet>& _xDriverSet,const OUString& i_sRowSetFilter)
+void OKeySet::construct(const Reference< XResultSet>& _xDriverSet, const OUString& i_sRowSetFilter)
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen at sun.com", "OKeySet::construct" );
+
     OCacheSet::construct(_xDriverSet,i_sRowSetFilter);
+
     initColumns();
+    m_sRowSetFilter = i_sRowSetFilter;
 
-    Reference<XNameAccess> xKeyColumns  = getKeyColumns();
     Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
-    Reference<XColumnsSupplier> xQueryColSup(m_xComposer,UNO_QUERY);
+    Reference<XColumnsSupplier> xQueryColSup(m_xComposer, UNO_QUERY);
     const Reference<XNameAccess> xQueryColumns = xQueryColSup->getColumns();
-    findTableColumnsMatching_throw(makeAny(m_xTable),m_sUpdateTableName,xMeta,xQueryColumns,m_pKeyColumnNames);
-
-    // the first row is empty because it's now easier for us to distinguish when we are beforefirst or first
-    // without extra variable to be set
-    OKeySetValue keySetValue((ORowSetValueVector *)NULL,::std::pair<sal_Int32,Reference<XRow> >(0,(Reference<XRow>)NULL));
-    m_aKeyMap.insert(OKeySetMatrix::value_type(0, keySetValue));
-    m_aKeyIter = m_aKeyMap.begin();
-
-    OUStringBuffer aFilter = createKeyFilter();
+    findTableColumnsMatching_throw( makeAny(m_xTable), m_sUpdateTableName, xMeta, xQueryColumns, m_pKeyColumnNames );
 
     Reference< XSingleSelectQueryComposer> xSourceComposer(m_xComposer,UNO_QUERY);
     Reference< XMultiServiceFactory >  xFactory(m_xConnection, UNO_QUERY_THROW);
@@ -297,8 +316,6 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet,const OUString
     const Sequence< OUString> aSeq = xSelectTables->getElementNames();
     if ( aSeq.getLength() > 1 ) // special handling for join
     {
-        static OUString aAnd(" AND ");
-        const OUString aQuote    = getIdentifierQuoteString();
         const OUString* pIter = aSeq.getConstArray();
         const OUString* const pEnd  = pIter + aSeq.getLength();
         for(;pIter != pEnd;++pIter)
@@ -309,31 +326,63 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet,const OUString
                 Reference<XPropertySet> xProp(xSelColSup,uno::UNO_QUERY);
                 OUString sSelectTableName = ::dbtools::composeTableName( xMeta, xProp, ::dbtools::eInDataManipulation, false, false, false );
 
-                ::dbaccess::getColumnPositions(xQueryColumns,xSelColSup->getColumns()->getElementNames(),sSelectTableName,(*m_pForeignColumnNames));
+                ::dbaccess::getColumnPositions(xQueryColumns, xSelColSup->getColumns()->getElementNames(), sSelectTableName, (*m_pForeignColumnNames), true);
 
-                const SelectColumnsMetaData::iterator aPosEnd = (*m_pForeignColumnNames).end();
-                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);
-                    appendOneKeyColumnClause(::dbtools::quoteName( aQuote,sSelectTableName),
-                                             ::dbtools::quoteName( aQuote,aPosIter->second.sRealName),
-                                             aFilter);
-                }
-                break;
+                // LEM: there used to be a break here; however, I see no reason to stop
+                //      at first non-updateTable, so I removed it. (think of multiple joins...)
             }
         }
     }
-    executeStatement(aFilter,i_sRowSetFilter,xAnalyzer);
+
+    // the first row is empty because it's now easier for us to distinguish when we are beforefirst or first
+    // without extra variable to be set
+    OKeySetValue keySetValue((ORowSetValueVector *)NULL,::std::pair<sal_Int32,Reference<XRow> >(0,(Reference<XRow>)NULL));
+    m_aKeyMap.insert(OKeySetMatrix::value_type(0, keySetValue));
+    m_aKeyIter = m_aKeyMap.begin();
+}
+
+void OKeySet::ensureStatement( )
+{
+    // do we already have a statement for the current combination of NULLness
+    // of key & foreign columns?
+    FilterColumnsNULL_t FilterColumnsNULL;
+    FilterColumnsNULL.reserve(m_aKeyIter->second.first->get().size());
+    connectivity::ORowVector< ORowSetValue >::Vector::const_iterator aIter = m_aKeyIter->second.first->get().begin();
+    const connectivity::ORowVector< ORowSetValue >::Vector::const_iterator aEnd  = m_aKeyIter->second.first->get().end();
+    for( ; aIter != aEnd; ++aIter )
+        FilterColumnsNULL.push_back(aIter->isNull());
+    vStatements_t::iterator pNewStatement(m_vStatements.find(FilterColumnsNULL));
+    if(pNewStatement == m_vStatements.end())
+    {
+        // no: make a new one
+        makeNewStatement();
+        std::pair< vStatements_t::iterator, bool > insert_result
+            (m_vStatements.insert(vStatements_t::value_type(FilterColumnsNULL, m_xStatement)));
+        assert(insert_result.second);
+    }
+    else
+        // yes: use it
+        m_xStatement = pNewStatement->second;
 }
-void OKeySet::executeStatement(OUStringBuffer& io_aFilter,const OUString& i_sRowSetFilter,Reference<XSingleSelectQueryComposer>& io_xAnalyzer)
+
+void OKeySet::makeNewStatement()
 {
-    bool bFilterSet = !i_sRowSetFilter.isEmpty();
+    Reference< XSingleSelectQueryComposer> xSourceComposer(m_xComposer,UNO_QUERY);
+    Reference< XMultiServiceFactory >  xFactory(m_xConnection, UNO_QUERY_THROW);
+    Reference<XSingleSelectQueryComposer> xAnalyzer(xFactory->createInstance(SERVICE_NAME_SINGLESELECTQUERYCOMPOSER),UNO_QUERY);
+    xAnalyzer->setElementaryQuery(xSourceComposer->getElementaryQuery());
+
+    OUStringBuffer aFilter(createKeyFilter());
+    executeStatement(aFilter, xAnalyzer);
+}
+
+void OKeySet::executeStatement(OUStringBuffer& io_aFilter, Reference<XSingleSelectQueryComposer>& io_xAnalyzer)
+{
+    bool bFilterSet = !m_sRowSetFilter.isEmpty();
     if ( bFilterSet )
     {
         FilterCreator aFilterCreator;
-        aFilterCreator.append( i_sRowSetFilter );
+        aFilterCreator.append( m_sRowSetFilter );
         aFilterCreator.append( io_aFilter.makeStringAndClear() );
         io_aFilter = aFilterCreator.getComposedAndClear();
     }
@@ -1298,6 +1347,7 @@ sal_Bool SAL_CALL OKeySet::previous(  ) throw(SQLException, RuntimeException)
 
 bool OKeySet::doTryRefetch_throw()  throw(SQLException, RuntimeException)
 {
+    ensureStatement( );
     // we just reassign the base members
     Reference< XParameters > xParameter(m_xStatement,UNO_QUERY);
     OSL_ENSURE(xParameter.is(),"No Parameter interface!");
@@ -1346,7 +1396,7 @@ void SAL_CALL OKeySet::refreshRow() throw(SQLException, RuntimeException)
 
     invalidateRow();
 
-    if(isBeforeFirst() || isAfterLast() || !m_xStatement.is())
+    if(isBeforeFirst() || isAfterLast())
         return;
 
     if ( m_aKeyIter->second.second.second.is() )
@@ -1667,16 +1717,19 @@ void getColumnPositions(const Reference<XNameAccess>& _rxQueryColumns,
                     sal_Int32 nNullable = ColumnValue::NULLABLE_UNKNOWN;
                     OSL_VERIFY( xQueryColumnProp->getPropertyValue( PROPERTY_ISNULLABLE ) >>= nNullable );
 
+                    SelectColumnDescription aColDesc( nPos, nType, nScale, nNullable != sdbc::ColumnValue::NO_NULLS, sColumnDefault );
+                    OUString sName;
                     if ( i_bAppendTableName )
                     {
-                        OUString sName = sTableName + "." + sRealName;
-                        SelectColumnDescription aColDesc( nPos, nType,nScale,nNullable != sdbc::ColumnValue::NO_NULLS, sColumnDefault );
+                        sName = sTableName + "." + sRealName;
                         aColDesc.sRealName = sRealName;
                         aColDesc.sTableName = sTableName;
-                        o_rColumnNames[sName] = aColDesc;
                     }
                     else
-                        o_rColumnNames[sRealName] = SelectColumnDescription( nPos, nType,nScale,nNullable != sdbc::ColumnValue::NO_NULLS, sColumnDefault );
+                    {
+                        sName = sRealName;
+                    }
+                    o_rColumnNames[sName] = aColDesc;
 
                     break;
                 }
diff --git a/dbaccess/source/core/api/KeySet.hxx b/dbaccess/source/core/api/KeySet.hxx
index 44edc44..1185790 100644
--- a/dbaccess/source/core/api/KeySet.hxx
+++ b/dbaccess/source/core/api/KeySet.hxx
@@ -25,6 +25,7 @@
 #include <cppuhelper/implbase1.hxx>
 #include <memory>
 #include <map>
+#include <vector>
 
 #include <com/sun/star/lang/XUnoTunnel.hpp>
 #include <com/sun/star/sdb/XSingleSelectQueryAnalyzer.hpp>
@@ -91,11 +92,21 @@ namespace dbaccess
         SAL_WNODEPRECATED_DECLARATIONS_POP
         connectivity::OSQLTable                                 m_xTable; // reference to our table
         ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess>    m_xTableKeys;
+        // we need a different SQL (statement) for each different combination
+        // of NULLness of key & foreign columns;
+        // each subclause is either "colName = ?" or "colName IS NULL"
+        // (we avoid the standard "colName IS NOT DISTINCT FROM ?" because it is not widely supported)
+        typedef ::std::vector< bool > FilterColumnsNULL_t;
+        typedef ::std::map< FilterColumnsNULL_t,
+                            ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > >
+                vStatements_t;
+        vStatements_t                                           m_vStatements;
         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement>   m_xStatement;
         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet>           m_xSet;
         ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRow>                 m_xRow;
         ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryAnalyzer >   m_xComposer;
-        ::rtl::OUString                                                                 m_sUpdateTableName;
+        const ::rtl::OUString                                   m_sUpdateTableName;
+        ::rtl::OUString                                         m_sRowSetFilter;
         ::std::vector< ::rtl::OUString >                        m_aFilterColumns;
         sal_Int32&                                              m_rRowCount;
 
@@ -124,17 +135,19 @@ namespace dbaccess
                                              const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>& i_xQueryColumns,
                                              ::std::auto_ptr<SelectColumnsMetaData>& o_pKeyColumnNames);
         SAL_WNODEPRECATED_DECLARATIONS_POP
+        void ensureStatement( );
+        virtual void makeNewStatement( );
         void setOneKeyColumnParameter( sal_Int32 &nPos,
                                        const ::com::sun::star::uno::Reference<  ::com::sun::star::sdbc::XParameters > &_xParameter,
                                        const connectivity::ORowSetValue &_rValue,
                                        sal_Int32 _nType,
                                        sal_Int32 _nScale ) const;
-        ::rtl::OUStringBuffer createKeyFilter();
+        ::rtl::OUStringBuffer createKeyFilter( );
         bool doTryRefetch_throw() throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);;
         void tryRefetch(const ORowSetRow& _rInsertRow,bool bRefetch);
         void executeUpdate(const ORowSetRow& _rInsertRow ,const ORowSetRow& _rOrginalRow,const ::rtl::OUString& i_sSQL,const ::rtl::OUString& i_sTableName,const ::std::vector<sal_Int32>& _aIndexColumnPositions = ::std::vector<sal_Int32>());
         void executeInsert( const ORowSetRow& _rInsertRow,const ::rtl::OUString& i_sSQL,const ::rtl::OUString& i_sTableName = ::rtl::OUString(),bool bRefetch = false);
-        void executeStatement(::rtl::OUStringBuffer& io_aFilter,const ::rtl::OUString& i_sRowSetFilter,::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer>& io_xAnalyzer);
+        void executeStatement(::rtl::OUStringBuffer& io_aFilter, ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XSingleSelectQueryComposer>& io_xAnalyzer);
 
         virtual ~OKeySet();
     public:
diff --git a/dbaccess/source/core/api/OptimisticSet.cxx b/dbaccess/source/core/api/OptimisticSet.cxx
index 34f545b..546a984 100644
--- a/dbaccess/source/core/api/OptimisticSet.cxx
+++ b/dbaccess/source/core/api/OptimisticSet.cxx
@@ -1,4 +1,3 @@
-
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /*
  * This file is part of the LibreOffice project.
@@ -108,8 +107,11 @@ OptimisticSet::~OptimisticSet()
 void OptimisticSet::construct(const Reference< XResultSet>& _xDriverSet,const ::rtl::OUString& i_sRowSetFilter)
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen at sun.com", "OptimisticSet::construct" );
+
     OCacheSet::construct(_xDriverSet,i_sRowSetFilter);
+
     initColumns();
+    m_sRowSetFilter = i_sRowSetFilter;
 
     Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
     bool bCase = (xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers()) ? true : false;
@@ -134,7 +136,10 @@ void OptimisticSet::construct(const Reference< XResultSet>& _xDriverSet,const ::
     OKeySetValue keySetValue((ORowSetValueVector *)NULL,::std::pair<sal_Int32,Reference<XRow> >(0,(Reference<XRow>)NULL));
     m_aKeyMap.insert(OKeySetMatrix::value_type(0,keySetValue));
     m_aKeyIter = m_aKeyMap.begin();
+}
 
+void OptimisticSet::makeNewStatement( )
+{
     ::rtl::OUStringBuffer aFilter = createKeyFilter();
 
     Reference< XSingleSelectQueryComposer> xSourceComposer(m_xComposer,UNO_QUERY);
@@ -152,12 +157,12 @@ void OptimisticSet::construct(const Reference< XResultSet>& _xDriverSet,const ::
     fillJoinedColumns_throw(m_aSqlIterator.getJoinConditions());
 
     const ::rtl::OUString sComposerFilter = m_xComposer->getFilter();
-    if ( !i_sRowSetFilter.isEmpty() || (!sComposerFilter.isEmpty() && sComposerFilter != i_sRowSetFilter) )
+    if ( !m_sRowSetFilter.isEmpty() || (!sComposerFilter.isEmpty() && sComposerFilter != m_sRowSetFilter) )
     {
         FilterCreator aFilterCreator;
-        if ( !sComposerFilter.isEmpty() && sComposerFilter != i_sRowSetFilter )
+        if ( !sComposerFilter.isEmpty() && sComposerFilter != m_sRowSetFilter )
             aFilterCreator.append( sComposerFilter );
-        aFilterCreator.append( i_sRowSetFilter );
+        aFilterCreator.append( m_sRowSetFilter );
         aFilterCreator.append( aFilter.makeStringAndClear() );
         aFilter = aFilterCreator.getComposedAndClear();
     }
diff --git a/dbaccess/source/core/api/OptimisticSet.hxx b/dbaccess/source/core/api/OptimisticSet.hxx
index a35f18e..0e97233 100644
--- a/dbaccess/source/core/api/OptimisticSet.hxx
+++ b/dbaccess/source/core/api/OptimisticSet.hxx
@@ -50,6 +50,7 @@ namespace dbaccess
         void fillJoinedColumns_throw(const ::std::vector< ::connectivity::TNodePair>& i_aJoinColumns);
         void fillJoinedColumns_throw(const ::rtl::OUString& i_sLeftColumn,const ::rtl::OUString& i_sRightColumn);
     protected:
+        virtual void makeNewStatement( );
         virtual ~OptimisticSet();
     public:
         OptimisticSet(const ::comphelper::ComponentContext& _rContext,
commit a4322a23a90320f013169d9c925b8a6387f3d50a
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Wed Feb 27 06:47:14 2013 +0100

    janitorial: save one object
    
    Change-Id: I52b7d8204bb2d34639dea544833318fe86a5ddcf

diff --git a/dbaccess/source/core/api/KeySet.cxx b/dbaccess/source/core/api/KeySet.cxx
index ff036af..6970db2 100644
--- a/dbaccess/source/core/api/KeySet.cxx
+++ b/dbaccess/source/core/api/KeySet.cxx
@@ -1641,9 +1641,7 @@ void getColumnPositions(const Reference<XNameAccess>& _rxQueryColumns,
         const OUString* pTblColumnIter   = _aColumnNames.getConstArray();
         const OUString* pTblColumnEnd    = pTblColumnIter + _aColumnNames.getLength();
 
-
-        ::comphelper::UStringMixLess aTmp(o_rColumnNames.key_comp());
-        ::comphelper::UStringMixEqual bCase(aTmp.isCaseSensitive());
+        ::comphelper::UStringMixEqual bCase(o_rColumnNames.key_comp().isCaseSensitive());
 
         for(sal_Int32 nPos = 1;pSelIter != pSelEnd;++pSelIter,++nPos)
         {
commit 0c878187501586072eb74b2867417283bc47fe8c
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Wed Feb 27 06:32:38 2013 +0100

    janitorial
    
     - more const qualifiers
     - remove unnecessary cast
     - don't hardcode magic number
       (length of hardcoded string)
    
    Change-Id: Id8165ec556c913213b5be22c731b78f6b325f22c

diff --git a/dbaccess/source/core/api/KeySet.cxx b/dbaccess/source/core/api/KeySet.cxx
index 261249b..ff036af 100644
--- a/dbaccess/source/core/api/KeySet.cxx
+++ b/dbaccess/source/core/api/KeySet.cxx
@@ -300,7 +300,7 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet,const OUString
         static OUString aAnd(" AND ");
         const OUString aQuote    = getIdentifierQuoteString();
         const OUString* pIter = aSeq.getConstArray();
-        const OUString* pEnd   = pIter + aSeq.getLength();
+        const OUString* const pEnd  = pIter + aSeq.getLength();
         for(;pIter != pEnd;++pIter)
         {
             if ( *pIter != m_sUpdateTableName )
@@ -443,12 +443,12 @@ Sequence< sal_Int32 > SAL_CALL OKeySet::deleteRows( const Sequence< Any >& rows
     OUStringBuffer aCondition("( ");
 
     SelectColumnsMetaData::const_iterator aIter = (*m_pKeyColumnNames).begin();
-    SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end();
+    const SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end();
     for(;aIter != aPosEnd;++aIter)
     {
         aCondition.append(::dbtools::quoteName( aQuote,aIter->second.sRealName) + aEqual + aAnd);
     }
-    aCondition.setLength(aCondition.getLength()-5);
+    aCondition.setLength(aCondition.getLength() - aAnd.getLength());
     const OUString sCon( aCondition.makeStringAndClear() );
 
     const Any* pBegin   = rows.getConstArray();
@@ -911,7 +911,7 @@ void OKeySet::copyRowValue(const ORowSetRow& _rInsertRow,ORowSetRow& _rKeyRow,sa
 
     // update the key values
     SelectColumnsMetaData::const_iterator aPosIter = (*m_pKeyColumnNames).begin();
-    SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end();
+    const SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end();
     for(;aPosIter != aPosEnd;++aPosIter,++aIter)
     {
         impl_convertValue_throw(_rInsertRow,aPosIter->second);
@@ -1325,12 +1325,12 @@ bool OKeySet::doTryRefetch_throw()  throw(SQLException, RuntimeException)
 
     // now set the primary key column values
     connectivity::ORowVector< ORowSetValue >::Vector::const_iterator aIter = m_aKeyIter->second.first->get().begin();
-    SelectColumnsMetaData::const_iterator aPosIter = (*m_pKeyColumnNames).begin();
-    SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end();
+    SelectColumnsMetaData::const_iterator aPosIter = m_pKeyColumnNames->begin();
+    SelectColumnsMetaData::const_iterator aPosEnd = m_pKeyColumnNames->end();
     for(;aPosIter != aPosEnd;++aPosIter,++aIter)
         setOneKeyColumnParameter(nPos,xParameter,*aIter,aPosIter->second.nType,aPosIter->second.nScale);
-    aPosIter = (*m_pForeignColumnNames).begin();
-    aPosEnd = (*m_pForeignColumnNames).end();
+    aPosIter = m_pForeignColumnNames->begin();
+    aPosEnd = m_pForeignColumnNames->end();
     for(;aPosIter != aPosEnd;++aPosIter,++aIter)
         setOneKeyColumnParameter(nPos,xParameter,*aIter,aPosIter->second.nType,aPosIter->second.nScale);
 
@@ -1643,7 +1643,7 @@ void getColumnPositions(const Reference<XNameAccess>& _rxQueryColumns,
 
 
         ::comphelper::UStringMixLess aTmp(o_rColumnNames.key_comp());
-        ::comphelper::UStringMixEqual bCase(static_cast< ::comphelper::UStringMixLess*>(&aTmp)->isCaseSensitive());
+        ::comphelper::UStringMixEqual bCase(aTmp.isCaseSensitive());
 
         for(sal_Int32 nPos = 1;pSelIter != pSelEnd;++pSelIter,++nPos)
         {
commit 1b77302ef95f1eaf77baabd98883ed649fa25242
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Wed Feb 27 06:30:56 2013 +0100

    spelling in comments
    
    Change-Id: I3a7df167a91dd6ef845d16d5e6cf46ff5a82d455

diff --git a/dbaccess/source/core/api/KeySet.cxx b/dbaccess/source/core/api/KeySet.cxx
index 99022cf..261249b 100644
--- a/dbaccess/source/core/api/KeySet.cxx
+++ b/dbaccess/source/core/api/KeySet.cxx
@@ -182,7 +182,7 @@ void OKeySet::findTableColumnsMatching_throw(   const Any& i_aTable,
         // For instance, imagine a "SELECT alias.col FROM table AS alias". Now i_aTable would be the table named
         // "table", so our sUpdateTableName would be "table" as well - not the information about the "alias" is
         // already lost here.
-        // now getColumnPositions would travers the columns, and check which of them belong to the table denoted
+        // now getColumnPositions would traverse the columns, and check which of them belong to the table denoted
         // by sUpdateTableName. Since the latter is "table", but the columns only know that they belong to a table
         // named "alias", there will be no matching - so getColumnPositions wouldn't find anything.
 
@@ -518,7 +518,7 @@ void SAL_CALL OKeySet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow
     OUString sIsNull(" IS NULL");
     OUString sParam(" = ?");
 
-    // use keys and indexes for excat postioning
+    // use keys and indexes for exact postioning
     // first the keys
     Reference<XNameAccess> xKeyColumns = getKeyColumns();
 
@@ -1042,7 +1042,7 @@ void SAL_CALL OKeySet::moveToCurrentRow(  ) throw(SQLException, RuntimeException
 Reference<XNameAccess> OKeySet::getKeyColumns() const
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen at sun.com", "OKeySet::getKeyColumns" );
-    // use keys and indexes for excat postioning
+    // use keys and indexes for exact postioning
     // first the keys
 
     Reference<XIndexAccess> xKeys = m_xTableKeys;


More information about the Libreoffice-commits mailing list