Как получить и преобразовать строку таблицы в массив на 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 шт):
У серверного Си'шного 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);
// ...
}