forked from amazingfate/loongoffice
...(for now, from LIBO_INTERNAL_CODE only). See the mail thread starting at <https://lists.freedesktop.org/archives/libreoffice/2017-January/076665.html> "Dynamic Exception Specifications" for details. Most changes have been done automatically by the rewriting loplugin:dynexcspec (after enabling the rewriting mode, to be committed shortly). The way it only removes exception specs from declarations if it also sees a definition, it identified some dead declarations-w/o-definitions (that have been removed manually) and some cases where a definition appeared in multiple include files (which have also been cleaned up manually). There's also been cases of macro paramters (that were used to abstract over exception specs) that have become unused now (and been removed). Furthermore, some code needed to be cleaned up manually (avmedia/source/quicktime/ and connectivity/source/drivers/kab/), as I had no configurations available that would actually build that code. Missing @throws documentation has not been applied in such manual clean-up. Change-Id: I3408691256c9b0c12bc5332de976743626e13960 Reviewed-on: https://gerrit.libreoffice.org/33574 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
286 lines
7.7 KiB
C++
286 lines
7.7 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
|
|
#include "StaticSet.hxx"
|
|
#include <com/sun/star/sdbcx/CompareBookmark.hpp>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
|
|
#include <com/sun/star/sdbc/XPreparedStatement.hpp>
|
|
#include "dbastrings.hrc"
|
|
#include "apitools.hxx"
|
|
#include <connectivity/CommonTools.hxx>
|
|
#include <comphelper/types.hxx>
|
|
|
|
using namespace dbaccess;
|
|
using namespace connectivity;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::beans;
|
|
using namespace ::com::sun::star::sdbc;
|
|
using namespace ::com::sun::star::sdbcx;
|
|
using namespace ::com::sun::star::container;
|
|
using namespace ::com::sun::star::lang;
|
|
using namespace ::osl;
|
|
|
|
void OStaticSet::fillValueRow(ORowSetRow& _rRow,sal_Int32 /*_nPosition*/)
|
|
{
|
|
_rRow = *m_aSetIter;
|
|
}
|
|
|
|
// css::sdbcx::XRowLocate
|
|
Any SAL_CALL OStaticSet::getBookmark()
|
|
{
|
|
return makeAny(getRow());
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::moveToBookmark( const Any& bookmark )
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
return absolute(::comphelper::getINT32(bookmark));
|
|
}
|
|
|
|
sal_Int32 SAL_CALL OStaticSet::compareBookmarks( const Any& _first, const Any& _second )
|
|
{
|
|
sal_Int32 nFirst = 0, nSecond = 0;
|
|
_first >>= nFirst;
|
|
_second >>= nSecond;
|
|
return (nFirst < nSecond) ? CompareBookmark::LESS : ((nFirst > nSecond) ? CompareBookmark::GREATER : CompareBookmark::EQUAL);
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::hasOrderedBookmarks( )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
sal_Int32 SAL_CALL OStaticSet::hashBookmark( const Any& bookmark )
|
|
{
|
|
return ::comphelper::getINT32(bookmark);
|
|
}
|
|
|
|
bool OStaticSet::fetchRow()
|
|
{
|
|
bool bRet = false;
|
|
if ( !m_bEnd && (!m_nMaxRows || sal_Int32(m_aSet.size()) < m_nMaxRows) )
|
|
bRet = m_xDriverSet->next();
|
|
if ( bRet )
|
|
{
|
|
m_aSet.push_back(new connectivity::ORowVector< connectivity::ORowSetValue >(m_xSetMetaData->getColumnCount()));
|
|
m_aSetIter = m_aSet.end() - 1;
|
|
((*m_aSetIter)->get())[0] = getRow();
|
|
OCacheSet::fillValueRow(*m_aSetIter,((*m_aSetIter)->get())[0]);
|
|
}
|
|
else
|
|
m_bEnd = true;
|
|
return bRet;
|
|
}
|
|
|
|
void OStaticSet::fillAllRows()
|
|
{
|
|
if(!m_bEnd)
|
|
{
|
|
sal_Int32 nColumnCount = m_xSetMetaData->getColumnCount();
|
|
while(m_xDriverSet->next())
|
|
{
|
|
ORowSetRow pRow = new connectivity::ORowVector< connectivity::ORowSetValue >(nColumnCount);
|
|
m_aSet.push_back(pRow);
|
|
m_aSetIter = m_aSet.end() - 1;
|
|
(pRow->get())[0] = getRow();
|
|
OCacheSet::fillValueRow(pRow,(pRow->get())[0]);
|
|
}
|
|
m_bEnd = true;
|
|
}
|
|
}
|
|
|
|
// XResultSet
|
|
bool SAL_CALL OStaticSet::next()
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
|
|
if(isAfterLast())
|
|
return false;
|
|
if(!m_bEnd) // not yet all records fetched
|
|
{
|
|
++m_aSetIter;
|
|
if(m_aSetIter == m_aSet.end() && !fetchRow())
|
|
m_aSetIter = m_aSet.end();
|
|
}
|
|
else if(!isAfterLast())
|
|
++m_aSetIter;
|
|
return !isAfterLast();
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::isBeforeFirst( )
|
|
{
|
|
return m_aSetIter == m_aSet.begin();
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::isAfterLast( )
|
|
{
|
|
return m_aSetIter == m_aSet.end() && m_bEnd;
|
|
}
|
|
|
|
void SAL_CALL OStaticSet::beforeFirst( )
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
m_aSetIter = m_aSet.begin();
|
|
}
|
|
|
|
void SAL_CALL OStaticSet::afterLast( )
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
fillAllRows();
|
|
m_aSetIter = m_aSet.end();
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::first()
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
m_aSetIter = m_aSet.begin()+1;
|
|
if(m_aSetIter == m_aSet.end() && !fetchRow())
|
|
m_aSetIter = m_aSet.end();
|
|
|
|
return m_aSetIter != m_aSet.end();
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::last()
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
fillAllRows();
|
|
m_aSetIter = m_aSet.end()-1;
|
|
|
|
return !isBeforeFirst() && !isAfterLast();
|
|
}
|
|
|
|
sal_Int32 SAL_CALL OStaticSet::getRow( )
|
|
{
|
|
OSL_ENSURE(!isAfterLast(),"getRow is not allowed when afterlast record!");
|
|
OSL_ENSURE(!isBeforeFirst(),"getRow is not allowed when beforefirst record!");
|
|
|
|
sal_Int32 nPos = m_aSet.size() - (m_aSet.end() - m_aSetIter);
|
|
OSL_ENSURE(nPos > 0,"RowPos is < 0");
|
|
return nPos;
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::absolute( sal_Int32 row )
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
OSL_ENSURE(row,"OStaticSet::absolute: INVALID row number!");
|
|
// if row greater 0 than count from end - row means last
|
|
if(row < 0)
|
|
{
|
|
if(!m_bEnd)
|
|
fillAllRows();
|
|
|
|
sal_Int32 nRow = getRow();
|
|
nRow += row;
|
|
if(nRow <= (sal_Int32)m_aSet.size())
|
|
m_aSetIter = m_aSet.begin() + nRow;
|
|
else
|
|
m_aSetIter = m_aSet.begin();
|
|
}
|
|
else if(row > 0)
|
|
{
|
|
if(row >= (sal_Int32)m_aSet.size())
|
|
{
|
|
if(!m_bEnd)
|
|
{
|
|
bool bNext = true;
|
|
for(sal_Int32 i=m_aSet.size()-1;i < row && bNext;++i)
|
|
bNext = fetchRow();
|
|
}
|
|
|
|
if(row > (sal_Int32)m_aSet.size())
|
|
m_aSetIter = m_aSet.end(); // check again
|
|
else
|
|
m_aSetIter = m_aSet.begin() + row;
|
|
}
|
|
else
|
|
m_aSetIter = m_aSet.begin() + row;
|
|
}
|
|
|
|
return m_aSetIter != m_aSet.end() && m_aSetIter != m_aSet.begin();
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::previous( )
|
|
{
|
|
m_bInserted = m_bUpdated = m_bDeleted = false;
|
|
|
|
if(m_aSetIter != m_aSet.begin())
|
|
--m_aSetIter;
|
|
|
|
return m_aSetIter != m_aSet.begin();
|
|
}
|
|
|
|
void SAL_CALL OStaticSet::refreshRow( )
|
|
{
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::rowUpdated( )
|
|
{
|
|
return m_bUpdated;
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::rowInserted( )
|
|
{
|
|
return m_bInserted;
|
|
}
|
|
|
|
bool SAL_CALL OStaticSet::rowDeleted( )
|
|
{
|
|
return m_bDeleted;
|
|
}
|
|
|
|
void SAL_CALL OStaticSet::insertRow( const ORowSetRow& _rInsertRow,const connectivity::OSQLTable& _xTable )
|
|
{
|
|
OCacheSet::insertRow( _rInsertRow,_xTable);
|
|
if(m_bInserted)
|
|
{
|
|
m_aSet.push_back(new ORowVector< ORowSetValue >(*_rInsertRow)); // we don't know where the new row is so we append it to the current rows
|
|
m_aSetIter = m_aSet.end() - 1;
|
|
((*m_aSetIter)->get())[0] = (_rInsertRow->get())[0] = getBookmark();
|
|
m_bEnd = false;
|
|
}
|
|
}
|
|
|
|
void SAL_CALL OStaticSet::deleteRow(const ORowSetRow& _rDeleteRow ,const connectivity::OSQLTable& _xTable )
|
|
{
|
|
OCacheSet::deleteRow(_rDeleteRow,_xTable);
|
|
if(m_bDeleted)
|
|
{
|
|
ORowSetMatrix::iterator aPos = m_aSet.begin()+(_rDeleteRow->get())[0].getInt32();
|
|
if(aPos == (m_aSet.end()-1))
|
|
m_aSetIter = m_aSet.end();
|
|
m_aSet.erase(aPos);
|
|
}
|
|
}
|
|
|
|
void OStaticSet::reset(const Reference< XResultSet> &_xDriverSet)
|
|
{
|
|
OCacheSet::construct(_xDriverSet, m_sRowSetFilter);
|
|
{
|
|
ORowSetMatrix t;
|
|
m_aSet.swap(t);
|
|
}
|
|
m_aSetIter = m_aSet.end();
|
|
m_bEnd = false;
|
|
m_aSet.push_back(nullptr); // this is the beforefirst record
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|