Better support for boost::optional in database layer.
This commit is contained in:
parent
780d912cd1
commit
e4ccd93b09
4 changed files with 27 additions and 5 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue