Insert NULL using BULK #4001 (#4755)

* fix(ODBC): Insert NULL using BULK #4001
resolve bound types and sizes at compile time

* fix: remove string suffix for static_assert

* Insert NULL using BULK #4001

* fix: typo

* fix(SQLite): missing functions; consolidate extract calls

* chore(SQLite): remove unnecessary typedef

* fix(SQLite): remove duplicate functions

* fix(SQLite): compile errors and warnings

* fix(SQLite): extract implementation signatures

* fix(SQLite): long64 platforms compile errors

* fix(SQLite): long64 platforms compile errors, part ii

* fix(ODBC): windows build

* fix(ODBC): MSSQL big string on windows

* fix(Data): psql and mysql compile errors

* fix(PostgreSQL): add missing functions

* fix(ODBC): revert column size discovery (breaks Oracle)

* fix(PostgreSQL): Nullable extraction #4001

* fix(MySQL): Nullable extraction #4001

* chore(Data): code tidy up

* fix(ODBC): add missing changes
This commit is contained in:
Aleksandar Fabijanic 2024-11-11 11:23:21 -06:00 committed by GitHub
parent fe9c13102d
commit 9530a77347
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
43 changed files with 5512 additions and 1313 deletions

View File

@ -242,6 +242,7 @@ public:
"SELECT * FROM Vectors ORDER BY int0 ASC", "SELECT * FROM Vectors ORDER BY int0 ASC",
const std::string& intFldName = "int0"); const std::string& intFldName = "int0");
void nullBulk(const std::string& blobPlaceholder = "?"s);
void internalBulkExtraction(); void internalBulkExtraction();
void internalBulkExtractionUTF16(); void internalBulkExtractionUTF16();
void internalStorageType(); void internalStorageType();

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,8 @@
#include "Poco/Data/MySQL/ResultMetadata.h" #include "Poco/Data/MySQL/ResultMetadata.h"
#include "Poco/Data/AbstractExtractor.h" #include "Poco/Data/AbstractExtractor.h"
#include "Poco/Data/LOB.h" #include "Poco/Data/LOB.h"
#include "Poco/Dynamic/Var.h"
#include "Poco/Nullable.h"
namespace Poco { namespace Poco {
@ -48,276 +50,359 @@ public:
virtual ~Extractor(); virtual ~Extractor();
/// Destroys the Extractor. /// Destroys the Extractor.
virtual bool extract(std::size_t pos, Poco::Int8& val); bool extract(std::size_t pos, Poco::Int8& val) override;
/// Extracts an Int8. /// Extracts an Int8.
virtual bool extract(std::size_t pos, Poco::UInt8& val); bool extract(std::size_t pos, Poco::UInt8& val) override;
/// Extracts an UInt8. /// Extracts an UInt8.
virtual bool extract(std::size_t pos, Poco::Int16& val); bool extract(std::size_t pos, Poco::Int16& val) override;
/// Extracts an Int16. /// Extracts an Int16.
virtual bool extract(std::size_t pos, Poco::UInt16& val); bool extract(std::size_t pos, Poco::UInt16& val) override;
/// Extracts an UInt16. /// Extracts an UInt16.
virtual bool extract(std::size_t pos, Poco::Int32& val); bool extract(std::size_t pos, Poco::Int32& val) override;
/// Extracts an Int32. /// Extracts an Int32.
virtual bool extract(std::size_t pos, Poco::UInt32& val); bool extract(std::size_t pos, Poco::UInt32& val) override;
/// Extracts an UInt32. /// Extracts an UInt32.
virtual bool extract(std::size_t pos, Poco::Int64& val); bool extract(std::size_t pos, Poco::Int64& val) override;
/// Extracts an Int64. /// Extracts an Int64.
virtual bool extract(std::size_t pos, Poco::UInt64& val); bool extract(std::size_t pos, Poco::UInt64& val) override;
/// Extracts an UInt64. /// Extracts an UInt64.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, long& val); bool extract(std::size_t pos, long& val) override;
/// Extracts a long. Returns false if null was received. /// Extracts a long. Returns false if null was received.
virtual bool extract(std::size_t pos, unsigned long& val); bool extract(std::size_t pos, unsigned long& val) override;
/// Extracts an unsigned long. Returns false if null was received. /// Extracts an unsigned long. Returns false if null was received.
#endif #endif
virtual bool extract(std::size_t pos, bool& val); bool extract(std::size_t pos, bool& val) override;
/// Extracts a boolean. /// Extracts a boolean.
virtual bool extract(std::size_t pos, float& val); bool extract(std::size_t pos, float& val) override;
/// Extracts a float. /// Extracts a float.
virtual bool extract(std::size_t pos, double& val); bool extract(std::size_t pos, double& val) override;
/// Extracts a double. /// Extracts a double.
virtual bool extract(std::size_t pos, char& val); bool extract(std::size_t pos, char& val) override;
/// Extracts a single character. /// Extracts a single character.
virtual bool extract(std::size_t pos, std::string& val); bool extract(std::size_t pos, std::string& val) override;
/// Extracts a string. /// Extracts a string.
virtual bool extract(std::size_t pos, Poco::Data::BLOB& val); bool extract(std::size_t pos, Poco::Data::BLOB& val) override;
/// Extracts a BLOB. /// Extracts a BLOB.
virtual bool extract(std::size_t pos, Poco::Data::CLOB& val); bool extract(std::size_t pos, Poco::Data::CLOB& val) override;
/// Extracts a CLOB. /// Extracts a CLOB.
virtual bool extract(std::size_t pos, DateTime& val); bool extract(std::size_t pos, DateTime& val) override;
/// Extracts a DateTime. Returns false if null was received. /// Extracts a DateTime. Returns false if null was received.
virtual bool extract(std::size_t pos, Date& val); bool extract(std::size_t pos, Date& val) override;
/// Extracts a Date. Returns false if null was received. /// Extracts a Date. Returns false if null was received.
virtual bool extract(std::size_t pos, Time& val); bool extract(std::size_t pos, Time& val) override;
/// Extracts a Time. Returns false if null was received. /// Extracts a Time. Returns false if null was received.
virtual bool extract(std::size_t pos, UUID& val); bool extract(std::size_t pos, UUID& val) override;
/// Extracts a UUID. Returns false if null was received. /// Extracts a UUID. Returns false if null was received.
virtual bool extract(std::size_t pos, Any& val); bool extract(std::size_t pos, Any& val) override;
/// Extracts an Any. Returns false if null was received. /// Extracts an Any. Returns false if null was received.
virtual bool extract(std::size_t pos, Dynamic::Var& val); bool extract(std::size_t pos, Dynamic::Var& val) override;
/// Extracts a Dynamic::Var. Returns false if null was received. /// Extracts a Dynamic::Var. Returns false if null was received.
virtual bool isNull(std::size_t col, std::size_t row); bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val) override;
/// Extracts a nullable nullable Int8.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val) override;
/// Extracts a nullable nullable UInt8.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val) override;
/// Extracts a nullable nullable Int16.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val) override;
/// Extracts a nullable nullable UInt16.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val) override;
/// Extracts a nullable nullable Int32.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val) override;
/// Extracts a nullable nullable UInt32.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val) override;
/// Extracts a nullable nullable Int64.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val) override;
/// Extracts a nullable nullable UInt64.
#ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, Poco::Nullable<long>& val) override;
/// Extracts a nullable long.
bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val) override;
/// Extracts a nullable nullable unsigned long.
#endif
bool extract(std::size_t pos, Poco::Nullable<bool>& val) override;
/// Extracts a nullable boolean.
bool extract(std::size_t pos, Poco::Nullable<float>& val) override;
/// Extracts a nullable float.
bool extract(std::size_t pos, Poco::Nullable<double>& val) override;
/// Extracts a nullable double.
bool extract(std::size_t pos, Poco::Nullable<char>& val) override;
/// Extracts a nullable single character.
bool extract(std::size_t pos, Poco::Nullable<std::string>& val) override;
/// Extracts a nullable string.
bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val) override;
/// Extracts a nullable UTF16String.
bool extract(std::size_t pos, Poco::Nullable<BLOB>& val) override;
/// Extracts a nullable BLOB.
bool extract(std::size_t pos, Poco::Nullable<CLOB>& val) override;
/// Extracts a nullable CLOB.
bool extract(std::size_t pos, Poco::Nullable<DateTime>& val) override;
/// Extracts a nullable DateTime.
bool extract(std::size_t pos, Poco::Nullable<Date>& val) override;
/// Extracts a nullable Date.
bool extract(std::size_t pos, Poco::Nullable<Time>& val) override;
/// Extracts a nullable Time.
bool extract(std::size_t pos, Poco::Nullable<UUID>& val) override;
/// Extracts a nullable UUID.
bool extract(std::size_t pos, Poco::Nullable<Any>& val) override;
/// Extracts a nullable nullable Any.
bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val) override;
/// Extracts a nullable Var.
bool isNull(std::size_t col, std::size_t row) override;
/// Returns true if the value at [col,row] position is null. /// Returns true if the value at [col,row] position is null.
virtual void reset(); void reset() override;
/// Resets any information internally cached by the extractor. /// Resets any information internally cached by the extractor.
//////////// ////////////
// Not implemented extract functions // Not implemented extract functions
//////////// ////////////
virtual bool extract(std::size_t pos, std::vector<Poco::Int8>& val); bool extract(std::size_t pos, std::vector<Poco::Int8>& val) override;
/// Extracts an Int8 vector. /// Extracts an Int8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int8>& val); bool extract(std::size_t pos, std::deque<Poco::Int8>& val) override;
/// Extracts an Int8 deque. /// Extracts an Int8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int8>& val); bool extract(std::size_t pos, std::list<Poco::Int8>& val) override;
/// Extracts an Int8 list. /// Extracts an Int8 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt8>& val); bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) override;
/// Extracts an UInt8 vector. /// Extracts an UInt8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt8>& val); bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) override;
/// Extracts an UInt8 deque. /// Extracts an UInt8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt8>& val); bool extract(std::size_t pos, std::list<Poco::UInt8>& val) override;
/// Extracts an UInt8 list. /// Extracts an UInt8 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int16>& val); bool extract(std::size_t pos, std::vector<Poco::Int16>& val) override;
/// Extracts an Int16 vector. /// Extracts an Int16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int16>& val); bool extract(std::size_t pos, std::deque<Poco::Int16>& val) override;
/// Extracts an Int16 deque. /// Extracts an Int16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int16>& val); bool extract(std::size_t pos, std::list<Poco::Int16>& val) override;
/// Extracts an Int16 list. /// Extracts an Int16 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt16>& val); bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) override;
/// Extracts an UInt16 vector. /// Extracts an UInt16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt16>& val); bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) override;
/// Extracts an UInt16 deque. /// Extracts an UInt16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt16>& val); bool extract(std::size_t pos, std::list<Poco::UInt16>& val) override;
/// Extracts an UInt16 list. /// Extracts an UInt16 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int32>& val); bool extract(std::size_t pos, std::vector<Poco::Int32>& val) override;
/// Extracts an Int32 vector. /// Extracts an Int32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int32>& val); bool extract(std::size_t pos, std::deque<Poco::Int32>& val) override;
/// Extracts an Int32 deque. /// Extracts an Int32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int32>& val); bool extract(std::size_t pos, std::list<Poco::Int32>& val) override;
/// Extracts an Int32 list. /// Extracts an Int32 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt32>& val); bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) override;
/// Extracts an UInt32 vector. /// Extracts an UInt32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt32>& val); bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) override;
/// Extracts an UInt32 deque. /// Extracts an UInt32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt32>& val); bool extract(std::size_t pos, std::list<Poco::UInt32>& val) override;
/// Extracts an UInt32 list. /// Extracts an UInt32 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int64>& val); bool extract(std::size_t pos, std::vector<Poco::Int64>& val) override;
/// Extracts an Int64 vector. /// Extracts an Int64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int64>& val); bool extract(std::size_t pos, std::deque<Poco::Int64>& val) override;
/// Extracts an Int64 deque. /// Extracts an Int64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int64>& val); bool extract(std::size_t pos, std::list<Poco::Int64>& val) override;
/// Extracts an Int64 list. /// Extracts an Int64 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt64>& val); bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) override;
/// Extracts an UInt64 vector. /// Extracts an UInt64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt64>& val); bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) override;
/// Extracts an UInt64 deque. /// Extracts an UInt64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt64>& val); bool extract(std::size_t pos, std::list<Poco::UInt64>& val) override;
/// Extracts an UInt64 list. /// Extracts an UInt64 list.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, std::vector<long>& val); bool extract(std::size_t pos, std::vector<long>& val) override;
/// Extracts a long vector. /// Extracts a long vector.
virtual bool extract(std::size_t pos, std::deque<long>& val); bool extract(std::size_t pos, std::deque<long>& val) override;
/// Extracts a long deque. /// Extracts a long deque.
virtual bool extract(std::size_t pos, std::list<long>& val); bool extract(std::size_t pos, std::list<long>& val) override;
/// Extracts a long list.
bool extract(std::size_t pos, std::vector<unsigned long>& val) override;
/// Extracts a long vector.
bool extract(std::size_t pos, std::deque<unsigned long>& val) override;
/// Extracts a long deque.
bool extract(std::size_t pos, std::list<unsigned long>& val) override;
/// Extracts a long list. /// Extracts a long list.
#endif #endif
virtual bool extract(std::size_t pos, std::vector<bool>& val); bool extract(std::size_t pos, std::vector<bool>& val) override;
/// Extracts a boolean vector. /// Extracts a boolean vector.
virtual bool extract(std::size_t pos, std::deque<bool>& val); bool extract(std::size_t pos, std::deque<bool>& val) override;
/// Extracts a boolean deque. /// Extracts a boolean deque.
virtual bool extract(std::size_t pos, std::list<bool>& val); bool extract(std::size_t pos, std::list<bool>& val) override;
/// Extracts a boolean list. /// Extracts a boolean list.
virtual bool extract(std::size_t pos, std::vector<float>& val); bool extract(std::size_t pos, std::vector<float>& val) override;
/// Extracts a float vector. /// Extracts a float vector.
virtual bool extract(std::size_t pos, std::deque<float>& val); bool extract(std::size_t pos, std::deque<float>& val) override;
/// Extracts a float deque. /// Extracts a float deque.
virtual bool extract(std::size_t pos, std::list<float>& val); bool extract(std::size_t pos, std::list<float>& val) override;
/// Extracts a float list. /// Extracts a float list.
virtual bool extract(std::size_t pos, std::vector<double>& val); bool extract(std::size_t pos, std::vector<double>& val) override;
/// Extracts a double vector. /// Extracts a double vector.
virtual bool extract(std::size_t pos, std::deque<double>& val); bool extract(std::size_t pos, std::deque<double>& val) override;
/// Extracts a double deque. /// Extracts a double deque.
virtual bool extract(std::size_t pos, std::list<double>& val); bool extract(std::size_t pos, std::list<double>& val) override;
/// Extracts a double list. /// Extracts a double list.
virtual bool extract(std::size_t pos, std::vector<char>& val); bool extract(std::size_t pos, std::vector<char>& val) override;
/// Extracts a character vector. /// Extracts a character vector.
virtual bool extract(std::size_t pos, std::deque<char>& val); bool extract(std::size_t pos, std::deque<char>& val) override;
/// Extracts a character deque. /// Extracts a character deque.
virtual bool extract(std::size_t pos, std::list<char>& val); bool extract(std::size_t pos, std::list<char>& val) override;
/// Extracts a character list. /// Extracts a character list.
virtual bool extract(std::size_t pos, std::vector<std::string>& val); bool extract(std::size_t pos, std::vector<std::string>& val) override;
/// Extracts a string vector. /// Extracts a string vector.
virtual bool extract(std::size_t pos, std::deque<std::string>& val); bool extract(std::size_t pos, std::deque<std::string>& val) override;
/// Extracts a string deque. /// Extracts a string deque.
virtual bool extract(std::size_t pos, std::list<std::string>& val); bool extract(std::size_t pos, std::list<std::string>& val) override;
/// Extracts a string list. /// Extracts a string list.
virtual bool extract(std::size_t pos, std::vector<BLOB>& val); bool extract(std::size_t pos, std::vector<BLOB>& val) override;
/// Extracts a BLOB vector. /// Extracts a BLOB vector.
virtual bool extract(std::size_t pos, std::deque<BLOB>& val); bool extract(std::size_t pos, std::deque<BLOB>& val) override;
/// Extracts a BLOB deque. /// Extracts a BLOB deque.
virtual bool extract(std::size_t pos, std::list<BLOB>& val); bool extract(std::size_t pos, std::list<BLOB>& val) override;
/// Extracts a BLOB list. /// Extracts a BLOB list.
virtual bool extract(std::size_t pos, std::vector<CLOB>& val); bool extract(std::size_t pos, std::vector<CLOB>& val) override;
/// Extracts a CLOB vector. /// Extracts a CLOB vector.
virtual bool extract(std::size_t pos, std::deque<CLOB>& val); bool extract(std::size_t pos, std::deque<CLOB>& val) override;
/// Extracts a CLOB deque. /// Extracts a CLOB deque.
virtual bool extract(std::size_t pos, std::list<CLOB>& val); bool extract(std::size_t pos, std::list<CLOB>& val) override;
/// Extracts a CLOB list. /// Extracts a CLOB list.
virtual bool extract(std::size_t pos, std::vector<DateTime>& val); bool extract(std::size_t pos, std::vector<DateTime>& val) override;
/// Extracts a DateTime vector. /// Extracts a DateTime vector.
virtual bool extract(std::size_t pos, std::deque<DateTime>& val); bool extract(std::size_t pos, std::deque<DateTime>& val) override;
/// Extracts a DateTime deque. /// Extracts a DateTime deque.
virtual bool extract(std::size_t pos, std::list<DateTime>& val); bool extract(std::size_t pos, std::list<DateTime>& val) override;
/// Extracts a DateTime list. /// Extracts a DateTime list.
virtual bool extract(std::size_t pos, std::vector<Date>& val); bool extract(std::size_t pos, std::vector<Date>& val) override;
/// Extracts a Date vector. /// Extracts a Date vector.
virtual bool extract(std::size_t pos, std::deque<Date>& val); bool extract(std::size_t pos, std::deque<Date>& val) override;
/// Extracts a Date deque. /// Extracts a Date deque.
virtual bool extract(std::size_t pos, std::list<Date>& val); bool extract(std::size_t pos, std::list<Date>& val) override;
/// Extracts a Date list. /// Extracts a Date list.
virtual bool extract(std::size_t pos, std::vector<Time>& val); bool extract(std::size_t pos, std::vector<Time>& val) override;
/// Extracts a Time vector. /// Extracts a Time vector.
virtual bool extract(std::size_t pos, std::deque<Time>& val); bool extract(std::size_t pos, std::deque<Time>& val) override;
/// Extracts a Time deque. /// Extracts a Time deque.
virtual bool extract(std::size_t pos, std::list<Time>& val); bool extract(std::size_t pos, std::list<Time>& val) override;
/// Extracts a Time list. /// Extracts a Time list.
virtual bool extract(std::size_t pos, std::vector<Any>& val); bool extract(std::size_t pos, std::vector<Any>& val) override;
/// Extracts an Any vector. /// Extracts an Any vector.
virtual bool extract(std::size_t pos, std::deque<Any>& val); bool extract(std::size_t pos, std::deque<Any>& val) override;
/// Extracts an Any deque. /// Extracts an Any deque.
virtual bool extract(std::size_t pos, std::list<Any>& val); bool extract(std::size_t pos, std::list<Any>& val) override;
/// Extracts an Any list. /// Extracts an Any list.
virtual bool extract(std::size_t pos, std::vector<Dynamic::Var>& val); bool extract(std::size_t pos, std::vector<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var vector. /// Extracts a Dynamic::Var vector.
virtual bool extract(std::size_t pos, std::deque<Dynamic::Var>& val); bool extract(std::size_t pos, std::deque<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var deque. /// Extracts a Dynamic::Var deque.
virtual bool extract(std::size_t pos, std::list<Dynamic::Var>& val); bool extract(std::size_t pos, std::list<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var list. /// Extracts a Dynamic::Var list.
private: private:
@ -331,6 +416,15 @@ private:
Extractor& operator=(const Extractor&); Extractor& operator=(const Extractor&);
private: private:
template <typename T>
bool extractNullable(std::size_t pos, Poco::Nullable<T>& val)
{
typename Poco::Nullable<T>::Type v;
if (!extract(pos, v)) val.clear();
else val = std::move(v);
return true;
}
StatementExecutor& _stmt; StatementExecutor& _stmt;
ResultMetadata& _metadata; ResultMetadata& _metadata;
}; };

View File

@ -285,13 +285,13 @@ bool Extractor::extractLongLOB(std::size_t pos)
// with a zero-length buffer to avoid allocating // with a zero-length buffer to avoid allocating
// huge amounts of memory. Therefore, when extracting // huge amounts of memory. Therefore, when extracting
// the buffers need to be adjusted. // the buffers need to be adjusted.
_metadata.adjustColumnSizeToFit(pos); _metadata.adjustColumnSizeToFit(pos);
MYSQL_BIND* row = _metadata.row(); MYSQL_BIND* row = _metadata.row();
if (!_stmt.fetchColumn(pos, &row[pos])) if (!_stmt.fetchColumn(pos, &row[pos]))
return false; return false;
return true; return true;
} }
@ -313,6 +313,154 @@ bool Extractor::extractJSON(std::size_t pos)
} }
#endif #endif
//////////////
// Nullable
//////////////
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val)
{
return extractNullable(pos, val);
}
#ifndef POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, Poco::Nullable<long>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<unsigned long>& val)
{
return extractNullable(pos, val);
}
#endif
bool Extractor::extract(std::size_t pos, Poco::Nullable<bool>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<float>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<double>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<char>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<std::string>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<UTF16String>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<BLOB>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<CLOB>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<DateTime>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Date>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Time>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<UUID>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Any>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val)
{
return extractNullable(pos, val);
}
////////////// //////////////
// Not implemented // Not implemented
////////////// //////////////
@ -479,6 +627,23 @@ bool Extractor::extract(std::size_t , std::list<long>& )
{ {
throw NotImplementedException("std::list extractor must be implemented."); throw NotImplementedException("std::list extractor must be implemented.");
} }
bool Extractor::extract(std::size_t , std::vector<unsigned long>& )
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool Extractor::extract(std::size_t , std::deque<unsigned long>& )
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool Extractor::extract(std::size_t , std::list<unsigned long>& )
{
throw NotImplementedException("std::list extractor must be implemented.");
}
#endif #endif

View File

