40.9. Модули и команда unknown
PL/Tcl поддерживает автозагрузку кода Tcl. Для этого он задействует специальную таблицу, pltcl_modules
, предназначенную для размещения модулей кода Tcl. Если эта таблица существует, из таблицы выбирается модуль unknown
и загружается в интерпретатор Tcl непосредственно перед первым выполнением функции PL/Tcl в сеансе базы данных. (Это происходит независимо для каждого интерпретатора Tcl, если их несколько в одном сеансе; см. Раздел 40.4.)
Хотя модуль unknown
может на самом деле содержать любой нужный вам скрипт инициализации, обычно в нём определяется процедура unknown
языка Tcl, которая вызывается всякий раз, когда Tcl не распознаёт имя вызываемой процедуры. Принятая в PL/Tcl версия этой процедуры пытается найти в pltcl_modules
модуль, в котором будет определена требуемая процедура. Если такой модуль находится, он загружается в интерпретатор и затем выполнение изначального вызова процедуры может быть продолжено. Дополнительная таблица pltcl_modfuncs
содержит индекс, связывающий функции с модулями, в которых они определены, так что поиск выполняется довольно быстро.
В составе Postgres Pro поставляются вспомогательные скрипты для обслуживания этих таблиц: pltcl_loadmod
, pltcl_listmod
, pltcl_delmod
, а также исходный код стандартного модуля unknown
в share/unknown.pltcl
. Для поддержки механизма автозагрузки этот модуль должен изначально загружаться в каждую базу данных.
Таблицы pltcl_modules
и pltcl_modfuncs
должны быть доступны на чтение всем, но разрешать запись в них разумно только администратору базы данных (и только он должен быть их владельцем). В качестве меры предосторожности PL/Tcl будет игнорировать таблицу pltcl_modules
(и таким образом, не будет пытаться загрузить модуль unknown
), если она принадлежит не суперпользователю. Но право на изменение данных в ней можно дать и другим пользователям, если они заслуживают такого доверия.