Как преобразовать PGresult в пользовательский тип данных с помощью libpq (PostgreSQL) - PullRequest
2 голосов
/ 06 мая 2010

Я использую библиотеку libpq в C для доступа к моей базе данных PostgreSQL. Итак, когда я делаю res = PQexec (conn, «ВЫБЕРИТЕ точку ОТ test_point3d»); Я не знаю, как преобразовать полученный мной PGresult в свой тип данных.

Я знаю, что могу использовать функцию PQgetValue, но, опять же, я не знаю, как преобразовать возвращаемую строку в мой собственный тип данных.

1 Ответ

4 голосов
/ 14 марта 2013

Лучший способ думать об этом - это то, что типы данных взаимодействуют с приложениями через текстовые интерфейсы. Libpq возвращает строку практически из чего угодно. Программист обязан проанализировать строку и создать из нее тип данных. Я знаю, что автор, вероятно, отказался от вопроса, но я работаю над чем-то похожим, и здесь стоит документировать несколько важных трюков, которые в некоторых случаях полезны.

Очевидно, что если это тип языка Си с собственным представлением входа и выхода, вам придется анализировать строку, как обычно.

Однако для массивов и кортежей запись в основном

[open_type_identifier][csv_string][close_type_identifier]

Например, кортеж может быть представлен как:

(35,65,1111111,f,f,2011-10-06,"2011-10-07 13:11:24.324195",186,chris,f,,,,f)

Это облегчает анализ. Как правило, вы можете использовать существующие процессоры csv после отключения первого и последнего символа. Кроме того, рассмотрим:

select row('test', 'testing, inc', array['test', 'testing, inc']);
                       row                       
-------------------------------------------------
 (test,"testing, inc","{test,""testing, inc""}")
(1 row)

Поскольку это показывает, что у вас есть стандартный CSV, экранирующий внутри вложенных атрибутов, вы можете фактически определить, что третий атрибут является массивом, а затем (с двойными кавычками) проанализировать его как массив. Таким образом, вложенные структуры данных могут быть обработаны способом, примерно аналогичным тому, который можно ожидать в таком формате, как JSON. Хитрость заключается в том, что это вложенный CSV.

...