@ -339,6 +339,27 @@ public:
void bind(std::size_t pos, const std::list<NullData>& val, Direction dir); void bind(std::size_t pos, const std::list<NullData>& val, Direction dir);
/// Binds a null list. /// Binds a null list.
template <typename T>
void bind(std::size_t pos, const std::vector<Nullable<T>>& val, Direction dir)
/// Binds a nullable vector.
{
bindImplNullableContainer(pos, val, dir);
}
template <typename T>
void bind(std::size_t pos, const std::deque<Nullable<T>>& val, Direction dir)
/// Binds a nullable deque.
{
bindImplNullableContainer(pos, val, dir);
}
template <typename T>
void bind(std::size_t pos, const std::list<Nullable<T>>& val, Direction dir)
/// Binds a nullable list.
{
bindImplNullableContainer(pos, val, dir);
}
void setDataBinding(ParameterBinding binding); void setDataBinding(ParameterBinding binding);
/// Set data binding type. /// Set data binding type.
@ -437,7 +458,7 @@ private:
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
SQL_PARAM_INPUT, SQL_PARAM_INPUT,
SQL_C_BINARY, SQL_C_BINARY,
Utility::sqlDataType(SQL_C_BINARY), TypeInfo::sqlDataType<SQL_C_BINARY>(),
columnSize, columnSize,
0, 0,
pVal, pVal,
@ -615,7 +636,7 @@ private:
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_CHAR, SQL_C_CHAR,
Utility::sqlDataType(SQL_C_CHAR), TypeInfo::sqlDataType<SQL_C_CHAR>(),
getStringColSize(size), getStringColSize(size),
0, 0,
_charPtrs[pos], _charPtrs[pos],
@ -682,7 +703,7 @@ private:
(SQLUSMALLINT)pos + 1, (SQLUSMALLINT)pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_WCHAR, SQL_C_WCHAR,
Utility::sqlDataType(SQL_C_WCHAR), TypeInfo::sqlDataType<SQL_C_WCHAR>(),
getStringColSize(size), getStringColSize(size),
0, 0,
_utf16CharPtrs[pos], _utf16CharPtrs[pos],
@ -752,7 +773,7 @@ private:
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
SQL_PARAM_INPUT, SQL_PARAM_INPUT,
SQL_C_BINARY, SQL_C_BINARY,
Utility::sqlDataType(SQL_C_BINARY), TypeInfo::sqlDataType<SQL_C_BINARY>(),
(SQLUINTEGER) size, (SQLUINTEGER) size,
0, 0,
_charPtrs[pos], _charPtrs[pos],
@ -801,7 +822,7 @@ private:
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_TYPE_DATE, SQL_C_TYPE_DATE,
Utility::sqlDataType(SQL_C_TYPE_DATE), TypeInfo::sqlDataType<SQL_C_TYPE_DATE>(),
colSize, colSize,
decDigits, decDigits,
(SQLPOINTER) &(*_dateVecVec[pos])[0], (SQLPOINTER) &(*_dateVecVec[pos])[0],
@ -849,7 +870,7 @@ private:
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_TYPE_TIME, SQL_C_TYPE_TIME,
Utility::sqlDataType(SQL_C_TYPE_TIME), TypeInfo::sqlDataType<SQL_C_TYPE_TIME>(),
colSize, colSize,
decDigits, decDigits,
(SQLPOINTER) &(*_timeVecVec[pos])[0], (SQLPOINTER) &(*_timeVecVec[pos])[0],
@ -898,7 +919,7 @@ private:
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_TYPE_TIMESTAMP, SQL_C_TYPE_TIMESTAMP,
Utility::sqlDataType(SQL_C_TYPE_TIMESTAMP), TypeInfo::sqlDataType<SQL_C_TYPE_TIMESTAMP>(),
colSize, colSize,
decDigits, decDigits,
(SQLPOINTER) &(*_dateTimeVecVec[pos])[0], (SQLPOINTER) &(*_dateTimeVecVec[pos])[0],
@ -919,6 +940,7 @@ private:
throw InvalidAccessException("ODBC::Binder::bindImplNullContainer():Container can only be bound immediately."); throw InvalidAccessException("ODBC::Binder::bindImplNullContainer():Container can only be bound immediately.");
std::size_t length = val.size(); std::size_t length = val.size();
poco_assert (length);
if (0 == length) if (0 == length)
throw InvalidArgumentException("ODBC::Binder::bindImplNullContainer():Empty container not allowed."); throw InvalidArgumentException("ODBC::Binder::bindImplNullContainer():Empty container not allowed.");
@ -928,18 +950,68 @@ private:
if (_vecLengthIndicator.size() <= pos) if (_vecLengthIndicator.size() <= pos)
{ {
_vecLengthIndicator.resize(pos + 1, 0); _vecLengthIndicator.resize(pos + 1, 0);
_vecLengthIndicator[pos] = new LengthVec(length ? length : 1); _vecLengthIndicator[pos] = new LengthVec(length, SQL_NULL_DATA);
} }
SQLINTEGER colSize = 0; SQLINTEGER colSize = 0;
SQLSMALLINT decDigits = 0; SQLSMALLINT decDigits = 0;
getColSizeAndPrecision(pos, SQL_C_STINYINT, colSize, decDigits); getColSizeAndPrecision(pos, SQL_C_CHAR, colSize, decDigits);
if (Utility::isError(SQLBindParameter(_rStmt, if (Utility::isError(SQLBindParameter(_rStmt,
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
SQL_PARAM_INPUT, SQL_PARAM_INPUT,
SQL_C_STINYINT, SQL_C_CHAR,
Utility::sqlDataType(SQL_C_STINYINT), TypeInfo::sqlDataType<SQL_C_CHAR>(),
colSize,
decDigits,
0,
0,
&(*_vecLengthIndicator[pos])[0])))
{
throw StatementException(_rStmt, "ODBC::Binder::bindImplNullContainer():SQLBindParameter()");
}
}
template<typename C>
void bindImplNullableContainer(std::size_t pos, const C& val, Direction dir)
{
if (isOutBound(dir) || !isInBound(dir))
throw NotImplementedException("ODBC::Binder::bindImplNullContainer():Null container parameter type can only be inbound.");
if (PB_IMMEDIATE != _paramBinding)
throw InvalidAccessException("ODBC::Binder::bindImplNullContainer():Container can only be bound immediately.");
std::size_t length = val.size();
poco_assert (length);
if (0 == length)
throw InvalidArgumentException("ODBC::Binder::bindImplNullContainer():Empty container not allowed.");
setParamSetSize(length);
if (_vecLengthIndicator.size() <= pos)
{
_vecLengthIndicator.resize(pos + 1, 0);
_vecLengthIndicator[pos] = new LengthVec(length, SQL_NULL_DATA);
auto valIt = val.begin(), valEnd = val.end();
auto lenIt = _vecLengthIndicator[pos]->begin(), lenEnd = _vecLengthIndicator[pos]->end();
for (; valIt != valEnd && lenIt != lenEnd; ++valIt, ++lenIt)
{
if (valIt->isNull()) *lenIt = SQL_NULL_DATA;
else *lenIt = Utility::sizeOf<C>();
}
}
SQLINTEGER colSize = 0;
SQLSMALLINT decDigits = 0;
getColSizeAndPrecision(pos, SQL_C_CHAR, colSize, decDigits);
if (Utility::isError(SQLBindParameter(_rStmt,
(SQLUSMALLINT) pos + 1,
SQL_PARAM_INPUT,
SQL_C_CHAR,
TypeInfo::sqlDataType<SQL_C_CHAR>(),
colSize, colSize,
decDigits, decDigits,
0, 0,

View File

@ -62,289 +62,372 @@ public:
~Extractor(); ~Extractor();
/// Destroys the Extractor. /// Destroys the Extractor.
bool extract(std::size_t pos, Poco::Int8& val); bool extract(std::size_t pos, Poco::Int8& val) override;
/// Extracts an Int8. /// Extracts an Int8.
bool extract(std::size_t pos, std::vector<Poco::Int8>& val); bool extract(std::size_t pos, std::vector<Poco::Int8>& val) override;
/// Extracts an Int8 vector. /// Extracts an Int8 vector.
bool extract(std::size_t pos, std::deque<Poco::Int8>& val); bool extract(std::size_t pos, std::deque<Poco::Int8>& val) override;
/// Extracts an Int8 deque. /// Extracts an Int8 deque.
bool extract(std::size_t pos, std::list<Poco::Int8>& val); bool extract(std::size_t pos, std::list<Poco::Int8>& val) override;
/// Extracts an Int8 list. /// Extracts an Int8 list.
bool extract(std::size_t pos, Poco::UInt8& val); bool extract(std::size_t pos, Poco::UInt8& val) override;
/// Extracts an UInt8. /// Extracts an UInt8.
bool extract(std::size_t pos, std::vector<Poco::UInt8>& val); bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) override;
/// Extracts an UInt8 vector. /// Extracts an UInt8 vector.
bool extract(std::size_t pos, std::deque<Poco::UInt8>& val); bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) override;
/// Extracts an UInt8 deque. /// Extracts an UInt8 deque.
bool extract(std::size_t pos, std::list<Poco::UInt8>& val); bool extract(std::size_t pos, std::list<Poco::UInt8>& val) override;
/// Extracts an UInt8 list. /// Extracts an UInt8 list.
bool extract(std::size_t pos, Poco::Int16& val); bool extract(std::size_t pos, Poco::Int16& val) override;
/// Extracts an Int16. /// Extracts an Int16.
bool extract(std::size_t pos, std::vector<Poco::Int16>& val); bool extract(std::size_t pos, std::vector<Poco::Int16>& val) override;
/// Extracts an Int16 vector. /// Extracts an Int16 vector.
bool extract(std::size_t pos, std::deque<Poco::Int16>& val); bool extract(std::size_t pos, std::deque<Poco::Int16>& val) override;
/// Extracts an Int16 deque. /// Extracts an Int16 deque.
bool extract(std::size_t pos, std::list<Poco::Int16>& val); bool extract(std::size_t pos, std::list<Poco::Int16>& val) override;
/// Extracts an Int16 list. /// Extracts an Int16 list.
bool extract(std::size_t pos, Poco::UInt16& val); bool extract(std::size_t pos, Poco::UInt16& val) override;
/// Extracts an UInt16. /// Extracts an UInt16.
bool extract(std::size_t pos, std::vector<Poco::UInt16>& val); bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) override;
/// Extracts an UInt16 vector. /// Extracts an UInt16 vector.
bool extract(std::size_t pos, std::deque<Poco::UInt16>& val); bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) override;
/// Extracts an UInt16 deque. /// Extracts an UInt16 deque.
bool extract(std::size_t pos, std::list<Poco::UInt16>& val); bool extract(std::size_t pos, std::list<Poco::UInt16>& val) override;
/// Extracts an UInt16 list. /// Extracts an UInt16 list.
bool extract(std::size_t pos, Poco::Int32& val); bool extract(std::size_t pos, Poco::Int32& val) override;
/// Extracts an Int32. /// Extracts an Int32.
bool extract(std::size_t pos, std::vector<Poco::Int32>& val); bool extract(std::size_t pos, std::vector<Poco::Int32>& val) override;
/// Extracts an Int32 vector. /// Extracts an Int32 vector.
bool extract(std::size_t pos, std::deque<Poco::Int32>& val); bool extract(std::size_t pos, std::deque<Poco::Int32>& val) override;
/// Extracts an Int32 deque. /// Extracts an Int32 deque.
bool extract(std::size_t pos, std::list<Poco::Int32>& val); bool extract(std::size_t pos, std::list<Poco::Int32>& val) override;
/// Extracts an Int32 list. /// Extracts an Int32 list.
bool extract(std::size_t pos, Poco::UInt32& val); bool extract(std::size_t pos, Poco::UInt32& val) override;
/// Extracts an UInt32. /// Extracts an UInt32.
bool extract(std::size_t pos, std::vector<Poco::UInt32>& val); bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) override;
/// Extracts an UInt32 vector. /// Extracts an UInt32 vector.
bool extract(std::size_t pos, std::deque<Poco::UInt32>& val); bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) override;
/// Extracts an UInt32 deque. /// Extracts an UInt32 deque.
bool extract(std::size_t pos, std::list<Poco::UInt32>& val); bool extract(std::size_t pos, std::list<Poco::UInt32>& val) override;
/// Extracts an UInt32 list. /// Extracts an UInt32 list.
bool extract(std::size_t pos, Poco::Int64& val); bool extract(std::size_t pos, Poco::Int64& val) override;
/// Extracts an Int64. /// Extracts an Int64.
bool extract(std::size_t pos, std::vector<Poco::Int64>& val); bool extract(std::size_t pos, std::vector<Poco::Int64>& val) override;
/// Extracts an Int64 vector. /// Extracts an Int64 vector.
bool extract(std::size_t pos, std::deque<Poco::Int64>& val); bool extract(std::size_t pos, std::deque<Poco::Int64>& val) override;
/// Extracts an Int64 deque. /// Extracts an Int64 deque.
bool extract(std::size_t pos, std::list<Poco::Int64>& val); bool extract(std::size_t pos, std::list<Poco::Int64>& val) override;
/// Extracts an Int64 list. /// Extracts an Int64 list.
bool extract(std::size_t pos, Poco::UInt64& val); bool extract(std::size_t pos, Poco::UInt64& val) override;
/// Extracts an UInt64. /// Extracts an UInt64.
bool extract(std::size_t pos, std::vector<Poco::UInt64>& val); bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) override;
/// Extracts an UInt64 vector. /// Extracts an UInt64 vector.
bool extract(std::size_t pos, std::deque<Poco::UInt64>& val); bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) override;
/// Extracts an UInt64 deque. /// Extracts an UInt64 deque.
bool extract(std::size_t pos, std::list<Poco::UInt64>& val); bool extract(std::size_t pos, std::list<Poco::UInt64>& val) override;
/// Extracts an UInt64 list. /// Extracts an UInt64 list.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, long& val); bool extract(std::size_t pos, long& val) override;
/// Extracts a long. /// Extracts a long.
bool extract(std::size_t pos, unsigned long& val); bool extract(std::size_t pos, unsigned long& val) override;
/// Extracts an unsigned long. /// Extracts an unsigned long.
bool extract(std::size_t pos, std::vector<long>& val); bool extract(std::size_t pos, std::vector<long>& val) override;
/// Extracts a long vector. /// Extracts a long vector.
bool extract(std::size_t pos, std::deque<long>& val); bool extract(std::size_t pos, std::deque<long>& val) override;
/// Extracts a long deque. /// Extracts a long deque.
bool extract(std::size_t pos, std::list<long>& val); bool extract(std::size_t pos, std::list<long>& val) override;
/// Extracts a long list. /// Extracts a long list.
bool extract(std::size_t pos, std::vector<unsigned long>& val) override;
/// Extracts an unsigned long vector.
bool extract(std::size_t pos, std::deque<unsigned long>& val) override;
/// Extracts an unsigned long deque.
bool extract(std::size_t pos, std::list<unsigned long>& val) override;
/// Extracts an unsigned long list.
#endif #endif
bool extract(std::size_t pos, bool& val); bool extract(std::size_t pos, bool& val) override;
/// Extracts a boolean. /// Extracts a boolean.
bool extract(std::size_t pos, std::vector<bool>& val); bool extract(std::size_t pos, std::vector<bool>& val) override;
/// Extracts a boolean vector. /// Extracts a boolean vector.
bool extract(std::size_t pos, std::deque<bool>& val); bool extract(std::size_t pos, std::deque<bool>& val) override;
/// Extracts a boolean deque. /// Extracts a boolean deque.
bool extract(std::size_t pos, std::list<bool>& val); bool extract(std::size_t pos, std::list<bool>& val) override;
/// Extracts a boolean list. /// Extracts a boolean list.
bool extract(std::size_t pos, float& val); bool extract(std::size_t pos, float& val) override;
/// Extracts a float. /// Extracts a float.
bool extract(std::size_t pos, std::vector<float>& val); bool extract(std::size_t pos, std::vector<float>& val) override;
/// Extracts a float vector. /// Extracts a float vector.
bool extract(std::size_t pos, std::deque<float>& val); bool extract(std::size_t pos, std::deque<float>& val) override;
/// Extracts a float deque. /// Extracts a float deque.
bool extract(std::size_t pos, std::list<float>& val); bool extract(std::size_t pos, std::list<float>& val) override;
/// Extracts a float list. /// Extracts a float list.
bool extract(std::size_t pos, double& val); bool extract(std::size_t pos, double& val) override;
/// Extracts a double. /// Extracts a double.
bool extract(std::size_t pos, std::vector<double>& val); bool extract(std::size_t pos, std::vector<double>& val) override;
/// Extracts a double vector. /// Extracts a double vector.
bool extract(std::size_t pos, std::deque<double>& val); bool extract(std::size_t pos, std::deque<double>& val) override;
/// Extracts a double deque. /// Extracts a double deque.
bool extract(std::size_t pos, std::list<double>& val); bool extract(std::size_t pos, std::list<double>& val) override;
/// Extracts a double list. /// Extracts a double list.
bool extract(std::size_t pos, char& val); bool extract(std::size_t pos, char& val) override;
/// Extracts a single character. /// Extracts a single character.
bool extract(std::size_t pos, std::vector<char>& val); bool extract(std::size_t pos, std::vector<char>& val) override;
/// Extracts a single character vector. /// Extracts a single character vector.
bool extract(std::size_t pos, std::deque<char>& val); bool extract(std::size_t pos, std::deque<char>& val) override;
/// Extracts a single character deque. /// Extracts a single character deque.
bool extract(std::size_t pos, std::list<char>& val); bool extract(std::size_t pos, std::list<char>& val) override;
/// Extracts a single character list. /// Extracts a single character list.
bool extract(std::size_t pos, std::string& val); bool extract(std::size_t pos, std::string& val) override;
/// Extracts a string. /// Extracts a string.
bool extract(std::size_t pos, std::vector<std::string>& val); bool extract(std::size_t pos, std::vector<std::string>& val) override;
/// Extracts a string vector. /// Extracts a string vector.
bool extract(std::size_t pos, std::deque<std::string>& val); bool extract(std::size_t pos, std::deque<std::string>& val) override;
/// Extracts a string deque. /// Extracts a string deque.
bool extract(std::size_t pos, std::list<std::string>& val); bool extract(std::size_t pos, std::list<std::string>& val) override;
/// Extracts a string list. /// Extracts a string list.
/// Extracts a single character list. /// Extracts a single character list.
bool extract(std::size_t pos, UTF16String& val); bool extract(std::size_t pos, UTF16String& val) override;
/// Extracts a string. /// Extracts a string.
bool extract(std::size_t pos, std::vector<UTF16String>& val); bool extract(std::size_t pos, std::vector<UTF16String>& val) override;
/// Extracts a string vector. /// Extracts a string vector.
bool extract(std::size_t pos, std::deque<UTF16String>& val); bool extract(std::size_t pos, std::deque<UTF16String>& val) override;
/// Extracts a string deque. /// Extracts a string deque.
bool extract(std::size_t pos, std::list<UTF16String>& val); bool extract(std::size_t pos, std::list<UTF16String>& val) override;
/// Extracts a string list. /// Extracts a string list.
bool extract(std::size_t pos, Poco::Data::BLOB& val); bool extract(std::size_t pos, Poco::Data::BLOB& val) override;
/// Extracts a BLOB. /// Extracts a BLOB.
bool extract(std::size_t pos, Poco::Data::CLOB& val); bool extract(std::size_t pos, Poco::Data::CLOB& val) override;
/// Extracts a CLOB. /// Extracts a CLOB.
bool extract(std::size_t pos, std::vector<Poco::Data::BLOB>& val); bool extract(std::size_t pos, std::vector<Poco::Data::BLOB>& val) override;
/// Extracts a BLOB vector. /// Extracts a BLOB vector.
bool extract(std::size_t pos, std::deque<Poco::Data::BLOB>& val); bool extract(std::size_t pos, std::deque<Poco::Data::BLOB>& val) override;
/// Extracts a BLOB deque. /// Extracts a BLOB deque.
bool extract(std::size_t pos, std::list<Poco::Data::BLOB>& val); bool extract(std::size_t pos, std::list<Poco::Data::BLOB>& val) override;
/// Extracts a BLOB list. /// Extracts a BLOB list.
bool extract(std::size_t pos, std::vector<Poco::Data::CLOB>& val); bool extract(std::size_t pos, std::vector<Poco::Data::CLOB>& val) override;
/// Extracts a CLOB vector. /// Extracts a CLOB vector.
bool extract(std::size_t pos, std::deque<Poco::Data::CLOB>& val); bool extract(std::size_t pos, std::deque<Poco::Data::CLOB>& val) override;
/// Extracts a CLOB deque. /// Extracts a CLOB deque.
bool extract(std::size_t pos, std::list<Poco::Data::CLOB>& val); bool extract(std::size_t pos, std::list<Poco::Data::CLOB>& val) override;
/// Extracts a CLOB list. /// Extracts a CLOB list.
bool extract(std::size_t pos, Poco::Data::Date& val); bool extract(std::size_t pos, Poco::Data::Date& val) override;
/// Extracts a Date. /// Extracts a Date.
bool extract(std::size_t pos, std::vector<Poco::Data::Date>& val); bool extract(std::size_t pos, std::vector<Poco::Data::Date>& val) override;
/// Extracts a Date vector. /// Extracts a Date vector.
bool extract(std::size_t pos, std::deque<Poco::Data::Date>& val); bool extract(std::size_t pos, std::deque<Poco::Data::Date>& val) override;
/// Extracts a Date deque. /// Extracts a Date deque.
bool extract(std::size_t pos, std::list<Poco::Data::Date>& val); bool extract(std::size_t pos, std::list<Poco::Data::Date>& val) override;
/// Extracts a Date list. /// Extracts a Date list.
bool extract(std::size_t pos, Poco::Data::Time& val); bool extract(std::size_t pos, Poco::Data::Time& val) override;
/// Extracts a Time. /// Extracts a Time.
bool extract(std::size_t pos, std::vector<Poco::Data::Time>& val); bool extract(std::size_t pos, std::vector<Poco::Data::Time>& val) override;
/// Extracts a Time vector. /// Extracts a Time vector.
bool extract(std::size_t pos, std::deque<Poco::Data::Time>& val); bool extract(std::size_t pos, std::deque<Poco::Data::Time>& val) override;
/// Extracts a Time deque. /// Extracts a Time deque.
bool extract(std::size_t pos, std::list<Poco::Data::Time>& val); bool extract(std::size_t pos, std::list<Poco::Data::Time>& val) override;
/// Extracts a Time list. /// Extracts a Time list.
bool extract(std::size_t pos, Poco::DateTime& val); bool extract(std::size_t pos, Poco::DateTime& val) override;
/// Extracts a DateTime. /// Extracts a DateTime.
bool extract(std::size_t pos, std::vector<Poco::DateTime>& val); bool extract(std::size_t pos, std::vector<Poco::DateTime>& val) override;
/// Extracts a DateTime vector. /// Extracts a DateTime vector.
bool extract(std::size_t pos, std::deque<Poco::DateTime>& val); bool extract(std::size_t pos, std::deque<Poco::DateTime>& val) override;
/// Extracts a DateTime deque. /// Extracts a DateTime deque.
bool extract(std::size_t pos, std::list<Poco::DateTime>& val); bool extract(std::size_t pos, std::list<Poco::DateTime>& val) override;
/// Extracts a DateTime list. /// Extracts a DateTime list.
bool extract(std::size_t pos, Poco::UUID& val); bool extract(std::size_t pos, Poco::UUID& val) override;
/// Extracts a UUID. /// Extracts a UUID.
bool extract(std::size_t pos, Poco::Any& val); bool extract(std::size_t pos, Poco::Any& val) override;
/// Extracts an Any. /// Extracts an Any.
bool extract(std::size_t pos, std::vector<Poco::Any>& val); bool extract(std::size_t pos, std::vector<Poco::Any>& val) override;
/// Extracts an Any vector. /// Extracts an Any vector.
bool extract(std::size_t pos, std::deque<Poco::Any>& val); bool extract(std::size_t pos, std::deque<Poco::Any>& val) override;
/// Extracts an Any deque. /// Extracts an Any deque.
bool extract(std::size_t pos, std::list<Poco::Any>& val); bool extract(std::size_t pos, std::list<Poco::Any>& val) override;
/// Extracts an Any list. /// Extracts an Any list.
bool extract(std::size_t pos, Poco::Dynamic::Var& val); bool extract(std::size_t pos, Poco::Dynamic::Var& val) override;
/// Extracts a Dynamic::Var. /// Extracts a Dynamic::Var.
bool extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val); bool extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var vector. /// Extracts a Dynamic::Var vector.
bool extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val); bool extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var deque. /// Extracts a Dynamic::Var deque.
bool extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val); bool extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var list. /// Extracts a Dynamic::Var list.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val) override;
/// Extracts a Nullable Int8.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val) override;
/// Extracts a Nullable UInt8.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val) override;
/// Extracts a Nullable Int16.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val) override;
/// Extracts a Nullable UInt16.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val) override;
/// Extracts a Nullable Int32.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val) override;
/// Extracts a Nullable UInt32.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val) override;
/// Extracts a Nullable Int64.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val) override;
/// Extracts a Nullable UInt64.
#ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, Poco::Nullable<long>& val) override;
/// Extracts a Nullable long.
bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val) override;
/// Extracts a Nullable unsigned long.
#endif
bool extract(std::size_t pos, Poco::Nullable<bool>& val) override;
/// Extracts a Nullable bool.
bool extract(std::size_t pos, Poco::Nullable<float>& val) override;
/// Extracts a Nullable float.
bool extract(std::size_t pos, Poco::Nullable<double>& val) override;
/// Extracts a Nullable double.
bool extract(std::size_t pos, Poco::Nullable<char>& val) override;
/// Extracts a Nullable char.
bool extract(std::size_t pos, Poco::Nullable<std::string>& val) override;
/// Extracts a Nullable string.
bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val) override;
/// Extracts a Nullable UTF16String.
bool extract(std::size_t pos, Poco::Nullable<BLOB>& val) override;
/// Extracts a Nullable BLOB.
bool extract(std::size_t pos, Poco::Nullable<CLOB>& val) override;
/// Extracts a Nullable CLOB.
bool extract(std::size_t pos, Poco::Nullable<DateTime>& val) override;
/// Extracts a Nullable DateTime.
bool extract(std::size_t pos, Poco::Nullable<Date>& val) override;
/// Extracts a Nullable Date.
bool extract(std::size_t pos, Poco::Nullable<Time>& val) override;
/// Extracts a Nullable Time.
bool extract(std::size_t pos, Poco::Nullable<UUID>& val) override;
/// Extracts a Nullable UUID.
bool extract(std::size_t pos, Poco::Nullable<Any>& val) override;
/// Extracts a Nullable Any.
bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val) override;
/// Extracts a Nullable Var.
void setDataExtraction(Preparator::DataExtraction ext); void setDataExtraction(Preparator::DataExtraction ext);
/// Set data extraction mode. /// Set data extraction mode.
Preparator::DataExtraction getDataExtraction() const; Preparator::DataExtraction getDataExtraction() const;
/// Returns data extraction mode. /// Returns data extraction mode.
bool isNull(std::size_t col, std::size_t row = POCO_DATA_INVALID_ROW); bool isNull(std::size_t col, std::size_t row = POCO_DATA_INVALID_ROW) override;
/// Returns true if the value at [col,row] is null. /// Returns true if the value at [col,row] is null.
void reset(); void reset() override;
/// Resets the internally cached length indicators. /// Resets the internally cached length indicators.
private: private:
@ -618,6 +701,15 @@ private:
return ret; return ret;
} }
template <typename T>
bool extractNullable(std::size_t pos, Poco::Nullable<T>& val)
{
typename Poco::Nullable<T>::Type v;
if (!extract(pos, v)) val.clear();
else val = std::move(v);
return true;
}
bool isNullLengthIndicator(SQLLEN val) const; bool isNullLengthIndicator(SQLLEN val) const;
/// The reason for this utility wrapper are platforms where /// The reason for this utility wrapper are platforms where
/// SQLLEN macro (a.k.a. SQLINTEGER) yields 64-bit value, /// SQLLEN macro (a.k.a. SQLINTEGER) yields 64-bit value,

View File

