// // RecordSet.cpp // // Library: Data // Package: DataCore // Module: RecordSet // // Copyright (c) 2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "Poco/Data/RecordSet.h" #include "Poco/Data/Extraction.h" #include "Poco/Data/RowFilter.h" #include "Poco/Data/Date.h" #include "Poco/Data/Time.h" #include "Poco/Data/DataException.h" #include "Poco/DateTime.h" #include "Poco/UTFString.h" using namespace Poco::Data::Keywords; using Poco::DateTime; using Poco::UTF16String; namespace Poco { namespace Data { const std::size_t RecordSet::UNKNOWN_TOTAL_ROW_COUNT = std::numeric_limits::max(); RecordSet::RecordSet(const Statement& rStatement, RowFormatter::Ptr pRowFormatter): Statement(rStatement), _currentRow(0), _pBegin(new RowIterator(this, 0 == rowsExtracted())), _pEnd(new RowIterator(this, true)), _totalRowCount(UNKNOWN_TOTAL_ROW_COUNT) { if (pRowFormatter) setRowFormatter(pRowFormatter); } RecordSet::RecordSet(Session& rSession, const std::string& query, RowFormatter::Ptr pRowFormatter): Statement((rSession << query, now)), _currentRow(0), _pBegin(new RowIterator(this, 0 == rowsExtracted())), _pEnd(new RowIterator(this, true)), _totalRowCount(UNKNOWN_TOTAL_ROW_COUNT) { if (pRowFormatter) setRowFormatter(pRowFormatter); } RecordSet::RecordSet(const RecordSet& other): Statement(other), _currentRow(other._currentRow), _pBegin(new RowIterator(this, 0 == rowsExtracted())), _pEnd(new RowIterator(this, true)), _rowMap(other._rowMap), _pFilter(other._pFilter), _totalRowCount(other._totalRowCount) { } RecordSet::RecordSet(RecordSet&& other) noexcept: Statement(std::move(other)), _currentRow(other._currentRow), _pBegin(new RowIterator(this, 0 == rowsExtracted())), _pEnd(new RowIterator(this, true)), _rowMap(std::move(other._rowMap)), _pFilter(other._pFilter), _totalRowCount(other._totalRowCount) { other._currentRow = 0; delete other._pBegin; other._pBegin = nullptr; delete other._pEnd; other._pEnd = nullptr; other._rowMap.clear(); other._pFilter.reset(); other._totalRowCount = UNKNOWN_TOTAL_ROW_COUNT; } RecordSet::~RecordSet() { try { delete _pBegin; delete _pEnd; } catch (...) { poco_unexpected(); } } RecordSet& RecordSet::operator = (RecordSet&& other) noexcept { Statement::operator = (std::move(other)); _currentRow = std::move(other._currentRow); other._currentRow = 0; _pBegin = new RowIterator(this, 0 == rowsExtracted()); delete other._pBegin; other._pBegin = nullptr; _pEnd = new RowIterator(this, true); delete other._pEnd; other._pEnd = nullptr; _rowMap = std::move(other._rowMap); other._rowMap.clear(); _pFilter = std::move(other._pFilter); other._pFilter.reset(); _totalRowCount = std::move(other._totalRowCount); other._totalRowCount = UNKNOWN_TOTAL_ROW_COUNT; return *this; } void RecordSet::reset(const Statement& stmt) { delete _pBegin; _pBegin = nullptr; delete _pEnd; _pEnd = nullptr; _currentRow = 0; _totalRowCount = UNKNOWN_TOTAL_ROW_COUNT; _rowMap.clear(); Statement::operator = (stmt); _pBegin = new RowIterator(this, 0 == rowsExtracted()); _pEnd = new RowIterator(this, true); } template const Column& RecordSet::column(const std::string& name) const /// Returns the reference to the first Column with the specified name. { if (isBulkExtraction()) { using E = InternalBulkExtraction; return columnImpl(name); } else { using E = InternalExtraction; return columnImpl(name); } } template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template Data_API const Column>& RecordSet::column>(const std::string& name) const; template const Column& RecordSet::column(std::size_t pos) const /// Returns the reference to column at specified position. { if (isBulkExtraction()) { using E = InternalBulkExtraction; return columnImpl(pos); } else { using E = InternalExtraction; return columnImpl(pos); } } template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template Data_API const Column>& RecordSet::column>(std::size_t pos) const; template const T& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const /// Returns the reference to data value at [col, row] location. { if (useFilter && isFiltered() && !isAllowed(row)) throw InvalidAccessException("Row not allowed"); switch (storage()) { case STORAGE_VECTOR: { using C = typename std::vector; return column(col).value(row); } case STORAGE_LIST: { using C = typename std::list; return column(col).value(row); } case STORAGE_DEQUE: case STORAGE_UNKNOWN: { using C = typename std::deque; return column(col).value(row); } default: throw IllegalStateException("Invalid storage setting."); } } template Data_API const bool& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const UInt8& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const Int16& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const UInt16& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const Int32& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const UInt32& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const Int64& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const UInt64& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const float& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const double& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const std::string& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const UTF16String& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const BLOB& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const CLOB& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const Date& RecordSet::value(std::size_t col, std::size_t row, bool useFilter) const; template Data_API const Time& RecordSet::value