[Знаю как]
DBD::Pg@win32
VAP home logo

Содержание

ActivePerl

Для программирования на языке Perl под Windows (платформой win32) существует пакет ActivePerl созданный компанией ActiveState. Этот пакет содержит почти все необходимое для разработки приложений на Perl, почти - это значит не все. Большинство общеупотребимых модулей языка присутствуют, некоторые заменены на функциональные аналоги, которые в большинстве случаев удовлетворяют предъявляемым требованиям, но порой нет.

DBD::Pg

В штатной поставке ActivePerl отсутствует DBI драйвер DBD::Pg необходимый для доступа к SQL серверу баз данных PostgreSQL. Вместо него предлагается пакет драйвера DBD::PgPP, который годится, разве что, на поиграться поскольку, во-первых, имеет производительность оставляющую желать лучшего, во-вторых, испытывает серьезные проблемы при обработке действительно больших запросов. Обычная диагностика в таком случае в журнале Apache имеет вид:

[Mon Mar 09 20:28:37 2009] [error] [client 127.0.0.1]
Complex regular subexpression recursion limit (32766) exceeded
at C:/Perl/site/lib/DBD/PgPP.pm line 750.,
referer: http://vap.org.ru.lan/cgi-bin/pb_cc.pl

Решением проблемы является переход к использованию штатного для DBI модуля DBI::Pg, порт которого под платформу win32 на самом деле существует, хотя и не включен в поставку ActivePerl. Все необходимое можно скачать с сайта:

http://pgfoundry.org/projects/dbdpgppm/

Минимум, что оттуда нужно забрать - установочный файл пакета ActivePerl подходящий для вашей установки, например, DBD-Pg-2.10.0-Perl5.10.ppd годится для установки ActivePerl версии 5.10. Важно, если вы собираетесь осуществлять доступ к PostgreSQL серверу расположенному где-то в сетях публичного доступа, иными словами - не на вашем локальном ПК, то обязательно используйте для доступа DBD драйвер с поддержкой SSL, например, DBD-Pg-2.10.0-SSL-Perl5.10.ppd. Разумеется вам нужно будет явно активировать защищенное соединение в вашем коде. Установка выполняется простой командой: "ppm install <имя_файла.ppd>". Например:

ppm install DBD-Pg-2.10.0-Perl5.10.ppd

После этого все, по идее, должно работать, но могут быть исключения. win32 порт DBD::Pg для своей работы требует наличия библиотеки времени исполнения Microsoft Visual C/C++ 8.0, поэтому вам может потребоваться загрузить файл msvcr80.zip с того же сайта, и если вы решили прибегнуть к DBD::Pg с поддержкой SSL, то в дополнение вам понадобится архив openssl.zip. Содержимое обеих архивов нужно распаковать в системный каталог Windows, обычно это C:\Windows\system32.

Microsoft Visual C++ Runtime Library
		Runtime Error!
		Program: C:\Perl\bin\perl.exe
		R6034
		An application has made an attempt to load the C runtime library incorrectly.
		Please contact the application's support team for more information.

Однако, и на этом эпопея может не закончится. Вы можете получить при запуске диалоговое окно с сообщением об ошибке подобное приведенному здесь. Исправляется эта проблема следующим образом. Необходимо из каталога, где у вас установлен DBD::Pg, обычно это C:\Perl\site\lib\auto\DBD\Pg, взять файл Pg.dll.manifest и скопировать его в каталог исполняемых модулей Perl, обычно это C:\Perl\bin, переименовав в perl.exe.manifest.


N.B. год спустя

Проделал все эти "телодвижения" год спустя и выяснил, что, судя по всему, все перечисленные выше операции являются не возможными, но необходимыми. То есть, перечень необходимых действий после установки DBD-Pg-2.10.0-(SSL-)Perl5.10.ppd должен быть:

  1. Убедитесь, что в C:\Windows\system32 присутствует файл msvcr80.dll? Нет? Качайте и распаковывайте туда msvcr80.zip.
  2. Если вы установили пакет DBD-Pg-2.10.0-SSL-Perl5.10.ppd, то проверяйте есть ли в C:\Windows\system32 файлы из архива openssl.zip? Нет? Делаем то же самое, что и для msvcr80.dll.
  3. Наиболее интересные грабли. Выше приведенное диалоговое сообщение "Microsoft Visual C++ Runtime Library: Runtime Error! blah-blah-blah..." может и не появиться! Смотрите в логах ошибок сервера сообщения вроде:
    [Thu Feb 04 22:50:45 2010] [error] [client 127.0.0.1] install_driver(Pg) failed:
    Can't load 'C:/Perl/site/lib/auto/DBD/Pg/Pg.dll' for module DBD::Pg: load_file:
    [censored] C:/Perl/lib/DynaLoader.pm line 201., referer: http://vap.org.ru.lan/
    [Thu Feb 04 22:50:45 2010] [error] [client 127.0.0.1]  at (eval 8) line 3,
    referer: http://vap.org.ru.lan/
    [Thu Feb 04 22:50:45 2010] [error] [client 127.0.0.1] Compilation failed
    in require at (eval 8) line 3., referer: http://vap.org.ru.lan/
    [Thu Feb 04 22:50:45 2010] [error] [client 127.0.0.1] Perhaps a required
    shared library or dll isn't installed where expected,
    referer: http://vap.org.ru.lan/
    Это верный сигнал к тому, что судьба вам проделывать выше описанные пляски с созданием perl.exe.manifest.



@Mail.ru Rambler's Top100