Как получить и преобразовать строку таблицы в массив на Postgres c?

Мне по определённой причине надо написать расширение на Си для Postgres. В чем проблема - следую документации самого Postgres: https://postgrespro.ru/docs/postgresql/9.4/xfunc-c

А как взять строку таблицы (рандомной вообще) и преобразовать ее в массив, чтобы с ней работать? Да, я вижу, что есть вот это:

HeapTupleHeader t = PG_GETARG_HEAPTUPLEHEADER(0);

Окей, получаем текущую строку, после этого в документации написано, что можно вызвать GETATTRIBUTEBYNAME - а что если я не знаю имя? Допустим, есть GetAttributeByNum - номер колонки, но откуда я могу знать сколько колонок в строке таблицы? Разве что не задавать конкретно как int columnNumber = PG_GETARG_INT32(1), тогда, наверное, можно пройтись циклом.

Суть: я запуталась и в документации, и в Си, и в Postgres, и мне нужно небольшое разъяснение по этому поводу.


Ответы (1 шт):

Автор решения: Fat-Zer

У серверного Си'шного API постгреса документацией являются его хедеры и исходники... Одни говорят, что другой и не надо, а другие, что это называется «её просто нет», но, по факту, читать их всё равно придётся. К тому что есть на сайте стоит относится не более чем как к общему обзору.


Для ответа на конкретные вопросы достаточно просто взглянуть на реализацию той же GetAttributeByName():

Допустим, есть GetAttributeByNum - номер колонки, но откуда я могу знать сколько колонок в строке таблицы?

#include <server/utils/typcache.h>
// ...
TupleDesc tupDesc = lookup_rowtype_tupdesc(tupType, tupTypmod);
int n = tupDesc->natts;

Окей, получаем текущую строку, после этого в документации написано, что можно вызвать GETATTRIBUTEBYNAME - а что если я не знаю имя?

Перебрать имена после этого можно как-то так:

for (i = 0; i < tupDesc->natts; i++) {
    Form_pg_attribute att = TupleDescAttr(tupDesc, i);
    char *name = &(att->attname);
    // ...
 }
→ Ссылка