File Coverage

blib/lib/SlapbirdAPM/DBIx/Tracer.pm
Criterion Covered Total %
statement 26 122 21.3
branch 0 42 0.0
condition 0 8 0.0
subroutine 9 20 45.0
pod 1 1 100.0
total 36 193 18.6


line stmt bran cond sub pod time code
1             # This software is copyright (c) 2012 by Tokuhiro Matsuno Etokuhirom AAJKLFJEF@ GMAIL COME.
2             #
3             # This is free software; you can redistribute it and/or modify it under
4             # the same terms as the Perl 5 programming language system itself.
5             #
6             # Terms of the Perl programming language system itself
7             #
8             # a) the GNU General Public License as published by the Free
9             # Software Foundation; either version 1, or (at your option) any
10             # later version, or
11             # b) the "Artistic License"
12             #
13             # --- The GNU General Public License, Version 1, February 1989 ---
14             #
15             # This software is Copyright (c) 2012 by Tokuhiro Matsuno Etokuhirom AAJKLFJEF@ GMAIL COME.
16             #
17             # This is free software, licensed under:
18             #
19             # The GNU General Public License, Version 1, February 1989
20             #
21             # GNU GENERAL PUBLIC LICENSE
22             # Version 1, February 1989
23             #
24             # Copyright (C) 1989 Free Software Foundation, Inc.
25             # 51 Franklin St, Suite 500, Boston, MA 02110-1335 USA
26             #
27             # Everyone is permitted to copy and distribute verbatim copies
28             # of this license document, but changing it is not allowed.
29             #
30             # Preamble
31             #
32             # The license agreements of most software companies try to keep users
33             # at the mercy of those companies. By contrast, our General Public
34             # License is intended to guarantee your freedom to share and change free
35             # software--to make sure the software is free for all its users. The
36             # General Public License applies to the Free Software Foundation's
37             # software and to any other program whose authors commit to using it.
38             # You can use it for your programs, too.
39             #
40             # When we speak of free software, we are referring to freedom, not
41             # price. Specifically, the General Public License is designed to make
42             # sure that you have the freedom to give away or sell copies of free
43             # software, that you receive source code or can get it if you want it,
44             # that you can change the software or use pieces of it in new free
45             # programs; and that you know you can do these things.
46             #
47             # To protect your rights, we need to make restrictions that forbid
48             # anyone to deny you these rights or to ask you to surrender the rights.
49             # These restrictions translate to certain responsibilities for you if you
50             # distribute copies of the software, or if you modify it.
51             #
52             # For example, if you distribute copies of a such a program, whether
53             # gratis or for a fee, you must give the recipients all the rights that
54             # you have. You must make sure that they, too, receive or can get the
55             # source code. And you must tell them their rights.
56             #
57             # We protect your rights with two steps: (1) copyright the software, and
58             # (2) offer you this license which gives you legal permission to copy,
59             # distribute and/or modify the software.
60             #
61             # Also, for each author's protection and ours, we want to make certain
62             # that everyone understands that there is no warranty for this free
63             # software. If the software is modified by someone else and passed on, we
64             # want its recipients to know that what they have is not the original, so
65             # that any problems introduced by others will not reflect on the original
66             # authors' reputations.
67             #
68             # The precise terms and conditions for copying, distribution and
69             # modification follow.
70             #
71             # GNU GENERAL PUBLIC LICENSE
72             # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
73             #
74             # 0. This License Agreement applies to any program or other work which
75             # contains a notice placed by the copyright holder saying it may be
76             # distributed under the terms of this General Public License. The
77             # "Program", below, refers to any such program or work, and a "work based
78             # on the Program" means either the Program or any work containing the
79             # Program or a portion of it, either verbatim or with modifications. Each
80             # licensee is addressed as "you".
81             #
82             # 1. You may copy and distribute verbatim copies of the Program's source
83             # code as you receive it, in any medium, provided that you conspicuously and
84             # appropriately publish on each copy an appropriate copyright notice and
85             # disclaimer of warranty; keep intact all the notices that refer to this
86             # General Public License and to the absence of any warranty; and give any
87             # other recipients of the Program a copy of this General Public License
88             # along with the Program. You may charge a fee for the physical act of
89             # transferring a copy.
90             #
91             # 2. You may modify your copy or copies of the Program or any portion of
92             # it, and copy and distribute such modifications under the terms of Paragraph
93             # 1 above, provided that you also do the following:
94             #
95             # a) cause the modified files to carry prominent notices stating that
96             # you changed the files and the date of any change; and
97             #
98             # b) cause the whole of any work that you distribute or publish, that
99             # in whole or in part contains the Program or any part thereof, either
100             # with or without modifications, to be licensed at no charge to all
101             # third parties under the terms of this General Public License (except
102             # that you may choose to grant warranty protection to some or all
103             # third parties, at your option).
104             #
105             # c) If the modified program normally reads commands interactively when
106             # run, you must cause it, when started running for such interactive use
107             # in the simplest and most usual way, to print or display an
108             # announcement including an appropriate copyright notice and a notice
109             # that there is no warranty (or else, saying that you provide a
110             # warranty) and that users may redistribute the program under these
111             # conditions, and telling the user how to view a copy of this General
112             # Public License.
113             #
114             # d) You may charge a fee for the physical act of transferring a
115             # copy, and you may at your option offer warranty protection in
116             # exchange for a fee.
117             #
118             # Mere aggregation of another independent work with the Program (or its
119             # derivative) on a volume of a storage or distribution medium does not bring
120             # the other work under the scope of these terms.
121             #
122             # 3. You may copy and distribute the Program (or a portion or derivative of
123             # it, under Paragraph 2) in object code or executable form under the terms of
124             # Paragraphs 1 and 2 above provided that you also do one of the following:
125             #
126             # a) accompany it with the complete corresponding machine-readable
127             # source code, which must be distributed under the terms of
128             # Paragraphs 1 and 2 above; or,
129             #
130             # b) accompany it with a written offer, valid for at least three
131             # years, to give any third party free (except for a nominal charge
132             # for the cost of distribution) a complete machine-readable copy of the
133             # corresponding source code, to be distributed under the terms of
134             # Paragraphs 1 and 2 above; or,
135             #
136             # c) accompany it with the information you received as to where the
137             # corresponding source code may be obtained. (This alternative is
138             # allowed only for noncommercial distribution and only if you
139             # received the program in object code or executable form alone.)
140             #
141             # Source code for a work means the preferred form of the work for making
142             # modifications to it. For an executable file, complete source code means
143             # all the source code for all modules it contains; but, as a special
144             # exception, it need not include source code for modules which are standard
145             # libraries that accompany the operating system on which the executable
146             # file runs, or for standard header files or definitions files that
147             # accompany that operating system.
148             #
149             # 4. You may not copy, modify, sublicense, distribute or transfer the
150             # Program except as expressly provided under this General Public License.
151             # Any attempt otherwise to copy, modify, sublicense, distribute or transfer
152             # the Program is void, and will automatically terminate your rights to use
153             # the Program under this License. However, parties who have received
154             # copies, or rights to use copies, from you under this General Public
155             # License will not have their licenses terminated so long as such parties
156             # remain in full compliance.
157             #
158             # 5. By copying, distributing or modifying the Program (or any work based
159             # on the Program) you indicate your acceptance of this license to do so,
160             # and all its terms and conditions.
161             #
162             # 6. Each time you redistribute the Program (or any work based on the
163             # Program), the recipient automatically receives a license from the original
164             # licensor to copy, distribute or modify the Program subject to these
165             # terms and conditions. You may not impose any further restrictions on the
166             # recipients' exercise of the rights granted herein.
167             #
168             # 7. The Free Software Foundation may publish revised and/or new versions
169             # of the General Public License from time to time. Such new versions will
170             # be similar in spirit to the present version, but may differ in detail to
171             # address new problems or concerns.
172             #
173             # Each version is given a distinguishing version number. If the Program
174             # specifies a version number of the license which applies to it and "any
175             # later version", you have the option of following the terms and conditions
176             # either of that version or of any later version published by the Free
177             # Software Foundation. If the Program does not specify a version number of
178             # the license, you may choose any version ever published by the Free Software
179             # Foundation.
180             #
181             # 8. If you wish to incorporate parts of the Program into other free
182             # programs whose distribution conditions are different, write to the author
183             # to ask for permission. For software which is copyrighted by the Free
184             # Software Foundation, write to the Free Software Foundation; we sometimes
185             # make exceptions for this. Our decision will be guided by the two goals
186             # of preserving the free status of all derivatives of our free software and
187             # of promoting the sharing and reuse of software generally.
188             #
189             # NO WARRANTY
190             #
191             # 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
192             # FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
193             # OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
194             # PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
195             # OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
196             # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
197             # TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
198             # PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
199             # REPAIR OR CORRECTION.
200             #
201             # 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
202             # WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
203             # REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
204             # INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
205             # OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
206             # TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
207             # YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
208             # PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
209             # POSSIBILITY OF SUCH DAMAGES.
210             #
211             # END OF TERMS AND CONDITIONS
212             #
213             # Appendix: How to Apply These Terms to Your New Programs
214             #
215             # If you develop a new program, and you want it to be of the greatest
216             # possible use to humanity, the best way to achieve this is to make it
217             # free software which everyone can redistribute and change under these
218             # terms.
219             #
220             # To do so, attach the following notices to the program. It is safest to
221             # attach them to the start of each source file to most effectively convey
222             # the exclusion of warranty; and each file should have at least the
223             # "copyright" line and a pointer to where the full notice is found.
224             #
225             #
226             # Copyright (C) 19yy
227             #
228             # This program is free software; you can redistribute it and/or modify
229             # it under the terms of the GNU General Public License as published by
230             # the Free Software Foundation; either version 1, or (at your option)
231             # any later version.
232             #
233             # This program is distributed in the hope that it will be useful,
234             # but WITHOUT ANY WARRANTY; without even the implied warranty of
235             # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
236             # GNU General Public License for more details.
237             #
238             # You should have received a copy of the GNU General Public License
239             # along with this program; if not, write to the Free Software
240             # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA
241             #
242             #
243             # Also add information on how to contact you by electronic and paper mail.
244             #
245             # If the program is interactive, make it output a short notice like this
246             # when it starts in an interactive mode:
247             #
248             # Gnomovision version 69, Copyright (C) 19xx name of author
249             # Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
250             # This is free software, and you are welcome to redistribute it
251             # under certain conditions; type `show c' for details.
252             #
253             # The hypothetical commands `show w' and `show c' should show the
254             # appropriate parts of the General Public License. Of course, the
255             # commands you use may be called something other than `show w' and `show
256             # c'; they could even be mouse-clicks or menu items--whatever suits your
257             # program.
258             #
259             # You should also get your employer (if you work as a programmer) or your
260             # school, if any, to sign a "copyright disclaimer" for the program, if
261             # necessary. Here a sample; alter the names:
262             #
263             # Yoyodyne, Inc., hereby disclaims all copyright interest in the
264             # program `Gnomovision' (a program to direct compilers to make passes
265             # at assemblers) written by James Hacker.
266             #
267             # , 1 April 1989
268             # Ty Coon, President of Vice
269             #
270             # That's all there is to it!
271             #
272             #
273             # --- The Artistic License 1.0 ---
274             #
275             # This software is Copyright (c) 2012 by Tokuhiro Matsuno Etokuhirom AAJKLFJEF@ GMAIL COME.
276             #
277             # This is free software, licensed under:
278             #
279             # The Artistic License 1.0
280             #
281             # The Artistic License
282             #
283             # Preamble
284             #
285             # The intent of this document is to state the conditions under which a Package
286             # may be copied, such that the Copyright Holder maintains some semblance of
287             # artistic control over the development of the package, while giving the users of
288             # the package the right to use and distribute the Package in a more-or-less
289             # customary fashion, plus the right to make reasonable modifications.
290             #
291             # Definitions:
292             #
293             # - "Package" refers to the collection of files distributed by the Copyright
294             # Holder, and derivatives of that collection of files created through
295             # textual modification.
296             # - "Standard Version" refers to such a Package if it has not been modified,
297             # or has been modified in accordance with the wishes of the Copyright
298             # Holder.
299             # - "Copyright Holder" is whoever is named in the copyright or copyrights for
300             # the package.
301             # - "You" is you, if you're thinking about copying or distributing this Package.
302             # - "Reasonable copying fee" is whatever you can justify on the basis of media
303             # cost, duplication charges, time of people involved, and so on. (You will
304             # not be required to justify it to the Copyright Holder, but only to the
305             # computing community at large as a market that must bear the fee.)
306             # - "Freely Available" means that no fee is charged for the item itself, though
307             # there may be fees involved in handling the item. It also means that
308             # recipients of the item may redistribute it under the same conditions they
309             # received it.
310             #
311             # 1. You may make and give away verbatim copies of the source form of the
312             # Standard Version of this Package without restriction, provided that you
313             # duplicate all of the original copyright notices and associated disclaimers.
314             #
315             # 2. You may apply bug fixes, portability fixes and other modifications derived
316             # from the Public Domain or from the Copyright Holder. A Package modified in such
317             # a way shall still be considered the Standard Version.
318             #
319             # 3. You may otherwise modify your copy of this Package in any way, provided that
320             # you insert a prominent notice in each changed file stating how and when you
321             # changed that file, and provided that you do at least ONE of the following:
322             #
323             # a) place your modifications in the Public Domain or otherwise make them
324             # Freely Available, such as by posting said modifications to Usenet or an
325             # equivalent medium, or placing the modifications on a major archive site
326             # such as ftp.uu.net, or by allowing the Copyright Holder to include your
327             # modifications in the Standard Version of the Package.
328             #
329             # b) use the modified Package only within your corporation or organization.
330             #
331             # c) rename any non-standard executables so the names do not conflict with
332             # standard executables, which must also be provided, and provide a separate
333             # manual page for each non-standard executable that clearly documents how it
334             # differs from the Standard Version.
335             #
336             # d) make other distribution arrangements with the Copyright Holder.
337             #
338             # 4. You may distribute the programs of this Package in object code or executable
339             # form, provided that you do at least ONE of the following:
340             #
341             # a) distribute a Standard Version of the executables and library files,
342             # together with instructions (in the manual page or equivalent) on where to
343             # get the Standard Version.
344             #
345             # b) accompany the distribution with the machine-readable source of the Package
346             # with your modifications.
347             #
348             # c) accompany any non-standard executables with their corresponding Standard
349             # Version executables, giving the non-standard executables non-standard
350             # names, and clearly documenting the differences in manual pages (or
351             # equivalent), together with instructions on where to get the Standard
352             # Version.
353             #
354             # d) make other distribution arrangements with the Copyright Holder.
355             #
356             # 5. You may charge a reasonable copying fee for any distribution of this
357             # Package. You may charge any fee you choose for support of this Package. You
358             # may not charge a fee for this Package itself. However, you may distribute this
359             # Package in aggregate with other (possibly commercial) programs as part of a
360             # larger (possibly commercial) software distribution provided that you do not
361             # advertise this Package as a product of your own.
362             #
363             # 6. The scripts and library files supplied as input to or produced as output
364             # from the programs of this Package do not automatically fall under the copyright
365             # of this Package, but belong to whomever generated them, and may be sold
366             # commercially, and may be aggregated with this Package.
367             #
368             # 7. C or perl subroutines supplied by you and linked into this Package shall not
369             # be considered part of this Package.
370             #
371             # 8. The name of the Copyright Holder may not be used to endorse or promote
372             # products derived from this software without specific prior written permission.
373             #
374             # 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
375             # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
376             # MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
377             #
378             # The End
379              
380             package SlapbirdAPM::DBIx::Tracer;
381 1     1   7 use strict;
  1         3  
  1         48  
