File Coverage

blib/lib/SQL/Bind.pm
Criterion Covered Total %
statement 47 48 97.9
branch 15 16 93.7
condition n/a
subroutine 5 5 100.0
pod 0 1 0.0
total 67 70 95.7


line stmt bran cond sub pod time code
1             package SQL::Bind;
2 2     2   70582 use strict;
  2         12  
  2         94  
3 2     2   13 use warnings;
  2         3  
  2         53  
4 2     2   11 use base 'Exporter';
  2         2  
  2         1215  
5             our @EXPORT_OK = qw(sql);
6              
7             our $VERSION = '1.01';
8              
9             sub sql {
10 11     11 0 28523 my ($sql, %params) = @_;
11              
12 11         17 my @bind;
13              
14 11         74 $sql =~ s{:([a-z_][a-z0-9_]*)(!|\*)?}{
15             my $options = $2
16             ? {
17             {
18             '!' => 'raw',
19             '*' => 'recursive'
20 13 100       50 }->{$2} => 1
21             }
22             : {};
23 13         38 my ($replacement, @subbind) = _replace($1, $options, %params);
24              
25 13         20 push @bind, @subbind;
26              
27 13         41 $replacement;
28             }gei;
29              
30 11         47 return ($sql, @bind);
31             }
32              
33             sub _replace {
34 13     13   36 my ($placeholder, $options, %params) = @_;
35              
36 13         14 my @bind;
37              
38 13         16 my $replacement = '';
39              
40 13 50       30 if (!exists $params{$placeholder}) {
41 0         0 die sprintf 'unknown placeholder: %s', $placeholder;
42             }
43              
44 13 100       34 if (ref $params{$placeholder} eq 'HASH') {
    100          
45 2 100       7 if ($options->{raw}) {
46 1         4 $replacement = join ', ', map { $_ . '=' . $params{$placeholder}->{$_} }
47 1         3 keys %{$params{$placeholder}};
  1         4  
48             }
49             else {
50 1         3 $replacement = join ', ', map { $_ . '=?' } keys %{$params{$placeholder}};
  1         4  
  1         3  
51 1         3 push @bind, values %{$params{$placeholder}};
  1         3  
52             }
53             }
54             elsif (ref $params{$placeholder} eq 'ARRAY') {
55 4 100       9 if ($options->{raw}) {
56 2         12 $replacement = join ', ', @{$params{$placeholder}};
  2         9  
57             }
58             else {
59 2         5 $replacement = join ', ', map { '?' } 1 .. @{$params{$placeholder}};
  4         9  
  2         5  
60 2         4 push @bind, @{$params{$placeholder}};
  2         3  
61             }
62             }
63             else {
64 7 100       17 if ($options->{raw}) {
    100          
65 1         2 $replacement = $params{$placeholder};
66             }
67             elsif ($options->{recursive}) {
68 1         6 my ($subsql, @subbind) = sql($params{$placeholder}, %params);
69              
70 1         3 $replacement = $subsql;
71 1         2 push @bind, @subbind;
72             }
73             else {
74 5         7 $replacement = '?';
75 5         7 push @bind, $params{$placeholder};
76             }
77             }
78              
79 13         42 return ($replacement, @bind);
80             }
81              
82             1;
83             __END__