@ -603,7 +603,7 @@ private:
poco_assert (0 == _lenLengths[pos].size()); poco_assert (0 == _lenLengths[pos].size());
_lenLengths[pos].resize(length); _lenLengths[pos].resize(length);
std::vector<T>& cache = RefAnyCast<std::vector<T> >(_values[pos]); std::vector<T>& cache = RefAnyCast<std::vector<T>>(_values[pos]);
cache.resize(length); cache.resize(length);
if (Utility::isError(SQLBindCol(_rStmt, if (Utility::isError(SQLBindCol(_rStmt,

View File

@ -76,12 +76,112 @@ public:
~TypeInfo(); ~TypeInfo();
/// Destroys the TypeInfo. /// Destroys the TypeInfo.
int cDataType(int sqlDataType) const; SQLSMALLINT cDataType(SQLSMALLINT sqlDataType) const;
/// Returns C data type corresponding to supplied SQL data type. /// Returns C data type corresponding to supplied SQL data type.
int sqlDataType(int cDataType) const; template <SQLSMALLINT T>
static constexpr SQLSMALLINT cDataType()
/// Returns C data type corresponding to supplied SQL data type.
{
static_assert (
(T == SQL_CHAR ) ||
(T == SQL_CHAR ) ||
(T == SQL_VARCHAR ) ||
(T == SQL_LONGVARCHAR ) ||
(T == SQL_DECIMAL ) ||
(T == SQL_NUMERIC ) ||
(T == SQL_BIT ) ||
(T == SQL_TINYINT ) ||
(T == SQL_SMALLINT ) ||
(T == SQL_INTEGER ) ||
(T == SQL_BIGINT ) ||
(T == SQL_REAL ) ||
(T == SQL_FLOAT ) ||
(T == SQL_DOUBLE ) ||
(T == SQL_BINARY ) ||
(T == SQL_VARBINARY ) ||
(T == SQL_LONGVARBINARY ) ||
(T == SQL_TYPE_DATE ) ||
(T == SQL_TYPE_TIME ) ||
(T == SQL_TYPE_TIMESTAMP), "TypeInfo::cDataType(): Unknown SQL type."
);
if constexpr(T == SQL_CHAR ) return SQL_C_CHAR;
if constexpr(T == SQL_CHAR ) return SQL_C_CHAR;
if constexpr(T == SQL_VARCHAR ) return SQL_C_CHAR;
if constexpr(T == SQL_LONGVARCHAR ) return SQL_C_CHAR;
if constexpr(T == SQL_DECIMAL ) return SQL_C_DOUBLE;
if constexpr(T == SQL_NUMERIC ) return SQL_C_DOUBLE;
if constexpr(T == SQL_BIT ) return SQL_C_BIT;
if constexpr(T == SQL_TINYINT ) return SQL_C_STINYINT;
if constexpr(T == SQL_SMALLINT ) return SQL_C_SSHORT;
if constexpr(T == SQL_INTEGER ) return SQL_C_SLONG;
if constexpr(T == SQL_BIGINT ) return SQL_C_SBIGINT;
if constexpr(T == SQL_REAL ) return SQL_C_FLOAT;
if constexpr(T == SQL_FLOAT ) return SQL_C_DOUBLE;
if constexpr(T == SQL_DOUBLE ) return SQL_C_DOUBLE;
if constexpr(T == SQL_BINARY ) return SQL_C_BINARY;
if constexpr(T == SQL_VARBINARY ) return SQL_C_BINARY;
if constexpr(T == SQL_LONGVARBINARY ) return SQL_C_BINARY;
if constexpr(T == SQL_TYPE_DATE ) return SQL_C_TYPE_DATE;
if constexpr(T == SQL_TYPE_TIME ) return SQL_C_TYPE_TIME;
if constexpr(T == SQL_TYPE_TIMESTAMP) return SQL_C_TYPE_TIMESTAMP;
return 0;
}
SQLSMALLINT sqlDataType(SQLSMALLINT cDataType) const;
/// Returns SQL data type corresponding to supplied C data type. /// Returns SQL data type corresponding to supplied C data type.
template <SQLSMALLINT T>
static constexpr SQLSMALLINT sqlDataType()
/// Returns SQL data type corresponding to supplied C data type.
{
static_assert (
(T == SQL_C_CHAR ) ||
(T == SQL_C_WCHAR ) ||
(T == SQL_C_BIT ) ||
(T == SQL_C_TINYINT ) ||
(T == SQL_C_STINYINT ) ||
(T == SQL_C_UTINYINT ) ||
(T == SQL_C_SHORT ) ||
(T == SQL_C_SSHORT ) ||
(T == SQL_C_USHORT ) ||
(T == SQL_C_LONG ) ||
(T == SQL_C_SLONG ) ||
(T == SQL_C_ULONG ) ||
(T == SQL_C_SBIGINT ) ||
(T == SQL_C_UBIGINT ) ||
(T == SQL_C_FLOAT ) ||
(T == SQL_C_DOUBLE ) ||
(T == SQL_C_BINARY ) ||
(T == SQL_C_TYPE_DATE ) ||
(T == SQL_C_TYPE_TIME ) ||
(T == SQL_C_TYPE_TIMESTAMP), "TypeInfo::sqlDataType(): Unknown C type."
);
if constexpr(T == SQL_C_CHAR ) return SQL_VARCHAR;
if constexpr(T == SQL_C_WCHAR ) return SQL_WVARCHAR;
if constexpr(T == SQL_C_BIT ) return SQL_BIT;
if constexpr(T == SQL_C_TINYINT ) return SQL_TINYINT;
if constexpr(T == SQL_C_STINYINT ) return SQL_TINYINT;
if constexpr(T == SQL_C_UTINYINT ) return SQL_TINYINT;
if constexpr(T == SQL_C_SHORT ) return SQL_SMALLINT;
if constexpr(T == SQL_C_SSHORT ) return SQL_SMALLINT;
if constexpr(T == SQL_C_USHORT ) return SQL_SMALLINT;
if constexpr(T == SQL_C_LONG ) return SQL_INTEGER;
if constexpr(T == SQL_C_SLONG ) return SQL_INTEGER;
if constexpr(T == SQL_C_ULONG ) return SQL_INTEGER;
if constexpr(T == SQL_C_SBIGINT ) return SQL_BIGINT;
if constexpr(T == SQL_C_UBIGINT ) return SQL_BIGINT;
if constexpr(T == SQL_C_FLOAT ) return SQL_REAL;
if constexpr(T == SQL_C_DOUBLE ) return SQL_DOUBLE;
if constexpr(T == SQL_C_BINARY ) return SQL_LONGVARBINARY;
if constexpr(T == SQL_C_TYPE_DATE ) return SQL_TYPE_DATE;
if constexpr(T == SQL_C_TYPE_TIME ) return SQL_TYPE_TIME;
if constexpr(T == SQL_C_TYPE_TIMESTAMP) return SQL_TYPE_TIMESTAMP;
return 0;
}
void fillTypeInfo(const SQLHDBC* pHDBC); void fillTypeInfo(const SQLHDBC* pHDBC);
/// Fills the data type info structure for the database. /// Fills the data type info structure for the database.
@ -107,7 +207,7 @@ private:
DataTypeMap _cDataTypes; DataTypeMap _cDataTypes;
DataTypeMap _sqlDataTypes; DataTypeMap _sqlDataTypes;
TypeInfoVec _typeInfo; TypeInfoVec _typeInfo;
const SQLHDBC* _pHDBC; const SQLHDBC* _pHDBC;
}; };

View File

@ -171,6 +171,31 @@ public:
/// Returns the back end DBMS name. /// Returns the back end DBMS name.
/// On error, returns "unknown". /// On error, returns "unknown".
template <typename T>
static constexpr SQLINTEGER sizeOf()
/// Returns size of the data type.
{
static_assert (
(std::is_same_v<T, Date>) ||
(std::is_same_v<T, Time>) ||
(std::is_same_v<T, DateTime>) ||
(std::is_same_v<T, UUID>), "Utility::sizeOf(): Unsupported type"
);
if constexpr(std::is_same_v<T, Date >) return sizeof(SQL_DATE_STRUCT);
if constexpr(std::is_same_v<T, Time >) return sizeof(SQL_TIME_STRUCT);
if constexpr(std::is_same_v<T, DateTime>) return sizeof(SQL_TIMESTAMP_STRUCT);
if constexpr(std::is_same_v<T, UUID >) return 16;
return 0;
}
template <typename T>
static constexpr SQLINTEGER sizeOf(const T&)
/// Returns size of the data type.
{
return sizeOf<std::remove_const_t<std::remove_reference_t<T>>>();
}
private: private:
static const TypeInfo _dataTypes; static const TypeInfo _dataTypes;
/// C <==> SQL data type mapping /// C <==> SQL data type mapping

View File

@ -165,7 +165,7 @@ void Binder::bind(std::size_t pos, const std::string& val, Direction dir)
(SQLUSMALLINT)pos + 1, (SQLUSMALLINT)pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_CHAR, SQL_C_CHAR,
Utility::sqlDataType(SQL_C_CHAR), TypeInfo::sqlDataType<SQL_C_CHAR>(),
getStringColSize(colSize), getStringColSize(colSize),
0, 0,
pVal, pVal,
@ -218,7 +218,7 @@ void Binder::bind(std::size_t pos, const UTF16String& val, Direction dir)
(SQLUSMALLINT)pos + 1, (SQLUSMALLINT)pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_WCHAR, SQL_C_WCHAR,
Utility::sqlDataType(SQL_C_WCHAR), TypeInfo::sqlDataType<SQL_C_WCHAR>(),
getStringColSize(colSize), getStringColSize(colSize),
0, 0,
pVal, pVal,
@ -232,7 +232,7 @@ void Binder::bind(std::size_t pos, const UTF16String& val, Direction dir)
void Binder::bind(std::size_t pos, const Date& val, Direction dir) void Binder::bind(std::size_t pos, const Date& val, Direction dir)
{ {
SQLINTEGER size = (SQLINTEGER) sizeof(SQL_DATE_STRUCT); SQLINTEGER size = Utility::sizeOf(val);
SQLLEN* pLenIn = new SQLLEN; SQLLEN* pLenIn = new SQLLEN;
*pLenIn = size; *pLenIn = size;
@ -251,7 +251,7 @@ void Binder::bind(std::size_t pos, const Date& val, Direction dir)
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_TYPE_DATE, SQL_C_TYPE_DATE,
Utility::sqlDataType(SQL_C_TYPE_DATE), TypeInfo::sqlDataType<SQL_C_TYPE_DATE>(),
colSize, colSize,
decDigits, decDigits,
(SQLPOINTER) pDS, (SQLPOINTER) pDS,
@ -265,7 +265,7 @@ void Binder::bind(std::size_t pos, const Date& val, Direction dir)
void Binder::bind(std::size_t pos, const Time& val, Direction dir) void Binder::bind(std::size_t pos, const Time& val, Direction dir)
{ {
SQLINTEGER size = (SQLINTEGER) sizeof(SQL_TIME_STRUCT); SQLINTEGER size = Utility::sizeOf(val);
SQLLEN* pLenIn = new SQLLEN; SQLLEN* pLenIn = new SQLLEN;
*pLenIn = size; *pLenIn = size;
@ -284,7 +284,7 @@ void Binder::bind(std::size_t pos, const Time& val, Direction dir)
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_TYPE_TIME, SQL_C_TYPE_TIME,
Utility::sqlDataType(SQL_C_TYPE_TIME), TypeInfo::sqlDataType<SQL_C_TYPE_TIME>(),
colSize, colSize,
decDigits, decDigits,
(SQLPOINTER) pTS, (SQLPOINTER) pTS,
@ -298,7 +298,7 @@ void Binder::bind(std::size_t pos, const Time& val, Direction dir)
void Binder::bind(std::size_t pos, const Poco::DateTime& val, Direction dir) void Binder::bind(std::size_t pos, const Poco::DateTime& val, Direction dir)
{ {
SQLINTEGER size = (SQLINTEGER) sizeof(SQL_TIMESTAMP_STRUCT); SQLINTEGER size = Utility::sizeOf(val);
SQLLEN* pLenIn = new SQLLEN; SQLLEN* pLenIn = new SQLLEN;
*pLenIn = size; *pLenIn = size;
@ -317,7 +317,7 @@ void Binder::bind(std::size_t pos, const Poco::DateTime& val, Direction dir)
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
toODBCDirection(dir), toODBCDirection(dir),
SQL_C_TYPE_TIMESTAMP, SQL_C_TYPE_TIMESTAMP,
Utility::sqlDataType(SQL_C_TYPE_TIMESTAMP), TypeInfo::sqlDataType<SQL_C_TYPE_TIMESTAMP>(),
colSize, colSize,
decDigits, decDigits,
(SQLPOINTER) pTS, (SQLPOINTER) pTS,
@ -331,7 +331,7 @@ void Binder::bind(std::size_t pos, const Poco::DateTime& val, Direction dir)
void Binder::bind(std::size_t pos, const UUID& val, Direction dir) void Binder::bind(std::size_t pos, const UUID& val, Direction dir)
{ {
SQLINTEGER size = (SQLINTEGER) 16; SQLINTEGER size = Utility::sizeOf(val);
SQLLEN* pLenIn = new SQLLEN; SQLLEN* pLenIn = new SQLLEN;
*pLenIn = size; *pLenIn = size;
@ -375,13 +375,13 @@ void Binder::bind(std::size_t pos, const NullData& val, Direction dir)
SQLINTEGER colSize = 0; SQLINTEGER colSize = 0;
SQLSMALLINT decDigits = 0; SQLSMALLINT decDigits = 0;
getColSizeAndPrecision(pos, SQL_C_STINYINT, colSize, decDigits); getColSizeAndPrecision(pos, SQL_C_CHAR, colSize, decDigits);
if (Utility::isError(SQLBindParameter(_rStmt, if (Utility::isError(SQLBindParameter(_rStmt,
(SQLUSMALLINT) pos + 1, (SQLUSMALLINT) pos + 1,
SQL_PARAM_INPUT, SQL_PARAM_INPUT,
SQL_C_CHAR, SQL_C_CHAR,
Utility::sqlDataType(SQL_C_CHAR), TypeInfo::sqlDataType<SQL_C_CHAR>(),
colSize, colSize,
decDigits, decDigits,
0, 0,
@ -534,8 +534,8 @@ void Binder::getColSizeAndPrecision(std::size_t pos,
bool foundSize(false); bool foundSize(false);
bool foundPrec(false); bool foundPrec(false);
// SQLServer driver reports COLUMN_SIZE 8000 for VARCHAR(MAX), // SQLServer driver reports COLUMN_SIZE 8000 for VARCHAR(MAX),
// so the size check must be skipped when big strings are enabled // so the size check must be skipped when big strings are enabled
#ifdef POCO_DATA_ODBC_HAVE_SQL_SERVER_EXT #ifdef POCO_DATA_ODBC_HAVE_SQL_SERVER_EXT
bool isVarchar(false); bool isVarchar(false);
switch (sqlDataType) switch (sqlDataType)
@ -558,10 +558,10 @@ void Binder::getColSizeAndPrecision(std::size_t pos,
#ifdef POCO_DATA_ODBC_HAVE_SQL_SERVER_EXT #ifdef POCO_DATA_ODBC_HAVE_SQL_SERVER_EXT
&& !isVarchar && !isVarchar
#endif #endif
) )
{ {
throw LengthExceededException(Poco::format("ODBC::Binder::getColSizeAndPrecision();%d: Error binding column %z size=%z, max size=%ld)", throw LengthExceededException(Poco::format("ODBC::Binder::getColSizeAndPrecision();%d: Error binding column %z size=%z, max size=%ld)",
__LINE__, pos, actualSize, static_cast<long>(colSize))); __LINE__, pos, actualSize, static_cast<long>(colSize)));
} }
foundPrec = _pTypeInfo->tryGetInfo(cDataType, "MAXIMUM_SCALE", tmp); foundPrec = _pTypeInfo->tryGetInfo(cDataType, "MAXIMUM_SCALE", tmp);
@ -576,8 +576,8 @@ void Binder::getColSizeAndPrecision(std::size_t pos,
try try
{ {
Parameter p(_rStmt, pos); Parameter p(_rStmt, pos);
colSize = (SQLINTEGER) p.columnSize(); colSize = (SQLINTEGER)p.columnSize();
decDigits = (SQLSMALLINT) p.decimalDigits(); decDigits = (SQLSMALLINT)p.decimalDigits();
return; return;
} }
catch (StatementException&) catch (StatementException&)
@ -587,8 +587,8 @@ void Binder::getColSizeAndPrecision(std::size_t pos,
try try
{ {
ODBCMetaColumn c(_rStmt, pos); ODBCMetaColumn c(_rStmt, pos);
colSize = (SQLINTEGER) c.length(); colSize = (SQLINTEGER)c.length();
decDigits = (SQLSMALLINT) c.precision(); decDigits = (SQLSMALLINT)c.precision();
return; return;
} }
catch (StatementException&) catch (StatementException&)

View File

@ -108,6 +108,7 @@ bool Extractor::extractBoundImpl<Poco::Data::Date>(std::size_t pos, Poco::Data::
} }
template<> template<>
bool Extractor::extractBoundImplContainer<std::vector<Poco::Data::Date> >(std::size_t pos, bool Extractor::extractBoundImplContainer<std::vector<Poco::Data::Date> >(std::size_t pos,
std::vector<Poco::Data::Date>& val) std::vector<Poco::Data::Date>& val)
@ -678,7 +679,34 @@ bool Extractor::extract(std::size_t pos, std::list<long>& val)
else else
throw InvalidAccessException("Direct container extraction only allowed for bound mode."); throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
} }
#endif
bool Extractor::extract(std::size_t pos, std::vector<unsigned long>& val)
{
if (Preparator::DE_BOUND == _dataExtraction)
return extractBoundImplContainer(pos, val);
else
throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
}
bool Extractor::extract(std::size_t pos, std::deque<unsigned long>& val)
{
if (Preparator::DE_BOUND == _dataExtraction)
return extractBoundImplContainer(pos, val);
else
throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
}
bool Extractor::extract(std::size_t pos, std::list<unsigned long>& val)
{
if (Preparator::DE_BOUND == _dataExtraction)
return extractBoundImplContainer(pos, val);
else
throw InvalidAccessException("Direct container extraction only allowed for bound mode.");
}
#endif // POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, double& val) bool Extractor::extract(std::size_t pos, double& val)
@ -1376,6 +1404,151 @@ bool Extractor::extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val)
} }
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val)
{
return extractNullable(pos, val);
}
#ifndef POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, Poco::Nullable<long>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<unsigned long>& val)
{
return extractNullable(pos, val);
}
#endif
bool Extractor::extract(std::size_t pos, Poco::Nullable<bool>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<float>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<double>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<char>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<std::string>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<UTF16String>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<BLOB>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<CLOB>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<DateTime>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Date>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Time>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<UUID>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Any>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val)
{
return extractNullable(pos, val);
}
bool Extractor::isNull(std::size_t col, std::size_t row) bool Extractor::isNull(std::size_t col, std::size_t row)
{ {
if (Preparator::DE_MANUAL == _dataExtraction) if (Preparator::DE_MANUAL == _dataExtraction)

View File

@ -403,6 +403,7 @@ std::size_t ODBCStatementImpl::next()
if (nextRowReady()) if (nextRowReady())
{ {
Extractions& extracts = extractions(); Extractions& extracts = extractions();
poco_assert (extracts.size());
Extractions::iterator it = extracts.begin(); Extractions::iterator it = extracts.begin();
Extractions::iterator itEnd = extracts.end(); Extractions::iterator itEnd = extracts.end();
std::size_t prevCount = 0; std::size_t prevCount = 0;

View File

@ -198,7 +198,7 @@ bool TypeInfo::tryGetInfo(SQLSMALLINT type, const std::string& param, Dynamic::V
} }
int TypeInfo::cDataType(int sqlDataType) const SQLSMALLINT TypeInfo::cDataType(SQLSMALLINT sqlDataType) const
{ {
DataTypeMap::const_iterator it = _cDataTypes.find(sqlDataType); DataTypeMap::const_iterator it = _cDataTypes.find(sqlDataType);
@ -209,7 +209,7 @@ int TypeInfo::cDataType(int sqlDataType) const
} }
int TypeInfo::sqlDataType(int cDataType) const SQLSMALLINT TypeInfo::sqlDataType(SQLSMALLINT cDataType) const
{ {
DataTypeMap::const_iterator it = _sqlDataTypes.find(cDataType); DataTypeMap::const_iterator it = _sqlDataTypes.find(cDataType);

View File

@ -153,21 +153,24 @@ void Utility::dateTimeSync(SQL_TIMESTAMP_STRUCT& ts, const Poco::DateTime& dt)
ts.second = dt.second(); ts.second = dt.second();
// Fraction support is limited to milliseconds due to MS SQL Server limitation // Fraction support is limited to milliseconds due to MS SQL Server limitation
// see http://support.microsoft.com/kb/263872 // see http://support.microsoft.com/kb/263872
ts.fraction = (dt.millisecond() * 1000000);// + (dt.microsecond() * 1000); ts.fraction = (dt.millisecond() * 1000000);
} }
std::string Utility::dbmsName(const ConnectionHandle& db) std::string Utility::dbmsName(const ConnectionHandle& db)
{ {
std::string ret = "unknown"s;
const SQLSMALLINT bufSize = 1024; const SQLSMALLINT bufSize = 1024;
SQLCHAR dbmsName[bufSize] = {0}; SQLCHAR dbmsName[bufSize] = {0};
SQLSMALLINT retSize = 0; SQLSMALLINT retSize = 0;
SQLRETURN rc = Poco::Data::ODBC::SQLGetInfo(const_cast<SQLHDBC>(db.handle()), SQL_DBMS_NAME, dbmsName, bufSize, &retSize); SQLRETURN rc = Poco::Data::ODBC::SQLGetInfo(const_cast<SQLHDBC>(db.handle()), SQL_DBMS_NAME, dbmsName, bufSize, &retSize);
if (!isError(rc)) if (!isError(rc))
{ {
return std::string(reinterpret_cast<char*>(dbmsName), retSize); ret.assign(reinterpret_cast<char*>(dbmsName), retSize);
// API returns string longer than effective length
ret.erase(ret.find_last_not_of('\0') + 1, std::string::npos);
} }
return "unknown"s; return ret;
} }

View File

@ -967,6 +967,7 @@ CppUnit::Test* ODBCOracleTest::suite()
CppUnit_addTest(pSuite, ODBCOracleTest, testLimitPrepare); CppUnit_addTest(pSuite, ODBCOracleTest, testLimitPrepare);
CppUnit_addTest(pSuite, ODBCOracleTest, testLimitZero); CppUnit_addTest(pSuite, ODBCOracleTest, testLimitZero);
CppUnit_addTest(pSuite, ODBCOracleTest, testPrepare); CppUnit_addTest(pSuite, ODBCOracleTest, testPrepare);
CppUnit_addTest(pSuite, ODBCOracleTest, testNullBulk);
CppUnit_addTest(pSuite, ODBCOracleTest, testBulk); CppUnit_addTest(pSuite, ODBCOracleTest, testBulk);
CppUnit_addTest(pSuite, ODBCOracleTest, testBulkPerformance); CppUnit_addTest(pSuite, ODBCOracleTest, testBulkPerformance);
CppUnit_addTest(pSuite, ODBCOracleTest, testSetSimple); CppUnit_addTest(pSuite, ODBCOracleTest, testSetSimple);

View File

@ -51,6 +51,7 @@ using Poco::DateTime;
// FreeTDS version selection guide: http://www.freetds.org/userguide/choosingtdsprotocol.htm // FreeTDS version selection guide: http://www.freetds.org/userguide/choosingtdsprotocol.htm
// (see #define FREE_TDS_VERSION below) // (see #define FREE_TDS_VERSION below)
#if !defined(FORCE_FREE_TDS) #if !defined(FORCE_FREE_TDS)
#ifdef POCO_ODBC_USE_SQL_NATIVE #ifdef POCO_ODBC_USE_SQL_NATIVE
#define MS_SQL_SERVER_ODBC_DRIVER "SQL Server Native Client 10.0" #define MS_SQL_SERVER_ODBC_DRIVER "SQL Server Native Client 10.0"
@ -61,9 +62,7 @@ using Poco::DateTime;
#else #else
#define MS_SQL_SERVER_ODBC_DRIVER "FreeTDS" #define MS_SQL_SERVER_ODBC_DRIVER "FreeTDS"
#define FREE_TDS_VERSION "7.4" #define FREE_TDS_VERSION "7.4"
#if defined(POCO_OS_FAMILY_WINDOWS) #pragma message ("Using " MS_SQL_SERVER_ODBC_DRIVER " driver, version " FREE_TDS_VERSION)
#pragma message ("Using " MS_SQL_SERVER_ODBC_DRIVER " driver, version " FREE_TDS_VERSION)
#endif
#endif #endif
#if POCO_DATA_SQL_SERVER_BIG_STRINGS #if POCO_DATA_SQL_SERVER_BIG_STRINGS
@ -399,6 +398,26 @@ void ODBCSQLServerTest::testNull()
} }
void ODBCSQLServerTest::testNullBulk()
{
try
{
if (!_pSession) fail ("Test not available.");
_pSession->setFeature("autoBind", true);
_pSession->setFeature("autoExtract", true);
recreatePersonBLOBTable();
_pExecutor->nullBulk("CONVERT(VARBINARY(30),?)");
}
catch(Poco::Exception& ex)
{
std::cout << ex.displayText() << std::endl;
}
}
void ODBCSQLServerTest::testBulk() void ODBCSQLServerTest::testBulk()
{ {
if (!_pSession) fail ("Test not available."); if (!_pSession) fail ("Test not available.");
@ -412,7 +431,7 @@ void ODBCSQLServerTest::testBulk()
std::vector<CLOB>, std::vector<CLOB>,
std::vector<double>, std::vector<double>,
std::vector<DateTime>, std::vector<DateTime>,
std::vector<bool> >(100, "CONVERT(VARBINARY(30),?)"); std::vector<bool>>(100, "CONVERT(VARBINARY(30),?)");
recreateMiscTable(); recreateMiscTable();
_pExecutor->doBulkWithBool<std::deque<int>, _pExecutor->doBulkWithBool<std::deque<int>,
@ -420,7 +439,7 @@ void ODBCSQLServerTest::testBulk()
std::deque<CLOB>, std::deque<CLOB>,
std::deque<double>, std::deque<double>,
std::deque<DateTime>, std::deque<DateTime>,
std::deque<bool> >(100, "CONVERT(VARBINARY(30),?)"); std::deque<bool>>(100, "CONVERT(VARBINARY(30),?)");
recreateMiscTable(); recreateMiscTable();
_pExecutor->doBulkWithBool<std::list<int>, _pExecutor->doBulkWithBool<std::list<int>,
@ -428,7 +447,7 @@ void ODBCSQLServerTest::testBulk()
std::list<CLOB>, std::list<CLOB>,
std::list<double>, std::list<double>,
std::list<DateTime>, std::list<DateTime>,
std::list<bool> >(100, "CONVERT(VARBINARY(30),?)"); std::list<bool>>(100, "CONVERT(VARBINARY(30),?)");
} }
@ -1086,6 +1105,7 @@ CppUnit::Test* ODBCSQLServerTest::suite()
CppUnit_addTest(pSuite, ODBCSQLServerTest, testLimitZero); CppUnit_addTest(pSuite, ODBCSQLServerTest, testLimitZero);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testPrepare); CppUnit_addTest(pSuite, ODBCSQLServerTest, testPrepare);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testBulk); CppUnit_addTest(pSuite, ODBCSQLServerTest, testBulk);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testNullBulk);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testBulkPerformance); CppUnit_addTest(pSuite, ODBCSQLServerTest, testBulkPerformance);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testSetSimple); CppUnit_addTest(pSuite, ODBCSQLServerTest, testSetSimple);
CppUnit_addTest(pSuite, ODBCSQLServerTest, testSetComplex); CppUnit_addTest(pSuite, ODBCSQLServerTest, testSetComplex);

View File

@ -51,6 +51,7 @@ public:
void testBigStringVector(); void testBigStringVector();
void testBigBatch(); void testBigBatch();
void testNull() override; void testNull() override;
void testNullBulk() override;
void testBulk() override; void testBulk() override;
void testStoredProcedure() override; void testStoredProcedure() override;

View File

@ -485,6 +485,18 @@ void ODBCTest::testPrepare()
} }
void ODBCTest::testNullBulk()
{
if (!_pSession) fail ("Test not available.");
_pSession->setFeature("autoBind", true);
_pSession->setFeature("autoExtract", true);
recreatePersonBLOBTable();
_pExecutor->nullBulk();
}
void ODBCTest::testBulk() void ODBCTest::testBulk()
{ {
if (!_pSession) fail ("Test not available."); if (!_pSession) fail ("Test not available.");
@ -497,21 +509,21 @@ void ODBCTest::testBulk()
std::vector<std::string>, std::vector<std::string>,
std::vector<CLOB>, std::vector<CLOB>,
std::vector<double>, std::vector<double>,
std::vector<DateTime> >(100); std::vector<DateTime>>(100);
recreateMiscTable(); recreateMiscTable();
_pExecutor->doBulk<std::deque<int>, _pExecutor->doBulk<std::deque<int>,
std::deque<std::string>, std::deque<std::string>,
std::deque<CLOB>, std::deque<CLOB>,
std::deque<double>, std::deque<double>,
std::deque<DateTime> >(100); std::deque<DateTime>>(100);
recreateMiscTable(); recreateMiscTable();
_pExecutor->doBulk<std::list<int>, _pExecutor->doBulk<std::list<int>,
std::list<std::string>, std::list<std::string>,
std::list<CLOB>, std::list<CLOB>,
std::list<double>, std::list<double>,
std::list<DateTime> >(100); std::list<DateTime>>(100);
} }

View File

@ -83,6 +83,7 @@ public:
virtual void testLimitPrepare(); virtual void testLimitPrepare();
virtual void testLimitZero(); virtual void testLimitZero();
virtual void testPrepare(); virtual void testPrepare();
virtual void testNullBulk();
virtual void testBulk(); virtual void testBulk();
virtual void testBulkPerformance(); virtual void testBulkPerformance();

View File

@ -24,19 +24,6 @@ CppUnit::Test* ODBCTestSuite::suite()
{ {
CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("ODBCTestSuite"); CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("ODBCTestSuite");
// WARNING!
// On Win XP Pro, the PostgreSQL connection fails if attempted after DB2 w/ following error:
//
// sqlState="IM003"
// message="Specified driver could not be loaded due to system error 127 (PostgreSQL ANSI)."
// nativeError=160
// System error 127 is "The specified procedure could not be found."
// This problem does not manifest with Mammoth ODBCng PostgreSQL driver.
//
// Oracle tests do not exit cleanly if Oracle driver is loaded after DB2.
//
// For the time being, the workaround is to connect to DB2 after connecting to PostgreSQL and Oracle.
addTest(pSuite, ODBCOracleTest::suite()); addTest(pSuite, ODBCOracleTest::suite());
addTest(pSuite, ODBCSQLServerTest::suite()); addTest(pSuite, ODBCSQLServerTest::suite());
addTest(pSuite, ODBCMySQLTest::suite()); addTest(pSuite, ODBCMySQLTest::suite());

View File

@ -158,6 +158,8 @@ public:
void limitZero(); void limitZero();
void prepare(); void prepare();
void nullBulk(const std::string& blobPlaceholder="?");
template <typename C1, typename C2, typename C3, typename C4, typename C5, typename C6> template <typename C1, typename C2, typename C3, typename C4, typename C5, typename C6>
void doBulkWithBool(Poco::UInt32 size, const std::string& blobPlaceholder="?") void doBulkWithBool(Poco::UInt32 size, const std::string& blobPlaceholder="?")
{ {
@ -719,6 +721,12 @@ inline void SQLExecutor::prepare()
} }
inline void SQLExecutor::nullBulk(const std::string& blobPlaceholder)
{
_dataExecutor.nullBulk(blobPlaceholder);
}
inline void SQLExecutor::doBulkPerformance(Poco::UInt32 size) inline void SQLExecutor::doBulkPerformance(Poco::UInt32 size)
{ {
_dataExecutor.doBulkPerformance(size); _dataExecutor.doBulkPerformance(size);

View File

@ -47,276 +47,359 @@ public:
virtual ~BinaryExtractor(); virtual ~BinaryExtractor();
/// Destroys the Extractor. /// Destroys the Extractor.
virtual bool extract(std::size_t pos, Poco::Int8& val); bool extract(std::size_t pos, Poco::Int8& val) override;
/// Extracts an Int8. /// Extracts an Int8.
virtual bool extract(std::size_t pos, Poco::UInt8& val); bool extract(std::size_t pos, Poco::UInt8& val) override;
/// Extracts an UInt8. /// Extracts an UInt8.
virtual bool extract(std::size_t pos, Poco::Int16& val); bool extract(std::size_t pos, Poco::Int16& val) override;
/// Extracts an Int16. /// Extracts an Int16.
virtual bool extract(std::size_t pos, Poco::UInt16& val); bool extract(std::size_t pos, Poco::UInt16& val) override;
/// Extracts an UInt16. /// Extracts an UInt16.
virtual bool extract(std::size_t pos, Poco::Int32& val); bool extract(std::size_t pos, Poco::Int32& val) override;
/// Extracts an Int32. /// Extracts an Int32.
virtual bool extract(std::size_t pos, Poco::UInt32& val); bool extract(std::size_t pos, Poco::UInt32& val) override;
/// Extracts an UInt32. /// Extracts an UInt32.
virtual bool extract(std::size_t pos, Poco::Int64& val); bool extract(std::size_t pos, Poco::Int64& val) override;
/// Extracts an Int64. /// Extracts an Int64.
virtual bool extract(std::size_t pos, Poco::UInt64& val); bool extract(std::size_t pos, Poco::UInt64& val) override;
/// Extracts an UInt64. /// Extracts an UInt64.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, long& val); bool extract(std::size_t pos, long& val) override;
/// Extracts a long. Returns false if null was received. /// Extracts a long. Returns false if null was received.
virtual bool extract(std::size_t pos, unsigned long& val); bool extract(std::size_t pos, unsigned long& val) override;
/// Extracts an unsigned long. Returns false if null was received. /// Extracts an unsigned long. Returns false if null was received.
#endif #endif
virtual bool extract(std::size_t pos, bool& val); bool extract(std::size_t pos, bool& val) override;
/// Extracts a boolean. /// Extracts a boolean.
virtual bool extract(std::size_t pos, float& val); bool extract(std::size_t pos, float& val) override;
/// Extracts a float. /// Extracts a float.
virtual bool extract(std::size_t pos, double& val); bool extract(std::size_t pos, double& val) override;
/// Extracts a double. /// Extracts a double.
virtual bool extract(std::size_t pos, char& val); bool extract(std::size_t pos, char& val) override;
/// Extracts a single character. /// Extracts a single character.
virtual bool extract(std::size_t pos, std::string& val); bool extract(std::size_t pos, std::string& val) override;
/// Extracts a string. /// Extracts a string.
virtual bool extract(std::size_t pos, Poco::Data::BLOB& val); bool extract(std::size_t pos, Poco::Data::BLOB& val) override;
/// Extracts a BLOB. /// Extracts a BLOB.
virtual bool extract(std::size_t pos, Poco::Data::CLOB& val); bool extract(std::size_t pos, Poco::Data::CLOB& val) override;
/// Extracts a CLOB. /// Extracts a CLOB.
virtual bool extract(std::size_t pos, DateTime& val); bool extract(std::size_t pos, DateTime& val) override;
/// Extracts a DateTime. Returns false if null was received. /// Extracts a DateTime. Returns false if null was received.
virtual bool extract(std::size_t pos, Date& val); bool extract(std::size_t pos, Date& val) override;
/// Extracts a Date. Returns false if null was received. /// Extracts a Date. Returns false if null was received.
virtual bool extract(std::size_t pos, Time& val); bool extract(std::size_t pos, Time& val) override;
/// Extracts a Time. Returns false if null was received. /// Extracts a Time. Returns false if null was received.
virtual bool extract(std::size_t pos, UUID& val); bool extract(std::size_t pos, UUID& val) override;
/// Extracts a UUID. Returns false if null was received. /// Extracts a UUID. Returns false if null was received.
virtual bool extract(std::size_t pos, Any& val); bool extract(std::size_t pos, Any& val) override;
/// Extracts an Any. Returns false if null was received. /// Extracts an Any. Returns false if null was received.
virtual bool extract(std::size_t pos, Dynamic::Var& val); bool extract(std::size_t pos, Dynamic::Var& val) override;
/// Extracts a Dynamic::Var. Returns false if null was received. /// Extracts a Dynamic::Var. Returns false if null was received.
virtual bool isNull(std::size_t col, std::size_t row); bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val) override;
/// Extracts a nullable nullable Int8.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val) override;
/// Extracts a nullable nullable UInt8.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val) override;
/// Extracts a nullable nullable Int16.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val) override;
/// Extracts a nullable nullable UInt16.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val) override;
/// Extracts a nullable nullable Int32.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val) override;
/// Extracts a nullable nullable UInt32.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val) override;
/// Extracts a nullable nullable Int64.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val) override;
/// Extracts a nullable nullable UInt64.
#ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, Poco::Nullable<long>& val) override;
/// Extracts a nullable long.
bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val) override;
/// Extracts a nullable nullable unsigned long.
#endif
bool extract(std::size_t pos, Poco::Nullable<bool>& val) override;
/// Extracts a nullable boolean.
bool extract(std::size_t pos, Poco::Nullable<float>& val) override;
/// Extracts a nullable float.
bool extract(std::size_t pos, Poco::Nullable<double>& val) override;
/// Extracts a nullable double.
bool extract(std::size_t pos, Poco::Nullable<char>& val) override;
/// Extracts a nullable single character.
bool extract(std::size_t pos, Poco::Nullable<std::string>& val) override;
/// Extracts a nullable string.
bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val) override;
/// Extracts a nullable UTF16String.
bool extract(std::size_t pos, Poco::Nullable<BLOB>& val) override;
/// Extracts a nullable BLOB.
bool extract(std::size_t pos, Poco::Nullable<CLOB>& val) override;
/// Extracts a nullable CLOB.
bool extract(std::size_t pos, Poco::Nullable<DateTime>& val) override;
/// Extracts a nullable DateTime.
bool extract(std::size_t pos, Poco::Nullable<Date>& val) override;
/// Extracts a nullable Date.
bool extract(std::size_t pos, Poco::Nullable<Time>& val) override;
/// Extracts a nullable Time.
bool extract(std::size_t pos, Poco::Nullable<UUID>& val) override;
/// Extracts a nullable UUID.
bool extract(std::size_t pos, Poco::Nullable<Any>& val) override;
/// Extracts a nullable nullable Any.
bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val) override;
/// Extracts a nullable Var.
bool isNull(std::size_t col, std::size_t row) override;
/// Returns true if the value at [col,row] position is null. /// Returns true if the value at [col,row] position is null.
virtual void reset(); void reset() override;
/// Resets any information internally cached by the extractor. /// Resets any information internally cached by the extractor.
//////////// ////////////
// Not implemented extract functions // Not implemented extract functions
//////////// ////////////
virtual bool extract(std::size_t pos, std::vector<Poco::Int8>& val); bool extract(std::size_t pos, std::vector<Poco::Int8>& val) override;
/// Extracts an Int8 vector. /// Extracts an Int8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int8>& val); bool extract(std::size_t pos, std::deque<Poco::Int8>& val) override;
/// Extracts an Int8 deque. /// Extracts an Int8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int8>& val); bool extract(std::size_t pos, std::list<Poco::Int8>& val) override;
/// Extracts an Int8 list. /// Extracts an Int8 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt8>& val); bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) override;
/// Extracts an UInt8 vector. /// Extracts an UInt8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt8>& val); bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) override;
/// Extracts an UInt8 deque. /// Extracts an UInt8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt8>& val); bool extract(std::size_t pos, std::list<Poco::UInt8>& val) override;
/// Extracts an UInt8 list. /// Extracts an UInt8 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int16>& val); bool extract(std::size_t pos, std::vector<Poco::Int16>& val) override;
/// Extracts an Int16 vector. /// Extracts an Int16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int16>& val); bool extract(std::size_t pos, std::deque<Poco::Int16>& val) override;
/// Extracts an Int16 deque. /// Extracts an Int16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int16>& val); bool extract(std::size_t pos, std::list<Poco::Int16>& val) override;
/// Extracts an Int16 list. /// Extracts an Int16 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt16>& val); bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) override;
/// Extracts an UInt16 vector. /// Extracts an UInt16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt16>& val); bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) override;
/// Extracts an UInt16 deque. /// Extracts an UInt16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt16>& val); bool extract(std::size_t pos, std::list<Poco::UInt16>& val) override;
/// Extracts an UInt16 list. /// Extracts an UInt16 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int32>& val); bool extract(std::size_t pos, std::vector<Poco::Int32>& val) override;
/// Extracts an Int32 vector. /// Extracts an Int32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int32>& val); bool extract(std::size_t pos, std::deque<Poco::Int32>& val) override;
/// Extracts an Int32 deque. /// Extracts an Int32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int32>& val); bool extract(std::size_t pos, std::list<Poco::Int32>& val) override;
/// Extracts an Int32 list. /// Extracts an Int32 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt32>& val); bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) override;
/// Extracts an UInt32 vector. /// Extracts an UInt32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt32>& val); bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) override;
/// Extracts an UInt32 deque. /// Extracts an UInt32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt32>& val); bool extract(std::size_t pos, std::list<Poco::UInt32>& val) override;
/// Extracts an UInt32 list. /// Extracts an UInt32 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int64>& val); bool extract(std::size_t pos, std::vector<Poco::Int64>& val) override;
/// Extracts an Int64 vector. /// Extracts an Int64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int64>& val); bool extract(std::size_t pos, std::deque<Poco::Int64>& val) override;
/// Extracts an Int64 deque. /// Extracts an Int64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int64>& val); bool extract(std::size_t pos, std::list<Poco::Int64>& val) override;
/// Extracts an Int64 list. /// Extracts an Int64 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt64>& val); bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) override;
/// Extracts an UInt64 vector. /// Extracts an UInt64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt64>& val); bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) override;
/// Extracts an UInt64 deque. /// Extracts an UInt64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt64>& val); bool extract(std::size_t pos, std::list<Poco::UInt64>& val) override;
/// Extracts an UInt64 list. /// Extracts an UInt64 list.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, std::vector<long>& val); bool extract(std::size_t pos, std::vector<long>& val) override;
/// Extracts a long vector. /// Extracts a long vector.
virtual bool extract(std::size_t pos, std::deque<long>& val); bool extract(std::size_t pos, std::deque<long>& val) override;
/// Extracts a long deque. /// Extracts a long deque.
virtual bool extract(std::size_t pos, std::list<long>& val); bool extract(std::size_t pos, std::list<long>& val) override;
/// Extracts a long list.
bool extract(std::size_t pos, std::vector<unsigned long>& val) override;
/// Extracts a long vector.
bool extract(std::size_t pos, std::deque<unsigned long>& val) override;
/// Extracts a long deque.
bool extract(std::size_t pos, std::list<unsigned long>& val) override;
/// Extracts a long list. /// Extracts a long list.
#endif #endif
virtual bool extract(std::size_t pos, std::vector<bool>& val); bool extract(std::size_t pos, std::vector<bool>& val) override;
/// Extracts a boolean vector. /// Extracts a boolean vector.
virtual bool extract(std::size_t pos, std::deque<bool>& val); bool extract(std::size_t pos, std::deque<bool>& val) override;
/// Extracts a boolean deque. /// Extracts a boolean deque.
virtual bool extract(std::size_t pos, std::list<bool>& val); bool extract(std::size_t pos, std::list<bool>& val) override;
/// Extracts a boolean list. /// Extracts a boolean list.
virtual bool extract(std::size_t pos, std::vector<float>& val); bool extract(std::size_t pos, std::vector<float>& val) override;
/// Extracts a float vector. /// Extracts a float vector.
virtual bool extract(std::size_t pos, std::deque<float>& val); bool extract(std::size_t pos, std::deque<float>& val) override;
/// Extracts a float deque. /// Extracts a float deque.
virtual bool extract(std::size_t pos, std::list<float>& val); bool extract(std::size_t pos, std::list<float>& val) override;
/// Extracts a float list. /// Extracts a float list.
virtual bool extract(std::size_t pos, std::vector<double>& val); bool extract(std::size_t pos, std::vector<double>& val) override;
/// Extracts a double vector. /// Extracts a double vector.
virtual bool extract(std::size_t pos, std::deque<double>& val); bool extract(std::size_t pos, std::deque<double>& val) override;
/// Extracts a double deque. /// Extracts a double deque.
virtual bool extract(std::size_t pos, std::list<double>& val); bool extract(std::size_t pos, std::list<double>& val) override;
/// Extracts a double list. /// Extracts a double list.
virtual bool extract(std::size_t pos, std::vector<char>& val); bool extract(std::size_t pos, std::vector<char>& val) override;
/// Extracts a character vector. /// Extracts a character vector.
virtual bool extract(std::size_t pos, std::deque<char>& val); bool extract(std::size_t pos, std::deque<char>& val) override;
/// Extracts a character deque. /// Extracts a character deque.
virtual bool extract(std::size_t pos, std::list<char>& val); bool extract(std::size_t pos, std::list<char>& val) override;
/// Extracts a character list. /// Extracts a character list.
virtual bool extract(std::size_t pos, std::vector<std::string>& val); bool extract(std::size_t pos, std::vector<std::string>& val) override;
/// Extracts a string vector. /// Extracts a string vector.
virtual bool extract(std::size_t pos, std::deque<std::string>& val); bool extract(std::size_t pos, std::deque<std::string>& val) override;
/// Extracts a string deque. /// Extracts a string deque.
virtual bool extract(std::size_t pos, std::list<std::string>& val); bool extract(std::size_t pos, std::list<std::string>& val) override;
/// Extracts a string list. /// Extracts a string list.
virtual bool extract(std::size_t pos, std::vector<BLOB>& val); bool extract(std::size_t pos, std::vector<BLOB>& val) override;
/// Extracts a BLOB vector. /// Extracts a BLOB vector.
virtual bool extract(std::size_t pos, std::deque<BLOB>& val); bool extract(std::size_t pos, std::deque<BLOB>& val) override;
/// Extracts a BLOB deque. /// Extracts a BLOB deque.
virtual bool extract(std::size_t pos, std::list<BLOB>& val); bool extract(std::size_t pos, std::list<BLOB>& val) override;
/// Extracts a BLOB list. /// Extracts a BLOB list.
virtual bool extract(std::size_t pos, std::vector<CLOB>& val); bool extract(std::size_t pos, std::vector<CLOB>& val) override;
/// Extracts a CLOB vector. /// Extracts a CLOB vector.
virtual bool extract(std::size_t pos, std::deque<CLOB>& val); bool extract(std::size_t pos, std::deque<CLOB>& val) override;
/// Extracts a CLOB deque. /// Extracts a CLOB deque.
virtual bool extract(std::size_t pos, std::list<CLOB>& val); bool extract(std::size_t pos, std::list<CLOB>& val) override;
/// Extracts a CLOB list. /// Extracts a CLOB list.
virtual bool extract(std::size_t pos, std::vector<DateTime>& val); bool extract(std::size_t pos, std::vector<DateTime>& val) override;
/// Extracts a DateTime vector. /// Extracts a DateTime vector.
virtual bool extract(std::size_t pos, std::deque<DateTime>& val); bool extract(std::size_t pos, std::deque<DateTime>& val) override;
/// Extracts a DateTime deque. /// Extracts a DateTime deque.
virtual bool extract(std::size_t pos, std::list<DateTime>& val); bool extract(std::size_t pos, std::list<DateTime>& val) override;
/// Extracts a DateTime list. /// Extracts a DateTime list.
virtual bool extract(std::size_t pos, std::vector<Date>& val); bool extract(std::size_t pos, std::vector<Date>& val) override;
/// Extracts a Date vector. /// Extracts a Date vector.
virtual bool extract(std::size_t pos, std::deque<Date>& val); bool extract(std::size_t pos, std::deque<Date>& val) override;
/// Extracts a Date deque. /// Extracts a Date deque.
virtual bool extract(std::size_t pos, std::list<Date>& val); bool extract(std::size_t pos, std::list<Date>& val) override;
/// Extracts a Date list. /// Extracts a Date list.
virtual bool extract(std::size_t pos, std::vector<Time>& val); bool extract(std::size_t pos, std::vector<Time>& val) override;
/// Extracts a Time vector. /// Extracts a Time vector.
virtual bool extract(std::size_t pos, std::deque<Time>& val); bool extract(std::size_t pos, std::deque<Time>& val) override;
/// Extracts a Time deque. /// Extracts a Time deque.
virtual bool extract(std::size_t pos, std::list<Time>& val); bool extract(std::size_t pos, std::list<Time>& val) override;
/// Extracts a Time list. /// Extracts a Time list.
virtual bool extract(std::size_t pos, std::vector<Any>& val); bool extract(std::size_t pos, std::vector<Any>& val) override;
/// Extracts an Any vector. /// Extracts an Any vector.
virtual bool extract(std::size_t pos, std::deque<Any>& val); bool extract(std::size_t pos, std::deque<Any>& val) override;
/// Extracts an Any deque. /// Extracts an Any deque.
virtual bool extract(std::size_t pos, std::list<Any>& val); bool extract(std::size_t pos, std::list<Any>& val) override;
/// Extracts an Any list. /// Extracts an Any list.
virtual bool extract(std::size_t pos, std::vector<Dynamic::Var>& val); bool extract(std::size_t pos, std::vector<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var vector. /// Extracts a Dynamic::Var vector.
virtual bool extract(std::size_t pos, std::deque<Dynamic::Var>& val); bool extract(std::size_t pos, std::deque<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var deque. /// Extracts a Dynamic::Var deque.
virtual bool extract(std::size_t pos, std::list<Dynamic::Var>& val); bool extract(std::size_t pos, std::list<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var list. /// Extracts a Dynamic::Var list.
private: private:
@ -327,6 +410,15 @@ private:
BinaryExtractor& operator = (const BinaryExtractor&); BinaryExtractor& operator = (const BinaryExtractor&);
private: private:
template <typename T>
bool extractNullable(std::size_t pos, Poco::Nullable<T>& val)
{
typename Poco::Nullable<T>::Type v;
if (!extract(pos, v)) val.clear();
else val = std::move(v);
return true;
}
StatementExecutor& _statementExecutor; StatementExecutor& _statementExecutor;
}; };

View File

@ -44,279 +44,362 @@ public:
Extractor(StatementExecutor& st); Extractor(StatementExecutor& st);
/// Creates the Extractor. /// Creates the Extractor.
virtual ~Extractor(); ~Extractor() override;
/// Destroys the Extractor. /// Destroys the Extractor.
virtual bool extract(std::size_t pos, Poco::Int8& val); bool extract(std::size_t pos, Poco::Int8& val) override;
/// Extracts an Int8. /// Extracts an Int8.
virtual bool extract(std::size_t pos, Poco::UInt8& val); bool extract(std::size_t pos, Poco::UInt8& val) override;
/// Extracts an UInt8. /// Extracts an UInt8.
virtual bool extract(std::size_t pos, Poco::Int16& val); bool extract(std::size_t pos, Poco::Int16& val) override;
/// Extracts an Int16. /// Extracts an Int16.
virtual bool extract(std::size_t pos, Poco::UInt16& val); bool extract(std::size_t pos, Poco::UInt16& val) override;
/// Extracts an UInt16. /// Extracts an UInt16.
virtual bool extract(std::size_t pos, Poco::Int32& val); bool extract(std::size_t pos, Poco::Int32& val) override;
/// Extracts an Int32. /// Extracts an Int32.
virtual bool extract(std::size_t pos, Poco::UInt32& val); bool extract(std::size_t pos, Poco::UInt32& val) override;
/// Extracts an UInt32. /// Extracts an UInt32.
virtual bool extract(std::size_t pos, Poco::Int64& val); bool extract(std::size_t pos, Poco::Int64& val) override;
/// Extracts an Int64. /// Extracts an Int64.
virtual bool extract(std::size_t pos, Poco::UInt64& val); bool extract(std::size_t pos, Poco::UInt64& val) override;
/// Extracts an UInt64. /// Extracts an UInt64.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, long& val); bool extract(std::size_t pos, long& val) override;
/// Extracts a long. Returns false if null was received. /// Extracts a long. Returns false if null was received.
virtual bool extract(std::size_t pos, unsigned long& val); bool extract(std::size_t pos, unsigned long& val) override;
/// Extracts an unsigned long. Returns false if null was received. /// Extracts an unsigned long. Returns false if null was received.
#endif #endif
virtual bool extract(std::size_t pos, bool& val); bool extract(std::size_t pos, bool& val) override;
/// Extracts a boolean. /// Extracts a boolean.
virtual bool extract(std::size_t pos, float& val); bool extract(std::size_t pos, float& val) override;
/// Extracts a float. /// Extracts a float.
virtual bool extract(std::size_t pos, double& val); bool extract(std::size_t pos, double& val) override;
/// Extracts a double. /// Extracts a double.
virtual bool extract(std::size_t pos, char& val); bool extract(std::size_t pos, char& val) override;
/// Extracts a single character. /// Extracts a single character.
virtual bool extract(std::size_t pos, std::string& val); bool extract(std::size_t pos, std::string& val) override;
/// Extracts a string. /// Extracts a string.
virtual bool extract(std::size_t pos, Poco::Data::BLOB& val); bool extract(std::size_t pos, Poco::Data::BLOB& val) override;
/// Extracts a BLOB. /// Extracts a BLOB.
virtual bool extract(std::size_t pos, Poco::Data::CLOB& val); bool extract(std::size_t pos, Poco::Data::CLOB& val) override;
/// Extracts a CLOB. /// Extracts a CLOB.
virtual bool extract(std::size_t pos, DateTime& val); bool extract(std::size_t pos, DateTime& val) override;
/// Extracts a DateTime. Returns false if null was received. /// Extracts a DateTime. Returns false if null was received.
virtual bool extract(std::size_t pos, Date& val); bool extract(std::size_t pos, Date& val) override;
/// Extracts a Date. Returns false if null was received. /// Extracts a Date. Returns false if null was received.
virtual bool extract(std::size_t pos, Time& val); bool extract(std::size_t pos, Time& val) override;
/// Extracts a Time. Returns false if null was received. /// Extracts a Time. Returns false if null was received.
virtual bool extract(std::size_t pos, UUID& val); bool extract(std::size_t pos, UUID& val) override;
/// Extracts a UUID. Returns false if null was received. /// Extracts a UUID. Returns false if null was received.
virtual bool extract(std::size_t pos, Any& val); bool extract(std::size_t pos, Any& val) override;
/// Extracts an Any. Returns false if null was received. /// Extracts an Any. Returns false if null was received.
virtual bool extract(std::size_t pos, Dynamic::Var& val); bool extract(std::size_t pos, Dynamic::Var& val) override;
/// Extracts a Dynamic::Var. Returns false if null was received. /// Extracts a Dynamic::Var. Returns false if null was received.
virtual bool isNull(std::size_t col, std::size_t row); bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val) override;
/// Extracts a nullable nullable Int8.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val) override;
/// Extracts a nullable nullable UInt8.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val) override;
/// Extracts a nullable nullable Int16.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val) override;
/// Extracts a nullable nullable UInt16.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val) override;
/// Extracts a nullable nullable Int32.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val) override;
/// Extracts a nullable nullable UInt32.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val) override;
/// Extracts a nullable nullable Int64.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val) override;
/// Extracts a nullable nullable UInt64.
#ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, Poco::Nullable<long>& val) override;
/// Extracts a nullable long.
bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val) override;
/// Extracts a nullable nullable unsigned long.
#endif
bool extract(std::size_t pos, Poco::Nullable<bool>& val) override;
/// Extracts a nullable boolean.
bool extract(std::size_t pos, Poco::Nullable<float>& val) override;
/// Extracts a nullable float.
bool extract(std::size_t pos, Poco::Nullable<double>& val) override;
/// Extracts a nullable double.
bool extract(std::size_t pos, Poco::Nullable<char>& val) override;
/// Extracts a nullable single character.
bool extract(std::size_t pos, Poco::Nullable<std::string>& val) override;
/// Extracts a nullable string.
bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val) override;
/// Extracts a nullable UTF16String.
bool extract(std::size_t pos, Poco::Nullable<BLOB>& val) override;
/// Extracts a nullable BLOB.
bool extract(std::size_t pos, Poco::Nullable<CLOB>& val) override;
/// Extracts a nullable CLOB.
bool extract(std::size_t pos, Poco::Nullable<DateTime>& val) override;
/// Extracts a nullable DateTime.
bool extract(std::size_t pos, Poco::Nullable<Date>& val) override;
/// Extracts a nullable Date.
bool extract(std::size_t pos, Poco::Nullable<Time>& val) override;
/// Extracts a nullable Time.
bool extract(std::size_t pos, Poco::Nullable<UUID>& val) override;
/// Extracts a nullable UUID.
bool extract(std::size_t pos, Poco::Nullable<Any>& val) override;
/// Extracts a nullable nullable Any.
bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val) override;
/// Extracts a nullable Var.
bool isNull(std::size_t col, std::size_t row) override;
/// Returns true if the value at [col,row] position is null. /// Returns true if the value at [col,row] position is null.
virtual void reset(); void reset() override;
/// Resets any information internally cached by the extractor. /// Resets any information internally cached by the extractor.
//////////// ////////////
// Not implemented extract functions // Not implemented extract functions
//////////// ////////////
virtual bool extract(std::size_t pos, std::vector<Poco::Int8>& val); bool extract(std::size_t pos, std::vector<Poco::Int8>& val) override;
/// Extracts an Int8 vector. /// Extracts an Int8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int8>& val); bool extract(std::size_t pos, std::deque<Poco::Int8>& val) override;
/// Extracts an Int8 deque. /// Extracts an Int8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int8>& val); bool extract(std::size_t pos, std::list<Poco::Int8>& val) override;
/// Extracts an Int8 list. /// Extracts an Int8 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt8>& val); bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) override;
/// Extracts an UInt8 vector. /// Extracts an UInt8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt8>& val); bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) override;
/// Extracts an UInt8 deque. /// Extracts an UInt8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt8>& val); bool extract(std::size_t pos, std::list<Poco::UInt8>& val) override;
/// Extracts an UInt8 list. /// Extracts an UInt8 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int16>& val); bool extract(std::size_t pos, std::vector<Poco::Int16>& val) override;
/// Extracts an Int16 vector. /// Extracts an Int16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int16>& val); bool extract(std::size_t pos, std::deque<Poco::Int16>& val) override;
/// Extracts an Int16 deque. /// Extracts an Int16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int16>& val); bool extract(std::size_t pos, std::list<Poco::Int16>& val) override;
/// Extracts an Int16 list. /// Extracts an Int16 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt16>& val); bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) override;
/// Extracts an UInt16 vector. /// Extracts an UInt16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt16>& val); bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) override;
/// Extracts an UInt16 deque. /// Extracts an UInt16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt16>& val); bool extract(std::size_t pos, std::list<Poco::UInt16>& val) override;
/// Extracts an UInt16 list. /// Extracts an UInt16 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int32>& val); bool extract(std::size_t pos, std::vector<Poco::Int32>& val) override;
/// Extracts an Int32 vector. /// Extracts an Int32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int32>& val); bool extract(std::size_t pos, std::deque<Poco::Int32>& val) override;
/// Extracts an Int32 deque. /// Extracts an Int32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int32>& val); bool extract(std::size_t pos, std::list<Poco::Int32>& val) override;
/// Extracts an Int32 list. /// Extracts an Int32 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt32>& val); bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) override;
/// Extracts an UInt32 vector. /// Extracts an UInt32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt32>& val); bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) override;
/// Extracts an UInt32 deque. /// Extracts an UInt32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt32>& val); bool extract(std::size_t pos, std::list<Poco::UInt32>& val) override;
/// Extracts an UInt32 list. /// Extracts an UInt32 list.
virtual bool extract(std::size_t pos, std::vector<Poco::Int64>& val); bool extract(std::size_t pos, std::vector<Poco::Int64>& val) override;
/// Extracts an Int64 vector. /// Extracts an Int64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int64>& val); bool extract(std::size_t pos, std::deque<Poco::Int64>& val) override;
/// Extracts an Int64 deque. /// Extracts an Int64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int64>& val); bool extract(std::size_t pos, std::list<Poco::Int64>& val) override;
/// Extracts an Int64 list. /// Extracts an Int64 list.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt64>& val); bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) override;
/// Extracts an UInt64 vector. /// Extracts an UInt64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt64>& val); bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) override;
/// Extracts an UInt64 deque. /// Extracts an UInt64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt64>& val); bool extract(std::size_t pos, std::list<Poco::UInt64>& val) override;
/// Extracts an UInt64 list. /// Extracts an UInt64 list.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, std::vector<long>& val); bool extract(std::size_t pos, std::vector<long>& val) override;
/// Extracts a long vector. /// Extracts a long vector.
virtual bool extract(std::size_t pos, std::deque<long>& val); bool extract(std::size_t pos, std::deque<long>& val) override;
/// Extracts a long deque. /// Extracts a long deque.
virtual bool extract(std::size_t pos, std::list<long>& val); bool extract(std::size_t pos, std::list<long>& val) override;
/// Extracts a long list.
bool extract(std::size_t pos, std::vector<unsigned long>& val) override;
/// Extracts a long vector.
bool extract(std::size_t pos, std::deque<unsigned long>& val) override;
/// Extracts a long deque.
bool extract(std::size_t pos, std::list<unsigned long>& val) override;
/// Extracts a long list. /// Extracts a long list.
#endif #endif
virtual bool extract(std::size_t pos, std::vector<bool>& val); bool extract(std::size_t pos, std::vector<bool>& val) override;
/// Extracts a boolean vector. /// Extracts a boolean vector.
virtual bool extract(std::size_t pos, std::deque<bool>& val); bool extract(std::size_t pos, std::deque<bool>& val) override;
/// Extracts a boolean deque. /// Extracts a boolean deque.
virtual bool extract(std::size_t pos, std::list<bool>& val); bool extract(std::size_t pos, std::list<bool>& val) override;
/// Extracts a boolean list. /// Extracts a boolean list.
virtual bool extract(std::size_t pos, std::vector<float>& val); bool extract(std::size_t pos, std::vector<float>& val) override;
/// Extracts a float vector. /// Extracts a float vector.
virtual bool extract(std::size_t pos, std::deque<float>& val); bool extract(std::size_t pos, std::deque<float>& val) override;
/// Extracts a float deque. /// Extracts a float deque.
virtual bool extract(std::size_t pos, std::list<float>& val); bool extract(std::size_t pos, std::list<float>& val) override;
/// Extracts a float list. /// Extracts a float list.
virtual bool extract(std::size_t pos, std::vector<double>& val); bool extract(std::size_t pos, std::vector<double>& val) override;
/// Extracts a double vector. /// Extracts a double vector.
virtual bool extract(std::size_t pos, std::deque<double>& val); bool extract(std::size_t pos, std::deque<double>& val) override;
/// Extracts a double deque. /// Extracts a double deque.
virtual bool extract(std::size_t pos, std::list<double>& val); bool extract(std::size_t pos, std::list<double>& val) override;
/// Extracts a double list. /// Extracts a double list.
virtual bool extract(std::size_t pos, std::vector<char>& val); bool extract(std::size_t pos, std::vector<char>& val) override;
/// Extracts a character vector. /// Extracts a character vector.
virtual bool extract(std::size_t pos, std::deque<char>& val); bool extract(std::size_t pos, std::deque<char>& val) override;
/// Extracts a character deque. /// Extracts a character deque.
virtual bool extract(std::size_t pos, std::list<char>& val); bool extract(std::size_t pos, std::list<char>& val) override;
/// Extracts a character list. /// Extracts a character list.
virtual bool extract(std::size_t pos, std::vector<std::string>& val); bool extract(std::size_t pos, std::vector<std::string>& val) override;
/// Extracts a string vector. /// Extracts a string vector.
virtual bool extract(std::size_t pos, std::deque<std::string>& val); bool extract(std::size_t pos, std::deque<std::string>& val) override;
/// Extracts a string deque. /// Extracts a string deque.
virtual bool extract(std::size_t pos, std::list<std::string>& val); bool extract(std::size_t pos, std::list<std::string>& val) override;
/// Extracts a string list. /// Extracts a string list.
virtual bool extract(std::size_t pos, std::vector<BLOB>& val); bool extract(std::size_t pos, std::vector<BLOB>& val) override;
/// Extracts a BLOB vector. /// Extracts a BLOB vector.
virtual bool extract(std::size_t pos, std::deque<BLOB>& val); bool extract(std::size_t pos, std::deque<BLOB>& val) override;
/// Extracts a BLOB deque. /// Extracts a BLOB deque.
virtual bool extract(std::size_t pos, std::list<BLOB>& val); bool extract(std::size_t pos, std::list<BLOB>& val) override;
/// Extracts a BLOB list. /// Extracts a BLOB list.
virtual bool extract(std::size_t pos, std::vector<CLOB>& val); bool extract(std::size_t pos, std::vector<CLOB>& val) override;
/// Extracts a CLOB vector. /// Extracts a CLOB vector.
virtual bool extract(std::size_t pos, std::deque<CLOB>& val); bool extract(std::size_t pos, std::deque<CLOB>& val) override;
/// Extracts a CLOB deque. /// Extracts a CLOB deque.
virtual bool extract(std::size_t pos, std::list<CLOB>& val); bool extract(std::size_t pos, std::list<CLOB>& val) override;
/// Extracts a CLOB list. /// Extracts a CLOB list.
virtual bool extract(std::size_t pos, std::vector<DateTime>& val); bool extract(std::size_t pos, std::vector<DateTime>& val) override;
/// Extracts a DateTime vector. /// Extracts a DateTime vector.
virtual bool extract(std::size_t pos, std::deque<DateTime>& val); bool extract(std::size_t pos, std::deque<DateTime>& val) override;
/// Extracts a DateTime deque. /// Extracts a DateTime deque.
virtual bool extract(std::size_t pos, std::list<DateTime>& val); bool extract(std::size_t pos, std::list<DateTime>& val) override;
/// Extracts a DateTime list. /// Extracts a DateTime list.
virtual bool extract(std::size_t pos, std::vector<Date>& val); bool extract(std::size_t pos, std::vector<Date>& val) override;
/// Extracts a Date vector. /// Extracts a Date vector.
virtual bool extract(std::size_t pos, std::deque<Date>& val); bool extract(std::size_t pos, std::deque<Date>& val) override;
/// Extracts a Date deque. /// Extracts a Date deque.
virtual bool extract(std::size_t pos, std::list<Date>& val); bool extract(std::size_t pos, std::list<Date>& val) override;
/// Extracts a Date list. /// Extracts a Date list.
virtual bool extract(std::size_t pos, std::vector<Time>& val); bool extract(std::size_t pos, std::vector<Time>& val) override;
/// Extracts a Time vector. /// Extracts a Time vector.
virtual bool extract(std::size_t pos, std::deque<Time>& val); bool extract(std::size_t pos, std::deque<Time>& val) override;
/// Extracts a Time deque. /// Extracts a Time deque.
virtual bool extract(std::size_t pos, std::list<Time>& val); bool extract(std::size_t pos, std::list<Time>& val) override;
/// Extracts a Time list. /// Extracts a Time list.
virtual bool extract(std::size_t pos, std::vector<Any>& val); bool extract(std::size_t pos, std::vector<Any>& val) override;
/// Extracts an Any vector. /// Extracts an Any vector.
virtual bool extract(std::size_t pos, std::deque<Any>& val); bool extract(std::size_t pos, std::deque<Any>& val) override;
/// Extracts an Any deque. /// Extracts an Any deque.
virtual bool extract(std::size_t pos, std::list<Any>& val); bool extract(std::size_t pos, std::list<Any>& val) override;
/// Extracts an Any list. /// Extracts an Any list.
virtual bool extract(std::size_t pos, std::vector<Dynamic::Var>& val); bool extract(std::size_t pos, std::vector<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var vector. /// Extracts a Dynamic::Var vector.
virtual bool extract(std::size_t pos, std::deque<Dynamic::Var>& val); bool extract(std::size_t pos, std::deque<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var deque. /// Extracts a Dynamic::Var deque.
virtual bool extract(std::size_t pos, std::list<Dynamic::Var>& val); bool extract(std::size_t pos, std::list<Dynamic::Var>& val) override;
/// Extracts a Dynamic::Var list. /// Extracts a Dynamic::Var list.
private: private:
@ -343,6 +426,15 @@ private:
bool extractToDynamic(std::size_t pos, Dynamic::Var& val); bool extractToDynamic(std::size_t pos, Dynamic::Var& val);
template <typename T>
bool extractNullable(std::size_t pos, Poco::Nullable<T>& val)
{
typename Poco::Nullable<T>::Type v;
if (!extract(pos, v)) val.clear();
else val = std::move(v);
return true;
}
// Prevent VC8 warning "operator= could not be generated" // Prevent VC8 warning "operator= could not be generated"
Extractor& operator = (const Extractor&); Extractor& operator = (const Extractor&);

View File

@ -652,6 +652,154 @@ bool BinaryExtractor::extract(std::size_t pos, Dynamic::Var& val)
return readVar(outputParameter, val); return readVar(outputParameter, val);
} }
//////////////
// Nullable
//////////////
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val)
{
return extractNullable(pos, val);
}
#ifndef POCO_INT64_IS_LONG
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<long>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<unsigned long>& val)
{
return extractNullable(pos, val);
}
#endif
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<bool>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<float>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<double>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<char>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<std::string>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<UTF16String>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<BLOB>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<CLOB>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<DateTime>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Date>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Time>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<UUID>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Any>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val)
{
return extractNullable(pos, val);
}
bool BinaryExtractor::isNull(std::size_t col, std::size_t /*row*/) bool BinaryExtractor::isNull(std::size_t col, std::size_t /*row*/)
{ {
@ -849,6 +997,23 @@ bool BinaryExtractor::extract(std::size_t, std::list<long>&)
{ {
throw NotImplementedException("std::list extractor must be implemented."); throw NotImplementedException("std::list extractor must be implemented.");
} }
bool BinaryExtractor::extract(std::size_t, std::vector<unsigned long>&)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool BinaryExtractor::extract(std::size_t, std::deque<unsigned long>&)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool BinaryExtractor::extract(std::size_t, std::list<unsigned long>&)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
#endif #endif

View File

@ -27,7 +27,7 @@ namespace Data {
namespace PostgreSQL { namespace PostgreSQL {
Extractor::Extractor(StatementExecutor& st /*, ResultMetadata& md */): Extractor::Extractor(StatementExecutor& st):
_statementExecutor(st) _statementExecutor(st)
{ {
} }
@ -539,6 +539,154 @@ bool Extractor::extractToDynamic(std::size_t pos, Dynamic::Var& val)
return success; return success;
} }
//////////////
// Nullable
//////////////
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val)
{
return extractNullable(pos, val);
}
#ifndef POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, Poco::Nullable<long>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<unsigned long>& val)
{
return extractNullable(pos, val);
}
#endif
bool Extractor::extract(std::size_t pos, Poco::Nullable<bool>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<float>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<double>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<char>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<std::string>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<UTF16String>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<BLOB>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<CLOB>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<DateTime>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Date>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Time>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<UUID>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Any>& val)
{
return extractNullable(pos, val);
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val)
{
return extractNullable(pos, val);
}
////////////// //////////////
// Not implemented // Not implemented
@ -706,6 +854,23 @@ bool Extractor::extract(std::size_t, std::list<long>&)
{ {
throw NotImplementedException("std::list extractor must be implemented."); throw NotImplementedException("std::list extractor must be implemented.");
} }
bool Extractor::extract(std::size_t, std::vector<unsigned long>&)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool Extractor::extract(std::size_t, std::deque<unsigned long>&)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool Extractor::extract(std::size_t, std::list<unsigned long>&)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
#endif #endif

View File

@ -151,18 +151,11 @@ void PostgreSQLTest::testFailedConnect()
try try
{ {
std::cout << "Attempting to Connect to [" << dbConnString << "] with invalid credentials: " << std::endl;
Session session(PostgreSQL::Connector::KEY, dbConnString); Session session(PostgreSQL::Connector::KEY, dbConnString);
fail ("must fail"); failmsg ("must fail");
}
catch (ConnectionFailedException& ex)
{
std::cout << ex.displayText() << std::endl;
}
catch (ConnectionException& ex)
{
std::cout << ex.displayText() << std::endl;
} }
catch (ConnectionFailedException& ex) {}
catch (ConnectionException& ex) {}
} }
@ -171,75 +164,75 @@ void PostgreSQLTest::testPostgreSQLOIDs()
if (!_pSession) fail ("Test not available."); if (!_pSession) fail ("Test not available.");
std::string tableCreateString = "CREATE TABLE Test (" std::string tableCreateString = "CREATE TABLE Test ("
"charcol char," "charcol char,"
"bigintcol bigint," "bigintcol bigint,"
"int8col int8," "int8col int8,"
"bigserialcol bigserial," "bigserialcol bigserial,"
"serial8col serial8," "serial8col serial8,"
"bit1col bit(1)," "bit1col bit(1),"
"bit4col bit(4)," "bit4col bit(4),"
"bit6col bit(6)," "bit6col bit(6),"
"bit8col bit(8)," "bit8col bit(8),"
"bit9col bit(9)," "bit9col bit(9),"
"bitv1col bit varying(1)," "bitv1col bit varying(1),"
"bitv4col bit varying(4)," "bitv4col bit varying(4),"
"bitv6col bit varying(6)," "bitv6col bit varying(6),"
"bitv8col bit varying(8)," "bitv8col bit varying(8),"
"bitv9col bit varying(9)," "bitv9col bit varying(9),"
"booleancol boolean," "booleancol boolean,"
"boolcol bool," "boolcol bool,"
"boxcol box," "boxcol box,"
"byteacol bytea," "byteacol bytea,"
"char1col char(1)," "char1col char(1),"
"char4col char(4)," "char4col char(4),"
"char6col char(6)," "char6col char(6),"
"char8col char(8)," "char8col char(8),"
"char9col char(9)," "char9col char(9),"
"char12col char(12)," "char12col char(12),"
"char256col char(256)," "char256col char(256),"
"charv1col char varying(1)," "charv1col char varying(1),"
"charv4col char varying(4)," "charv4col char varying(4),"
"charv6col char varying(6)," "charv6col char varying(6),"
"charv8col char varying(8)," "charv8col char varying(8),"
"charv9col char varying(9)," "charv9col char varying(9),"
"charv12col char varying(12)," "charv12col char varying(12),"
"charv256col char varying(256)," "charv256col char varying(256),"
"cidrcol cidr," "cidrcol cidr,"
"circlecol circle," "circlecol circle,"
"datecol date," "datecol date,"
"doubleprecol double precision," "doubleprecol double precision,"
"float8col float8," "float8col float8,"
"inetcol inet," "inetcol inet,"
"integercol integer," "integercol integer,"
"intcol int," "intcol int,"
"int4col int4," "int4col int4,"
"jsoncol json," "jsoncol json,"
// "jsonbcol jsonb," // requires 9.4 // "jsonbcol jsonb," // requires 9.4
"linecol line," "linecol line,"
"lsegcol lseg," "lsegcol lseg,"
"macaddrcol macaddr," "macaddrcol macaddr,"
"moneycol money," "moneycol money,"
"numericcol numeric(12,3)," "numericcol numeric(12,3),"
"decimalcol decimal(12,4)," "decimalcol decimal(12,4),"
"pathcol path," "pathcol path,"
// "pglencol pg_lsn," // requires 9.4 // "pglencol pg_lsn," // requires 9.4
"pointcol point," "pointcol point,"
"polygoncol polygon," "polygoncol polygon,"
"realcol real," "realcol real,"
"float4col float4," "float4col float4,"
"smallintcol smallint," "smallintcol smallint,"
"int2col int2," "int2col int2,"
"smallserialcol smallserial," "smallserialcol smallserial,"
"serial2col serial2," "serial2col serial2,"
"serialcol serial," "serialcol serial,"
"serial4col serial4," "serial4col serial4,"
"textcol text," "textcol text,"
"timewtzcol time(6) without time zone," "timewtzcol time(6) without time zone,"
"tsquerycol tsquery," "tsquerycol tsquery,"
"tsvectorcol tsvector," "tsvectorcol tsvector,"
"txidsnapshotcol txid_snapshot," "txidsnapshotcol txid_snapshot,"
"uuidcol uuid," "uuidcol uuid,"
"xmlcol xml" "xmlcol xml"
")"; ")";
Oid OIDArray[] = { Oid OIDArray[] = {
@ -1322,7 +1315,7 @@ CppUnit::Test* PostgreSQLTest::suite()
CppUnit_addTest(pSuite, PostgreSQLTest, testNullableInt); CppUnit_addTest(pSuite, PostgreSQLTest, testNullableInt);
CppUnit_addTest(pSuite, PostgreSQLTest, testNullableString); CppUnit_addTest(pSuite, PostgreSQLTest, testNullableString);
CppUnit_addTest(pSuite, PostgreSQLTest, testTupleWithNullable); CppUnit_addTest(pSuite, PostgreSQLTest, testTupleWithNullable);
CppUnit_addTest(pSuite, PostgreSQLTest, testSqlState); CppUnit_addTest(pSuite, PostgreSQLTest, testSqlState);
CppUnit_addTest(pSuite, PostgreSQLTest, testBinarySimpleAccess); CppUnit_addTest(pSuite, PostgreSQLTest, testBinarySimpleAccess);
CppUnit_addTest(pSuite, PostgreSQLTest, testBinaryComplexType); CppUnit_addTest(pSuite, PostgreSQLTest, testBinaryComplexType);

View File

@ -28,6 +28,9 @@
#include "Poco/Data/Time.h" #include "Poco/Data/Time.h"
#include "Poco/Data/Date.h" #include "Poco/Data/Date.h"
#include "Poco/Data/Time.h" #include "Poco/Data/Time.h"
#include "Poco/Nullable.h"
#include "Poco/UUID.h"
#include "Poco/UTFString.h"
#include "Poco/Any.h" #include "Poco/Any.h"
#include "Poco/Dynamic/Var.h" #include "Poco/Dynamic/Var.h"
#include "sqlite3.h" #include "sqlite3.h"
@ -45,7 +48,7 @@ class SQLite_API Extractor: public Poco::Data::AbstractExtractor
/// If NULL is received, the incoming val value is not changed and false is returned /// If NULL is received, the incoming val value is not changed and false is returned
{ {
public: public:
typedef std::vector<std::pair<bool, bool> > NullIndVec; using NullIndVec = std::vector<std::pair<bool, bool> >;
/// Type for null indicators container. /// Type for null indicators container.
Extractor(sqlite3_stmt* pStmt); Extractor(sqlite3_stmt* pStmt);
@ -54,78 +57,373 @@ public:
~Extractor(); ~Extractor();
/// Destroys the Extractor. /// Destroys the Extractor.
bool extract(std::size_t pos, Poco::Int8& val); bool extract(std::size_t pos, Poco::Int8& val) override;
/// Extracts an Int8. /// Extracts an Int8.
bool extract(std::size_t pos, Poco::UInt8& val); bool extract(std::size_t pos, Poco::UInt8& val) override;
/// Extracts an UInt8. /// Extracts an UInt8.
bool extract(std::size_t pos, Poco::Int16& val); bool extract(std::size_t pos, Poco::Int16& val) override;
/// Extracts an Int16. /// Extracts an Int16.
bool extract(std::size_t pos, Poco::UInt16& val); bool extract(std::size_t pos, Poco::UInt16& val) override;
/// Extracts an UInt16. /// Extracts an UInt16.
bool extract(std::size_t pos, Poco::Int32& val); bool extract(std::size_t pos, Poco::Int32& val) override;
/// Extracts an Int32. /// Extracts an Int32.
bool extract(std::size_t pos, Poco::UInt32& val); bool extract(std::size_t pos, Poco::UInt32& val) override;
/// Extracts an UInt32. /// Extracts an UInt32.
bool extract(std::size_t pos, Poco::Int64& val); bool extract(std::size_t pos, Poco::Int64& val) override;
/// Extracts an Int64. /// Extracts an Int64.
bool extract(std::size_t pos, Poco::UInt64& val); bool extract(std::size_t pos, Poco::UInt64& val) override;
/// Extracts an UInt64. /// Extracts an UInt64.
#ifndef POCO_INT64_IS_LONG bool extract(std::size_t pos, bool& val) override;
bool extract(std::size_t pos, long& val);
/// Extracts a long.
bool extract(std::size_t pos, unsigned long& val);
/// Extracts an unsigned long.
#endif
bool extract(std::size_t pos, bool& val);
/// Extracts a boolean. /// Extracts a boolean.
bool extract(std::size_t pos, float& val); bool extract(std::size_t pos, float& val) override;
/// Extracts a float. /// Extracts a float.
bool extract(std::size_t pos, double& val); bool extract(std::size_t pos, double& val) override;
/// Extracts a double. /// Extracts a double.
bool extract(std::size_t pos, char& val); bool extract(std::size_t pos, char& val) override;
/// Extracts a single character. /// Extracts a single character.
bool extract(std::size_t pos, std::string& val); bool extract(std::size_t pos, std::string& val) override;
/// Extracts a string. /// Extracts a string.
bool extract(std::size_t pos, Poco::Data::BLOB& val); bool extract(std::size_t pos, UTF16String& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, Poco::Data::BLOB& val) override;
/// Extracts a BLOB. /// Extracts a BLOB.
bool extract(std::size_t pos, Poco::Data::CLOB& val); bool extract(std::size_t pos, Poco::Data::CLOB& val) override;
/// Extracts a CLOB. /// Extracts a CLOB.
bool extract(std::size_t pos, Poco::Data::Date& val); bool extract(std::size_t pos, Poco::Data::Date& val) override;
/// Extracts a Date. /// Extracts a Date.
bool extract(std::size_t pos, Poco::Data::Time& val); bool extract(std::size_t pos, Poco::Data::Time& val) override;
/// Extracts a Time. /// Extracts a Time.
bool extract(std::size_t pos, Poco::DateTime& val); bool extract(std::size_t pos, Poco::DateTime& val) override;
/// Extracts a DateTime. /// Extracts a DateTime.
bool extract(std::size_t pos, Poco::UUID& val); bool extract(std::size_t pos, Poco::UUID& val) override;
/// Extracts a Time. /// Extracts a UUID.
bool extract(std::size_t pos, Poco::Any& val); bool extract(std::size_t pos, Poco::Any& val) override;
/// Extracts an Any. /// Extracts an Any.
bool extract(std::size_t pos, Poco::Dynamic::Var& val); bool extract(std::size_t pos, Poco::Dynamic::Var& val) override;
/// Extracts a Dynamic::Var. /// Extracts a Dynamic::Var.
bool isNull(std::size_t pos, std::size_t row = POCO_DATA_INVALID_ROW); // Nullable extraction
bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val) override;
/// Extracts an Nullable<Int8>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val) override;
/// Extracts an Nullable<UInt8>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val) override;
/// Extracts an Nullable<Int16>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val) override;
/// Extracts an Nullable<UInt16>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val) override;
/// Extracts an Nullable<Int32>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val) override;
/// Extracts an Nullable<UInt32>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val) override;
/// Extracts an Nullable<Int64>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val) override;
/// Extracts an Nullable<UInt64>.
#ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, long& val) override;
/// Extracts a long.
bool extract(std::size_t pos, unsigned long& val) override;
/// Extracts an unsigned long.
bool extract(std::size_t pos, std::vector<long>& val) override;
/// Extracts a long vector.
bool extract(std::size_t pos, std::deque<long>& val) override;
/// Extracts a long deque.
bool extract(std::size_t pos, std::list<long>& val) override;
/// Extracts a long list.
bool extract(std::size_t pos, std::vector<unsigned long>& val) override;
/// Extracts an unsigned long vector.
bool extract(std::size_t pos, std::deque<unsigned long>& val) override;
/// Extracts an unsigned long deque.
bool extract(std::size_t pos, std::list<unsigned long>& val) override;
/// Extracts an unsigned long list.
bool extract(std::size_t pos, Poco::Nullable<long>& val) override;
/// Extracts a Nullable<long>.
bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val) override;
/// Extracts a Nullable<unsigned long>.
#endif
bool extract(std::size_t pos, Poco::Nullable<bool>& val) override;
/// Extracts a Nullable<bool>.
bool extract(std::size_t pos, Poco::Nullable<float>& val) override;
/// Extracts a Nullable<float>.
bool extract(std::size_t pos, Poco::Nullable<double>& val) override;
/// Extracts a Nullable<double>.
bool extract(std::size_t pos, Poco::Nullable<char>& val) override;
/// Extracts a single Nullable character.
bool extract(std::size_t pos, Poco::Nullable<std::string>& val) override;
/// Extracts a Nullable<string>.
bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val) override;
/// Extracts a Nullable<UTF16String>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Data::BLOB>& val) override;
/// Extracts a Nullable<BLOB>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Data::CLOB>& val) override;
/// Extracts a Nullable<BLOB>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Data::Date>& val) override;
/// Extracts a Nullable<Date>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Data::Time>& val) override;
/// Extracts a :Nullable<Time>.
bool extract(std::size_t pos, Poco::Nullable<Poco::DateTime>& val) override;
/// Extracts Nullable<DateTime>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UUID>& val) override;
/// Extracts a Nullable<UUID>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Any>& val) override;
/// Extracts a Nullable<Any>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val) override;
/// Extracts a Nullable<Var>.
// Containers
bool extract(std::size_t pos, std::vector<Poco::Int8>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Int8>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Int8>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::UInt8>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Int16>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Int16>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Int16>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::UInt16>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Int32>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Int32>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Int32>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::UInt32>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Int64>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Int64>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Int64>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::UInt64>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<bool>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<bool>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<bool>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<char>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<char>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<char>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<std::string>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<std::string>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<std::string>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<UTF16String>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<UTF16String>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<UTF16String>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<float>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<float>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<float>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<double>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<double>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<double>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Data::Date>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Data::Date>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Data::Date>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Data::Time>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Data::Time>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Data::Time>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Data::BLOB>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Data::BLOB>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Data::BLOB>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Data::CLOB>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Data::CLOB>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Data::CLOB>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::DateTime>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::DateTime>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::DateTime>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::UUID>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::UUID>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::UUID>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Any>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Any>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Any>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val) override;
/// Throws NotImplementedException.
bool extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val) override;
/// Throws NotImplementedException.
bool isNull(std::size_t pos, std::size_t row = POCO_DATA_INVALID_ROW) override;
/// Returns true if the current row value at pos column is null. /// Returns true if the current row value at pos column is null.
/// Because of the loss of information about null-ness of the /// Because of the loss of information about null-ness of the
/// underlying database values due to the nature of SQLite engine, /// underlying database values due to the nature of SQLite engine,
@ -141,10 +439,18 @@ public:
/// The row argument, needed for connectors with bulk capabilities, /// The row argument, needed for connectors with bulk capabilities,
/// is ignored in this implementation. /// is ignored in this implementation.
void reset(); void reset() override;
/// Clears the cached nulls indicator vector. /// Clears the cached nulls indicator vector.
private: private:
template <typename F, typename T>
bool extract(F func, std::size_t pos, T& val)
{
if (isNull(pos)) return false;
val = func(_pStmt, (int) pos);
return true;
}
template <typename T> template <typename T>
bool extractImpl(std::size_t pos, T& val) bool extractImpl(std::size_t pos, T& val)
/// Utility function for extraction of Any and Dynamic::Var. /// Utility function for extraction of Any and Dynamic::Var.

View File

@ -20,6 +20,7 @@
#include "Poco/Data/DataException.h" #include "Poco/Data/DataException.h"
#include "Poco/DateTimeParser.h" #include "Poco/DateTimeParser.h"
#include "Poco/Exception.h" #include "Poco/Exception.h"
#include "Poco/Debugger.h"
#if defined(POCO_UNBUNDLED) #if defined(POCO_UNBUNDLED)
#include <sqlite3.h> #include <sqlite3.h>
#else #else
@ -49,43 +50,19 @@ Extractor::~Extractor()
bool Extractor::extract(std::size_t pos, Poco::Int32& val) bool Extractor::extract(std::size_t pos, Poco::Int32& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, Poco::Int64& val) bool Extractor::extract(std::size_t pos, Poco::Int64& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int64, pos, val);
val = sqlite3_column_int64(_pStmt, (int) pos);
return true;
} }
#ifndef POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, long& val)
{
if (isNull(pos)) return false;
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, unsigned long& val)
{
if (isNull(pos)) return false;
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
#endif
bool Extractor::extract(std::size_t pos, double& val) bool Extractor::extract(std::size_t pos, double& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_double, pos, val);
val = sqlite3_column_double(_pStmt, (int) pos);
return true;
} }
@ -101,59 +78,51 @@ bool Extractor::extract(std::size_t pos, std::string& val)
} }
bool Extractor::extract(std::size_t pos, UTF16String& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, Poco::Int8& val) bool Extractor::extract(std::size_t pos, Poco::Int8& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, Poco::UInt8& val) bool Extractor::extract(std::size_t pos, Poco::UInt8& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, Poco::Int16& val) bool Extractor::extract(std::size_t pos, Poco::Int16& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, Poco::UInt16& val) bool Extractor::extract(std::size_t pos, Poco::UInt16& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, Poco::UInt32& val) bool Extractor::extract(std::size_t pos, Poco::UInt32& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, Poco::UInt64& val) bool Extractor::extract(std::size_t pos, Poco::UInt64& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int64, pos, val);
val = sqlite3_column_int64(_pStmt, (int) pos);
return true;
} }
bool Extractor::extract(std::size_t pos, bool& val) bool Extractor::extract(std::size_t pos, bool& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = (0 != sqlite3_column_int(_pStmt, (int) pos));
return true;
} }
@ -167,9 +136,7 @@ bool Extractor::extract(std::size_t pos, float& val)
bool Extractor::extract(std::size_t pos, char& val) bool Extractor::extract(std::size_t pos, char& val)
{ {
if (isNull(pos)) return false; return extract(sqlite3_column_int, pos, val);
val = sqlite3_column_int(_pStmt, (int) pos);
return true;
} }
@ -230,6 +197,299 @@ bool Extractor::extract(std::size_t pos, Dynamic::Var& val)
} }
// Nullable
bool Extractor::extract(std::size_t pos, Nullable<Poco::Int32>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::Int64>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int64(_pStmt, (int) pos);
return true;
}
#ifndef POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, long& val)
{
if (isNull(pos)) return false;
val = sqlite3_column_int64(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, unsigned long& val)
{
if (isNull(pos)) return false;
val = sqlite3_column_int64(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, std::vector<long>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<long>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<long>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<unsigned long>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<unsigned long>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<unsigned long>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, Nullable<long>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<unsigned long>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
#endif // POCO_INT64_IS_LONG
bool Extractor::extract(std::size_t pos, Nullable<double>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_double(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<std::string>& val)
{
if (isNull(pos)) val.clear();
else
{
const char *pBuf = reinterpret_cast<const char*>(sqlite3_column_text(_pStmt, (int) pos));
if (!pBuf) val = ""s;
else val = pBuf;
}
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<UTF16String>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::Int8>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::UInt8>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::Int16>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::UInt16>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::UInt32>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::UInt64>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int64(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<bool>& val)
{
if (isNull(pos)) val.clear();
else val = (0 != sqlite3_column_int(_pStmt, (int) pos));
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<float>& val)
{
if (isNull(pos)) val.clear();
else val = static_cast<float>(sqlite3_column_double(_pStmt, (int) pos));
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<char>& val)
{
if (isNull(pos)) val.clear();
else val = sqlite3_column_int(_pStmt, (int) pos);
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Date>& val)
{
if (isNull(pos)) val.clear();
else
{
std::string str;
extract(pos, str);
int tzd;
val = DateTimeParser::parse(Utility::SQLITE_DATE_FORMAT, str, tzd);
}
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Time>& val)
{
if (isNull(pos)) val.clear();
else
{
std::string str;
extract(pos, str);
int tzd;
val = DateTimeParser::parse(Utility::SQLITE_TIME_FORMAT, str, tzd);
}
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<DateTime>& val)
{
if (isNull(pos)) val.clear();
else
{
std::string dt;
extract(pos, dt);
int tzd;
if (val.isNull()) val = DateTime();
DateTimeParser::parse(dt, val.value(), tzd);
}
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<UUID>& val)
{
if (isNull(pos)) val.clear();
else
{
std::string str;
extract(pos, str);
if (val.isNull()) val = UUID();
val.value().parse(str);
}
return true;
}
bool Extractor::extract(std::size_t pos, Nullable<Poco::Any>& val)
{
if (isNull(pos))
{
val.clear();
return true;
}
if (val.isNull()) val = Poco::Any();
return extractImpl(pos, val.value());
}
bool Extractor::extract(std::size_t pos, Nullable<Dynamic::Var>& val)
{
if (isNull(pos))
{
val.clear();
return true;
}
if (val.isNull()) val = Dynamic::Var();
return extractImpl(pos, val.value());
}
inline bool Extractor::extract(std::size_t pos, Nullable<Poco::Data::BLOB>& val)
{
if (isNull(pos))
{
val.clear();
return true;
}
if (val.isNull()) val = Poco::Data::BLOB();
return extractLOB<Poco::Data::BLOB::ValueType>(pos, val.value());
}
inline bool Extractor::extract(std::size_t pos, Nullable<Poco::Data::CLOB>& val)
{
if (isNull(pos))
{
val.clear();
return true;
}
if (val.isNull()) val = Poco::Data::CLOB();
return extractLOB<Poco::Data::CLOB::ValueType>(pos, val.value());
}
bool Extractor::isNull(std::size_t pos, std::size_t) bool Extractor::isNull(std::size_t pos, std::size_t)
{ {
if (pos >= _nulls.size()) if (pos >= _nulls.size())
@ -245,4 +505,401 @@ bool Extractor::isNull(std::size_t pos, std::size_t)
} }
// Containers
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int8>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int8>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int8>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt8>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt8>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt8>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int16>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int16>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int16>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt16>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt16>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt16>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int32>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int32>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int32>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt32>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt32>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt32>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int64>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int64>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int64>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt64>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt64>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt64>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<bool>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<bool>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<bool>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<char>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<char>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<char>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<std::string>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<std::string>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<std::string>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<UTF16String>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<UTF16String>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<UTF16String>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<float>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<float>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<float>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<double>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<double>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<double>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::Date>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::Date>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::Date>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::Time>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::Time>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::Time>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::BLOB>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::BLOB>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::BLOB>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::CLOB>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::CLOB>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::CLOB>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::DateTime>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::DateTime>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::DateTime>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::UUID>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UUID>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UUID>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Any>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Any>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Any>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val)
{
throw Poco::NotImplementedException(poco_src_loc);
}
} } } // namespace Poco::Data::SQLite } } } // namespace Poco::Data::SQLite

View File

@ -45,6 +45,7 @@
#include <iostream> #include <iostream>
using namespace std::string_literals;
using namespace Poco::Data::Keywords; using namespace Poco::Data::Keywords;
using Poco::Data::Session; using Poco::Data::Session;
using Poco::Data::Statement; using Poco::Data::Statement;
@ -62,6 +63,7 @@ using Poco::Data::Transaction;
using Poco::Data::AbstractExtractionVec; using Poco::Data::AbstractExtractionVec;
using Poco::Data::AbstractExtractionVecVec; using Poco::Data::AbstractExtractionVecVec;
using Poco::Data::AbstractBindingVec; using Poco::Data::AbstractBindingVec;
using Poco::Data::NullData;
using Poco::Data::NotConnectedException; using Poco::Data::NotConnectedException;
using Poco::Data::SQLite::Notifier; using Poco::Data::SQLite::Notifier;
using Poco::Nullable; using Poco::Nullable;
@ -2189,6 +2191,120 @@ void SQLiteTest::testNullable()
} }
void SQLiteTest::testNullableVector()
{
Session ses (Poco::Data::SQLite::Connector::KEY, "dummy.db");
ses << "DROP TABLE IF EXISTS NullableTest", now;
ses << "CREATE TABLE NullableTest (i INTEGER, r REAL, s VARCHAR, d DATETIME)", now;
const int sz = 3;
std::vector<NullData> nd(sz, null);
ses << "INSERT INTO NullableTest VALUES(:i, :r, :s, :d)", use(nd), use(nd), use(nd), use(nd), now;
std::vector<Nullable<int>> v(sz, 1);
std::vector<Nullable<double>> f(sz, 1.5);
std::vector<Nullable<std::string>> s(sz, "abc"s);
std::vector<Nullable<DateTime>> d(sz, DateTime());
for (int i = 0; i < sz; ++i)
{
assertFalse (v[i].isNull());
assertFalse (f[i].isNull());
assertFalse (s[i].isNull());
assertFalse (d[i].isNull());
}
v.clear();
f.clear();
s.clear();
d.clear();
assertEqual (0, v.size());
assertEqual (0, f.size());
assertEqual (0, s.size());
assertEqual (0, d.size());
ses << "SELECT i, r, s, d FROM NullableTest", into(v), into(f), into(s), into(d), now;
assertEqual (sz, v.size());
assertEqual (sz, f.size());
assertEqual (sz, s.size());
assertEqual (sz, d.size());
for (int i = 0; i < sz; ++i)
{
assertTrue (v[i].isNull());
assertTrue (f[i].isNull());
assertTrue (s[i].isNull());
assertTrue (d[i].isNull());
}
ses << "DELETE FROM NullableTest", now;
ses << "SELECT i, r, s, d FROM NullableTest", into(v), into(f), into(s), into(d), now;
assertEqual (0, v.size());
assertEqual (0, f.size());
assertEqual (0, s.size());
assertEqual (0, d.size());
const std::vector<Nullable<int>> nv = {null, 2, 3};
const std::vector<Nullable<double>> nf = {1.5, null, 3.5};
const std::vector<Nullable<std::string>> ns = {"123"s, "abc"s, null};
const std::vector<Nullable<DateTime>> ndt = {null, DateTime(1965, 6, 18), null};
v = nv;
f = nf;
s = ns;
d = ndt;
ses << "INSERT INTO NullableTest VALUES(:i, :r, :s, :d)", use(v), use(f), use(s), use(d), now;
v.clear();
f.clear();
s.clear();
d.clear();
assertEqual (0, v.size());
assertEqual (0, f.size());
assertEqual (0, s.size());
assertEqual (0, d.size());
ses << "SELECT i, r, s, d FROM NullableTest", into(v), into(f), into(s), into(d), now;
assertEqual (sz, v.size());
assertEqual (sz, f.size());
assertEqual (sz, s.size());
assertEqual (sz, d.size());
assertTrue (v == nv);
assertTrue (f == nf);
assertTrue (s == ns);
assertTrue (d == ndt);
RecordSet rs(ses, "SELECT * FROM NullableTest");
rs.moveFirst();
assertTrue (rs.isNull("i"));
assertTrue (!rs.isNull("r"));
assertTrue (!rs.isNull("s"));
assertTrue (rs.isNull("d"));
assertTrue (rs.moveNext());
assertTrue (!rs.isNull("i"));
assertTrue (rs.isNull("r"));
assertTrue (!rs.isNull("s"));
assertTrue (!rs.isNull("d"));
assertTrue (rs.moveNext());
assertTrue (!rs.isNull("i"));
assertTrue (!rs.isNull("r"));
assertTrue (rs.isNull("s"));
assertTrue (rs.isNull("d"));
}
void SQLiteTest::testNulls() void SQLiteTest::testNulls()
{ {
Session ses (Poco::Data::SQLite::Connector::KEY, "dummy.db"); Session ses (Poco::Data::SQLite::Connector::KEY, "dummy.db");
@ -3272,21 +3388,21 @@ void SQLiteTest::testSessionTransactionReadUncommitted()
Connector::enableSharedCache(); Connector::enableSharedCache();
Session session (Poco::Data::SQLite::Connector::KEY, "dummy.db"); Session session (Poco::Data::SQLite::Connector::KEY, "dummy.db");
assertTrue (session.isConnected()); assertTrue (session.isConnected());
session << "DROP TABLE IF EXISTS Person", now; session << "DROP TABLE IF EXISTS Person", now;
session << "CREATE TABLE IF NOT EXISTS Person (LastName VARCHAR(30), FirstName VARCHAR, Address VARCHAR, Age INTEGER(3))", now; session << "CREATE TABLE IF NOT EXISTS Person (LastName VARCHAR(30), FirstName VARCHAR, Address VARCHAR, Age INTEGER(3))", now;
if (!session.canTransact()) if (!session.canTransact())
{ {
std::cout << "Session not capable of transactions." << std::endl; std::cout << "Session not capable of transactions." << std::endl;
return; return;
} }
Session local (Poco::Data::SQLite::Connector::KEY, "dummy.db"); Session local (Poco::Data::SQLite::Connector::KEY, "dummy.db");
assertTrue (local.isConnected()); assertTrue (local.isConnected());
assertTrue (local.getFeature("autoCommit")); assertTrue (local.getFeature("autoCommit"));
std::string funct = "transaction()"; std::string funct = "transaction()";
std::vector<std::string> lastNames; std::vector<std::string> lastNames;
std::vector<std::string> firstNames; std::vector<std::string> firstNames;
@ -3303,55 +3419,55 @@ void SQLiteTest::testSessionTransactionReadUncommitted()
ages.push_back(2); ages.push_back(2);
int count = 0, locCount = 0; int count = 0, locCount = 0;
std::string result; std::string result;
setTransactionIsolation(session, Session::TRANSACTION_READ_UNCOMMITTED); setTransactionIsolation(session, Session::TRANSACTION_READ_UNCOMMITTED);
setTransactionIsolation(local, Session::TRANSACTION_READ_UNCOMMITTED); setTransactionIsolation(local, Session::TRANSACTION_READ_UNCOMMITTED);
session.begin(); session.begin();
assertTrue (!session.getFeature("autoCommit")); assertTrue (!session.getFeature("autoCommit"));
assertTrue (session.isTransaction()); assertTrue (session.isTransaction());
session << "INSERT INTO Person VALUES (?,?,?,?)", use(lastNames), use(firstNames), use(addresses), use(ages), now; session << "INSERT INTO Person VALUES (?,?,?,?)", use(lastNames), use(firstNames), use(addresses), use(ages), now;
assertTrue (session.isTransaction()); assertTrue (session.isTransaction());
Statement stmt = (local << "SELECT COUNT(*) FROM Person", into(locCount), async, now); Statement stmt = (local << "SELECT COUNT(*) FROM Person", into(locCount), async, now);
session << "SELECT COUNT(*) FROM Person", into(count), now; session << "SELECT COUNT(*) FROM Person", into(count), now;
assertTrue (2 == count); assertTrue (2 == count);
stmt.wait(); stmt.wait();
assertTrue (session.isTransaction()); assertTrue (session.isTransaction());
session.rollback(); session.rollback();
assertTrue (!session.isTransaction()); assertTrue (!session.isTransaction());
assertTrue (session.getFeature("autoCommit")); assertTrue (session.getFeature("autoCommit"));
assertEqual(2, locCount); assertEqual(2, locCount);
session << "SELECT count(*) FROM Person", into(count), now; session << "SELECT count(*) FROM Person", into(count), now;
assertTrue (0 == count); assertTrue (0 == count);
assertTrue (!session.isTransaction()); assertTrue (!session.isTransaction());
session.begin(); session.begin();
session << "INSERT INTO Person VALUES (?,?,?,?)", use(lastNames), use(firstNames), use(addresses), use(ages), now; session << "INSERT INTO Person VALUES (?,?,?,?)", use(lastNames), use(firstNames), use(addresses), use(ages), now;
assertTrue (session.isTransaction()); assertTrue (session.isTransaction());
assertTrue (!session.getFeature("autoCommit")); assertTrue (!session.getFeature("autoCommit"));
Statement stmt1 = (local << "SELECT COUNT(*) FROM Person", into(locCount), now); Statement stmt1 = (local << "SELECT COUNT(*) FROM Person", into(locCount), now);
assertTrue (2 == locCount); assertTrue (2 == locCount);
session << "SELECT count(*) FROM Person", into(count), now; session << "SELECT count(*) FROM Person", into(count), now;
assertTrue (2 == count); assertTrue (2 == count);
session.commit(); session.commit();
assertTrue (!session.isTransaction()); assertTrue (!session.isTransaction());
assertTrue (session.getFeature("autoCommit")); assertTrue (session.getFeature("autoCommit"));
session << "SELECT count(*) FROM Person", into(count), now; session << "SELECT count(*) FROM Person", into(count), now;
assertTrue (2 == count); assertTrue (2 == count);
session.close(); session.close();
assertTrue (!session.isConnected()); assertTrue (!session.isConnected());
local.close(); local.close();
assertTrue (!local.isConnected()); assertTrue (!local.isConnected());
} }
@ -3841,6 +3957,7 @@ CppUnit::Test* SQLiteTest::suite()
CppUnit_addTest(pSuite, SQLiteTest, testInternalExtraction); CppUnit_addTest(pSuite, SQLiteTest, testInternalExtraction);
CppUnit_addTest(pSuite, SQLiteTest, testPrimaryKeyConstraint); CppUnit_addTest(pSuite, SQLiteTest, testPrimaryKeyConstraint);
CppUnit_addTest(pSuite, SQLiteTest, testNullable); CppUnit_addTest(pSuite, SQLiteTest, testNullable);
CppUnit_addTest(pSuite, SQLiteTest, testNullableVector);
CppUnit_addTest(pSuite, SQLiteTest, testNulls); CppUnit_addTest(pSuite, SQLiteTest, testNulls);
CppUnit_addTest(pSuite, SQLiteTest, testRowIterator); CppUnit_addTest(pSuite, SQLiteTest, testRowIterator);
CppUnit_addTest(pSuite, SQLiteTest, testAsync); CppUnit_addTest(pSuite, SQLiteTest, testAsync);

