Как прочитать массив пар результата из libpqxx в C ++ - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть функция postgresf, возвращающая тип 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 и даже логическое значение из результата:

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" есть двоичный результатFormatwith: PQexecParams () и paramFormats = 1; см .: https://www.postgresql.org/docs/10/libpq-exec.html

Есть ли двоичный формат в "libpqxx" сейчас?Что-то изменилось за последние 10 лет?см .: http://pqxx.org/development/libpqxx/wiki/BinaryTransfers

Есть ли быстрый способ получить блок составных данных из libpqxx и преобразовать его в C ++?

1 Ответ

0 голосов
/ 29 ноября 2018

Я полагаю, что решение

, например, использовать:

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);
  • static std :: string to_string (std :: pair Obj);

теперь вам нужно перекомпилировать libpqxx.

Проблема в том, что реализация "from_string" заканчивается синтаксическим анализом строки наподобие "(9,5)".И Stringparsing - не то, что я хочу.

, поэтому я собираюсь попробовать libpq.

...