summaryrefslogtreecommitdiff
path: root/contrib/ltree_plpython
diff options
context:
space:
mode:
authorTom Lane2016-10-04 21:49:07 +0000
committerTom Lane2016-10-04 21:49:07 +0000
commiteda04886c1e048d695728206504ab4198462168e (patch)
tree30501f4583bd1b5ecf7dd990dd15d16a9f889b9c /contrib/ltree_plpython
parentfc76259f5b8473dbd3d2009b0e4a267cf3a7e704 (diff)
Avoid direct cross-module links in hstore_plperl and ltree_plpython, too.
Just turning the crank on the project started in commit d51924be8. These cases turn out to be exact subsets of the boilerplate needed for hstore_plpython. Discussion: <2652.1475512158@sss.pgh.pa.us>
Diffstat (limited to 'contrib/ltree_plpython')
-rw-r--r--contrib/ltree_plpython/Makefile19
-rw-r--r--contrib/ltree_plpython/ltree_plpython.c29
-rw-r--r--contrib/ltree_plpython/ltree_plpython2u--1.0.sql5
-rw-r--r--contrib/ltree_plpython/ltree_plpython3u--1.0.sql5
-rw-r--r--contrib/ltree_plpython/ltree_plpythonu--1.0.sql5
5 files changed, 38 insertions, 25 deletions
diff --git a/contrib/ltree_plpython/Makefile b/contrib/ltree_plpython/Makefile
index 08186f19a13..c45b7c2b097 100644
--- a/contrib/ltree_plpython/Makefile
+++ b/contrib/ltree_plpython/Makefile
@@ -4,7 +4,7 @@ MODULE_big = ltree_plpython$(python_majorversion)
OBJS = ltree_plpython.o $(WIN32RES)
PGFILEDESC = "ltree_plpython - ltree transform for plpython"
-PG_CPPFLAGS = -I$(top_srcdir)/src/pl/plpython $(python_includespec) -I$(top_srcdir)/contrib/ltree
+PG_CPPFLAGS = -I$(top_srcdir)/src/pl/plpython $(python_includespec) -I$(top_srcdir)/contrib/ltree -DPLPYTHON_LIBNAME='"plpython$(python_majorversion)"'
EXTENSION = ltree_plpythonu ltree_plpython2u ltree_plpython3u
DATA = ltree_plpythonu--1.0.sql ltree_plpython2u--1.0.sql ltree_plpython3u--1.0.sql
@@ -23,19 +23,18 @@ include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
endif
-# In configurations that forbid undefined symbols in libraries, link with each
-# dependency. This does preclude pgxs builds.
+# We must link libpython explicitly
ifeq ($(PORTNAME), aix)
rpathdir = $(pkglibdir):$(python_libdir)
-SHLIB_LINK += $(python_libspec) $(python_additional_libs) $(sort $(wildcard ../../src/pl/plpython/libplpython*.exp))
-endif
+SHLIB_LINK += $(python_libspec) $(python_additional_libs)
+else
ifeq ($(PORTNAME), win32)
-SHLIB_LINK += $(sort $(wildcard ../../src/pl/plpython/libpython*.a)) $(sort $(wildcard ../../src/pl/plpython/libplpython*.a))
+# ... see silliness in plpython Makefile ...
+SHLIB_LINK += $(sort $(wildcard ../../src/pl/plpython/libpython*.a))
+else
+rpathdir = $(python_libdir)
+SHLIB_LINK += $(python_libspec)
endif
-
-ifeq ($(PORTNAME), cygwin)
-SHLIB_LINK += -L../ltree -lltree -L../../src/pl/plpython \
- -lplpython$(python_majorversion) $(python_libspec)
endif
REGRESS_OPTS += --load-extension=ltree
diff --git a/contrib/ltree_plpython/ltree_plpython.c b/contrib/ltree_plpython/ltree_plpython.c
index 26b7b3c275d..bdd462a91b9 100644
--- a/contrib/ltree_plpython/ltree_plpython.c
+++ b/contrib/ltree_plpython/ltree_plpython.c
@@ -1,10 +1,39 @@
#include "postgres.h"
+
#include "fmgr.h"
#include "plpython.h"
#include "ltree.h"
PG_MODULE_MAGIC;
+extern void _PG_init(void);
+
+/* Linkage to functions in plpython module */
+#if PY_MAJOR_VERSION >= 3
+typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size);
+static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
+#endif
+
+
+/*
+ * Module initialize function: fetch function pointers for cross-module calls.
+ */
+void
+_PG_init(void)
+{
+ /* Asserts verify that typedefs above match original declarations */
+#if PY_MAJOR_VERSION >= 3
+ AssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
+ PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
+ load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
+ true, NULL);
+#endif
+}
+
+
+/* These defines must be after the module init function */
+#define PLyUnicode_FromStringAndSize PLyUnicode_FromStringAndSize_p
+
PG_FUNCTION_INFO_V1(ltree_to_plpython);
diff --git a/contrib/ltree_plpython/ltree_plpython2u--1.0.sql b/contrib/ltree_plpython/ltree_plpython2u--1.0.sql
index 62531371bf9..5c4a7037013 100644
--- a/contrib/ltree_plpython/ltree_plpython2u--1.0.sql
+++ b/contrib/ltree_plpython/ltree_plpython2u--1.0.sql
@@ -3,11 +3,6 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION ltree_plpython2u" to load this file. \quit
--- make sure the prerequisite libraries are loaded
-LOAD 'plpython2';
-SELECT NULL::ltree;
-
-
CREATE FUNCTION ltree_to_plpython2(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS 'MODULE_PATHNAME', 'ltree_to_plpython';
diff --git a/contrib/ltree_plpython/ltree_plpython3u--1.0.sql b/contrib/ltree_plpython/ltree_plpython3u--1.0.sql
index 3f21d1b7210..09ada3c7e8b 100644
--- a/contrib/ltree_plpython/ltree_plpython3u--1.0.sql
+++ b/contrib/ltree_plpython/ltree_plpython3u--1.0.sql
@@ -3,11 +3,6 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION ltree_plpython3u" to load this file. \quit
--- make sure the prerequisite libraries are loaded
-LOAD 'plpython3';
-SELECT NULL::ltree;
-
-
CREATE FUNCTION ltree_to_plpython3(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS 'MODULE_PATHNAME', 'ltree_to_plpython';
diff --git a/contrib/ltree_plpython/ltree_plpythonu--1.0.sql b/contrib/ltree_plpython/ltree_plpythonu--1.0.sql
index e8deadc62d0..ee93edf28b9 100644
--- a/contrib/ltree_plpython/ltree_plpythonu--1.0.sql
+++ b/contrib/ltree_plpython/ltree_plpythonu--1.0.sql
@@ -3,11 +3,6 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION ltree_plpythonu" to load this file. \quit
--- make sure the prerequisite libraries are loaded
-LOAD 'plpython2'; -- change to plpython3 if that ever becomes the default
-SELECT NULL::ltree;
-
-
CREATE FUNCTION ltree_to_plpython(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS 'MODULE_PATHNAME';