View File

@ -108,6 +108,7 @@ public:
void testInternalExtraction(); void testInternalExtraction();
void testPrimaryKeyConstraint(); void testPrimaryKeyConstraint();
void testNullable(); void testNullable();
void testNullableVector();
void testNulls(); void testNulls();
void testRowIterator(); void testRowIterator();
void testAsync(); void testAsync();

View File

@ -368,7 +368,7 @@ protected:
private: private:
using StringList = std::vector<std::string*>; using StringList = std::vector<std::string*>;
std::unique_ptr<Transcoder> _pTranscoder; std::unique_ptr<Transcoder> _pTranscoder;
std::unique_ptr<StringList> _pStrings; std::unique_ptr<StringList> _pStrings;
}; };

View File

@ -21,6 +21,7 @@
#include "Poco/Data/Data.h" #include "Poco/Data/Data.h"
#include "Poco/Data/Constants.h" #include "Poco/Data/Constants.h"
#include "Poco/Data/LOB.h" #include "Poco/Data/LOB.h"
#include "Poco/Nullable.h"
#include "Poco/UUID.h" #include "Poco/UUID.h"
#include "Poco/UTFString.h" #include "Poco/UTFString.h"
#include "Poco/TextEncoding.h" #include "Poco/TextEncoding.h"
@ -66,97 +67,97 @@ public:
virtual bool extract(std::size_t pos, Poco::Int8& val) = 0; virtual bool extract(std::size_t pos, Poco::Int8& val) = 0;
/// Extracts an Int8. Returns false if null was received. /// Extracts an Int8. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::Int8>& val); virtual bool extract(std::size_t pos, std::vector<Poco::Int8>& val) = 0;
/// Extracts an Int8 vector. /// Extracts an Int8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int8>& val); virtual bool extract(std::size_t pos, std::deque<Poco::Int8>& val) = 0;
/// Extracts an Int8 deque. /// Extracts an Int8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int8>& val); virtual bool extract(std::size_t pos, std::list<Poco::Int8>& val) = 0;
/// Extracts an Int8 list. /// Extracts an Int8 list.
virtual bool extract(std::size_t pos, Poco::UInt8& val) = 0; virtual bool extract(std::size_t pos, Poco::UInt8& val) = 0;
/// Extracts an UInt8. Returns false if null was received. /// Extracts an UInt8. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt8>& val); virtual bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) = 0;
/// Extracts an UInt8 vector. /// Extracts an UInt8 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt8>& val); virtual bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) = 0;
/// Extracts an UInt8 deque. /// Extracts an UInt8 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt8>& val); virtual bool extract(std::size_t pos, std::list<Poco::UInt8>& val) = 0;
/// Extracts an UInt8 list. /// Extracts an UInt8 list.
virtual bool extract(std::size_t pos, Poco::Int16& val) = 0; virtual bool extract(std::size_t pos, Poco::Int16& val) = 0;
/// Extracts an Int16. Returns false if null was received. /// Extracts an Int16. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::Int16>& val); virtual bool extract(std::size_t pos, std::vector<Poco::Int16>& val) = 0;
/// Extracts an Int16 vector. /// Extracts an Int16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int16>& val); virtual bool extract(std::size_t pos, std::deque<Poco::Int16>& val) = 0;
/// Extracts an Int16 deque. /// Extracts an Int16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int16>& val); virtual bool extract(std::size_t pos, std::list<Poco::Int16>& val) = 0;
/// Extracts an Int16 list. /// Extracts an Int16 list.
virtual bool extract(std::size_t pos, Poco::UInt16& val) = 0; virtual bool extract(std::size_t pos, Poco::UInt16& val) = 0;
/// Extracts an UInt16. Returns false if null was received. /// Extracts an UInt16. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt16>& val); virtual bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) = 0;
/// Extracts an UInt16 vector. /// Extracts an UInt16 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt16>& val); virtual bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) = 0;
/// Extracts an UInt16 deque. /// Extracts an UInt16 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt16>& val); virtual bool extract(std::size_t pos, std::list<Poco::UInt16>& val) = 0;
/// Extracts an UInt16 list. /// Extracts an UInt16 list.
virtual bool extract(std::size_t pos, Poco::Int32& val) = 0; virtual bool extract(std::size_t pos, Poco::Int32& val) = 0;
/// Extracts an Int32. Returns false if null was received. /// Extracts an Int32. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::Int32>& val); virtual bool extract(std::size_t pos, std::vector<Poco::Int32>& val) = 0;
/// Extracts an Int32 vector. /// Extracts an Int32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int32>& val); virtual bool extract(std::size_t pos, std::deque<Poco::Int32>& val) = 0;
/// Extracts an Int32 deque. /// Extracts an Int32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int32>& val); virtual bool extract(std::size_t pos, std::list<Poco::Int32>& val) = 0;
/// Extracts an Int32 list. /// Extracts an Int32 list.
virtual bool extract(std::size_t pos, Poco::UInt32& val) = 0; virtual bool extract(std::size_t pos, Poco::UInt32& val) = 0;
/// Extracts an UInt32. Returns false if null was received. /// Extracts an UInt32. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt32>& val); virtual bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) = 0;
/// Extracts an UInt32 vector. /// Extracts an UInt32 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt32>& val); virtual bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) = 0;
/// Extracts an UInt32 deque. /// Extracts an UInt32 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt32>& val); virtual bool extract(std::size_t pos, std::list<Poco::UInt32>& val) = 0;
/// Extracts an UInt32 list. /// Extracts an UInt32 list.
virtual bool extract(std::size_t pos, Poco::Int64& val) = 0; virtual bool extract(std::size_t pos, Poco::Int64& val) = 0;
/// Extracts an Int64. Returns false if null was received. /// Extracts an Int64. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::Int64>& val); virtual bool extract(std::size_t pos, std::vector<Poco::Int64>& val) = 0;
/// Extracts an Int64 vector. /// Extracts an Int64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Int64>& val); virtual bool extract(std::size_t pos, std::deque<Poco::Int64>& val) = 0;
/// Extracts an Int64 deque. /// Extracts an Int64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::Int64>& val); virtual bool extract(std::size_t pos, std::list<Poco::Int64>& val) = 0;
/// Extracts an Int64 list. /// Extracts an Int64 list.
virtual bool extract(std::size_t pos, Poco::UInt64& val) = 0; virtual bool extract(std::size_t pos, Poco::UInt64& val) = 0;
/// Extracts an UInt64. Returns false if null was received. /// Extracts an UInt64. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::UInt64>& val); virtual bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) = 0;
/// Extracts an UInt64 vector. /// Extracts an UInt64 vector.
virtual bool extract(std::size_t pos, std::deque<Poco::UInt64>& val); virtual bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) = 0;
/// Extracts an UInt64 deque. /// Extracts an UInt64 deque.
virtual bool extract(std::size_t pos, std::list<Poco::UInt64>& val); virtual bool extract(std::size_t pos, std::list<Poco::UInt64>& val) = 0;
/// Extracts an UInt64 list. /// Extracts an UInt64 list.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
@ -166,74 +167,83 @@ public:
virtual bool extract(std::size_t pos, unsigned long& val) = 0; virtual bool extract(std::size_t pos, unsigned long& val) = 0;
/// Extracts an unsigned long. Returns false if null was received. /// Extracts an unsigned long. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<long>& val); virtual bool extract(std::size_t pos, std::vector<long>& val) = 0;
/// Extracts a long vector. /// Extracts a long vector.
virtual bool extract(std::size_t pos, std::deque<long>& val); virtual bool extract(std::size_t pos, std::deque<long>& val) = 0;
/// Extracts a long deque. /// Extracts a long deque.
virtual bool extract(std::size_t pos, std::list<long>& val); virtual bool extract(std::size_t pos, std::list<long>& val) = 0;
/// Extracts a long list. /// Extracts a long list.
virtual bool extract(std::size_t pos, std::vector<unsigned long>& val) = 0;
/// Extracts an unsigned long vector.
virtual bool extract(std::size_t pos, std::deque<unsigned long>& val) = 0;
/// Extracts an unsigned long deque.
virtual bool extract(std::size_t pos, std::list<unsigned long>& val) = 0;
/// Extracts an unsigned long list.
#endif #endif
virtual bool extract(std::size_t pos, bool& val) = 0; virtual bool extract(std::size_t pos, bool& val) = 0;
/// Extracts a boolean. Returns false if null was received. /// Extracts a boolean. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<bool>& val); virtual bool extract(std::size_t pos, std::vector<bool>& val) = 0;
/// Extracts a boolean vector. /// Extracts a boolean vector.
virtual bool extract(std::size_t pos, std::deque<bool>& val); virtual bool extract(std::size_t pos, std::deque<bool>& val) = 0;
/// Extracts a boolean deque. /// Extracts a boolean deque.
virtual bool extract(std::size_t pos, std::list<bool>& val); virtual bool extract(std::size_t pos, std::list<bool>& val) = 0;
/// Extracts a boolean list. /// Extracts a boolean list.
virtual bool extract(std::size_t pos, float& val) = 0; virtual bool extract(std::size_t pos, float& val) = 0;
/// Extracts a float. Returns false if null was received. /// Extracts a float. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<float>& val); virtual bool extract(std::size_t pos, std::vector<float>& val) = 0;
/// Extracts a float vector. /// Extracts a float vector.
virtual bool extract(std::size_t pos, std::deque<float>& val); virtual bool extract(std::size_t pos, std::deque<float>& val) = 0;
/// Extracts a float deque. /// Extracts a float deque.
virtual bool extract(std::size_t pos, std::list<float>& val); virtual bool extract(std::size_t pos, std::list<float>& val) = 0;
/// Extracts a float list. /// Extracts a float list.
virtual bool extract(std::size_t pos, double& val) = 0; virtual bool extract(std::size_t pos, double& val) = 0;
/// Extracts a double. Returns false if null was received. /// Extracts a double. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<double>& val); virtual bool extract(std::size_t pos, std::vector<double>& val) = 0;
/// Extracts a double vector. /// Extracts a double vector.
virtual bool extract(std::size_t pos, std::deque<double>& val); virtual bool extract(std::size_t pos, std::deque<double>& val) = 0;
/// Extracts a double deque. /// Extracts a double deque.
virtual bool extract(std::size_t pos, std::list<double>& val); virtual bool extract(std::size_t pos, std::list<double>& val) = 0;
/// Extracts a double list. /// Extracts a double list.
virtual bool extract(std::size_t pos, char& val) = 0; virtual bool extract(std::size_t pos, char& val) = 0;
/// Extracts a single character. Returns false if null was received. /// Extracts a single character. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<char>& val); virtual bool extract(std::size_t pos, std::vector<char>& val) = 0;
/// Extracts a character vector. /// Extracts a character vector.
virtual bool extract(std::size_t pos, std::deque<char>& val); virtual bool extract(std::size_t pos, std::deque<char>& val) = 0;
/// Extracts a character deque. /// Extracts a character deque.
virtual bool extract(std::size_t pos, std::list<char>& val); virtual bool extract(std::size_t pos, std::list<char>& val) = 0;
/// Extracts a character list. /// Extracts a character list.
virtual bool extract(std::size_t pos, std::string& val) = 0; virtual bool extract(std::size_t pos, std::string& val) = 0;
/// Extracts a string. Returns false if null was received. /// Extracts a string. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<std::string>& val); virtual bool extract(std::size_t pos, std::vector<std::string>& val) = 0;
/// Extracts a string vector. /// Extracts a string vector.
virtual bool extract(std::size_t pos, std::deque<std::string>& val); virtual bool extract(std::size_t pos, std::deque<std::string>& val) = 0;
/// Extracts a string deque. /// Extracts a string deque.
virtual bool extract(std::size_t pos, std::list<std::string>& val); virtual bool extract(std::size_t pos, std::list<std::string>& val) = 0;
/// Extracts a string list. /// Extracts a string list.
virtual bool extract(std::size_t pos, UTF16String& val); virtual bool extract(std::size_t pos, UTF16String& val);
@ -254,58 +264,58 @@ public:
virtual bool extract(std::size_t pos, CLOB& val) = 0; virtual bool extract(std::size_t pos, CLOB& val) = 0;
/// Extracts a CLOB. Returns false if null was received. /// Extracts a CLOB. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<BLOB>& val); virtual bool extract(std::size_t pos, std::vector<BLOB>& val) = 0;
/// Extracts a BLOB vector. /// Extracts a BLOB vector.
virtual bool extract(std::size_t pos, std::deque<BLOB>& val); virtual bool extract(std::size_t pos, std::deque<BLOB>& val) = 0;
/// Extracts a BLOB deque. /// Extracts a BLOB deque.
virtual bool extract(std::size_t pos, std::list<BLOB>& val); virtual bool extract(std::size_t pos, std::list<BLOB>& val) = 0;
/// Extracts a BLOB list. /// Extracts a BLOB list.
virtual bool extract(std::size_t pos, std::vector<CLOB>& val); virtual bool extract(std::size_t pos, std::vector<CLOB>& val) = 0;
/// Extracts a CLOB vector. /// Extracts a CLOB vector.
virtual bool extract(std::size_t pos, std::deque<CLOB>& val); virtual bool extract(std::size_t pos, std::deque<CLOB>& val) = 0;
/// Extracts a CLOB deque. /// Extracts a CLOB deque.
virtual bool extract(std::size_t pos, std::list<CLOB>& val); virtual bool extract(std::size_t pos, std::list<CLOB>& val) = 0;
/// Extracts a CLOB list. /// Extracts a CLOB list.
virtual bool extract(std::size_t pos, DateTime& val) = 0; virtual bool extract(std::size_t pos, DateTime& val) = 0;
/// Extracts a DateTime. Returns false if null was received. /// Extracts a DateTime. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<DateTime>& val); virtual bool extract(std::size_t pos, std::vector<DateTime>& val) = 0;
/// Extracts a DateTime vector. /// Extracts a DateTime vector.
virtual bool extract(std::size_t pos, std::deque<DateTime>& val); virtual bool extract(std::size_t pos, std::deque<DateTime>& val) = 0;
/// Extracts a DateTime deque. /// Extracts a DateTime deque.
virtual bool extract(std::size_t pos, std::list<DateTime>& val); virtual bool extract(std::size_t pos, std::list<DateTime>& val) = 0;
/// Extracts a DateTime list. /// Extracts a DateTime list.
virtual bool extract(std::size_t pos, Date& val) = 0; virtual bool extract(std::size_t pos, Date& val) = 0;
/// Extracts a Date. Returns false if null was received. /// Extracts a Date. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Date>& val); virtual bool extract(std::size_t pos, std::vector<Date>& val) = 0;
/// Extracts a Date vector. /// Extracts a Date vector.
virtual bool extract(std::size_t pos, std::deque<Date>& val); virtual bool extract(std::size_t pos, std::deque<Date>& val) = 0;
/// Extracts a Date deque. /// Extracts a Date deque.
virtual bool extract(std::size_t pos, std::list<Date>& val); virtual bool extract(std::size_t pos, std::list<Date>& val) = 0;
/// Extracts a Date list. /// Extracts a Date list.
virtual bool extract(std::size_t pos, Time& val) = 0; virtual bool extract(std::size_t pos, Time& val) = 0;
/// Extracts a Time. Returns false if null was received. /// Extracts a Time. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Time>& val); virtual bool extract(std::size_t pos, std::vector<Time>& val) = 0;
/// Extracts a Time vector. /// Extracts a Time vector.
virtual bool extract(std::size_t pos, std::deque<Time>& val); virtual bool extract(std::size_t pos, std::deque<Time>& val) = 0;
/// Extracts a Time deque. /// Extracts a Time deque.
virtual bool extract(std::size_t pos, std::list<Time>& val); virtual bool extract(std::size_t pos, std::list<Time>& val) = 0;
/// Extracts a Time list. /// Extracts a Time list.
virtual bool extract(std::size_t pos, UUID& val) = 0; virtual bool extract(std::size_t pos, UUID& val) = 0;
@ -323,27 +333,101 @@ public:
virtual bool extract(std::size_t pos, Any& val) = 0; virtual bool extract(std::size_t pos, Any& val) = 0;
/// Extracts an Any. Returns false if null was received. /// Extracts an Any. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Any>& val); virtual bool extract(std::size_t pos, std::vector<Any>& val) = 0;
/// Extracts an Any vector. /// Extracts an Any vector.
virtual bool extract(std::size_t pos, std::deque<Any>& val); virtual bool extract(std::size_t pos, std::deque<Any>& val) = 0;
/// Extracts an Any deque. /// Extracts an Any deque.
virtual bool extract(std::size_t pos, std::list<Any>& val); virtual bool extract(std::size_t pos, std::list<Any>& val) = 0;
/// Extracts an Any list. /// Extracts an Any list.
virtual bool extract(std::size_t pos, Poco::Dynamic::Var& val) = 0; virtual bool extract(std::size_t pos, Poco::Dynamic::Var& val) = 0;
/// Extracts a Var. Returns false if null was received. /// Extracts a Var. Returns false if null was received.
virtual bool extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val); virtual bool extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val) = 0;
/// Extracts a Var vector. /// Extracts a Var vector.
virtual bool extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val); virtual bool extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val) = 0;
/// Extracts a Var deque. /// Extracts a Var deque.
virtual bool extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val); virtual bool extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val) = 0;
/// Extracts a Var list. /// Extracts a Var list.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val);
/// Extracts a nullable nullable Int8.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val);
/// Extracts a nullable nullable UInt8.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val);
/// Extracts a nullable nullable Int16.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val);
/// Extracts a nullable nullable UInt16.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val);
/// Extracts a nullable nullable Int32.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val);
/// Extracts a nullable nullable UInt32.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val);
/// Extracts a nullable nullable Int64.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val);
/// Extracts a nullable nullable UInt64.
#ifndef POCO_INT64_IS_LONG
virtual bool extract(std::size_t pos, Poco::Nullable<long>& val);
/// Extracts a nullable long.
virtual bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val);
/// Extracts a nullable nullable unsigned long.
#endif
virtual bool extract(std::size_t pos, Poco::Nullable<bool>& val);
/// Extracts a nullable boolean.
virtual bool extract(std::size_t pos, Poco::Nullable<float>& val);
/// Extracts a nullable float.
virtual bool extract(std::size_t pos, Poco::Nullable<double>& val);
/// Extracts a nullable double.
virtual bool extract(std::size_t pos, Poco::Nullable<char>& val);
/// Extracts a nullable single character.
virtual bool extract(std::size_t pos, Poco::Nullable<std::string>& val);
/// Extracts a nullable string.
virtual bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val);
/// Extracts a nullable UTF16String.
virtual bool extract(std::size_t pos, Poco::Nullable<BLOB>& val);
/// Extracts a nullable BLOB.
virtual bool extract(std::size_t pos, Poco::Nullable<CLOB>& val);
/// Extracts a nullable CLOB.
virtual bool extract(std::size_t pos, Poco::Nullable<DateTime>& val);
/// Extracts a nullable DateTime.
virtual bool extract(std::size_t pos, Poco::Nullable<Date>& val);
/// Extracts a nullable Date.
virtual bool extract(std::size_t pos, Poco::Nullable<Time>& val);
/// Extracts a nullable Time.
virtual bool extract(std::size_t pos, Poco::Nullable<UUID>& val);
/// Extracts a nullable UUID.
virtual bool extract(std::size_t pos, Poco::Nullable<Any>& val);
/// Extracts a nullable nullable Any.
virtual bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val);
/// Extracts a nullable Var.
virtual bool isNull(std::size_t col, std::size_t row = POCO_DATA_INVALID_ROW) = 0; virtual bool isNull(std::size_t col, std::size_t row = POCO_DATA_INVALID_ROW) = 0;
/// Returns true if the value at [col,row] position is null. /// Returns true if the value at [col,row] position is null.

