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
This commit is contained in:
Lionel Elie Mamane
2012-12-05 18:09:57 +01:00
parent 82555fdad5
commit bd60c90f85

View File

@@ -38,7 +38,6 @@
#include <com/sun/star/sdbcx/KeyType.hpp>
#include <connectivity/dbtools.hxx>
#include <connectivity/dbexception.hxx>
#include <boost/static_assert.hpp>
#include <list>
#include <algorithm>
#include <string.h>
@@ -1432,23 +1431,10 @@ sal_Bool OKeySet::fetchRow()
bRet = m_xDriverSet->next();
if ( bRet )
{
const int cc = m_xSetMetaData->getColumnCount();
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);
m_xRow.set(new OPrivateRow(aFullRow->get()));
m_xRow.set(m_xDriverRow, UNO_QUERY_THROW);
connectivity::ORowVector< ORowSetValue >::Vector::iterator aIter = aKeyRow->get().begin();
// copy key columns