Kaydet (Commit) 59375da7 authored tarafından Lionel Elie Mamane's avatar Lionel Elie Mamane

fdo#53281 Don't cache whole row in KeySet

This was done for the sake of ODBC,
but the cost was imposed on all backends.

The ODBC problems are now solved cleanly (and more efficiently)
in the SDBC<->ODBC layer.

Change-Id: Ib8a864da08deaaacc96a379fb72b3b7cbb34598c
üst 570cb8ff
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include <com/sun/star/sdbcx/KeyType.hpp> #include <com/sun/star/sdbcx/KeyType.hpp>
#include <connectivity/dbtools.hxx> #include <connectivity/dbtools.hxx>
#include <connectivity/dbexception.hxx> #include <connectivity/dbexception.hxx>
#include <boost/static_assert.hpp>
#include <list> #include <list>
#include <algorithm> #include <algorithm>
#include <string.h> #include <string.h>
...@@ -1432,23 +1431,10 @@ sal_Bool OKeySet::fetchRow() ...@@ -1432,23 +1431,10 @@ sal_Bool OKeySet::fetchRow()
bRet = m_xDriverSet->next(); bRet = m_xDriverSet->next();
if ( bRet ) if ( bRet )
{ {
const int cc = m_xSetMetaData->getColumnCount();
ORowSetRow aKeyRow = new connectivity::ORowVector< ORowSetValue >((*m_pKeyColumnNames).size() + m_pForeignColumnNames->size()); ORowSetRow aKeyRow = new connectivity::ORowVector< ORowSetValue >((*m_pKeyColumnNames).size() + m_pForeignColumnNames->size());
ORowSetRow aFullRow = new connectivity::ORowVector< ORowSetValue >(cc);
// Fetch the columns only once and in order, to satisfy restrictive backends such as ODBC
connectivity::ORowVector< ORowSetValue >::Vector::iterator aFRIter = aFullRow->get().begin();
// Column 0 is reserved for the bookmark; unused here.
++aFRIter;
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(sal_Int32)); // "At least a 32 bit word expected"
for (int i = 1; i <= cc; ++i, ++aFRIter )
{
aFRIter->fill(i, m_xSetMetaData->getColumnType(i), m_xDriverRow);
}
::comphelper::disposeComponent(m_xSet); ::comphelper::disposeComponent(m_xSet);
m_xRow.set(new OPrivateRow(aFullRow->get())); m_xRow.set(m_xDriverRow, UNO_QUERY_THROW);
connectivity::ORowVector< ORowSetValue >::Vector::iterator aIter = aKeyRow->get().begin(); connectivity::ORowVector< ORowSetValue >::Vector::iterator aIter = aKeyRow->get().begin();
// copy key columns // copy key columns
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment