// // MySQLException.cpp // // Library: Data/MySQL // Package: MySQL // Module: Extractor // // Copyright (c) 2008, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "Poco/Data/MySQL/Extractor.h" #include "Poco/Data/Date.h" #include "Poco/Data/Time.h" namespace Poco { namespace Data { namespace MySQL { Extractor::Extractor(StatementExecutor& st, ResultMetadata& md): _stmt(st), _metadata(md) { } Extractor::~Extractor() { } bool Extractor::extract(std::size_t pos, Poco::Int8& val) { return realExtractFixed(pos, MYSQL_TYPE_TINY, &val); } bool Extractor::extract(std::size_t pos, Poco::UInt8& val) { return realExtractFixed(pos, MYSQL_TYPE_TINY, &val, true); } bool Extractor::extract(std::size_t pos, Poco::Int16& val) { return realExtractFixed(pos, MYSQL_TYPE_SHORT, &val); } bool Extractor::extract(std::size_t pos, Poco::UInt16& val) { return realExtractFixed(pos, MYSQL_TYPE_SHORT, &val, true); } bool Extractor::extract(std::size_t pos, Poco::Int32& val) { return realExtractFixed(pos, MYSQL_TYPE_LONG, &val); } bool Extractor::extract(std::size_t pos, Poco::UInt32& val) { return realExtractFixed(pos, MYSQL_TYPE_LONG, &val, true); } bool Extractor::extract(std::size_t pos, Poco::Int64& val) { return realExtractFixed(pos, MYSQL_TYPE_LONGLONG, &val); } bool Extractor::extract(std::size_t pos, Poco::UInt64& val) { return realExtractFixed(pos, MYSQL_TYPE_LONGLONG, &val, true); } #ifndef POCO_INT64_IS_LONG bool Extractor::extract(std::size_t pos, long& val) { return realExtractFixed(pos, MYSQL_TYPE_LONG, &val); } bool Extractor::extract(std::size_t pos, unsigned long& val) { return realExtractFixed(pos, MYSQL_TYPE_LONG, &val, true); } #endif bool Extractor::extract(std::size_t pos, bool& val) { return realExtractFixed(pos, MYSQL_TYPE_TINY, &val); } bool Extractor::extract(std::size_t pos, float& val) { return realExtractFixed(pos, MYSQL_TYPE_FLOAT, &val); } bool Extractor::extract(std::size_t pos, double& val) { return realExtractFixed(pos, MYSQL_TYPE_DOUBLE, &val); } bool Extractor::extract(std::size_t pos, char& val) { return realExtractFixed(pos, MYSQL_TYPE_TINY, &val); } bool Extractor::extract(std::size_t pos, std::string& val) { if (_metadata.columnsReturned() <= pos) throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); if (_metadata.isNull(static_cast(pos))) return false; //mysql reports TEXT types as FDT_BLOB when being extracted MetaColumn::ColumnDataType columnType = _metadata.metaColumn(static_cast(pos)).type(); if (columnType != Poco::Data::MetaColumn::FDT_STRING && columnType != Poco::Data::MetaColumn::FDT_BLOB) throw MySQLException("Extractor: not a string"); val.assign(reinterpret_cast(_metadata.rawData(pos)), _metadata.length(pos)); return true; } bool Extractor::extract(std::size_t pos, Poco::Data::BLOB& val) { if (_metadata.columnsReturned() <= pos) throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); if (_metadata.isNull(static_cast(pos))) return false; if (_metadata.metaColumn(static_cast(pos)).type() != Poco::Data::MetaColumn::FDT_BLOB) throw MySQLException("Extractor: not a blob"); val.assignRaw(_metadata.rawData(pos), _metadata.length(pos)); return true; } bool Extractor::extract(std::size_t pos, Poco::Data::CLOB& val) { if (_metadata.columnsReturned() <= pos) throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); if (_metadata.isNull(static_cast(pos))) return false; if (_metadata.metaColumn(static_cast(pos)).type() != Poco::Data::MetaColumn::FDT_BLOB) throw MySQLException("Extractor: not a blob"); val.assignRaw(reinterpret_cast(_metadata.rawData(pos)), _metadata.length(pos)); return true; } bool Extractor::extract(std::size_t pos, DateTime& val) { MYSQL_TIME mt = {0}; if (!realExtractFixed(pos, MYSQL_TYPE_DATETIME, &mt)) return false; val.assign(mt.year, mt.month, mt.day, mt.hour, mt.minute, mt.second, mt.second_part / 1000, mt.second_part % 1000); return true; } bool Extractor::extract(std::size_t pos, Date& val) { MYSQL_TIME mt = {0}; if (!realExtractFixed(pos, MYSQL_TYPE_DATE, &mt)) return false; val.assign(mt.year, mt.month, mt.day); return true; } bool Extractor::extract(std::size_t pos, Time& val) { MYSQL_TIME mt = {0}; if (!realExtractFixed(pos, MYSQL_TYPE_TIME, &mt)) return false; val.assign(mt.hour, mt.minute, mt.second); return true; } bool Extractor::extract(std::size_t pos, Any& val) { return false; } bool Extractor::extract(std::size_t pos, Dynamic::Var& val) { return false; } bool Extractor::isNull(std::size_t col, std::size_t row) { poco_assert(row == POCO_DATA_INVALID_ROW); if (_metadata.columnsReturned() <= col) throw MySQLException("Extractor: attempt to extract more parameters, than query result contain"); if (_metadata.isNull(static_cast(col))) return true; return false; } void Extractor::reset() { AbstractExtractor::reset(); } bool Extractor::realExtractFixed(std::size_t pos, enum_field_types type, void* buffer, bool isUnsigned) { MYSQL_BIND bind = {0}; my_bool isNull = 0; bind.is_null = &isNull; bind.buffer_type = type; bind.buffer = buffer; bind.is_unsigned = isUnsigned; if (!_stmt.fetchColumn(pos, &bind)) return false; return isNull == 0; } ////////////// // Not implemented ////////////// bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } #ifndef POCO_INT64_IS_LONG bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } #endif bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector& ) { throw NotImplementedException("std::vector extractor must be implemented."); } bool Extractor::extract(std::size_t , std::deque& ) { throw NotImplementedException("std::deque extractor must be implemented."); } bool Extractor::extract(std::size_t , std::list& ) { throw NotImplementedException("std::list extractor must be implemented."); } bool Extractor::extract(std::size_t , std::vector