#ifndef PGSQL_VALUE_H #define PGSQL_VALUE_H #include "Pgsql_declare.h" #include "ArrayParser.h" #include #include #include namespace Pgsql { /** \brief Class that is returned as value of a cell to facilitate auto conversion. */ class Value { public: Value(const char *val, Oid typ); QString asQString() const; const char* c_str() const { return m_val; } operator QString() const; operator QDateTime() const; operator QDate() const; operator QTime() const; operator std::string() const; operator int16_t() const; operator int32_t() const; operator Oid() const; operator int64_t() const; operator bool() const; operator float() const; operator double() const; bool isString() const; enum class NullHandling { Ignore, Throw }; /** * * \param insert_iter An insert_iterator which is used to add the elements of the array to a container. */ template void getAsArray(I insert_iter, NullHandling nullhandling = NullHandling::Throw) const { using value_type = E; ArrayParser parser(m_val); for (;;) { auto res = parser.GetNextElem(); if (res.ok) { if (res.value) { std::string str(res.value->data(), res.value->length()); Value val(str.c_str(), ANYOID); value_type v; v << val; insert_iter = v; } else { if (nullhandling == NullHandling::Throw) throw std::runtime_error("Unexpected NULL value in array"); } } else break; } } template void getAsArray(I insert_iter, const E &value_for_nulls) const { using value_type = E; ArrayParser parser(m_val); for (;;) { auto res = parser.GetNextElem(); if (res.ok) { if (res.value) { std::string str(res.value->data(), res.value->length()); Value val(str.c_str(), ANYOID); value_type v; v << val; insert_iter = v; } else { insert_iter = value_for_nulls; } } else break; } } template void getAsArrayOfOptional(I insert_iter) const { using value_type = E; ArrayParser parser(m_val); for (;;) { auto res = parser.GetNextElem(); if (res.ok) { if (res.value) { std::string str(res.value->data(), res.value->length()); Value val(str.c_str(), ANYOID); value_type v; v << val; insert_iter = v; } else { insert_iter = std::nullopt; } } else break; } } private: const char *m_val; Oid m_typ; }; template void operator<<(T &s, const Value &v) { s = static_cast(v); } } // end namespace Pgsql #endif // PGSQL_VALUE_H