Re: Can't trap Pg warnings



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@xxxxxxxx/msg00170.html

On Fri, 2006-03-24 at 07:19 -0500, tlm wrote:
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:

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:alexander@xxxxxxxx http://www.foken.de/alexander/


--
Joe Slagel
Chief Software Architect
Geospiza Inc
www.geospiza.com

.



Relevant Pages

  • JES Identity Server - amconfig problems
    ... When installing the Identity Server so I could use Messaging Server, ... I got the Web Server v6.1 SP2 installed successfully. ... warning: CORE3283: stderr: java.util.MissingResourceException: Can't ...
    (SunManagers)
  • sun identity server on sun webserver,
    ... the websrv was running fine, i think installed identity server, and now ... warning: CORE3283: stderr: java.util.MissingResourceException: Can't ... failure: CORE4007: Internal error: Unexpected Java exception thrown ...
    (SunManagers)
  • Re: HEADS-UP: Planning on deprecating libc_r for 6.0
    ... >>How about modifying the dynamic linker to print a warning to stderr, ...
    (freebsd-arch)
  • rpmbuild error during kernel recompile
    ... scripts/basic/fixdep.c:129: warning: implicit declaration of function ... scripts/basic/fixdep.c:129: error: `stderr' undeclared (first use in ...
    (comp.os.linux.setup)
  • rpmbuild error during kernel recompile
    ... scripts/basic/fixdep.c:129: warning: implicit declaration of function ... scripts/basic/fixdep.c:129: error: `stderr' undeclared (first use in ...
    (comp.os.linux.setup)