Re: Can't trap Pg warnings
- From: tlm1905@xxxxxxxxx (Tlm)
- Date: Fri, 24 Mar 2006 07:19:40 -0500
On 3/24/06, Alexander Foken <alexander@xxxxxxxx> wrote:
Ripped out of some of my code working with DBD::Pg:
# DBI->connect() here
$SIG{'__WARN__'}=sub {
# Don't use REs (//) here, you would change some special variables!
warn @_ unless substr($_[0],0,7) eq 'NOTICE:';
};
# Rest of the application
Thanks, but unfortunately this doesn't work (I should have mentioned in my
original post that I had already tried something like this). For example,
this script:
use strict;
use warnings;
use DBI;
my $h = DBI->connect( 'dbi:Pg:dbname=mytestdb', 'anonymous', '', );
$SIG{ __WARN__ } = sub {
if ( substr( $_[0], 0, 7 ) eq 'NOTICE:' ) {
warn "From Pg: $_[ 0 ]\n";
}
else {
warn "%%% $_[ 0 ]\n";
}
};
warn 'before';
$h->prepare( 'CREATE TEMPORARY TABLE tmp ( i serial )' )->execute();
warn 'after';
$h->disconnect;
__END__
produces the following output:
%%% before at test_script.pl line 17.
NOTICE: CREATE TABLE will create implicit sequence "tmp_i_seq" for serial
column "tmp.i"
%%% after at test_script.pl line 19.
As you can see, the warning from Pg never goes through the $SIG{ __WARN__ }
handler.
tlm
P.S. Is there a searchable archive for dbi-users@xxxxxxxx? The closest I've
found is http://www.nntp.perl.org/group/perl.dbi.users but it doesn't seem
to be searchable. (It also mangles Perl code: is there a way to prevent
this?)
Hope that helps.
Alexander
tlm wrote:
Consider the following short script:serial
use strict;
use warnings;
use DBI;
my $h = DBI->connect( 'dbi:Pg:dbname=mytestdb', 'anonymous', '', );
# close( STDERR );
# open( STDERR, '>', \my $stderr );
warn 'before';
$h->prepare( 'CREATE TEMPORARY TABLE tmp ( i serial )' )->execute();
warn 'after';
$h->disconnect;
# print ">>\n$stderr<<\n";
__END__
The output I get from it looks like this:
before at test_script.pl line 10.
NOTICE: CREATE TABLE will create implicit sequence "tmp_i_seq" for
column " tmp.i"to
after at test_script.pl line 12.
The output looks exactly the same if I pipe the command's standard output
/dev/null ( i.e. what we're seeing was sent to standard error).Pg
Now, if I uncomment the commented lines, the output looks like this:
before at script/test.pl line 10.
after at script/test.pl line 12.
<<
So, even though the messages given explicitly to warn in the script were
faithfully appended to the scalar $stderr, as intended, the notice from
(about the implicitly created sequence) is gone: it shows up neither onthe
screen, nor in the scalar $stderr.
How can I trap such notices?
Thanks!
tlm
P.S. It is tempting to blame the closing of STDERR for this problem, but
this a mandatory step. Without it, $stderr receives no output at all.
--
Alexander Foken
mailto:alexander@xxxxxxxx http://www.foken.de/alexander/
- Follow-Ups:
- Re: Can't trap Pg warnings
- From: Joe Slagel
- Re: Can't trap Pg warnings
- References:
- Can't trap Pg warnings
- From: Tlm
- Re: Can't trap Pg warnings
- From: Alexander Foken
- Can't trap Pg warnings
- Prev by Date: Problem with perl 5.8.8 with Oracle 9.0
- Next by Date: problem using table_info and column_info with DBD::Proxy
- Previous by thread: Re: Can't trap Pg warnings
- Next by thread: Re: Can't trap Pg warnings
- Index(es):
Relevant Pages
|