View File

@ -21,6 +21,7 @@
#include "Poco/Data/Data.h" #include "Poco/Data/Data.h"
#include "Poco/RefCountedObject.h" #include "Poco/RefCountedObject.h"
#include "Poco/Data/LOB.h" #include "Poco/Data/LOB.h"
#include "Poco/Nullable.h"
#include "Poco/UUID.h" #include "Poco/UUID.h"
#include "Poco/UTFString.h" #include "Poco/UTFString.h"
#include <vector> #include <vector>
@ -177,6 +178,15 @@ public:
virtual void prepare(std::size_t pos, const std::list<long>& val); virtual void prepare(std::size_t pos, const std::list<long>& val);
/// Prepares a long list. /// Prepares a long list.
virtual void prepare(std::size_t pos, const std::vector<unsigned long>& val);
/// Prepares a unsigned long vector.
virtual void prepare(std::size_t pos, const std::deque<unsigned long>& val);
/// Prepares a unsigned long deque.
virtual void prepare(std::size_t pos, const std::list<unsigned long>& val);
/// Prepares a unsigned long list.
#endif #endif
virtual void prepare(std::size_t pos, const bool&) = 0; virtual void prepare(std::size_t pos, const bool&) = 0;
@ -239,7 +249,7 @@ public:
virtual void prepare(std::size_t pos, const std::list<std::string>& val); virtual void prepare(std::size_t pos, const std::list<std::string>& val);
/// Prepares a character list. /// Prepares a character list.
virtual void prepare(std::size_t pos, const UTF16String&); virtual void prepare(std::size_t pos, const UTF16String&) = 0;
/// Prepares a UTF16String. /// Prepares a UTF16String.
virtual void prepare(std::size_t pos, const std::vector<UTF16String>& val); virtual void prepare(std::size_t pos, const std::vector<UTF16String>& val);
@ -347,6 +357,296 @@ public:
virtual void prepare(std::size_t pos, const std::list<Poco::Dynamic::Var>& val); virtual void prepare(std::size_t pos, const std::list<Poco::Dynamic::Var>& val);
/// Prepares a Var list. /// Prepares a Var list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::Int8>&);
/// Prepares an Int8.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::Int8>>& val);
/// Prepares an Int8 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::Int8>>& val);
/// Prepares an Int8 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::Int8>>& val);
/// Prepares an Int8 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::UInt8>&);
/// Prepares an UInt8.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::UInt8>>& val);
/// Prepares an UInt8 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::UInt8>>& val);
/// Prepares an UInt8 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::UInt8>>& val);
/// Prepares an UInt8 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::Int16>&);
/// Prepares an Int16.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::Int16>>& val);
/// Prepares an Int16 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::Int16>>& val);
/// Prepares an Int16 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::Int16>>& val);
/// Prepares an Int16 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::UInt16>&);
/// Prepares an UInt16.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::UInt16>>& val);
/// Prepares an UInt16 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::UInt16>>& val);
/// Prepares an UInt16 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::UInt16>>& val);
/// Prepares an UInt16 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::Int32>&);
/// Prepares an Int32.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::Int32>>& val);
/// Prepares an Int32 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::Int32>>& val);
/// Prepares an Int32 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::Int32>>& val);
/// Prepares an Int32 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::UInt32>&);
/// Prepares an UInt32.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::UInt32>>& val);
/// Prepares an UInt32 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::UInt32>>& val);
/// Prepares an UInt32 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::UInt32>>& val);
/// Prepares an UInt32 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::Int64>&);
/// Prepares an Int64.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::Int64>>& val);
/// Prepares an Int64 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::Int64>>& val);
/// Prepares an Int64 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::Int64>>& val);
/// Prepares an Int64 list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::UInt64>&);
/// Prepares an UInt64.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::UInt64>>& val);
/// Prepares an UInt64 vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::UInt64>>& val);
/// Prepares an UInt64 deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::UInt64>>& val);
/// Prepares an UInt64 list.
#ifndef POCO_INT64_IS_LONG
virtual void prepare(std::size_t pos, const Poco::Nullable<long>&);
/// Prepares a long.
virtual void prepare(std::size_t pos, const Poco::Nullable<unsigned long>&);
/// Prepares an unsigned long.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<long>>& val);
/// Prepares a long vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<long>>& val);
/// Prepares a long deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<long>>& val);
/// Prepares a long list.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<unsigned long>>& val);
/// Prepares a unsigned long vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<unsigned long>>& val);
/// Prepares a unsigned long deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<unsigned long>>& val);
/// Prepares a unsigned long list.
#endif
virtual void prepare(std::size_t pos, const Poco::Nullable<bool>&);
/// Prepares a boolean.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<bool>>& val);
/// Prepares a boolean vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<bool>>& val);
/// Prepares a boolean deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<bool>>& val);
/// Prepares a boolean list.
virtual void prepare(std::size_t pos, const Poco::Nullable<float>&);
/// Prepares a float.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<float>>& val);
/// Prepares a float vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<float>>& val);
/// Prepares a float deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<float>>& val);
/// Prepares a float list.
virtual void prepare(std::size_t pos, const Poco::Nullable<double>&);
/// Prepares a double.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<double>>& val);
/// Prepares a double vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<double>>& val);
/// Prepares a double deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<double>>& val);
/// Prepares a double list.
virtual void prepare(std::size_t pos, const Poco::Nullable<char>&);
/// Prepares a single character.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<char>>& val);
/// Prepares a character vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<char>>& val);
/// Prepares a character deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<char>>& val);
/// Prepares a character list.
virtual void prepare(std::size_t pos, const Poco::Nullable<std::string>&);
/// Prepares a string.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<std::string>>& val);
/// Prepares a string vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<std::string>>& val);
/// Prepares a string deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<std::string>>& val);
/// Prepares a character list.
virtual void prepare(std::size_t pos, const Poco::Nullable<UTF16String>&);
/// Prepares a UTF16String.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<UTF16String>>& val);
/// Prepares a UTF16String vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<UTF16String>>& val);
/// Prepares a UTF16String deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<UTF16String>>& val);
/// Prepares a UTF16String list.
virtual void prepare(std::size_t pos, const Poco::Nullable<BLOB>&);
/// Prepares a BLOB.
virtual void prepare(std::size_t pos, const Poco::Nullable<CLOB>&);
/// Prepares a CLOB.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<BLOB>>& val);
/// Prepares a BLOB vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<BLOB>>& val);
/// Prepares a BLOB deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<BLOB>>& val);
/// Prepares a BLOB list.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<CLOB>>& val);
/// Prepares a CLOB vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<CLOB>>& val);
/// Prepares a CLOB deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<CLOB>>& val);
/// Prepares a CLOB list.
virtual void prepare(std::size_t pos, const Poco::Nullable<DateTime>&);
/// Prepares a DateTime.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<DateTime>>& val);
/// Prepares a DateTime vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<DateTime>>& val);
/// Prepares a DateTime deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<DateTime>>& val);
/// Prepares a DateTime list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Date>&);
/// Prepares a Date.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Date>>& val);
/// Prepares a Date vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Date>>& val);
/// Prepares a Date deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Date>>& val);
/// Prepares a Date list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Time>&);
/// Prepares a Time.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Time>>& val);
/// Prepares a Time vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Time>>& val);
/// Prepares a Time deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Time>>& val);
/// Prepares a Time list.
virtual void prepare(std::size_t pos, const Poco::Nullable<UUID>&);
/// Prepares a UUID.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<UUID>>& val);
/// Prepares a UUID vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<UUID>>& val);
/// Prepares a UUID deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<UUID>>& val);
/// Prepares a UUID list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Any>&);
/// Prepares an Any.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Any>>& val);
/// Prepares an Any vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Any>>& val);
/// Prepares an Any deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Any>>& val);
/// Prepares an Any list.
virtual void prepare(std::size_t pos, const Poco::Nullable<Poco::Dynamic::Var>&);
/// Prepares a Var.
virtual void prepare(std::size_t pos, const std::vector<Poco::Nullable<Poco::Dynamic::Var>>& val);
/// Prepares a Var vector.
virtual void prepare(std::size_t pos, const std::deque<Poco::Nullable<Poco::Dynamic::Var>>& val);
/// Prepares a Var deque.
virtual void prepare(std::size_t pos, const std::list<Poco::Nullable<Poco::Dynamic::Var>>& val);
/// Prepares a Var list.
void setLength(Poco::UInt32 length); void setLength(Poco::UInt32 length);
/// Sets the length of prepared data. /// Sets the length of prepared data.
/// Needed only for data lengths greater than 1 (i.e. for /// Needed only for data lengths greater than 1 (i.e. for

