В данном разделе перечислены параметры конфигурации, влияющие на PL/Perl.
plperl.on_init (string)
#
Задаёт код на языке Perl, который выполняется при первой инициализации интерпретатора Perl
инициализируется перед тем, как он будет специализирован для использования в plperl или
plperlu.
Функции интерфейса SPI недоступны во время выполнения данного кода.
Если при выполнении кода произойдет ошибка, это приведет к прерыванию инициализации
интерпретатора и передаче исключения в вызывающий запрос, что вызовет
отмену текущей транзакции или подтранзакции.
Код на языке Perl ограничен одной строкой. Более объемный код может быть размещен
в модуле и загружен с помощью этой on_init строки.
Примеры:
plperl.on_init = 'require "plperlinit.pl"' plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'
Любые модули, загруженные через plperl.on_init, прямо или
косвенно, будут доступны для использования в plperl. Это может
создать угрозу безопасности. Для просмотра списка загруженных модулей можно использовать следующую команду:
DO 'elog(WARNING, join ", ", sort keys %INC)' конструкция LANGUAGE plperl;
Инициализация будет выполняться в процессе postmaster, если plperl библиотека
включена в shared_preload_libraries, в этом
случае следует уделить особое внимание риску дестабилизации
работы процесса postmaster. Основная причина использования данного функционала
заключается в том, что модули Perl, загружаемые с помощью plperl.on_init должны быть
загружены только при запуске postmaster и будут мгновенно доступны
без накладных расходов на загрузку в отдельных сессиях базы данных. Однако
следует учитывать, что накладных расходов удастся избежать только для первого
интерпретатора Perl, используемого в сессии базы данных — либо PL/PerlU, либо
PL/Perl для первой SQL-роли, вызывающей функцию PL/Perl. Любые
дополнительные интерпретаторы Perl, созданные в сессии базы данных, должны будут
выполнять инициализацию plperl.on_init заново. Кроме того, в Windows
предварительная загрузка не даст никакой экономии, так как интерпретатор Perl
интерпретатор, созданный в процессе postmaster, не распространяется на
дочерние процессы.
Данный параметр может быть задан только в postgresql.conf файле конфигурации или в командной строке сервера.
plperl.on_plperl_init (string)
plperl.on_plperlu_init (string)
#
Эти параметры определяют код Perl, который должен быть выполнен при
специализации интерпретатора Perl для plperl или
plperlu соответственно. Это происходит при первом выполнении функции PL/Perl или
PL/PerlU в сеансе базы данных, либо в случае, когда
требуется создание дополнительного интерпретатора из-за вызова другого языка
или вызова функции PL/Perl новой SQL-ролью. Это
следует за любой инициализацией, выполненной plperl.on_init.
Функции интерфейса SPI недоступны во время выполнения данного кода.
Код Perl в plperl.on_plperl_init выполняется после
«блокировки среды» интерпретатора, и, следовательно, в нём могут выполняться только
доверенные операции.
Если выполнение кода завершается ошибкой, инициализация прерывается, а ошибка передается в вызывающий запрос, что приводит к отмене текущей транзакции или подтранзакции. Любые действия, уже выполненные в Perl, не будут отменены; однако данный интерпретатор более не будет использоваться. При повторном обращении к языку будет предпринята попытка инициализации в новом интерпретаторе Perl.
Изменять эти параметры могут только суперпользователи. Хотя эти параметры можно изменить в рамках сеанса, такие изменения не затронут интерпретаторы Perl, которые уже использовались для выполнения функций.
plperl.use_strict (boolean)
#
Если установлено значение true, при последующих компиляциях функций PL/Perl будет
strict включена прагма. Данный параметр не влияет на
функции, уже скомпилированные в текущем сеансе.
В настоящее время в PL/Perl отсутствует следующая функциональность, однако вклад в её реализацию приветствуется.
Функции PL/Perl не могут вызывать друг друга напрямую.
Интерфейс SPI на данный момент реализован не полностью.
Если для получения очень больших наборов данных используется
spi_exec_query, необходимо учитывать, что
все они будут загружены в память. Этого можно избежать путем использования
spi_query/spi_fetchrow как
было показано ранее.
Аналогичная проблема возникает, если функция, возвращающая набор данных, передает
большой набор строк обратно в PostgreSQL через return. Эту
проблему также можно предотвратить, используя вместо этого
return_next для каждой возвращаемой строки, как показано
ранее.
При нормальном завершении сеанса (не вызванном фатальной ошибкой) любые
END блоки, которые были определены, выполняются.
В настоящее время никакие другие действия не выполняются. В частности,
файловые дескрипторы автоматически не сбрасываются, а объекты
не уничтожаются автоматически.