summaryrefslogtreecommitdiff
path: root/src/pl/plperl/plc_perlboot.pl
blob: 29f7bed3dc4e442152f1f5ba20e3d9263291b1d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

#  $PostgreSQL: pgsql/src/pl/plperl/plc_perlboot.pl,v 1.2 2010/01/20 01:08:21 adunstan Exp $

PostgreSQL::InServer::Util::bootstrap();
PostgreSQL::InServer::SPI::bootstrap();

use strict;
use warnings;
use vars qw(%_SHARED);

sub ::plperl_warn {
	(my $msg = shift) =~ s/\(eval \d+\) //g;
	chomp $msg;
	&elog(&NOTICE, $msg);
}
$SIG{__WARN__} = \&::plperl_warn;

sub ::plperl_die {
	(my $msg = shift) =~ s/\(eval \d+\) //g;
	die $msg;
}
$SIG{__DIE__} = \&::plperl_die;


sub ::mkunsafefunc {
	my $ret = eval(qq[ sub { $_[0] $_[1] } ]);
	$@ =~ s/\(eval \d+\) //g if $@;
	return $ret;
}
  
use strict;

sub ::mk_strict_unsafefunc {
	my $ret = eval(qq[ sub { use strict; $_[0] $_[1] } ]);
	$@ =~ s/\(eval \d+\) //g if $@;
	return $ret;
}

sub ::encode_array_literal {
	my ($arg, $delim) = @_;
	return $arg
		if ref $arg ne 'ARRAY';
	$delim = ', ' unless defined $delim;
	my $res = '';
	foreach my $elem (@$arg) {
		$res .= $delim if length $res;
		if (ref $elem) {
			$res .= ::encode_array_literal($elem, $delim);
		}
		elsif (defined $elem) {
			(my $str = $elem) =~ s/(["\\])/\\$1/g;
			$res .= qq("$str");
		}
		else {
			$res .= 'NULL';
		}
	}
	return qq({$res});
}

sub ::encode_array_constructor {
	my $arg = shift;
	return quote_nullable($arg)
		if ref $arg ne 'ARRAY';
	my $res = join ", ", map {
		(ref $_) ? ::encode_array_constructor($_)
				 : ::quote_nullable($_)
	} @$arg;
	return "ARRAY[$res]";
}