Hello, In an attempt to add some custom logging into DBI calls, I have over-ridden the execute method of DBI with a custom execute method. The project I have includes writing out the SQL statement that is at fault if execute blows up. This needs to be transparent to the user, and must work with all existing DBI code that has been writen.
My approach is simple. Override execute, add some error logging if $@ returns back anything from an eval calling the real DBI execute. One piece is missing though. While printing out the statement from $pkg->{'STATEMENT'}, the placeholders used (?) ends up coming in literally. This is fine and I wouldn't mind substituting the values passed for the bindings, but I cannot get to the values. Let me clear that up.. If the user calls execute, binding the params within the execute, I can get them. They are passed to my execute statement and I can grab them from @_, but if the params are passed using bind_param, I cannot get them, save for overriding the bind_param statement as well (somthing I would rather not do). To make a long story short, I would like to know if there is any way to access the values passed in a bind_param method call. Here is the over-ridden execute method, this works except for the parameter part. Thanks in advance. -Mark sub execute { my $pkg = shift; my $statement = $pkg->{'Statement'}; # if RaiseError or PrintError are set to 1 (lets hope), lets make sure # we don't print the DBI error until we are ready to do so. { open TRAP, ">/dev/null"; local *STDERR = *TRAP; eval { $pkg->SUPER::execute(@_); }; close TRAP; } my @params = @_; my $params = (@params) ? \@params : ( my $tmp_p = $pkg->FETCH('driver_params') ? $tmp_p : [] ) ; my $num_of_parms = $pkg->{'NUM_OF_PARAMS'}; print "Number of Parameters: $num_of_parms\n"; print "Parms = @$params\n"; print "Executing Statement -> \n"; print "\n".&$pretty_print($statement)."\n"; if ($@) { warn "Could not execute statment -> \n"; warn "\n".&$pretty_print($statement)."\n"; die "$@\n"; # Yes this is intentional, die no matter what. } }