Brethren,
I am using DBD::mysql and reading connection parameters from MySQL defaults files, and it is MOSTLY working. I've been doing it for years, with code similar to the following:
sub open_db
{
my ($dsn, $dbh, $defaults);
$defaults = (defined $opts{defaults} && -f $opts{defaults})
? $opts{defaults}
: (-e $ENV{HOME}.'/.my.cnf')
? $ENV{HOME}.'/.my.cnf'
: (-e '/root/.my.cnf')
? '/root/.my.cnf'
: (-e './.my.cnf')
? './.my.cnf'
: 'NOTFOUND';
die "No valid defaults file found!" if ($defaults eq 'NOTFOUND' &&
+ !defined $opts{host});
$dsn = defined $opts{host} && defined $opts{port}
? sprintf("DBI:mysql:mysql:host=%s;port=%d;mysql_read_default
+_file=%s;mysql_read_default_group=mysql;",
$opts{host},
$opts{port},
$defaults)
: defined $opts{host}
? sprintf("DBI:mysql:mysql:host=%s;mysql_read_default_file=%s
+;mysql_read_default_group=mysql;",
$opts{host},
$defaults)
: defined $opts{socket} && -e $opts{socket}
? sprintf("DBI:mysql:mysql;mysql_read_default_file=%s;mysql_r
+ead_default_group=mysql;mysql_socket=%s;",
$defaults,
$opts{socket})
: sprintf("DBI:mysql:mysql;mysql_read_default_file=%s;mysql_r
+ead_default_group=mysql;",
$defaults);
$dbh = DBI->connect($dsn, undef, undef, {RaiseError => 1, AutoComm
+it => 0});
$dbh->do(sprintf('SET SESSION wait_timeout = %d',
$opts{interval} > 3500 ? $opts{interval} + 100 :
+3600)) || die "Could not set session wait_timeout";
return ($dbh);
}
Now, the one respect in which this is not working is that it ignores a host specified in the defaults file. Username is picked up correctly, password is picked up and used, host is ignored.
Can anyone tell me why this should be?