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/
>
>

Reply via email to