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

Reply via email to