43.8. ÐнÑÑÑенние оÑобенноÑÑи PL/Perl #
43.8.1. ÐонÑигÑÑиÑование #
Ð ÑÑом Ñазделе опиÑÑваÑÑÑÑ Ð¿Ð°ÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии, влиÑÑÑие на ÑабоÑÑ PL/Perl.
plperl.on_init(string) #ÐадаÑÑ ÐºÐ¾Ð´ Perl, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи пеÑвой иниÑиализаÑии инÑеÑпÑеÑаÑоÑа Perl, до Ñого, как он полÑÑÐ°ÐµÑ ÑпеÑиализаÑиÑ
plperlилиplperlu. Ðогда ÑÑÐ¾Ñ ÐºÐ¾Ð´ вÑполнÑеÑÑÑ, ÑÑнкÑии SPI еÑÑ Ð½Ðµ доÑÑÑпнÑ. ÐÑли вÑполнение кода завеÑÑаеÑÑÑ Ð¾Ñибкой, иниÑиализаÑÐ¸Ñ Ð¸Ð½ÑеÑпÑеÑаÑоÑа пÑеÑÑваеÑÑÑ Ð¸ оÑибка ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð² вÑзÑваÑÑий запÑоÑ, в ÑезÑлÑÑаÑе Ñего ÑекÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¸Ð»Ð¸ подÑÑанзакÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ.Ð Ð°Ð·Ð¼ÐµÑ ÑÑого кода огÑаниÑиваеÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑокой. Ðолее обÑÑмнÑй код можно помеÑÑиÑÑ Ð² модÑÐ»Ñ Ð¸ загÑÑзиÑÑ ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð² ÑÑÑоке
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;
ÐÑли библиоÑека
plperlвклÑÑена в shared_preload_libraries, иниÑиализаÑÐ¸Ñ Ð¿ÑоизойдÑÑ Ð² главном пÑоÑеÑÑе (postmaster) и в ÑÑом ÑлÑÑае Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ оÑÐµÐ½Ñ ÑеÑÑÑзно оÑениÑÑ ÑиÑк наÑÑÑÐµÐ½Ð¸Ñ ÑабоÑоÑпоÑобноÑÑи ÑÑого пÑоÑеÑÑа. ÐÑновной ÑмÑÑл иÑполÑзоваÑÑ ÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð² Ñом, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð´Ñли Perl, подклÑÑаемÑе вplperl.on_init, загÑÑжалиÑÑ ÑолÑко пÑи запÑÑке главного пÑоÑеÑÑа, и ÑÑо иÑклÑÑало Ð±Ñ Ð¸Ð·Ð´ÐµÑжки загÑÑзки Ð´Ð»Ñ Ð¾ÑделÑнÑÑ ÑеанÑов. Ðднако имейÑе в видÑ, ÑÑо ÑÑи издеÑжки иÑклÑÑаÑÑÑÑ ÑолÑко пÑи загÑÑзке в ÑеанÑе пеÑвого инÑеÑпÑеÑаÑоÑа Perl â бÑÐ´Ñ Ñо PL/PerlU или PL/Perl Ð´Ð»Ñ Ð¿ÐµÑвой SQL-Ñоли, вÑзÑваÑÑей ÑÑнкÑÐ¸Ñ Ð½Ð° PL/Perl. ÐÑбÑе дополниÑелÑнÑе инÑеÑпÑеÑаÑоÑÑ Perl, ÑоздаваемÑе в ÑеанÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑдÑÑ Ð²ÑполнÑÑÑplperl.on_initзаново. Также ÑÑÑиÑе, ÑÑо в Windows пÑедваÑиÑелÑÐ½Ð°Ñ Ð·Ð°Ð³ÑÑзка не даÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ вÑигÑÑÑа, Ñак как инÑеÑпÑеÑаÑÐ¾Ñ Perl, ÑозданнÑй в главном пÑоÑеÑÑе, не пеÑедаÑÑÑÑ Ð´Ð¾ÑеÑним пÑоÑеÑÑам.ÐадаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко в
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 в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого кода еÑÑ Ð½Ðµ доÑÑÑпнÑ. Ðод вplperl.on_plperl_initзапÑÑкаеÑÑÑ Ð¿Ð¾Ñле Ñого, как инÑеÑпÑеÑаÑÐ¾Ñ Â«Ð¿Ð¾Ð¼ÐµÑаеÑÑÑ Ð¿Ð¾Ð´ замок», Ñак ÑÑо в нÑм ÑазÑеÑаÑÑÑÑ ÑолÑко довеÑеннÑе опеÑаÑии.ÐÑли ÑÑÐ¾Ñ ÐºÐ¾Ð´ завеÑÑаеÑÑÑ Ð¾Ñибкой, иниÑиализаÑÐ¸Ñ Ð¿ÑеÑÑваеÑÑÑ Ð¸ оÑибка ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð² вÑзÑваÑÑий запÑоÑ, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº пÑеÑÑÐ²Ð°Ð½Ð¸Ñ ÑекÑÑей ÑÑанзакÑии или подÑÑанзакÑии. ÐÑи ÑÑом лÑбÑе дейÑÑвиÑ, Ñже пÑоизведÑннÑе в Perl, не бÑдÑÑ Ð¾ÑмененÑ; однако иÑполÑзоваÑÑÑÑ ÑÑÐ¾Ñ Ð¸Ð½ÑеÑпÑеÑаÑÐ¾Ñ Ð±Ð¾Ð»ÑÑе не бÑдеÑ. ÐÑи ÑледÑÑÑей попÑÑке иÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑзÑк ÑиÑÑема попÑÑаеÑÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ иниÑиализиÑоваÑÑ Ñвежий инÑеÑпÑеÑаÑÐ¾Ñ Perl.
ÐзменÑÑÑ ÑÑи паÑамеÑÑÑ ÑазÑеÑено ÑолÑко ÑÑпеÑполÑзоваÑелÑм. ХоÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ в ÑÐ°Ð¼ÐºÐ°Ñ ÑеанÑа, Ñакие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ повлиÑÑÑ Ð½Ð° ÑабоÑÑ Ð¸Ð½ÑеÑпÑеÑаÑоÑов Perl, задейÑÑвованнÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑий Ñанее.
plperl.use_strict(boolean) #ÐÑи знаÑении, Ñавном true, поÑледÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑÐ¸Ñ ÑÑнкÑий PL/Perl бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð²ÐºÐ»ÑÑÑннÑм Ñказанием
strict. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð½Ðµ влиÑÐµÑ Ð½Ð° ÑÑнкÑии, Ñже ÑкомпилиÑованнÑе в ÑекÑÑем ÑеанÑе.
43.8.2. ÐгÑаниÑÐµÐ½Ð¸Ñ Ð¸ недоÑÑаÑÑие возможноÑÑи #
СледÑÑÑие возможноÑÑи в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð² PL/Perl оÑÑÑÑÑÑвÑÑÑ, но Ð¸Ñ ÑеализаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð¶ÐµÐ»Ð°Ð½Ð½Ð¾Ð¹ доÑабоÑкой.
ФÑнкÑии на PL/Perl не могÑÑ Ð½Ð°Ð¿ÑÑмÑÑ Ð²ÑзÑваÑÑ Ð´ÑÑг дÑÑга.
SPI еÑÑ Ð½Ðµ полноÑÑÑÑ Ñеализован.
ÐÑли Ð²Ñ Ð²ÑбиÑаеÑе оÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑие набоÑÑ Ð´Ð°Ð½Ð½ÑÑ , иÑполÑзÑÑ
spi_exec_query, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо вÑе ÑÑи даннÑе загÑÑжаÑÑÑÑ Ð² памÑÑÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе избежаÑÑ ÑÑого, иÑполÑзÑÑ Ð¿Ð°ÑÑ ÑÑнкÑийspi_query/spi_fetchrow, как показано Ñанее.ÐÐ¾Ñ Ð¾Ð¶Ð°Ñ Ð¿Ñоблема возникаеÑ, еÑли ÑÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, пеÑедаÑÑ Ð² Postgres Pro болÑÑое ÑиÑло ÑÑÑок, вÑполнÑÑ
return. ÐÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñак же можно избежаÑÑ, вÑполнÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ возвÑаÑаемой ÑÑÑокиreturn_next, как показано Ñанее.Ðогда ÑÐµÐ°Ð½Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ ÑÑаÑно, не по пÑиÑине кÑиÑиÑеÑкой оÑибки, в Perl вÑполнÑÑÑÑÑ Ð²Ñе блоки
END, коÑоÑÑе бÑли опÑеделенÑ. Ðикакие дÑÑгие дейÑÑÐ²Ð¸Ñ Ð² наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ вÑполнÑÑÑÑÑ. Ð ÑаÑÑноÑÑи, бÑÑеÑÑ Ñайлов авÑомаÑиÑеÑки не ÑбÑаÑÑваÑÑÑÑ Ð¸ обÑекÑÑ Ð°Ð²ÑомаÑиÑеÑки не ÑниÑÑожаÑÑÑÑ.