Vous pouvez utiliser le hachage global %_SHARED
pour
stocker les données, incluant les références de code, entre les appels de
fonction pour la durée de vie de la session en cours.
Voici un exemple simple pour des données partagées :
CREATE OR REPLACE FUNCTION set_var(name text, val text) RETURNS text AS $$ if ($_SHARED{$_[0]} = $_[1]) { return 'ok'; } else { return "Ne peux pas initialiser la variable partagée $_[0] à $_[1]"; } $$ LANGUAGE plperl; CREATE OR REPLACE FUNCTION get_var(name text) RETURNS text AS $$ return $_SHARED{$_[0]}; $$ LANGUAGE plperl; SELECT set_var('sample', 'Bonjour, PL/Perl ! Comment va ?'); SELECT get_var('sample');
Voici un exemple légèrement plus compliqué utilisant une référence de code :
CREATE OR REPLACE FUNCTION ma_fonction() RETURNS void AS $$ $_SHARED{myquote} = sub { my $arg = shift; $arg =~ s/(['\\])/\\$1/g; return "'$arg'"; }; $$ LANGUAGE plperl; SELECT ma_fonction(); /* initialise la fonction */ /* Initialise une fonction qui utilise la fonction quote */ CREATE OR REPLACE FUNCTION utilise_quote(TEXT) RETURNS text AS $$ my $text_to_quote = shift; my $qfunc = $_SHARED{myquote}; return &$qfunc($text_to_quote); $$ LANGUAGE plperl;
(Vous pouviez avoir remplacé le code ci-dessus avec la seule ligne
return $_SHARED{myquote}->($_[0]);
au prix d'une mauvaise lisibilité.)
Pour des raisons de sécurité, PL/Perl exécute des fonctions appelées par
un rôle SQL dans un interpréteur Perl séparé pour ce rôle. Ceci empêche
l'interférence accidentelle ou malicieuse d'un utilisateur avec le
comportement des fonctions PL/Perl d'un autre utilisateur. Chaque
interpréteur a sa propre valeur de la variable
%_SHARED
et des autres états globaux. Du coup, deux
fonctions PL/Perl partageront la même valeur de %_SHARED
si et seulement si elles sont exécutées par le même rôle SQL. Dans une
application où une session seule exécute du code sous plusieurs rôles SQL
(via des fonctions SECURITY DEFINER
, l'utilisation de
SET ROLE
, etc), vous pouvez avoir besoin de mettre en place des
étapes explicites pour vous assurer que les fonctions PL/Perl peuvent
partager des données %_SHARED
. Pour cela, assurez-vous
que les fonctions qui doivent communiquer ont pour propriétaire le même
utilisateur et marquez les comme SECURITY DEFINER
. Bien sûr,
vous devez faire attention à ce que ces fonctions ne puissent pas être
utilisées pour faire des choses qu'elles ne sont pas sensées faire.