// // 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/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 { RecordSet::RecordSet(const Statement& rStatement, RowFormatter::Ptr pRowFormatter): Statement(rStatement), _currentRow(0), _pBegin(new RowIterator(this, 0 == rowsExtracted())), _pEnd(new RowIterator(this, true)) { 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)) { if (pRowFormatter) setRowFormatter(pRowFormatter); } RecordSet::RecordSet(const RecordSet& other): Statement(other.impl()), _currentRow(other._currentRow), _pBegin(new RowIterator(this, 0 == rowsExtracted())), _pEnd(new RowIterator(this, true)), _pFilter(other._pFilter) { } RecordSet::~RecordSet() { try { delete _pBegin; delete _pEnd; RowMap::iterator it = _rowMap.begin(); RowMap::iterator itEnd = _rowMap.end(); for (; it != itEnd; ++it) delete it->second; } catch (...) { poco_unexpected(); } } RecordSet& RecordSet::reset(const Statement& stmt) { delete _pBegin; _pBegin = 0; delete _pEnd; _pEnd = 0; _currentRow = 0; Statement::setTotalRowCount(StatementImpl::UNKNOWN_TOTAL_ROW_COUNT); RowMap::iterator it = _rowMap.begin(); RowMap::iterator end = _rowMap.end(); for (; it != end; ++it) delete it->second; _rowMap.clear(); Statement::operator = (stmt); _pBegin = new RowIterator(this, 0 == rowsExtracted()); _pEnd = new RowIterator(this, true); return *this; } Poco::Dynamic::Var RecordSet::value(std::size_t col, std::size_t dataRow, bool useFilter) const { if (useFilter && isFiltered() && !isAllowed(dataRow)) throw InvalidAccessException("Row not allowed"); if (isNull(col, dataRow)) return Poco::Dynamic::Var(); switch (columnType(col)) { case MetaColumn::FDT_BOOL: return value(col, dataRow, useFilter); case MetaColumn::FDT_INT8: return value(col, dataRow, useFilter); case MetaColumn::FDT_UINT8: return value(col, dataRow, useFilter); case MetaColumn::FDT_INT16: return value(col, dataRow, useFilter); case MetaColumn::FDT_UINT16: return value(col, dataRow, useFilter); case MetaColumn::FDT_INT32: return value(col, dataRow, useFilter); case MetaColumn::FDT_UINT32: return value(col, dataRow, useFilter); case MetaColumn::FDT_INT64: return value(col, dataRow, useFilter); case MetaColumn::FDT_UINT64: return value(col, dataRow, useFilter); case MetaColumn::FDT_FLOAT: return value(col, dataRow, useFilter); case MetaColumn::FDT_DOUBLE: return value(col, dataRow, useFilter); case MetaColumn::FDT_STRING: return value(col, dataRow, useFilter); case MetaColumn::FDT_WSTRING: return value(col, dataRow, useFilter); case MetaColumn::FDT_BLOB: return value(col, dataRow, useFilter); case MetaColumn::FDT_CLOB: return value(col, dataRow, useFilter); case MetaColumn::FDT_DATE: return value(col, dataRow, useFilter); case MetaColumn::FDT_TIME: return value