2017-01-05 25 views
0

Просто пытайтесь подключить базу данных с несколькими строками подключения с разными паролями. Пароли имеют разные привилегии. Если один пароль терпит неудачу, он должен попробовать с другим.несколько строк подключения к базе данных с другим паролем

Код написан ниже. Хотя он отлично работает, как мы можем реорганизовать код (eval & DBH) для обработки нескольких строк соединения?

my %config = do 'dbconfig.pl'; 

my $dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."", $config{user},$config{password},{RaiseError=>1,PrintError=>0}) }; 

if (!$dbh) { 
$dbh = eval { DBI->connect("dbi:Pg:dbname=".$config{db}.";host=$socket_nm;port=".$config{port}."",$config{user},$config{password},{RaiseError=>1,PrintError=>0}) };   
} 

if ([email protected]) { 
#Handle Exceptions 
} 

dbconfig.pl содержит:

db => 'db', 
port => '5432', 
user => 'db_ro', 
password => 'Pass01', 
password2 => 'Pass02' 
+1

Что вы подразумеваете под несколькими строками соединения? Вы хотите создать более одного дескриптора, каждый из которых подключается к другому серверу? – simbabque

+0

сервер такой же, пароли отличаются привилегиями. – Robie

+0

Значит, пользователь и пароль разные, и вам нужны несколько ручек? Укажите, какой должна быть ваша продукция. – simbabque

ответ

1

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

my @configs = (
    { 
     # ... 
     user  => 'user1', 
     password => 'password1', 
    }, 
    { 
     # ... 
     user  => 'user2', 
     password => 'password2', 
    }, 
); 

my $dbh; 
while (not $dbh) { 
    my $config = shift @configs; # grab the next config 
    if (not $config) { 
     # we ran out of configs to try 
     die "Couldn't connect to database"; 
    } 

    # try the config 
    $dbh = eval { 
     DBI->connect(
      "dbi:Pg:dbname=" . $config->{db} . ";host=$socket_nm;port=" . $config->{port} . "", 
      $config->{user}, $config->{password}, { RaiseError => 1, PrintError => 0 }); 
    }; 
    # we don't need to look at [email protected] here, but if we care we can still do it 
} 

Конфигурации теперь хранятся в массиве @configs. Внутри есть хеш-ссылки. В вашем цикле у нас есть лексический $config, который содержит текущий, который мы хотим попробовать. Обратите внимание, что это также хеш-ссылка, поэтому вам нужно использовать $config->{...} со стрелкой в ​​dsn.

Мы контактируем до тех пор, пока $dbh не установлен. Это так, пока eval внутри цикла не вернет рабочий объект дескриптора базы данных.

Нам также необходимо выйти из цикла, если у нас закончились конфигурации. Умирать было для этого хорошей идеей.

Если вы хотите, вы можете обрабатывать ошибки, которые eval ловит вас, но для этого вам не нужно это делать. Если вы все заботитесь о том, что в конечном итоге вы получите рабочее соединение, этого должно быть достаточно.


Примечание: Ваш %config = do 'dbconfig.pl' ужасен. Пожалуйста, используйте правильный формат файла конфигурации, такой как JSON, и модуль для его чтения. Мне очень нравится Config::ZOMG, поскольку он поддерживает множество различных форматов и позволяет объединять несколько файлов в один хэш конфигурации. Но вам может быть достаточно Config::Simple.