Кто-нибудь получил plperl для работы с Postgres 9.1 на Windows? - PullRequest
4 голосов
/ 30 декабря 2011

Мне не удалось заставить plperl работать с Postgres 9.1 в Windows.

Та же проблема описана здесь, но пока без решения: http://postgresql.1045698.n5.nabble.com/BUG-6204-Using-plperl-functions-generate-crash-td4802111.html

REPRO

Установите 32-разрядную версию Perl 5.14 для Windows отсюда: http://downloads.activestate.com/ActivePerl/releases/5.14.2.1402/ActivePerl-5.14.2.1402-MSWin32-x86-295342.msi

Добавьте Perl в переменную системного пути. Установите 32-разрядную версию Postgres 9.1.2 для Windows из базы данных предприятия www.enterprisedb.com/products/pgdownload.do#windows

Теперь создайте тестовую БД, добавьте в нее perl и попробуйте создать функцию:

postgres=# create database plperl_test;
CREATE DATABASE
postgres=# \c plperl_test
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
You are now connected to database "plperl_test" as user "postgres".
plperl_test=# create language plperl;
CREATE LANGUAGE
plperl_test=# create function perl_test() returns void as
plperl_test-# $$
plperl_test$# $$
plperl_test-# language plperl;
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.

Обратите внимание, что это вызвало процесс на сервере Postgres:неисправность.Yikes!

Когда я просматриваю свой лог-файл Postgres, я нахожу это ...

2011-12-29 15:51:08 PST STATEMENT:  create function perl_test() returns void as
    $$
    $$
    language plperl;
2011-12-29 15:51:26 PST LOG:  server process (PID 10364) was terminated by exception 0xC0000005
2011-12-29 15:51:26 PST HINT:  See C include file "ntstatus.h" for a description of the hexadecimal value.
2011-12-29 15:51:26 PST LOG:  terminating any other active server processes
2011-12-29 15:51:26 PST WARNING:  terminating connection because of crash of another server process
2011-12-29 15:51:26 PST DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2011-12-29 15:51:26 PST HINT:  In a moment you should be able to reconnect to the database and repeat your command.
2011-12-29 15:51:26 PST LOG:  all server processes terminated; reinitializing
2011-12-29 15:51:36 PST FATAL:  pre-existing shared memory block is still in use
2011-12-29 15:51:36 PST HINT:  Check if there are any old server processes still running, and terminate them.

Ответы [ 3 ]

2 голосов
/ 10 августа 2012

Я был удивлен, что не нашел хороших ответов от Google на этот счет.Кажется, что Activstate работает для некоторых, но не для других.Были подозрения о конфликтах с различными версиями системных библиотек Windows, но ничего определенного.Тем не менее, я смог наконец создать plperl.dll, который работает, используя клубничный Perl.

Вот пошаговые инструкции, чтобы заставить plperl работать с клубничным Perl.Хитрость заключается в том, чтобы перекомпилировать postgresql и plperl, но установить plperl поверх существующей установки postgresql.

сначала вам понадобится следующее:

  1. mingw (http://www.mingw.org)
  2. клубничный перл.http://www.strawberryperl.org
  3. Postgresql источники.Убедитесь, что вы получаете версию, соответствующую вашей установке.

Сайт mingw запутан до чертиков.Нет единого пакета для загрузки.Вы должны загрузить установщик, который загружает все остальное.Вот быстрая ссылка на него.

http://sourceforge.net/projects/mingw/files/Installer/

В их установщике выберите C и C ++ и среду MSYS для установки.Mingw не будет загрязнять вашу среду, поэтому установите его в любом старом месте.

Что касается Perl, я не думаю, что activestate поставляется с файлами (общими библиотеками), необходимыми для этого, и я нашелCPAN-клубника поддерживает превосходную поддержку (по сравнению с частными ppm-сайтами activestate) и douchebag-шаг activestate, заключающийся в размещении старых версий за платным доступом (и вынуждает другие сайты удалять свои размещенные копии).FU ActiveState.

Postgresql 9.1 изначально был построен на Perl 5.14, поэтому, вероятно, лучше придерживаться этой версии.

Распакуйте и установите все это.Mingw предоставит вам оболочку (найдите ярлык в меню автозагрузки) для компиляции. Запустите оболочку и не закрывайте ее.

выполните следующие действия для установки / удаления пакетов:

mingw-get install libminizip
mingw-get remove mingw-perl

вам нужно удалить perl от mingw, чтобы в процессе сборки использовался клубничный perl.Вместо этого вы можете обойтись с переменной path, но теперь этот путь проще

, вам нужно попасть в каталог, в который вы распаковали распакованные исходники postgresql.В оболочке mingw используйте корневой путь / c для обращения к диску C :.

Теперь просто сконфигурируйте и выполните

./configure --with-perl
make

Обратите внимание, что в postgres docs говорят, что нужно использовать gmake, но на mingw это make.

Сборка, вероятно, завершится неудачно при сборкеактуальный файл plperl.dll.Это потому, что среда сборки не производит правильную команду для сборки DLL.Если вы получите сообщение об ошибке, подобное этому:

dllwrap -o plperl.dll --dllname plperl.dll  --def libplperldll.def plperl.o SPI.o Util.o -L../../../src/port -Wl,--allow-multiple-definition  -Wl,--as-needed -LC:/strawberry/perl/lib/CORE -l -L../../../src/backend -lpostgres
c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/ld.exe: cannot find -l-L../../../src/backend
c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/ld.exe: cannot find -lpostgres

cd в src / pl / plperl и выполните следующую команду:

dllwrap -o plperl.dll --dllname plperl.dll  --def libplperldll.def plperl.o SPI.o Util.o -L../../../src/port -Wl,--allow-multiple-definition  -Wl,--as-needed -L/c/strawberry/perl/lib/CORE  -L../../../src/backend -lpostgres -lperl514

(обратите внимание, что у меня установлен perl в c: \клубника и mingw установлены в c: \ mingw)

На этом все готово.у вас есть plperl.dll в этом каталоге, который может заменить тот, который поставляется с postgresql.

0 голосов
/ 06 января 2014

После игры с новой установкой PostgreSQL 9.1.11 (x64) я обнаружил, что ActivePerl 5.14.1 (x64) работает. Ключ должен гарантировать, что PostgreSQL сможет найти необходимые библиотеки Perl DLL в своей среде PATH.

Запустите Зависимость Walker на plperl.dll в каталоге lib postgres. В случае PostgreSQL 9.1.11 он зависит от perl514.dll - поэтому измените PATH среды, чтобы включить каталог, в котором он находится (например, c: \ perl \ bin). Перепроверьте, правильно ли обнаружена DLL, перезапустив Dependency Walker, затем полностью остановите / запустите службу PostgreSQL, которую вы должны хорошо выполнить.

Если вы обнаружите, что plperl.dll зависит от другой библиотеки Perl DLL, вам нужно использовать версию ActivePerl, которая соответствует (то есть perl58.dll будет соответствовать ActivePerl 5.8, perl510.dll будет соответствовать ActivePerl 5.10 - гарантируя, что двоичный формат Perl и PostgreSQL всегда совпадает (32/64 бит)).

0 голосов
/ 15 марта 2012

Здесь говорится здесь , что (ActiveState) Perl 5.14 требуется, чтобы он заработал.Я не уверен насчет бренда, так как мне пришлось использовать устаревшую версию клубничного Perl для Postgres 9.0, которая работала просто отлично.Важно использовать правильную версию Perl 5.14 для Postgres 9.1.Попробуйте использовать двоичный формат (32 или 64 бита), совпадающий с форматом вашей установки postgres.

...