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.