Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re: How to report call stack for DBI queries

by dws (Chancellor)
on Apr 17, 2003 at 18:27 UTC ( [id://251283]=note: print w/replies, xml ) Need Help??


in reply to How to report call stack for DBI queries

Is there an easy way to override DBI::prepare or 'execute' in such a way that I can add some logging to give a stack trace (Carp::cluck) showing where every database query in a large body of code was called from, as it runs?

Assuming that you control the code that's doing the prepare(), a simple approach is to wrap the object that prepare() hands back. Something like:

my $sth = $dbh->prepare("SELECT ... WHERE ... ? ..."); $sth = Statement->wrap($sth, "Label"); ... $sth->execute(@args);
The wrapping class looks something like:
package Statement; sub wrap { my($pkg, $sth, $label) = @_; bless [ $sth, $label ], $pkg; } sub execute { my $self = shift; # tracing, timing code here. E.g., log($self->[1] . " is about to execute"); my $rv = $self->[0]->execute(@args); # timing, logging code here } sub finish { my $self = shift; $self->[0]->finish(); } 1;
You'll probably find that you need to wrap some additional methods.

The label helps track the statement and makes the logs more readable, and could include the text of the query.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://251283]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (11)
As of 2024-04-18 14:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found