While experimenting with subclassing DBI, I came across an odd behavior for
$DBI::errstr. I was doing things like:
*MyClass::errstr = \$DBI::errstr;
So that I could use $MyClass::errstr as an alias for $DBI::errstr. (By the
way, it would be nice if the init_rootclass() method did something like this
automatically). While testing, I noticed that this statement failed after a
connection error:
$MyClass::errstr eq $DBI::errstr
I figured there must be something odd with the typeglob. But to my
surprise, the following statement also failed after a connection error!
$DBI::errstr eq $DBI::errstr
It seems that they don't fail if there are no errors. If I compare
DBI->errstr and $DBI::errstr, they are the same, and DBI->errstr and
DBI->errstr are too. To add to the mystery, this comparison works with Perl
5.00404, DBI 1.06 and Sybase 0.13. (The configuration I'm having trouble
with is Perl 5.6.0, DBI 1.14, Sybase 0.91).
Does anyone have any ideas about this? Maybe I'm making some simple
mistake? The code I used to test this and my tests follow.
Thanks for your help,
Mitch
--------snip-------------
Perl version: 5.006
DBI version: 1.14
DBD::Sybase version: 0.91
============================================================
= Bad username and password on connection: Sybase
============================================================
Server message number=4002 severity=14 state=1 line=1 server=XXXXX
text=Login failed.
OpenClient message: LAYER = (4) ORIGIN = (1) SEVERITY = (4) NUMBER = (44)
Message String: ct_connect(): protocol specific layer: external error: The
attempt to connect to the server failed.
============================================================
$DBI::errstr eq $DBI::errstr:
DBI->errstr eq $DBI::errstr: 1
$DBI::errstr eq DBI->errstr: 1
DBI->errstr eq DBI->errstr: 1
DBI->errstr eq $copy: 1
$DBI::errstr eq $copy:
============================================================
= No error on connection: Sybase
============================================================
============================================================
$DBI::errstr eq $DBI::errstr: 1
DBI->errstr eq $DBI::errstr: 1
$DBI::errstr eq DBI->errstr: 1
DBI->errstr eq DBI->errstr: 1
DBI->errstr eq $copy: 1
$DBI::errstr eq $copy: 1
============================================================
= No error on connection: ExampleP
============================================================
============================================================
$DBI::errstr eq $DBI::errstr: 1
DBI->errstr eq $DBI::errstr: 1
$DBI::errstr eq DBI->errstr: 1
DBI->errstr eq DBI->errstr: 1
DBI->errstr eq $copy: 1
$DBI::errstr eq $copy: 1
-------snip------------
Perl version: 5.00404
DBI version: 1.06
DBD::Sybase version: 0.13
============================================================
= Bad username and password on connection: Sybase
============================================================
Server message number=4002 severity=14 state=1 line=1 server=HD1CMO
text=Login failed.
OpenClient message: LAYER = (4) ORIGIN = (1) SEVERITY = (4) NUMBER = (44)
Message String: ct_connect(): protocol specific layer: external error: The
attempt to connect to the server failed.
============================================================
$DBI::errstr eq $DBI::errstr: 1
Can't locate auto/DBI/errstr.al in @INC (@INC contains:
/usr/local/lib/perl5/sun4-solaris/5.00404 /usr/local/lib/perl5
/usr/local/lib/perl5/site_perl/sun4-solaris /usr/local/lib/perl5/site_perl
.) at ./bug.pl line 37
------snip--------------
#!/usr/local/bin/perl5 -w
use DBI;
use DBD::Sybase ();
my $server = 'YOURSERVER';
my $username = 'YOURUSERNAME';
my $password = 'YOURPASSWORD';
print "Perl version: $]\n";
print "DBI version: $DBI::VERSION\n";
print "DBD::Sybase version: $DBD::Sybase::VERSION\n";
#DBI->trace(9);
*main::copy = \$DBI::errstr;
my $dbh = DBI->connect(
"dbi:Sybase:server=$server",
'not_a_username',
'not_a_password',
RaiseError => 0,
PrintError => 0
}
);
print "=" x 60, "\n";
print "= Bad username and password on connection: Sybase\n";
print "=" x 60, "\n";
print $DBI::errstr;
print "=" x 60, "\n";
print '$DBI::errstr eq $DBI::errstr: ', $DBI::errstr eq $DBI::errstr, "\n";
print 'DBI->errstr eq $DBI::errstr: ', DBI->errstr eq $DBI::errstr, "\n";
print '$DBI::errstr eq DBI->errstr: ', $DBI::errstr eq DBI->errstr, "\n";
print 'DBI->errstr eq DBI->errstr: ', DBI->errstr eq DBI->errstr, "\n";
print 'DBI->errstr eq $copy: ', DBI->errstr eq $copy, "\n";
print '$DBI::errstr eq $copy: ', $DBI::errstr eq $copy, "\n";
my $dbh2 = DBI->connect(
"dbi:Sybase:server=$server",
$username,
$password,
{
RaiseError => 0,
PrintError => 0
}
);
$^W = 0;
print "\n\n";
print "=" x 60, "\n";
print "= No error on connection: Sybase\n";
print "=" x 60, "\n";
print $DBI::errstr;
print "=" x 60, "\n";
print '$DBI::errstr eq $DBI::errstr: ', $DBI::errstr eq $DBI::errstr, "\n";
print 'DBI->errstr eq $DBI::errstr: ', DBI->errstr eq $DBI::errstr, "\n";
print '$DBI::errstr eq DBI->errstr: ', $DBI::errstr eq DBI->errstr, "\n";
print 'DBI->errstr eq DBI->errstr: ', DBI->errstr eq DBI->errstr, "\n";
print 'DBI->errstr eq $copy: ', DBI->errstr eq $copy, "\n";
print '$DBI::errstr eq $copy: ', $DBI::errstr eq $copy, "\n";
$^W = 1;
my $dbh3 = DBI->connect(
'dbi:ExampleP:',
'',
'',
RaiseError => 0,
PrintError => 0
}
);
$^W = 0;
print "\n\n";
print "=" x 60, "\n";
print "= No error on connection: ExampleP\n";
print "=" x 60, "\n";
print $DBI::errstr;
print "=" x 60, "\n";
print '$DBI::errstr eq $DBI::errstr: ', $DBI::errstr eq $DBI::errstr, "\n";
print 'DBI->errstr eq $DBI::errstr: ', DBI->errstr eq $DBI::errstr, "\n";
print '$DBI::errstr eq DBI->errstr: ', $DBI::errstr eq DBI->errstr, "\n";
print 'DBI->errstr eq DBI->errstr: ', DBI->errstr eq DBI->errstr, "\n";
print 'DBI->errstr eq $copy: ', DBI->errstr eq $copy, "\n";
print '$DBI::errstr eq $copy: ', $DBI::errstr eq $copy, "\n";
$^W = 1;