mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Well, I finally solved the linking problem
that kept me from making perl secure. Attached is uuencoded tarball to add PL/perl to postgresql. Things I know don't work. -- triggers -- SPI The README file has a _VERY_ short tutorial. Mark Hollomon
This commit is contained in:
113
src/pl/plperl/Makefile.pl
Normal file
113
src/pl/plperl/Makefile.pl
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
use DynaLoader;
|
||||||
|
use Config;
|
||||||
|
use ExtUtils::Embed;
|
||||||
|
|
||||||
|
#
|
||||||
|
# massage the ld options
|
||||||
|
#
|
||||||
|
my $ldopts = ldopts();
|
||||||
|
chomp($ldopts);
|
||||||
|
|
||||||
|
#
|
||||||
|
# get the location of the Opcode module
|
||||||
|
#
|
||||||
|
my $opcode = '';
|
||||||
|
{
|
||||||
|
|
||||||
|
$modname = 'Opcode';
|
||||||
|
|
||||||
|
my $dir;
|
||||||
|
foreach (@INC) {
|
||||||
|
if (-d "$_/auto/$modname") {
|
||||||
|
$dir = "$_/auto/$modname";
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined $dir) {
|
||||||
|
$opcode = DynaLoader::dl_findfile("-L$dir", $modname);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
open(MAKEFILE, ">Makefile");
|
||||||
|
|
||||||
|
print MAKEFILE <<_STATIC_;
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Makefile
|
||||||
|
# Makefile for the plperl shared object
|
||||||
|
#
|
||||||
|
# AUTOGENERATED Makefile.pl
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Tell make where the postgresql sources live
|
||||||
|
#
|
||||||
|
SRCDIR= ../../../src
|
||||||
|
include \$(SRCDIR)/Makefile.global
|
||||||
|
|
||||||
|
|
||||||
|
# use the same compiler as perl did
|
||||||
|
CC= $Config{cc}
|
||||||
|
|
||||||
|
# get the compiler options that perl wants.
|
||||||
|
CFLAGS+= @{[ccopts()]}
|
||||||
|
# including the ones for dynamic loading
|
||||||
|
CFLAGS+= $Config{cccdlflags}
|
||||||
|
|
||||||
|
# add the includes for postgreSQL
|
||||||
|
CFLAGS+= -I\$(LIBPQDIR) -I\$(SRCDIR)/include
|
||||||
|
|
||||||
|
# For fmgr.h
|
||||||
|
CFLAGS+= -I\$(SRCDIR)/backend
|
||||||
|
|
||||||
|
|
||||||
|
# add the postgreSQL libraries
|
||||||
|
LDADD+= -L\$(LIBPQDIR) -lpq
|
||||||
|
|
||||||
|
LDFLAGS+= $Config{lddlflags} \\
|
||||||
|
$ldopts \\
|
||||||
|
-lperl
|
||||||
|
|
||||||
|
#
|
||||||
|
# DLOBJS is the dynamically-loaded object file.
|
||||||
|
#
|
||||||
|
DLOBJS= plperl\$(DLSUFFIX)
|
||||||
|
|
||||||
|
INFILES= \$(DLOBJS)
|
||||||
|
|
||||||
|
SHLIB_EXTRA_LIBS+= $opcode
|
||||||
|
|
||||||
|
#
|
||||||
|
# plus exports files
|
||||||
|
#
|
||||||
|
ifdef EXPSUFF
|
||||||
|
INFILES+= \$(DLOBJS:.o=\$(EXPSUFF))
|
||||||
|
endif
|
||||||
|
|
||||||
|
%.so: %.o
|
||||||
|
\$(CC) -o \$@ \$< \$(LDFLAGS) \$(SHLIB_EXTRA_LIBS) \$(LDADD)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Build the shared lib
|
||||||
|
#
|
||||||
|
plperl : plperl.lo
|
||||||
|
libtool \$(CC) -o plperl.so plperl.lo \$(SHLIB_EXTRA_LIBS) \$(LDADD) \$(LDFLAGS)
|
||||||
|
|
||||||
|
%.lo : %.c
|
||||||
|
libtool \$(CC) -c \$(CFLAGS) \$<
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Clean
|
||||||
|
#
|
||||||
|
clean:
|
||||||
|
rm -f \$(INFILES) *.o *.lo
|
||||||
|
rm -rf .libs
|
||||||
|
rm -f Makefile
|
||||||
|
|
||||||
|
dep depend:
|
||||||
|
|
||||||
|
_STATIC_
|
41
src/pl/plperl/README
Normal file
41
src/pl/plperl/README
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
>perl Makefile.pl
|
||||||
|
>make
|
||||||
|
|
||||||
|
copy the resulting library somewhere that
|
||||||
|
the postgresql backend can see it. assume
|
||||||
|
that path is /usr/local/pgsql/modules/plperl.so
|
||||||
|
|
||||||
|
CREATE FUNCTION plperl_call_handler() RETURNS opaque
|
||||||
|
AS '/usr/local/pgsql/modules/plperl.so' LANGUAGE 'C';
|
||||||
|
|
||||||
|
CREATE TRUSTED PROCEDURAL LANGUAGE 'plperl'
|
||||||
|
HANDLER plperl_call_handler
|
||||||
|
LANCOMPILER 'PL/Perl';
|
||||||
|
|
||||||
|
-- here is simple example
|
||||||
|
CREATE FUNCTION addints(int4, int4) RETURNS int4 AS '
|
||||||
|
return $_[0] + $_[1]
|
||||||
|
' LANGUAGE 'plperl';
|
||||||
|
|
||||||
|
SELECT addints(3,4);
|
||||||
|
|
||||||
|
-- of course, you can pass tuples;
|
||||||
|
CREATE TABLE twoints ( a integer, b integer);
|
||||||
|
CREATE FUNCTION addtwoints(twoints) RETURNS integer AS '
|
||||||
|
$tup = shift;
|
||||||
|
return $tup->{"a"} + $tup->{"b"};
|
||||||
|
' LANGUAGE 'plperl';
|
||||||
|
|
||||||
|
SELECT addtwoints(twoints) from twoints;
|
||||||
|
|
||||||
|
-- here is one that will fail. Creating the function
|
||||||
|
-- will work, but using it will fail.
|
||||||
|
CREATE FUNCTION badfunc() RETURNS int4 AS '
|
||||||
|
open(TEMP, ">/tmp/badfile");
|
||||||
|
print TEMP "Gotcha!\n";
|
||||||
|
return 1;
|
||||||
|
' LANGUAGE 'plperl';
|
||||||
|
|
||||||
|
SELECT badfunc();
|
||||||
|
|
||||||
|
|
2175
src/pl/plperl/plperl.c
Normal file
2175
src/pl/plperl/plperl.c
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user