382 1     1   5 use warnings;
  1         3  
  1         58  
383 1     1   21 use 5.008008;
  1         4  
384             our $VERSION = '0.03';
385              
386 1     1   3039 use DBI;
  1         27530  
  1         121  
387 1     1   15 use Time::HiRes qw(time gettimeofday tv_interval);
  1         2  
  1         12  
388 1     1   108 use Carp;
  1         3  
  1         455  
389              
390             our $IN_DO;
391              
392             my $org_execute = \&DBI::st::execute;
393             my $org_bind_param = \&DBI::st::bind_param;
394             my $org_db_do = \&DBI::db::do;
395             my $org_db_selectall_arrayref = \&DBI::db::selectall_arrayref;
396             my $org_db_selectrow_arrayref = \&DBI::db::selectrow_arrayref;
397             my $org_db_selectrow_array = \&DBI::db::selectrow_array;
398              
399             my $pp_mode = $INC{'DBI/PurePerl.pm'} ? 1 : 0;
400              
401             my $st_execute;
402             my $st_bind_param;
403             my $db_do;
404             my $selectall_arrayref;
405             my $selectrow_arrayref;
406             my $selectrow_array;
407              
408             our $OUTPUT;
409              
410             sub new {
411 0     0 1   my $class = shift;
412              
413             # argument processing
414 0           my %args;
415 0 0         if ( @_ == 1 ) {
416 0 0         if ( ref $_[0] eq 'CODE' ) {
417 0           $args{code} = $_[0];
418             }
419             else {
420 0           %args = %{ $_[0] };
  0            
421             }
422             }
423             else {
424 0           %args = @_;
425             }
426 0           for (qw(code)) {
427 0 0         unless ( $args{$_} ) {
428 0           croak "Missing mandatory parameter $_ for DBIx::Tracer->new";
429             }
430             }
431              
432 0           my $logger = $args{code};
433              
434             # create object
435 0           my $self = bless \%args, $class;
436              
437             # wrap methods
438 0           my $st_execute = $class->_st_execute( $org_execute, $logger );
439 0           $st_bind_param = $class->_st_bind_param( $org_bind_param, $logger );
440 0           $db_do = $class->_db_do( $org_db_do, $logger );
441 0 0         unless ($pp_mode) {
442 0           $selectall_arrayref =
443             $class->_select_array( $org_db_selectall_arrayref, 0, $logger );
444 0           $selectrow_arrayref =
445             $class->_select_array( $org_db_selectrow_arrayref, 0, $logger );
446 0           $selectrow_array =
447             $class->_select_array( $org_db_selectrow_array, 1, $logger );
448             }
449              
450 1     1   10 no warnings qw(redefine prototype);
  1         3  
  1         833  
451 0           *DBI::st::execute = $st_execute;
452 0           *DBI::st::bind_param = $st_bind_param;
453 0           *DBI::db::do = $db_do;
454 0 0         unless ($pp_mode) {
455 0           *DBI::db::selectall_arrayref = $selectall_arrayref;
456 0           *DBI::db::selectrow_arrayref = $selectrow_arrayref;
457 0           *DBI::db::selectrow_array = $selectrow_array;
458             }
459              
460 0           return $self;
461             }
462              
463             # -------------------------------------------------------------------------
464             # wrapper methods.
465              
466             sub _st_execute {
467 0     0     my ( $class, $org, $logger ) = @_;
468              
469             return sub {
470 0     0     my $sth = shift;
471 0           my @params = @_;
472 0           my @types;
473              
474 0           my $dbh = $sth->{Database};
475 0           my $ret = $sth->{Statement};
476 0 0         if ( my $attrs = $sth->{private_DBIx_Tracer_attrs} ) {
477 0           my $bind_params = $sth->{private_DBIx_Tracer_params};
478 0           for my $i ( 1 .. @$attrs ) {
479 0           push @types, $attrs->[ $i - 1 ]{TYPE};
480 0 0         push @params, $bind_params->[ $i - 1 ] if $bind_params;
481             }
482             }
483 0           $sth->{private_DBIx_Tracer_params} = undef;
484              
485 0           my $begin = time * 1_000;
486 0 0         my $wantarray = wantarray ? 1 : 0;
487 0 0         my $res =
488             $wantarray ? [ $org->( $sth, @_ ) ] : scalar $org->( $sth, @_ );
489 0           my $time = sprintf( '%.2f', ( time * 1_000 ) - $begin );
490              
491             # DBD::SQLite calls ::st::execute from ::do.
492             # It makes duplicated logging output.
493 0 0         unless ($IN_DO) {
494 0           $class->_logging( $logger, $dbh, $ret, $time, \@params );
495             }
496              
497 0 0         return $wantarray ? @$res : $res;
498 0           };
499             }
500              
501             sub _st_bind_param {
502 0     0     my ( $class, $org ) = @_;
503              
504             return sub {
505 0     0     my ( $sth, $p_num, $value, $attr ) = @_;
506 0   0       $sth->{private_DBIx_Tracer_params} ||= [];
507 0   0       $sth->{private_DBIx_Tracer_attrs} ||= [];
508 0 0 0       $attr = +{ TYPE => $attr || 0 } unless ref $attr eq 'HASH';
509 0           $sth->{private_DBIx_Tracer_params}[ $p_num - 1 ] = $value;
510 0           $sth->{private_DBIx_Tracer_attrs}[ $p_num - 1 ] = $attr;
511 0           $org->(@_);
512 0           };
513             }
514              
515             sub _select_array {
516 0     0     my ( $class, $org, $is_selectrow_array, $logger ) = @_;
517              
518             return sub {
519 0     0     my $wantarray = wantarray;
520 0           my ( $dbh, $stmt, $attr, @bind ) = @_;
521              
522 1     1   9 no warnings qw(redefine prototype);
  1         4  
  1         702  
523 0           local *DBI::st::execute = $org_execute; # suppress duplicate logging
524              
525 0 0         my $ret = ref $stmt ? $stmt->{Statement} : $stmt;
526              
527 0           my $begin = time;
528 0           my $res;
529 0 0         if ($is_selectrow_array) {
530 0 0         $res =
531             $wantarray
532             ? [ $org->( $dbh, $stmt, $attr, @bind ) ]
533             : $org->( $dbh, $stmt, $attr, @bind );
534             }
535             else {
536 0           $res = $org->( $dbh, $stmt, $attr, @bind );
537             }
538 0           my $time = sprintf( '%.2f', ( time * 1_000 ) - $begin );
539              
540 0           $class->_logging( $logger, $dbh, $ret, $time, \@bind );
541              
542 0 0         if ($is_selectrow_array) {
543 0 0         return $wantarray ? @$res : $res;
544             }
545 0           return $res;
546 0           };
547             }
548              
549             sub _db_do {
550 0     0     my ( $class, $org, $logger ) = @_;
551              
552             return sub {
553 0 0   0     my $wantarray = wantarray ? 1 : 0;
554 0           my ( $dbh, $stmt, $attr, @bind ) = @_;
555              
556 0           local $IN_DO = 1;
557              
558 0           my $ret = $stmt;
559              
560 0           my $begin = time;
561 0 0         my $res =
562             $wantarray
563             ? [ $org->( $dbh, $stmt, $attr, @bind ) ]
564             : scalar $org->( $dbh, $stmt, $attr, @bind );
565 0           my $time = sprintf( '%.2f', ( time * 1_000 ) - $begin );
566              
567 0           $class->_logging( $logger, $dbh, $ret, $time, \@bind );
568              
569 0 0         return $wantarray ? @$res : $res;
570 0           };
571             }
572              
573             sub _logging {
574 0     0     my ( $class, $logger, $dbh, $sql, $time, $bind_params ) = @_;
575 0   0       $bind_params ||= [];
576              
577 0           $logger->(
578             dbh => $dbh,
579             time => $time,
580             sql => $sql,
581             bind_params => $bind_params,
582             );
583             }
584              
585             sub DESTROY {
586 0     0     my $self = shift;
587              
588 1     1   10 no warnings qw(redefine prototype);
  1         14  
  1         171  
589 0           *DBI::st::execute = $org_execute;
590 0           *DBI::st::bind_param = $org_bind_param;
591 0           *DBI::db::do = $org_db_do;
592 0 0         unless ($pp_mode) {
593 0           *DBI::db::selectall_arrayref = $org_db_selectall_arrayref;
594 0           *DBI::db::selectrow_arrayref = $org_db_selectrow_arrayref;
595 0           *DBI::db::selectrow_array = $org_db_selectrow_array;
596             }
597              
598 0           return;
599             }
600              
601             1;
602             __END__