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.
  }
}



Reply via email to