我有一个postgresfunction返回类型tp_m_info包含
成对的数组(请参见下文)。我正在使用libpqxx连接到
Postgres。

CREATE TYPE public.tp_m_set_id AS
(
    m_id integer,
    m_name text
);


CREATE TYPE public.tp_m_info AS
(
    m_id integer,
    m_name text,
    m_value double precision,
    m_is_true boolean,
    original_ms tp_m_set_id[]
);

我可以从结果中读取int,double,str和boolean:
iter[m_id].as<int>()
iter[m_name].c_str()
iter[m_value].as<double>()

// and bool like
std::string tmp_str = iter["m_is_true"].c_str();
if ("t" == tmp_str)
{
    info.m_is_merged = true;
}
else
{
    info.m_is_merged = false;
}

但我不知道如何处理“tp_m_set_id []”
它失败,并显示类似“std::vector>”的内容
iter[original_ms].as<std::vector<std::pair<uint32_t, std::string>>>()

任何想法如何得到它?

在“libpq”中,存在带有以下内容的二进制resultFormat:
PQexecParams()和paramFormats = 1
请参阅:https://www.postgresql.org/docs/10/libpq-exec.html

现在“libpqxx”中有二进制格式吗?有什么改变
最近十年?
请参阅:http://pqxx.org/development/libpqxx/wiki/BinaryTransfers

有没有一种快速的方法可以从libpqxx和
将其转换为C++?

最佳答案

我想解决方案是

例如使用:

std::pair<int, int> my_pair = row["m_ints"].as<std::pair<int, int> >();

写入strconv.hxx:
template<> struct PQXX_LIBEXPORT string_traits<std::pair<int, int> >
{
static constexpr const char *name() noexcept { return "std::pair<int, int>"; }
static constexpr bool has_null() noexcept { return false; }
static bool is_null(std::pair<int, int>) { return false; }
[[noreturn]] static std::pair<int, int> null()
{ internal::throw_null_conversion(name()); }
static void from_string(const char Str[], std::pair<int, int> &Obj);
static std::string to_string(std::pair<int, int> Obj);
};

并在strconv.cxx中实现:
  • 静态无效from_string(const char Str [],std::pair&Obj);
  • 静态std::string to_string(std::pair Obj);

  • 现在您必须重新编译libpqxx。

    问题是,“from_string”的实现最终以字符串解析为“(9,5)”之类的字符串而结束。而且Stringparsing不是我想要的。

    所以我要尝试libpq。

    10-07 15:11