View File

@ -292,20 +292,10 @@ public:
static void extract(std::size_t pos, Nullable<T>& obj, const Nullable<T>& , AbstractExtractor::Ptr pExt) static void extract(std::size_t pos, Nullable<T>& obj, const Nullable<T>& , AbstractExtractor::Ptr pExt)
{ {
poco_assert_dbg (!pExt.isNull()); poco_assert_dbg (!pExt.isNull());
T val; pExt->extract(pos++, obj);
if (pExt->extract(pos++, val))
{
obj = std::move(val);
}
else
{
obj.clear();
}
} }
private: private:
TypeHandler(); TypeHandler();
~TypeHandler(); ~TypeHandler();
TypeHandler(const TypeHandler&); TypeHandler(const TypeHandler&);

View File

@ -47,425 +47,191 @@ void AbstractExtractor::reverseTranscode(const std::string& from, std::string& t
} }
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::Int8>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::Int8>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::Int8>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::UInt8>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::UInt8>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::UInt8>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::Int16>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::Int16>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::Int16>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::UInt16>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::UInt16>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::UInt16>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::Int32>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::Int32>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::Int32>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::UInt32>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::UInt32>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::UInt32>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::Int64>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::Int64>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::Int64>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::UInt64>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::UInt64>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::UInt64>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
#ifndef POCO_INT64_IS_LONG
bool AbstractExtractor::extract(std::size_t pos, std::vector<long>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<long>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<long>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
#endif
bool AbstractExtractor::extract(std::size_t pos, std::vector<bool>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<bool>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<bool>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<float>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<float>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<float>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<double>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<double>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<double>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<char>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<char>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<char>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<std::string>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<std::string>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<std::string>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, UTF16String& val) bool AbstractExtractor::extract(std::size_t pos, UTF16String& val)
{ {
throw NotImplementedException("UTF16String extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::vector<UTF16String>& val) bool AbstractExtractor::extract(std::size_t pos, std::vector<UTF16String>& val)
{ {
throw NotImplementedException("std::vector<UTF16String> extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::deque<UTF16String>& val) bool AbstractExtractor::extract(std::size_t pos, std::deque<UTF16String>& val)
{ {
throw NotImplementedException("std::deque<UTF16String> extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::list<UTF16String>& val) bool AbstractExtractor::extract(std::size_t pos, std::list<UTF16String>& val)
{ {
throw NotImplementedException("std::list<UTF16String> extractor must be implemented."); throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<BLOB>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<BLOB>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<BLOB>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<CLOB>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<CLOB>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<CLOB>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<DateTime>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<DateTime>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<DateTime>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Date>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Date>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Date>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::vector<Time>& val)
{
throw NotImplementedException("std::vector extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::deque<Time>& val)
{
throw NotImplementedException("std::deque extractor must be implemented.");
}
bool AbstractExtractor::extract(std::size_t pos, std::list<Time>& val)
{
throw NotImplementedException("std::list extractor must be implemented.");
} }
bool AbstractExtractor::extract(std::size_t pos, std::vector<UUID>& val) bool AbstractExtractor::extract(std::size_t pos, std::vector<UUID>& val)
{ {
throw NotImplementedException("std::vector extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::deque<UUID>& val) bool AbstractExtractor::extract(std::size_t pos, std::deque<UUID>& val)
{ {
throw NotImplementedException("std::deque extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::list<UUID>& val) bool AbstractExtractor::extract(std::size_t pos, std::list<UUID>& val)
{ {
throw NotImplementedException("std::list extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::vector<Any>& val) bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val)
{ {
throw NotImplementedException("std::vector extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::deque<Any>& val) bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val)
{ {
throw NotImplementedException("std::deque extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::list<Any>& val) bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val)
{ {
throw NotImplementedException("std::list extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val) bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val)
{ {
throw NotImplementedException("std::vector extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val) bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val)
{ {
throw NotImplementedException("std::deque extractor must be implemented."); throw NotImplementedException(poco_src_loc);
} }
bool AbstractExtractor::extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val) bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val)
{ {
throw NotImplementedException("std::list extractor must be implemented."); throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val)
{
throw NotImplementedException(poco_src_loc);
}
#ifndef POCO_INT64_IS_LONG
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<long>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<unsigned long>& val)
{
throw NotImplementedException(poco_src_loc);
}
#endif
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<bool>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<float>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<double>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<char>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<std::string>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<UTF16String>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<BLOB>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<CLOB>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<DateTime>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Date>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Time>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<UUID>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Any>& val)
{
throw NotImplementedException(poco_src_loc);
}
bool AbstractExtractor::extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val)
{
throw NotImplementedException(poco_src_loc);
} }

File diff suppressed because it is too large Load Diff

View File

@ -39,6 +39,7 @@
#include "Poco/Glob.h" #include "Poco/Glob.h"
#include "Poco/File.h" #include "Poco/File.h"
#include "Poco/Path.h" #include "Poco/Path.h"
#include "Poco/Nullable.h"
#include <string> #include <string>
#include <cstring> #include <cstring>
#include <sstream> #include <sstream>
@ -1164,7 +1165,6 @@ void DataTest::testRowSort()
testRowStrictWeak(row10, row9, row8); testRowStrictWeak(row10, row9, row8);
Row row11; Row row11;
row11.append("0", 2.5); row11.append("0", 2.5);
row11.append("1", 2.5); row11.append("1", 2.5);
@ -1604,6 +1604,17 @@ void DataTest::testSQLChannel()
} }
void DataTest::testNullableExtract()
{
Poco::Data::Test::Extractor ext;
Poco::Nullable<Poco::Int32> ni;
assertTrue (ni.isNull());
assertTrue (ext.extract(0, ni));
assertFalse (ni.isNull());
assertEqual (ni.value(), 1);
}
void DataTest::setUp() void DataTest::setUp()
{ {
} }
@ -1638,6 +1649,7 @@ CppUnit::Test* DataTest::suite()
CppUnit_addTest(pSuite, DataTest, testTranscode); CppUnit_addTest(pSuite, DataTest, testTranscode);
CppUnit_addTest(pSuite, DataTest, testSQLParse); CppUnit_addTest(pSuite, DataTest, testSQLParse);
CppUnit_addTest(pSuite, DataTest, testSQLChannel); CppUnit_addTest(pSuite, DataTest, testSQLChannel);
CppUnit_addTest(pSuite, DataTest, testNullableExtract);
return pSuite; return pSuite;
} }

View File

@ -47,6 +47,7 @@ public:
void testTranscode(); void testTranscode();
void testSQLParse(); void testSQLParse();
void testSQLChannel(); void testSQLChannel();
void testNullableExtract();
void setUp(); void setUp();
void tearDown(); void tearDown();

View File

@ -29,6 +29,8 @@ Extractor::~Extractor()
} }
// Int8
bool Extractor::extract(std::size_t pos, Poco::Int8& val) bool Extractor::extract(std::size_t pos, Poco::Int8& val)
{ {
val = 0; val = 0;
@ -36,6 +38,32 @@ bool Extractor::extract(std::size_t pos, Poco::Int8& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int8>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int8>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int8>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val)
{
return true;
}
// UInt8
bool Extractor::extract(std::size_t pos, Poco::UInt8& val) bool Extractor::extract(std::size_t pos, Poco::UInt8& val)
{ {
val = 0; val = 0;
@ -43,6 +71,32 @@ bool Extractor::extract(std::size_t pos, Poco::UInt8& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt8>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt8>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt8>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val)
{
return true;
}
// Int16
bool Extractor::extract(std::size_t pos, Poco::Int16& val) bool Extractor::extract(std::size_t pos, Poco::Int16& val)
{ {
val = 0; val = 0;
@ -50,6 +104,32 @@ bool Extractor::extract(std::size_t pos, Poco::Int16& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int16>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int16>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int16>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val)
{
return true;
}
// UInt16
bool Extractor::extract(std::size_t pos, Poco::UInt16& val) bool Extractor::extract(std::size_t pos, Poco::UInt16& val)
{ {
val = 0; val = 0;
@ -57,6 +137,32 @@ bool Extractor::extract(std::size_t pos, Poco::UInt16& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt16>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt16>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt16>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val)
{
return true;
}
// Int32
bool Extractor::extract(std::size_t pos, Poco::Int32& val) bool Extractor::extract(std::size_t pos, Poco::Int32& val)
{ {
val = 0; val = 0;
@ -64,6 +170,33 @@ bool Extractor::extract(std::size_t pos, Poco::Int32& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int32>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int32>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int32>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val)
{
val = 1;
return true;
}
// UInt32
bool Extractor::extract(std::size_t pos, Poco::UInt32& val) bool Extractor::extract(std::size_t pos, Poco::UInt32& val)
{ {
val = 0; val = 0;
@ -71,6 +204,32 @@ bool Extractor::extract(std::size_t pos, Poco::UInt32& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt32>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt32>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt32>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val)
{
return true;
}
// Int64
bool Extractor::extract(std::size_t pos, Poco::Int64& val) bool Extractor::extract(std::size_t pos, Poco::Int64& val)
{ {
val = 0; val = 0;
@ -78,7 +237,33 @@ bool Extractor::extract(std::size_t pos, Poco::Int64& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Int64>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Int64>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Int64>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val)
{
return true;
}
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
// long
bool Extractor::extract(std::size_t pos, long& val) bool Extractor::extract(std::size_t pos, long& val)
{ {
val = 0; val = 0;
@ -86,14 +271,66 @@ bool Extractor::extract(std::size_t pos, long& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<long>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<long>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<long>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<long>& val)
{
return true;
}
// unsigned long
bool Extractor::extract(std::size_t pos, unsigned long& val) bool Extractor::extract(std::size_t pos, unsigned long& val)
{ {
val = 0; val = 0;
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<unsigned long>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<unsigned long>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<unsigned long>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<unsigned long>& val)
{
return true;
}
#endif #endif
// UInt64
bool Extractor::extract(std::size_t pos, Poco::UInt64& val) bool Extractor::extract(std::size_t pos, Poco::UInt64& val)
{ {
val = 0; val = 0;
@ -101,6 +338,32 @@ bool Extractor::extract(std::size_t pos, Poco::UInt64& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::UInt64>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UInt64>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UInt64>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val)
{
return true;
}
// bool
bool Extractor::extract(std::size_t pos, bool& val) bool Extractor::extract(std::size_t pos, bool& val)
{ {
val = false; val = false;
@ -108,6 +371,32 @@ bool Extractor::extract(std::size_t pos, bool& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<bool>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<bool>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<bool>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<bool>& val)
{
return true;
}
// float
bool Extractor::extract(std::size_t pos, float& val) bool Extractor::extract(std::size_t pos, float& val)
{ {
val = 0; val = 0;
@ -115,6 +404,32 @@ bool Extractor::extract(std::size_t pos, float& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<float>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<float>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<float>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<float>& val)
{
return true;
}
// double
bool Extractor::extract(std::size_t pos, double& val) bool Extractor::extract(std::size_t pos, double& val)
{ {
val = 0; val = 0;
@ -122,6 +437,32 @@ bool Extractor::extract(std::size_t pos, double& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<double>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<double>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<double>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<double>& val)
{
return true;
}
// char
bool Extractor::extract(std::size_t pos, char& val) bool Extractor::extract(std::size_t pos, char& val)
{ {
val = '\0'; val = '\0';
@ -129,6 +470,32 @@ bool Extractor::extract(std::size_t pos, char& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<char>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<char>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<char>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<char>& val)
{
return true;
}
// std::string
bool Extractor::extract(std::size_t pos, std::string& val) bool Extractor::extract(std::size_t pos, std::string& val)
{ {
if (!transcodeRequired()) if (!transcodeRequired())
@ -139,6 +506,32 @@ bool Extractor::extract(std::size_t pos, std::string& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<std::string>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<std::string>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<std::string>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<std::string>& val)
{
return true;
}
// UTF16String
bool Extractor::extract(std::size_t pos, Poco::UTF16String& val) bool Extractor::extract(std::size_t pos, Poco::UTF16String& val)
{ {
std::string str(""); std::string str("");
@ -147,51 +540,284 @@ bool Extractor::extract(std::size_t pos, Poco::UTF16String& val)
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::UTF16String>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UTF16String>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UTF16String>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UTF16String>& val)
{
return true;
}
// BLOB
bool Extractor::extract(std::size_t pos, Poco::Data::BLOB& val) bool Extractor::extract(std::size_t pos, Poco::Data::BLOB& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::BLOB>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::BLOB>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::BLOB>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Data::BLOB>& val)
{
return true;
}
// CLOB
bool Extractor::extract(std::size_t pos, Poco::Data::CLOB& val) bool Extractor::extract(std::size_t pos, Poco::Data::CLOB& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::CLOB>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::CLOB>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::CLOB>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Data::CLOB>& val)
{
return true;
}
// Date
bool Extractor::extract(std::size_t pos, Poco::Data::Date& val) bool Extractor::extract(std::size_t pos, Poco::Data::Date& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::Date>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::Date>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::Date>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Data::Date>& val)
{
return true;
}
// Time
bool Extractor::extract(std::size_t pos, Poco::Data::Time& val) bool Extractor::extract(std::size_t pos, Poco::Data::Time& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Data::Time>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Data::Time>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Data::Time>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Data::Time>& val)
{
return true;
}
// DateTime
bool Extractor::extract(std::size_t pos, Poco::DateTime& val) bool Extractor::extract(std::size_t pos, Poco::DateTime& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::DateTime>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::DateTime>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::DateTime>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::DateTime>& val)
{
return true;
}
// UUID
bool Extractor::extract(std::size_t pos, Poco::UUID& val) bool Extractor::extract(std::size_t pos, Poco::UUID& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::UUID>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::UUID>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::UUID>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::UUID>& val)
{
return true;
}
// Any
bool Extractor::extract(std::size_t pos, Poco::Any& val) bool Extractor::extract(std::size_t pos, Poco::Any& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Any>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Any>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Any>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Any>& val)
{
return true;
}
// Var
bool Extractor::extract(std::size_t pos, Poco::Dynamic::Var& val) bool Extractor::extract(std::size_t pos, Poco::Dynamic::Var& val)
{ {
return true; return true;
} }
bool Extractor::extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val)
{
return true;
}
bool Extractor::extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val)
{
return true;
}
} } } // namespace Poco::Data::Test } } } // namespace Poco::Data::Test

View File

@ -32,80 +32,393 @@ public:
~Extractor(); ~Extractor();
/// Destroys the Extractor. /// Destroys the Extractor.
bool extract(std::size_t pos, Poco::Int8& val); // Int8
bool extract(std::size_t pos, Poco::Int8& val) override;
/// Extracts an Int8. /// Extracts an Int8.
bool extract(std::size_t pos, Poco::UInt8& val); bool extract(std::size_t pos, std::vector<Poco::Int8>& val) override;
/// Extracts a std::vector<Int8>.
bool extract(std::size_t pos, std::deque<Poco::Int8>& val) override;
/// Extracts a std::deque<Int8>.
bool extract(std::size_t pos, std::list<Poco::Int8>& val) override;
/// Extracts a std::list<Int8>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int8>& val) override;
/// Extracts a Nullable<Int8>.
// UInt8
bool extract(std::size_t pos, Poco::UInt8& val) override;
/// Extracts an UInt8. /// Extracts an UInt8.
bool extract(std::size_t pos, Poco::Int16& val); bool extract(std::size_t pos, std::vector<Poco::UInt8>& val) override;
/// Extracts a std::vector<UInt8>.
bool extract(std::size_t pos, std::deque<Poco::UInt8>& val) override;
/// Extracts a std::deque<UInt8>.
bool extract(std::size_t pos, std::list<Poco::UInt8>& val) override;
/// Extracts a std::list<UInt8>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt8>& val) override;
/// Extracts a Nullable<UInt8>.
// Int16
bool extract(std::size_t pos, Poco::Int16& val) override;
/// Extracts an Int16. /// Extracts an Int16.
bool extract(std::size_t pos, Poco::UInt16& val); bool extract(std::size_t pos, std::vector<Poco::Int16>& val) override;
/// Extracts a std::vector<Int16>.
bool extract(std::size_t pos, std::deque<Poco::Int16>& val) override;
/// Extracts a std::deque<Int16>.
bool extract(std::size_t pos, std::list<Poco::Int16>& val) override;
/// Extracts a std::list<Int16>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int16>& val) override;
/// Extracts a Nullable<Int16>.
// UInt16
bool extract(std::size_t pos, Poco::UInt16& val) override;
/// Extracts an UInt16. /// Extracts an UInt16.
bool extract(std::size_t pos, Poco::Int32& val); bool extract(std::size_t pos, std::vector<Poco::UInt16>& val) override;
/// Extracts a std::vector<UInt16>.
bool extract(std::size_t pos, std::deque<Poco::UInt16>& val) override;
/// Extracts a std::deque<UInt16>.
bool extract(std::size_t pos, std::list<Poco::UInt16>& val) override;
/// Extracts a std::list<UInt16>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt16>& val) override;
/// Extracts a Nullable<UInt16>.
// Int32
bool extract(std::size_t pos, Poco::Int32& val) override;
/// Extracts an Int32. /// Extracts an Int32.
bool extract(std::size_t pos, Poco::UInt32& val); bool extract(std::size_t pos, std::vector<Poco::Int32>& val) override;
/// Extracts a std::vector<Int32>.
bool extract(std::size_t pos, std::deque<Poco::Int32>& val) override;
/// Extracts a std::deque<Int32>.
bool extract(std::size_t pos, std::list<Poco::Int32>& val) override;
/// Extracts a std::list<Int32>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int32>& val) override;
/// Extracts a Nullable<Int32>.
// UInt32
bool extract(std::size_t pos, Poco::UInt32& val) override;
/// Extracts an UInt32. /// Extracts an UInt32.
bool extract(std::size_t pos, Poco::Int64& val); bool extract(std::size_t pos, std::vector<Poco::UInt32>& val) override;
/// Extracts a std::vector<UInt32>.
bool extract(std::size_t pos, std::deque<Poco::UInt32>& val) override;
/// Extracts a std::deque<UInt32>.
bool extract(std::size_t pos, std::list<Poco::UInt32>& val) override;
/// Extracts a std::list<UInt32>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt32>& val) override;
/// Extracts a Nullable<UInt32>.
// Int64
bool extract(std::size_t pos, Poco::Int64& val) override;
/// Extracts an Int64. /// Extracts an Int64.
bool extract(std::size_t pos, Poco::UInt64& val); bool extract(std::size_t pos, std::vector<Poco::Int64>& val) override;
/// Extracts a std::vector<Int64>.
bool extract(std::size_t pos, std::deque<Poco::Int64>& val) override;
/// Extracts a std::deque<Int64>.
bool extract(std::size_t pos, std::list<Poco::Int64>& val) override;
/// Extracts a std::list<Int64>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Int64>& val) override;
/// Extracts a Nullable<Int64>.
// UInt64
bool extract(std::size_t pos, Poco::UInt64& val) override;
/// Extracts an UInt64. /// Extracts an UInt64.
bool extract(std::size_t pos, Poco::Any& val); bool extract(std::size_t pos, std::vector<Poco::UInt64>& val) override;
/// Extracts a std::vector<UInt64>.
bool extract(std::size_t pos, std::deque<Poco::UInt64>& val) override;
/// Extracts a std::deque<UInt64>.
bool extract(std::size_t pos, std::list<Poco::UInt64>& val) override;
/// Extracts a std::list<UInt64>.
bool extract(std::size_t pos, Poco::Nullable<Poco::UInt64>& val) override;
/// Extracts a Nullable<UInt64>.
// Any
bool extract(std::size_t pos, Poco::Any& val) override;
/// Extracts an Any. /// Extracts an Any.
bool extract(std::size_t pos, Poco::Dynamic::Var& val); bool extract(std::size_t pos, std::vector<Poco::Any>& val) override;
/// Extracts a std::vector<Poco::Any>.
bool extract(std::size_t pos, std::deque<Poco::Any>& val) override;
/// Extracts a std::deque<Poco::Any>.
bool extract(std::size_t pos, std::list<Poco::Any>& val) override;
/// Extracts a std::list<Poco::Any>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Any>& val) override;
/// Extracts a Nullable<Poco::Any>.
// Var
bool extract(std::size_t pos, Poco::Dynamic::Var& val) override;
/// Extracts a Var. /// Extracts a Var.
bool extract(std::size_t pos, std::vector<Poco::Dynamic::Var>& val) override;
/// Extracts a std::vector<Poco::Dynamic::Var>.
bool extract(std::size_t pos, std::deque<Poco::Dynamic::Var>& val) override;
/// Extracts a std::deque<Poco::Dynamic::Var>.
bool extract(std::size_t pos, std::list<Poco::Dynamic::Var>& val) override;
/// Extracts a std::list<Poco::Dynamic::Var>.
bool extract(std::size_t pos, Poco::Nullable<Poco::Dynamic::Var>& val) override;
/// Extracts a Nullable<Poco::Dynamic::Var>.
#ifndef POCO_INT64_IS_LONG #ifndef POCO_INT64_IS_LONG
bool extract(std::size_t pos, long& val); // long
bool extract(std::size_t pos, long& val) override;
/// Extracts a long. /// Extracts a long.
bool extract(std::size_t pos, unsigned long& val); bool extract(std::size_t pos, std::vector<long>& val) override;
/// Extracts an unsigned long. /// Extracts a std::vector<long>.
bool extract(std::size_t pos, std::deque<long>& val) override;
/// Extracts a std::deque<long>.
bool extract(std::size_t pos, std::list<long>& val) override;
/// Extracts a std::list<long>.
bool extract(std::size_t pos, Poco::Nullable<long>& val) override;
/// Extracts a Nullable<long>.
// unsigned long
bool extract(std::size_t pos, unsigned long& val) override;
/// Extracts an unsigned unsigned long.
bool extract(std::size_t pos, std::vector<unsigned long>& val) override;
/// Extracts a std::vector<unsigned long>.
bool extract(std::size_t pos, std::deque<unsigned long>& val) override;
/// Extracts a std::deque<unsigned long>.
bool extract(std::size_t pos, std::list<unsigned long>& val) override;
/// Extracts a std::list<unsigned long>.
bool extract(std::size_t pos, Poco::Nullable<unsigned long>& val) override;
/// Extracts a Nullable<unsigned long>.
#endif #endif
bool extract(std::size_t pos, bool& val); // bool
bool extract(std::size_t pos, bool& val) override;
/// Extracts a boolean. /// Extracts a boolean.
bool extract(std::size_t pos, float& val); bool extract(std::size_t pos, std::vector<bool>& val) override;
/// Extracts a std::vector<bool>.
bool extract(std::size_t pos, std::deque<bool>& val) override;
/// Extracts a std::deque<bool>.
bool extract(std::size_t pos, std::list<bool>& val) override;
/// Extracts a std::list<bool>.
bool extract(std::size_t pos, Poco::Nullable<bool>& val) override;
/// Extracts a Nullable<bool>.
// float
bool extract(std::size_t pos, float& val) override;
/// Extracts a float. /// Extracts a float.
bool extract(std::size_t pos, double& val); bool extract(std::size_t pos, std::vector<float>& val) override;
/// Extracts a std::vector<float>.
bool extract(std::size_t pos, std::deque<float>& val) override;
/// Extracts a std::deque<float>.
bool extract(std::size_t pos, std::list<float>& val) override;
/// Extracts a std::list<float>.
bool extract(std::size_t pos, Poco::Nullable<float>& val) override;
/// Extracts a Nullable<float>.
// double
bool extract(std::size_t pos, double& val) override;
/// Extracts a double. /// Extracts a double.
bool extract(std::size_t pos, char& val); bool extract(std::size_t pos, std::vector<double>& val) override;
/// Extracts a std::vector<double>.
bool extract(std::size_t pos, std::deque<double>& val) override;
/// Extracts a std::deque<double>.
bool extract(std::size_t pos, std::list<double>& val) override;
/// Extracts a std::list<double>.
bool extract(std::size_t pos, Poco::Nullable<double>& val) override;
/// Extracts a Nullable<double>.
// char
bool extract(std::size_t pos, char& val) override;
/// Extracts a single character. /// Extracts a single character.
bool extract(std::size_t pos, std::string& val); bool extract(std::size_t pos, std::vector<char>& val) override;
/// Extracts a std::vector<char>.
bool extract(std::size_t pos, std::deque<char>& val) override;
/// Extracts a std::deque<char>.
bool extract(std::size_t pos, std::list<char>& val) override;
/// Extracts a std::list<char>.
bool extract(std::size_t pos, Poco::Nullable<char>& val) override;
/// Extracts a Nullable<char>.
// string
bool extract(std::size_t pos, std::string& val) override;
/// Extracts a string. /// Extracts a string.
bool extract(std::size_t pos, Poco::UTF16String& val); bool extract(std::size_t pos, std::vector<std::string>& val) override;
/// Extracts a std::vector<std::string>.
bool extract(std::size_t pos, std::deque<std::string>& val) override;
/// Extracts a std::deque<std::string>.
bool extract(std::size_t pos, std::list<std::string>& val) override;
/// Extracts a std::list<std::string>.
bool extract(std::size_t pos, Poco::Nullable<std::string>& val) override;
/// Extracts a Nullable<std::string>.
// UTF16String
bool extract(std::size_t pos, Poco::UTF16String& val) override;
/// Extracts a UTF16String. /// Extracts a UTF16String.
bool extract(std::size_t pos, Poco::Data::BLOB& val); bool extract(std::size_t pos, std::vector<UTF16String>& val) override;
/// Extracts a std::vector<UTF16String>.
bool extract(std::size_t pos, std::deque<UTF16String>& val) override;
/// Extracts a std::deque<UTF16String>.
bool extract(std::size_t pos, std::list<UTF16String>& val) override;
/// Extracts a std::list<UTF16String>.
bool extract(std::size_t pos, Poco::Nullable<UTF16String>& val) override;
/// Extracts a Nullable<UTF16String>.
// BLOB
bool extract(std::size_t pos, Poco::Data::BLOB& val) override;
/// Extracts a BLOB. /// Extracts a BLOB.
bool extract(std::size_t pos, Poco::Data::CLOB& val); bool extract(std::size_t pos, std::vector<BLOB>& val) override;
/// Extracts a std::vector<BLOB>.
bool extract(std::size_t pos, std::deque<BLOB>& val) override;
/// Extracts a std::deque<BLOB>.
bool extract(std::size_t pos, std::list<BLOB>& val) override;
/// Extracts a std::list<BLOB>.
bool extract(std::size_t pos, Poco::Nullable<BLOB>& val) override;
/// Extracts a Nullable<BLOB>.
// CLOB
bool extract(std::size_t pos, Poco::Data::CLOB& val) override;
/// Extracts a CLOB. /// Extracts a CLOB.
bool extract(std::size_t pos, Date& val); bool extract(std::size_t pos, std::vector<CLOB>& val) override;
/// Extracts a std::vector<CLOB>.
bool extract(std::size_t pos, std::deque<CLOB>& val) override;
/// Extracts a std::deque<CLOB>.
bool extract(std::size_t pos, std::list<CLOB>& val) override;
/// Extracts a std::list<CLOB>.
bool extract(std::size_t pos, Poco::Nullable<CLOB>& val) override;
/// Extracts a Nullable<CLOB>.
// Date
bool extract(std::size_t pos, Date& val) override;
/// Extracts a Date. /// Extracts a Date.
bool extract(std::size_t pos, Time& val); bool extract(std::size_t pos, std::vector<Date>& val) override;
/// Extracts a std::vector<Date>.
bool extract(std::size_t pos, std::deque<Date>& val) override;
/// Extracts a std::deque<Date>.
bool extract(std::size_t pos, std::list<Date>& val) override;
/// Extracts a std::list<Date>.
bool extract(std::size_t pos, Poco::Nullable<Date>& val) override;
/// Extracts a Nullable<Date>.
// Time
bool extract(std::size_t pos, Time& val) override;
/// Extracts a Time. /// Extracts a Time.
bool extract(std::size_t pos, DateTime& val); bool extract(std::size_t pos, std::vector<Time>& val) override;
/// Extracts a std::vector<Time>.
bool extract(std::size_t pos, std::deque<Time>& val) override;
/// Extracts a std::deque<Time>.
bool extract(std::size_t pos, std::list<Time>& val) override;
/// Extracts a std::list<Time>.
bool extract(std::size_t pos, Poco::Nullable<Time>& val) override;
/// Extracts a Nullable<Time>.
// DateTime
bool extract(std::size_t pos, DateTime& val) override;
/// Extracts a DateTime. /// Extracts a DateTime.
bool extract(std::size_t pos, UUID& val); bool extract(std::size_t pos, std::vector<DateTime>& val) override;
/// Extracts a std::vector<DateTime>.
bool extract(std::size_t pos, std::deque<DateTime>& val) override;
/// Extracts a std::deque<DateTime>.
bool extract(std::size_t pos, std::list<DateTime>& val) override;
/// Extracts a std::list<DateTime>.
bool extract(std::size_t pos, Poco::Nullable<DateTime>& val) override;
/// Extracts a Nullable<DateTime>.
// UUID
bool extract(std::size_t pos, UUID& val) override;
/// Extracts a UUID. /// Extracts a UUID.
bool extract(std::size_t pos, std::vector<UUID>& val) override;
/// Extracts a std::vector<UUID>.
bool extract(std::size_t pos, std::deque<UUID>& val) override;
/// Extracts a std::deque<UUID>.
bool extract(std::size_t pos, std::list<UUID>& val) override;
/// Extracts a std::list<UUID>.
bool extract(std::size_t pos, Poco::Nullable<UUID>& val) override;
/// Extracts a Nullable<UUID>.
bool isNull(std::size_t col, std::size_t row = -1); bool isNull(std::size_t col, std::size_t row = -1);
/// Returns true if the current row value at pos column is null. /// Returns true if the current row value at pos column is null.

View File

@ -100,14 +100,14 @@ protected:
private: private:
std::string _msg; std::string _msg;
Exception* _pNested; Exception* _pNested;
int _code; int _code;
}; };
#if defined(_HAS_EXCEPTIONS) #if defined(_HAS_EXCEPTIONS)
// Size of Poco::Exception depends on the exception settings (like _HAS_EXCEPTIONS) // Size of Poco::Exception depends on the exception settings (like _HAS_EXCEPTIONS)
// that might influence size of std::exception from which Poco::Exception is derived from. // that might influence size of std::exception from which Poco::Exception is derived from.
// It is expected that Poco libraries and application using Poco have the same settings. // It is expected that Poco libraries and application using Poco have the same settings.
static_assert(_HAS_EXCEPTIONS != 0); static_assert(_HAS_EXCEPTIONS != 0);
#endif #endif
// //

View File

@ -53,6 +53,8 @@ class Nullable
/// default construction. /// default construction.
{ {
public: public:
using Type = C;
Nullable() Nullable()
/// Creates an empty Nullable. /// Creates an empty Nullable.
{ {
@ -242,13 +244,13 @@ public:
return deflt; return deflt;
} }
operator C& () explicit operator C& ()
/// Get reference to the value /// Get reference to the value
{ {
return value(); return value();
} }
operator const C& () const explicit operator const C& () const
/// Get const reference to the value /// Get const reference to the value
{ {
return value(); return value();

View File

@ -116,6 +116,13 @@ std::string demangle()
} }
template <typename T>
std::string demangle(const T& t)
{
return demangle(typeid(std::remove_const_t<std::remove_reference_t<decltype(t)>>).name());
}
} // namespace Poco } // namespace Poco