File Coverage

blib/lib/SlapbirdAPM/Dancer2/DBIx/Tracer.pm
Criterion Covered Total %
statement 52 107 48.6
branch 5 40 12.5
condition 0 8 0.0
subroutine 12 17 70.5
pod 0 1 0.0
total 69 173 39.8


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::Dancer2::DBIx::Tracer;
381 1     1   8 use strict;
  1         3  
  1         44  
382 1     1   6 use warnings;
  1         3  
  1         71  
383              
384 1     1   2524 use DBI;
  1         24987  
  1         99  
385 1     1   14 use Time::HiRes qw(time gettimeofday tv_interval);
  1         3  
  1         12  
386 1     1   138 use Carp;
  1         3  
  1         469  
387              
388             our $IN_DO;
389              
390             my $org_execute = \&DBI::st::execute;
391             my $org_bind_param = \&DBI::st::bind_param;
392             my $org_db_do = \&DBI::db::do;
393             my $org_db_selectall_arrayref = \&DBI::db::selectall_arrayref;
394             my $org_db_selectrow_arrayref = \&DBI::db::selectrow_arrayref;
395             my $org_db_selectrow_array = \&DBI::db::selectrow_array;
396              
397             my $pp_mode = $INC{'DBI/PurePerl.pm'} ? 1 : 0;
398              
399             my $st_execute;
400             my $st_bind_param;
401             my $db_do;
402             my $selectall_arrayref;
403             my $selectrow_arrayref;
404             my $selectrow_array;
405              
406             our $OUTPUT;
407              
408             sub trace {
409 1     1 0 5 my $class = shift;
410              
411             # argument processing
412 1         8 my %args;
413 1 50       10 if ( @_ == 1 ) {
414 1 50       7 if ( ref $_[0] eq 'CODE' ) {
415 1         9 $args{code} = $_[0];
416             }
417             else {
418 0         0 %args = %{ $_[0] };
  0         0  
419             }
420             }
421             else {
422 0         0 %args = @_;
423             }
424 1         6 for (qw(code)) {
425 1 50       8 unless ( $args{$_} ) {
426 0         0 croak "Missing mandatory parameter $_ for DBIx::Tracer->new";
427             }
428             }
429              
430 1         3 my $logger = $args{code};
431              
432             # create object
433 1         6 my $self = bless \%args, $class;
434              
435             # wrap methods
436 1         9 my $st_execute = $class->_st_execute( $org_execute, $logger );
437 1         8 $st_bind_param = $class->_st_bind_param( $org_bind_param, $logger );
438 1         6 $db_do = $class->_db_do( $org_db_do, $logger );
439 1 50       4 unless ($pp_mode) {
440 1         5 $selectall_arrayref =
441             $class->_select_array( $org_db_selectall_arrayref, 0, $logger );
442 1         7 $selectrow_arrayref =
443             $class->_select_array( $org_db_selectrow_arrayref, 0, $logger );
444 1         6 $selectrow_array =
445             $class->_select_array( $org_db_selectrow_array, 1, $logger );
446             }
447              
448 1     1   10 no warnings qw(redefine prototype);
  1         3  
  1         733  
449 1         15 *DBI::st::execute = $st_execute;
450 1         3 *DBI::st::bind_param = $st_bind_param;
451 1         7 *DBI::db::do = $db_do;
452 1 50       3 unless ($pp_mode) {
453 1         9 *DBI::db::selectall_arrayref = $selectall_arrayref;
454 1         3 *DBI::db::selectrow_arrayref = $selectrow_arrayref;
455 1         23 *DBI::db::selectrow_array = $selectrow_array;
456             }
457             }
458              
459             # -------------------------------------------------------------------------
460             # wrapper methods.
461              
462             sub _st_execute {
463 1     1   6 my ( $class, $org, $logger ) = @_;
464              
465             return sub {
466 0     0   0 my $sth = shift;
467 0         0 my @params = @_;
468 0         0 my @types;
469              
470 0         0 my $dbh = $sth->{Database};
471 0         0 my $ret = $sth->{Statement};
472 0 0       0 if ( my $attrs = $sth->{private_DBIx_Tracer_attrs} ) {
473 0         0 my $bind_params = $sth->{private_DBIx_Tracer_params};
474 0         0 for my $i ( 1 .. @$attrs ) {
475 0         0 push @types, $attrs->[ $i - 1 ]{TYPE};
476 0 0       0 push @params, $bind_params->[ $i - 1 ] if $bind_params;
477             }
478             }
479 0         0 $sth->{private_DBIx_Tracer_params} = undef;
480              
481 0         0 my $begin = time * 1_000;
482 0 0       0 my $wantarray = wantarray ? 1 : 0;
483 0 0       0 my $res =
484             $wantarray ? [ $org->( $sth, @_ ) ] : scalar $org->( $sth, @_ );
485 0         0 my $time = sprintf( '%.2f', ( time * 1_000 ) - $begin );
486              
487             # DBD::SQLite calls ::st::execute from ::do.
488             # It makes duplicated logging output.
489 0 0       0 unless ($IN_DO) {
490 0         0 $class->_logging( $logger, $dbh, $ret, $time, \@params );
491             }
492              
493 0 0       0 return $wantarray ? @$res : $res;
494 1         18 };
495             }
496              
497             sub _st_bind_param {
498 1     1   6 my ( $class, $org ) = @_;
499              
500             return sub {
501 0     0   0 my ( $sth, $p_num, $value, $attr ) = @_;
502 0   0     0 $sth->{private_DBIx_Tracer_params} ||= [];
503 0   0     0 $sth->{private_DBIx_Tracer_attrs} ||= [];
504 0 0 0     0 $attr = +{ TYPE => $attr || 0 } unless ref $attr eq 'HASH';
505 0         0 $sth->{private_DBIx_Tracer_params}[ $p_num - 1 ] = $value;
506 0         0 $sth->{private_DBIx_Tracer_attrs}[ $p_num - 1 ] = $attr;
507 0         0 $org->(@_);
508 1         9 };
509             }
510              
511             sub _select_array {
512 3     3   10 my ( $class, $org, $is_selectrow_array, $logger ) = @_;
513              
514             return sub {
515 0     0   0 my $wantarray = wantarray;
516 0         0 my ( $dbh, $stmt, $attr, @bind ) = @_;
517              
518 1     1   10 no warnings qw(redefine prototype);
  1         2  
  1         583  
519 0         0 local *DBI::st::execute = $org_execute; # suppress duplicate logging
520              
521 0 0       0 my $ret = ref $stmt ? $stmt->{Statement} : $stmt;
522              
523 0         0 my $begin = time * 1_000;
524 0         0 my $res;
525 0 0       0 if ($is_selectrow_array) {
526 0 0       0 $res =
527             $wantarray
528             ? [ $org->( $dbh, $stmt, $attr, @bind ) ]
529             : $org->( $dbh, $stmt, $attr, @bind );
530             }
531             else {
532 0         0 $res = $org->( $dbh, $stmt, $attr, @bind );
533             }
534 0         0 my $time = sprintf( '%.2f', ( time * 1_000 ) - $begin );
535              
536 0         0 $class->_logging( $logger, $dbh, $ret, $time, \@bind );
537              
538 0 0       0 if ($is_selectrow_array) {
539 0 0       0 return $wantarray ? @$res : $res;
540             }
541 0         0 return $res;
542 3         17 };
543             }
544              
545             sub _db_do {
546 1     1   8 my ( $class, $org, $logger ) = @_;
547              
548             return sub {
549 0 0   0     my $wantarray = wantarray ? 1 : 0;
550 0           my ( $dbh, $stmt, $attr, @bind ) = @_;
551              
552 0           local $IN_DO = 1;
553              
554 0           my $ret = $stmt;
555              
556 0           my $begin = time * 1_000;
557 0 0         my $res =
558             $wantarray
559             ? [ $org->( $dbh, $stmt, $attr, @bind ) ]
560             : scalar $org->( $dbh, $stmt, $attr, @bind );
561 0           my $time = sprintf( '%.2f', ( time * 1_000 ) - $begin );
562              
563 0           $class->_logging( $logger, $dbh, $ret, $time, \@bind );
564              
565 0 0         return $wantarray ? @$res : $res;
566 1         5 };
567             }
568              
569             sub _logging {
570 0     0     my ( $class, $logger, $dbh, $sql, $time, $bind_params ) = @_;
571 0   0       $bind_params ||= [];
572              
573 0           $logger->(
574             dbh => $dbh,
575             time => $time,
576             sql => $sql,
577             bind_params => $bind_params,
578             );
579             }
580              
581             1;
582             __END__