Better support for boost::optional in database layer.

This commit is contained in:
eelke 2018-09-19 08:25:23 +02:00
parent 780d912cd1
commit e4ccd93b09
4 changed files with 27 additions and 5 deletions

View file

@ -24,8 +24,8 @@ PgClass PgClassContainer::loadElem(const Pgsql::Row &row)
>> v.tuples_est >> v.toastrelid >> v.isshared >> v.persistence >> v.tuples_est >> v.toastrelid >> v.isshared >> v.persistence
>> v.kind >> v.hasoids >> v.ispopulated >> v.frozenxid >> v.minmxid; >> v.kind >> v.hasoids >> v.ispopulated >> v.frozenxid >> v.minmxid;
col.getAsArray<QString>(std::back_inserter(v.acl), Pgsql::NullHandling::Ignore); col.getAsArray<QString>(std::back_inserter(v.acl), QString());
col.getAsArray<QString>(std::back_inserter(v.options), Pgsql::NullHandling::Ignore); col.getAsArray<QString>(std::back_inserter(v.options), QString());
auto cat = m_catalogue.lock(); auto cat = m_catalogue.lock();
auto ns = cat->namespaces()->getByKey(v.relnamespace); auto ns = cat->namespaces()->getByKey(v.relnamespace);

View file

@ -26,14 +26,14 @@ namespace Pgsql {
} }
template <typename E, typename I> template <typename E, typename I>
void getAsArray(I insert_iter, const E &value_for_nulls) const Col& getAsArray(I insert_iter, const E &value_for_nulls)
{ {
nextValue().getAsArray<E, I>(insert_iter, value_for_nulls); nextValue().getAsArray<E, I>(insert_iter, value_for_nulls);
return *this; return *this;
} }
template <typename E, typename I> template <typename E, typename I>
void getAsArrayOfOptional(I insert_iter) const Col& getAsArrayOfOptional(I insert_iter)
{ {
nextValue().getAsArrayOfOptional<E, I>(insert_iter); nextValue().getAsArrayOfOptional<E, I>(insert_iter);
return *this; return *this;
@ -50,6 +50,12 @@ namespace Pgsql {
int col = -1; int col = -1;
}; };
template <typename T>
Col& operator>>(Col &c, std::vector<T> &s)
{
return c.getAsArray<T>(std::back_inserter(s));
}
template <typename T> template <typename T>
Col& operator>>(Col &c, T &s) Col& operator>>(Col &c, T &s)
{ {

View file

@ -8,6 +8,7 @@
#include <vector> #include <vector>
#include <QString> #include <QString>
#include <QDateTime> #include <QDateTime>
#include <boost/optional.hpp>
namespace Pgsql { namespace Pgsql {
@ -149,10 +150,24 @@ namespace Pgsql {
Oid m_typ; Oid m_typ;
}; };
template <typename T>
void operator<<(boost::optional<T> &s, const Value &v)
{
if (v.null())
s = boost::optional<T>();
else
*s << v;
}
template <typename T>
void operator<<(std::vector<T> &s, const Value &v)
{
v.getAsArray(std::back_inserter(s));
}
template <typename T> template <typename T>
void operator<<(T &s, const Value &v) void operator<<(T &s, const Value &v)
{ {
//s = static_cast<T>(v);
s = v.operator T(); s = v.operator T();
} }

View file

@ -92,6 +92,7 @@ TEST(Pgsql_Value, getAsArray_Ints)
ASSERT_EQ(r[1], 2); ASSERT_EQ(r[1], 2);
} }
TEST(Pgsql_Value, getAsArray_QDateTime) TEST(Pgsql_Value, getAsArray_QDateTime)
{ {
Pgsql::Value v("{\"2017-12-11 10:11:22\",\"2017-12-13 12:00:11\"}", text_array_oid); Pgsql::Value v("{\"2017-12-11 10:11:22\",\"2017-12-13 12:00:11\"}", text_array_oid);