windows - 有没有人让 plperl 在 Windows 上使用 Postgres 9.1?

标签 windows perl postgresql plperl

我一直无法让 plperl 在 Windows 上与 Postgres 9.1 一起工作。

这里描述了同样的问题,但目前还没有解决方案: http://postgresql.1045698.n5.nabble.com/BUG-6204-Using-plperl-functions-generate-crash-td4802111.html

复制

从这里安装适用于 Windows 的 Perl 5.14 32 位: http://downloads.activestate.com/ActivePerl/releases/5.14.2.1402/ActivePerl-5.14.2.1402-MSWin32-x86-295342.msi

将Perl添加到系统路径变量中 从 Enterprise DB 安装适用于 Windows 的 Postgres 9.1.2 32 位 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 服务器进程关闭。哎呀!

当我查看我的 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.

最佳答案

令我惊讶的是,Google 对此没有给出好的答案。似乎 Activstate 对某些人有效,但对其他人无效。有人怀疑与不同版本的 windows 系统库有冲突,但没有定论。但是,我最终能够使用 strawberry perl 构建一个可以正常工作的 plperl.dll。

这里是让 plperl 使用 strawberry perl 的分步说明。诀窍是重新编译 postgresql 和 plperl,但在现有的 postgresql 安装上安装 plperl。

首先,您需要具备以下条件:

  1. mingw ( http://www.mingw.org )
  2. 草莓 perl。 http://www.strawberryperl.org
  3. Postgresql 来源。确保您获得与您的安装相匹配的版本。

mingw 站点非常困惑。没有要下载的单个包。您必须下载一个安装程序来下载其他所有内容。这是它的快速链接。

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

在他们的安装程序中,选择 C ​​和 C++,以及要安装的 MSYS 环境。 Mingw 不会污染您的环境,因此请将其安装在任何旧位置。

至于 perl,我不认为 activestate 附带执行此操作所需的文件(共享库),而且我发现 strawberry 的 CPAN 支持更出色(与 activestate 的专有 ppm 站点相比)和 activestate 的 douchebag 移动付费专区后面的旧版本(并迫使其他站点删除其托管副本)。 F.U.事件状态。

Postgresql 9.1 最初是针对 perl 5.14 构建的,因此最好坚持使用该版本。

解压并安装所有这些东西。 Mingw 会给你一个 shell(在启动菜单中寻找快捷方式)来编译。启动一个 shell,不要关闭它。

运行以下命令来安装/删除包:

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

您需要删除 mingw 的 perl,以便构建过程改用 strawberry perl。您可以改用路径变量,但这种方式更容易

现在,您需要进入解压 postgresql 源的目录。在mingw shell中,使用根路径/c来引用C:盘。

现在只需配置和制作

./configure --with-perl
make

请注意,postgres 文档说要使用 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

(注意我在 c:\strawberry 中安装了 perl,在 c:\mingw 中安装了 mingw)

至此,您就完成了。你在该目录中有一个 plperl.dll,它可以替换 postgresql 附带的那个。

关于windows - 有没有人让 plperl 在 Windows 上使用 Postgres 9.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674995/

相关文章:

c# - Windows 桌面应用程序的想法

perl - 为什么我可以打开undef?

perl - 为什么在Perl中打印 "\n"需要这么长时间?

perl - Perl 中的位操作

sql - 加入 2 个 postgres sql 查询

mysql - 无法连接到 Windows 上 X.X.X.X 上的 mysql 服务器

C++:使用 Win32 API 实现命名管道

Windows 过滤平台 - 我的数据包负载在哪里?

php - 我可以通过 Containable 行为检索聚合列吗?

performance - (varchar 作为性能列的类型?