Folks,

Please find enclosed a patch to the pl/perl documents that clafies the
scope of global data and gives an example of storing a code reference.

Cheers,
D
-- 
David Fetter [EMAIL PROTECTED] http://fetter.org/
phone: +1 510 893 6100   mobile: +1 415 235 3778

Remember to vote!
Index: doc/src/sgml/plperl.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql/doc/src/sgml/plperl.sgml,v
retrieving revision 2.32
diff -c -r2.32 plperl.sgml
*** doc/src/sgml/plperl.sgml    21 Nov 2004 21:17:01 -0000      2.32
--- doc/src/sgml/plperl.sgml    9 Dec 2004 20:45:54 -0000
***************
*** 315,322 ****
    <title>Global Values in PL/Perl</title>
  
    <para>
!    You can use the global hash <varname>%_SHARED</varname> to store
!    data between function calls.  For example:
  <programlisting>
  CREATE OR REPLACE FUNCTION set_var(name text, val text) RETURNS text AS $$
      if ($_SHARED{$_[0]} = $_[1]) {
--- 315,328 ----
    <title>Global Values in PL/Perl</title>
  
    <para>
!     You can use the global hash <varname>%_SHARED</varname> to store
!     data, including code references, between function calls for the
!     lifetime of the current session, which is bounded from below by
!     the lifetime of the current transaction.
!   </para>
!   <para>
!     Here is a simple example for shared data:
! 
  <programlisting>
  CREATE OR REPLACE FUNCTION set_var(name text, val text) RETURNS text AS $$
      if ($_SHARED{$_[0]} = $_[1]) {
***************
*** 333,338 ****
--- 339,368 ----
  SELECT set_var('sample', 'Hello, PL/Perl!  How's tricks?');
  SELECT get_var('sample');
  </programlisting>
+    Here is a slightly more complicated example using a code reference:
+ <programlisting>
+ CREATE OR REPLACE FUNCTION myfuncs() RETURNS VOID LANGUAGE plperl AS $$
+ $_SHARED{myquote} = sub
+ {
+     my $arg = shift;
+     $arg =~ s/(['\\])/\\$1/g;
+     return "'$arg'";
+ };
+ $$;
+ 
+ SELECT myfuncts(); /* Initializes the function */
+ 
+ /* Set up a function that uses the quote function */
+ 
+ CREATE OR REPLACE FUNCTION use_quote(TEXT) RETURNS TEXT LANGUAGE plperl AS $$
+     my $text_to_quote = shift;
+     my $qfunc = $_SHARED{myquote};
+     return &$qfunc($text_to_quote);
+ # You could have replaced the above with the one-liner
+ # return $_SHARED{myquote}->($_[0]);
+ # at the expense of readability, but please don't code that way.
+ $$;
+ </programlisting>
    </para>
   </sect1>
  
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to