Как получить текущее имя базы данных из C функции / расширения? - PullRequest
1 голос
/ 03 августа 2020

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

Требуется, чтобы использование SPI_prepare(), SPI_exec() не разрешалось в этом случае, поэтому запрос current_database() не будет работать.

Другие SPI_get* подойдут. Или доступ к текущему имени базы данных через TupleDesc или TriggerData тоже как-нибудь.

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Мне не ясно, какой из внутренних программных интерфейсов сервера postgresql может использоваться в расширениях SPI. Однако реализация функции current_database SQL делает следующее:

Name db;
db = (Name) palloc(NAMEDATALEN);
namestrcpy(db, get_database_name(MyDatabaseId));
PG_RETURN_NAME(db);

Итак, я думаю, что get_database_name(MyDatabaseId) - это то заклинание, которое вам нужно. Он возвращает строку C, которую ваше расширение C может использовать напрямую - остальная часть приведенного выше предназначена для вставки строки в объект Datum, чтобы оценщик запроса мог работать с ним.

0 голосов
/ 03 августа 2020

Я понял, что полезной кажется функция с именем «current_database ()», которая похожа на «select database ()». Позже возвращает строку, представляющую имя базы данных. Да, параметр, который ваше расширение получит для определения контекста или около того.

PL / SQL может создавать функции. Они, в свою очередь, могут вызывать расширения C -Language через разделяемые библиотеки. Наконец, имя может быть делегировано из базы данных в расширение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...