# Copyright (c) 2021, PostgreSQL Global Development Group # src/pl/plperl/plc_perlboot.pl use strict; use warnings; use 5.008001; use vars qw(%_SHARED $_TD); PostgreSQL::InServer::Util::bootstrap(); # globals sub ::is_array_ref { return ref($_[0]) =~ m/^(?:PostgreSQL::InServer::)?ARRAY$/; } sub ::encode_array_literal { my ($arg, $delim) = @_; return $arg unless (::is_array_ref($arg)); $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) unless ::is_array_ref($arg); my $res = join ", ", map { (ref $_) ? ::encode_array_constructor($_) : ::quote_nullable($_) } @$arg; return "ARRAY[$res]"; } { #<<< protect next line from perltidy so perlcritic annotation works package PostgreSQL::InServer; ## no critic (RequireFilenameMatchesPackage) #>>> use strict; use warnings; sub plperl_warn { (my $msg = shift) =~ s/\(eval \d+\) //g; chomp $msg; &::elog(&::WARNING, $msg); return; } $SIG{__WARN__} = \&plperl_warn; sub plperl_die { (my $msg = shift) =~ s/\(eval \d+\) //g; die $msg; } $SIG{__DIE__} = \&plperl_die; sub mkfuncsrc { my ($name, $imports, $prolog, $src) = @_; my $BEGIN = join "\n", map { my $names = $imports->{$_} || []; "$_->import(qw(@$names));" } sort keys %$imports; $BEGIN &&= "BEGIN { $BEGIN }"; return qq[ package main; sub { $BEGIN $prolog $src } ]; } sub mkfunc { ## no critic (ProhibitNoStrict, ProhibitStringyEval); no strict; # default to no strict for the eval no warnings; # default to no warnings for the eval my $ret = eval(mkfuncsrc(@_)); $@ =~ s/\(eval \d+\) //g if $@; return $ret; ## use critic } 1; } { package PostgreSQL::InServer::ARRAY; use strict; use warnings; use overload '""' => \&to_str, '@{}' => \&to_arr; sub to_str { my $self = shift; return ::encode_typed_literal($self->{'array'}, $self->{'typeoid'}); } sub to_arr { return shift->{'array'}; } 1; }