// // Extractor.cpp // // Library: Data/SQLite // Package: SQLite // Module: Extractor // // Copyright (c) 2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // SPDX-License-Identifier: BSL-1.0 // #include "Poco/Data/SQLite/Extractor.h" #include "Poco/Data/SQLite/Utility.h" #include "Poco/Data/Date.h" #include "Poco/Data/Time.h" #include "Poco/Data/LOB.h" #include "Poco/Data/DataException.h" #include "Poco/DateTimeParser.h" #include "Poco/Exception.h" #include "Poco/Debugger.h" #if defined(POCO_UNBUNDLED) #include #else #include "sqlite3.h" #endif #include using Poco::DateTimeParser; namespace Poco { namespace Data { namespace SQLite { Extractor::Extractor(sqlite3_stmt* pStmt): _pStmt(pStmt) { } Extractor::~Extractor() { } bool Extractor::extract(std::size_t pos, Poco::Int32& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Poco::Int64& val) { return extract(sqlite3_column_int64, pos, val); } bool Extractor::extract(std::size_t pos, double& val) { return extract(sqlite3_column_double, pos, val); } bool Extractor::extract(std::size_t pos, std::string& val) { if (isNull(pos)) return false; const char *pBuf = reinterpret_cast(sqlite3_column_text(_pStmt, (int) pos)); if (!pBuf) val.clear(); else val.assign(pBuf); return true; } 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) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Poco::UInt8& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Poco::Int16& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Poco::UInt16& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Poco::UInt32& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Poco::UInt64& val) { return extract(sqlite3_column_int64, pos, val); } bool Extractor::extract(std::size_t pos, bool& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, float& val) { if (isNull(pos)) return false; val = static_cast(sqlite3_column_double(_pStmt, (int) pos)); return true; } bool Extractor::extract(std::size_t pos, char& val) { return extract(sqlite3_column_int, pos, val); } bool Extractor::extract(std::size_t pos, Date& val) { if (isNull(pos)) return false; std::string str; extract(pos, str); int tzd; DateTime dt = DateTimeParser::parse(Utility::SQLITE_DATE_FORMAT, str, tzd); val = dt; return true; } bool Extractor::extract(std::size_t pos, Time& val) { if (isNull(pos)) return false; std::string str; extract(pos, str); int tzd; DateTime dt = DateTimeParser::parse(Utility::SQLITE_TIME_FORMAT, str, tzd); val = dt; return true; } bool Extractor::extract(std::size_t pos, DateTime& val) { if (isNull(pos)) return false; std::string dt; extract(pos, dt); int tzd; DateTimeParser::parse(dt, val, tzd); return true; } bool Extractor::extract(std::size_t pos, UUID& val) { if (isNull(pos)) return false; std::string str; extract(pos, str); val.parse(str); return true; } bool Extractor::extract(std::size_t pos, Poco::Any& val) { return extractImpl(pos, val); } bool Extractor::extract(std::size_t pos, Dynamic::Var& val) { return extractImpl(pos, val); } // Nullable bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& 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& val) { throw Poco::NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, std::deque& val) { throw Poco::NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, std::list& val) { throw Poco::NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, std::vector& val) { throw Poco::NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, std::deque& val) { throw Poco::NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, std::list& val) { throw Poco::NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& 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& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_double(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else { const char *pBuf = reinterpret_cast(sqlite3_column_text(_pStmt, (int) pos)); if (!pBuf) val = ""s; else val = pBuf; } return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { throw NotImplementedException(poco_src_loc); } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int64(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& 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& val) { if (isNull(pos)) val.clear(); else val = static_cast(sqlite3_column_double(_pStmt, (int) pos)); return true; } bool Extractor::extract(std::size_t pos, Nullable& val) { if (isNull(pos)) val.clear(); else val = sqlite3_column_int(_pStmt, (int) pos); return true; } bool Extractor::extract(std::size_t pos, Nullable& 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