Index: openacs-4/packages/acs-kernel/acs-kernel.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/acs-kernel.info,v
diff -u -r1.119 -r1.120
--- openacs-4/packages/acs-kernel/acs-kernel.info	7 Mar 2011 01:39:31 -0000	1.119
+++ openacs-4/packages/acs-kernel/acs-kernel.info	10 Apr 2011 21:18:52 -0000	1.120
@@ -7,15 +7,15 @@
     <initial-install-p>t</initial-install-p>
     <singleton-p>t</singleton-p>
     
-    <version name="5.7.0d8" url="http://openacs.org/repository/download/apm/acs-kernel-5.7.0d8.apm">
+    <version name="5.7.0d9" url="http://openacs.org/repository/download/apm/acs-kernel-5.7.0d9.apm">
         <owner url="mailto:oct@openacs.org">OpenACS Core Team</owner>
         <summary>Routines and data models providing the foundation for OpenACS-based Web services.</summary>
         <release-date>2010-06-17</release-date>
         <vendor url="http://openacs.org">OpenACS</vendor>
         <description format="text/html">The OpenACS kernel contains the core datamodel create and drop scripts for such things as objects, groups, partiies and the supporting PL/SQL and PL/pgSQL procedures.</description>
         <maturity>3</maturity>
 
-        <provides url="acs-kernel" version="5.7.0d8"/>
+        <provides url="acs-kernel" version="5.7.0d9"/>
 
         <callbacks>
         </callbacks>
Index: openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d8-5.7.0d9.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d8-5.7.0d9.sql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.7.0d8-5.7.0d9.sql	10 Apr 2011 21:18:52 -0000	1.1
@@ -0,0 +1,78 @@
+create or replace function number_src(text) returns text as '
+declare
+        v_src   alias for $1;
+        v_pos   integer;
+        v_ret   text default '''';
+        v_tmp   text;
+        v_cnt   integer default -1;
+begin
+        if v_src is null then 
+	     return null;
+        end if;
+
+        v_tmp := v_src;
+        LOOP
+            v_pos := position(''\n'' in v_tmp);
+            v_cnt := v_cnt + 1;
+
+            exit when v_pos = 0;
+
+            if v_cnt != 0 then
+              v_ret := v_ret || to_char(v_cnt,''9999'') || '':'' || substr(v_tmp,1,v_pos);
+            end if;
+            v_tmp := substr(v_tmp,v_pos + 1);
+        end LOOP;
+
+        return v_ret || to_char(v_cnt,''9999'') || '':'' || v_tmp;
+
+end;' language 'plpgsql' immutable strict;
+
+create or replace function get_func_definition (varchar,oidvector) returns text as '
+declare
+        fname           alias for $1;
+        args            alias for $2;
+        nargs           integer default 0;
+        v_pos           integer;
+        v_funcdef       text default '''';
+        v_args          varchar;
+        v_one_arg       varchar;
+        v_one_type      varchar;
+        v_nargs         integer;
+        v_src           text;
+        v_rettype       varchar;
+begin
+        select proargtypes, pronargs, number_src(prosrc), 
+               (select typname from pg_type where oid = p.prorettype::integer)
+          into v_args, v_nargs, v_src, v_rettype
+          from pg_proc p 
+         where proname = fname::name
+           and proargtypes = args;
+
+         v_funcdef := v_funcdef || ''
+create or replace function '' || fname || ''('';
+
+         v_pos := position('' '' in v_args);
+
+         while nargs < v_nargs loop
+             nargs := nargs + 1;
+             if nargs = v_nargs then 
+                 v_one_arg := v_args;
+                 v_args    := '''';
+             else
+                 v_one_arg := substr(v_args, 1, v_pos \- 1);
+                 v_args    := substr(v_args, v_pos + 1);
+                 v_pos     := position('' '' in v_args);            
+             end if;
+             select case when nargs = 1 
+                           then typname 
+                           else '','' || typname 
+                         end into v_one_type 
+               from pg_type 
+              where oid = v_one_arg::integer;
+             v_funcdef := v_funcdef || v_one_type;
+         end loop;
+         v_funcdef := v_funcdef || '') returns '' || v_rettype || '' as \\\'\\n'' || v_src || ''\\\' language \\\'plpgsql\\\';'';
+
+        return v_funcdef;
+
+end;' language 'plpgsql' stable strict;