Настройки форматирования строк в PostgreSQL/libpq

Я использую libpq для своего приложения C/C++ для взаимодействия с PostgreSQL.

Мои запросы параметризованы и представлены в текстовом (не двоичном) формате (с использованием PQexecParams) и возвращают данные, которые могут быть text, text[], int4range или другими сложными типами. Однако кажется, что libpq форматирует строки на основе правил, которые, как представляется, плохо документированы.

Например, для массива строк libpq возвращает что-то вроде этого:

{abc,def,"h,h","h\"h",h'h,"h h"}

когда массив в стиле C будет выглядеть так:

{"abc","def","h,h","h\"h","h'h","h h"}

libpq, похоже, помещает двойные кавычки и escape-символы (\) там, где считает нужным.

Для строки (не массива строк) libpq вообще не будет помещать двойные кавычки.

Поскольку любой печатный символ может быть сохранен в моих строках, есть ли способ заставить libpq или PostgreSQL возвращать строки и массивы строк в согласованном формате для удобного использования моим приложением C/C++?


person Bernard    schedule 16.01.2017    source источник
comment
Это не имеет ничего общего с libpq, это стандартный синтаксис вывода для массивов PostgreSQL (и на самом деле это сложнее, если вы также хотите поддерживать произвольные индексированные массивы). libpqtypes может делать то, что вам нужно: см. этот вопрос.   -  person pozs    schedule 16.01.2017
comment
@pozs Это имеет смысл, спасибо! В конце концов я использовал array_to_string, чтобы заставить PostgreSQL отправлять данные в виде простой строки. Для типов integer и timestamp я уже написал интерфейс, который выглядит так: pqclient.query("SELECT my_id, my_text FROM my_table WHERE data = $1;", make_tuple(12345), tuple<int64_t, string>(), [](optional<CommandError>&& error, vector<tuple<int64_t, string>>&& results){ ... });, который пока решает простые типы.   -  person Bernard    schedule 16.01.2017