On Thu, Sep 29, 2005 at 10:49:48AM -0700, Jeff Zucker wrote:
> Sorry, not enough coffee this morning, I forgot to use the DBD's quote, 
> dub^9.

So you're just making this up as you go along? ;-)

> package MyDbi;
> use base 'DBI';
> 
> package MyDbi::db;
> use base 'DBI::db';
> 
> sub prepare {
>    my($self,@connect_args) = @_;
>    return bless $self->SUPER::prepare(@connect_args), 'MyDbi::st';
> }

That prepare (and especially the bless) shouldn't be needed.
(That's one of the ways DBI make subclassing easier.)

> package MyDbi::st;
> use base 'DBI::st';
> 
> sub execute {
>    my($sth,@binds)[EMAIL PROTECTED];
>    my $rv;
>    eval { $rv = $sth->SUPER::execute(@binds) };
>    return $rv unless $@;
>    my $stmt = $sth->{Statement};
>    my $class = 'DBD::' . $sth->{Database}->{Driver}->{Name} . '::db';
>    for my $b(@binds) {
>        $b = $class->quote($b) if defined $b and !DBI::looks_like_number($b);
>        $b = q{NULL} unless defined $b;
>        $stmt =~ s/\?/$b/;
>    }
>    die sprintf "Execution Error: %sReconstructed SQL = %s\n"
>              , $sth->errstr, $stmt;
> }

I'd rework it this way (untested):

  sub execute {
     my($sth,@binds)[EMAIL PROTECTED];
     my $rv = eval { $sth->SUPER::execute(@binds) };
     return $rv unless $@;
     my $stmt = $sth->{Statement};
     for my $b (@binds) {
         $b = $sth->{Database}->quote($b) unless DBI::looks_like_number($b);
         $stmt =~ s/\?/$b/;
     }
     return $sth->set_err($sth->err, sprintf "Execution Error: %s 
(Reconstructed SQL = %s)\n" , $sth->errstr, $stmt));
  }

Tim.

Reply via email to