[Moscow.pm] хост из $dbh

Alexander M. Pravkin fduch на antar.bryansk.ru
Пн Сен 10 22:34:38 PDT 2012


On Tue, 2012-09-11 at 01:24 +0400, Михаил Монашёв wrote:
> Есть соединение с БД, созданное так:
> $dbh = DBI->connect(bla-bla-bla);
> 
> Как   имея   только  $dbh,  желательно  средствами  только  DBI  (т.е.
> по-правильному),  получить  имя  хоста, к которому сделано соединение?
> Причём  так,  чтобы работало одинаково на разных серверах и при разном
> написании  параметров  соединени  (порт  слитно  с  именем  хоста  или
> отдельным параметром и т.п.).
> 
> parse_dsn()  выдаёт  то, что снова надо парсить. И когда начинаешь это
> парсить,  выясняются  выше  описанные  ньансы,  намекающие  на то, что
> где-то должен быть правильный способ вынуть хост. Он есть?

Вряд ли. Параметры коннекта ('dbname=foo;host=localhost') самому DBI
фиолетовы, он их передаёт непосредственно драйверу. Дальше всё зависит
от драйвера.

DBD::Pg, например, заменяет все ';' на пробелы, добавляет туда же
логин-пароль и передаёт строку целиком в PQconnectdb без разбора.

При уже установленном соединении хост можно вытащить уже средствами
libpq, это умеет dbd_db_FETCH_attrib("pg_host"):

% perl -MDBI -E 'say DBI->connect("DBI:Pg:dbname=fduch;host=$_")->{pg_host} foreach ("", "localhost", "127.0.0.1")'

localhost
127.0.0.1


DBD::mysql вроде умеет dbd_db_FETCH_attrib("hostinfo").


-- 
Alexander M. Pravkin


Подробная информация о списке рассылки Moscow-pm