LINUX.ORG.RU

Perl, прерывается выполнение программы при невозможности подключения к БД

 , ,


0

1

Собственно нужно в цикле опросить несколько серверов БД Firebird, если нет подключения к серверу, то выводим сообщение о недоступности и переходим к следующему серверу БД. Слепил вот такой вот говно-код, т.к. програмлю на перле впервые, после подключения к заведомо неработающему серверу строкой $dbh=DBI->connect($dsn, $user, $spassword) появляется ошибка (DBI connect('hostname=192.168.1.2/3051;db=database;win1251','sysdba',...) failed: can't format message 13:98 — message system code -4 -Unable to complete network request to host «192.168.1.2». -Failed to establish a connection. at ./6.sh line 67. ) и работа программы просто прерывается, хотя стоит задача, выявить невозможность подключения и перейти к следующему серверу БД. Пока сервера БД доступны, цикл обрабатывается без сбоев.

#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $user="sysdba";
my $password="masterkey";
my @hosts="192.168.1.1","192.168.1.2","192.168.1.3";
my $dbport="3051";
my $db="database";
my $ib_charset="win1251";

my $i;
for ($i=0; $i<@hosts; $i++) {

my $dsn="dbi:Firebird:hostname=${hosts[$i]}/$dbport;db=${db};$ib_charset";
my $dbh;
   if ($dbh=DBI->connect($dsn, $user, $spassword)) {
	    print "Соединение с БД ${hosts[$i]} по порту tcp/$dbport успешно установлено\n"; 
	    } else {
	    print "Соединение с БД ${hosts[$i]} по порту tcp/$dbport не установлено, возможно сервер БД не запущен или доступ к нему блокируется МЭ\n";
	    }
		
$dbh->disconnect;

}
exit;


Последнее исправление: karasic (всего исправлений: 1)

if ($dbh=eval{DBI->connect($dsn, $user, $spassword)}) {

eval BLOCK поймает исключение и вернёт undef; в сообщение об ошибке можно вложить $@ (или $EVAL_ERROR при use English).

AITap ★★★★★
()
Ответ на: комментарий от karasic

А таки нет, работает, проблема оказывается ещё была в $dbh->disconnect; его тоже нужно было оформить с EVAL, т.к. не отчего было отключаться...

karasic
() автор топика
Ответ на: комментарий от karasic

Исправил ошибки в Вашем файле: http://paste.debian.net/98908/

1) my @hosts=("192.168.1.1","192.168.1.2","192.168.1.3"); Скобки необходимы вследствие приоритета оператора "," над «=» - иначе получается присвоение массиву одной строки и две константы в пустом контексте.

2) Исправил опечатку в строке подключения (переменная $spassword не объявлена).

Первые две ошибки Вам нашли warnings и strict.

3) $dbh->disconnect; имеет смысл только тогда, когда соединение установлено - перенёс его внутрь блока if

4) Избавился от C-style for loop в пользу более простого и понятного foreach

5) Прогнал через perltidy для улучшения форматирования кода

Теперь должно работать.

UPD: Вы и сами всё исправили. Поздравляю.

AITap ★★★★★
()
Последнее исправление: AITap (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.