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