From fe7230a6d54d55b150c084e2ab09e74c5aa07794 Mon Sep 17 00:00:00 2001 From: Erbengi <31409742+Erbengi@users.noreply.github.com> Date: Mon, 4 Sep 2017 17:59:13 +0200 Subject: [PATCH] Implement extraction of Dynamic::Var and Any in MySQL extractor (#1863) (#1872) * Implement extraction of Dynamic::Var and Any in MySQL extractor (#1863) * Remove probably unnecessary include from SQLExecutor --- .../MySQL/include/Poco/Data/MySQL/Extractor.h | 104 ++++++++++++++ Data/MySQL/src/Extractor.cpp | 5 +- Data/MySQL/testsuite/src/MySQLTest.cpp | 29 ++++ Data/MySQL/testsuite/src/MySQLTest.h | 4 + Data/MySQL/testsuite/src/SQLExecutor.cpp | 128 +++++++++++++++++- Data/MySQL/testsuite/src/SQLExecutor.h | 2 + 6 files changed, 265 insertions(+), 7 deletions(-) diff --git a/Data/MySQL/include/Poco/Data/MySQL/Extractor.h b/Data/MySQL/include/Poco/Data/MySQL/Extractor.h index f3b00d6ac..e6148a427 100644 --- a/Data/MySQL/include/Poco/Data/MySQL/Extractor.h +++ b/Data/MySQL/include/Poco/Data/MySQL/Extractor.h @@ -25,6 +25,8 @@ #include "Poco/Data/MySQL/ResultMetadata.h" #include "Poco/Data/AbstractExtractor.h" #include "Poco/Data/LOB.h" +#include "Poco/Data/Date.h" +#include "Poco/Data/Time.h" namespace Poco { @@ -324,6 +326,17 @@ private: bool realExtractFixed(std::size_t pos, enum_field_types type, void* buffer, bool isUnsigned = false); bool realExtractFixedBlob(std::size_t pos, enum_field_types type, void* buffer, size_t len); + template + T extractAny(std::size_t pos, bool& success) + { + T value; + success = extract(pos, value); + return value; + } + + template + bool extractToDynamic(std::size_t pos, T& val); + // Prevent VC8 warning "operator= could not be generated" Extractor& operator=(const Extractor&); @@ -333,6 +346,97 @@ private: ResultMetadata& _metadata; }; +template +bool Extractor::extractToDynamic(std::size_t pos, T &val) +{ + MetaColumn::ColumnDataType columnType = _metadata.metaColumn(static_cast(pos)).type(); + + T resultValue; + bool success = false; + + switch (columnType) + { + case MetaColumn::FDT_BOOL: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_INT8: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_UINT8: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_INT16: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_UINT16: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_INT32: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_UINT32: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_INT64: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_UINT64: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_FLOAT: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_DOUBLE: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_STRING: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_WSTRING: + return false; + + case MetaColumn::FDT_BLOB: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_CLOB: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_DATE: + resultValue = extractAny(pos, success); + break; + + case MetaColumn::FDT_TIME: + resultValue = extractAny