Looks like prior to DBD::Pg 1.31 these warning messages where sent to stderr and not via perl's warning mechanism.
http://www.mail-archive.com/dbi-announce@perl.org/msg00170.html On Fri, 2006-03-24 at 07:19 -0500, tlm wrote: > On 3/24/06, Alexander Foken <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED] 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: > > > > > >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 > > serial > > >column " tmp.i" > > >after at test_script.pl line 12. > > > > > >The output looks exactly the same if I pipe the command's standard output > > to > > >/dev/null ( i.e. what we're seeing was sent to standard error). > > > > > >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 > > Pg > > >(about the implicitly created sequence) is gone: it shows up neither on > > the > > >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:[EMAIL PROTECTED] http://www.foken.de/alexander/ > > > > -- Joe Slagel Chief Software Architect Geospiza Inc www.geospiza.com