File Coverage

blib/lib/SQL/Composer/Insert.pm
Criterion Covered Total %
statement 54 56 96.4
branch 12 16 75.0
condition 5 9 55.5
subroutine 8 8 100.0
pod 0 4 0.0
total 79 93 84.9


line stmt bran cond sub pod time code
1             package SQL::Composer::Insert;
2              
3 4     4   13714 use strict;
  4         7  
  4         90  
4 4     4   17 use warnings;
  4         7  
  4         107  
5              
6             require Carp;
7 4     4   567 use SQL::Composer::Quoter;
  4         8  
  4         1507  
8              
9             sub new {
10 9     9 0 6750 my $class = shift;
11 9         30 my (%params) = @_;
12              
13 9         28 my $self = { table => $params{into} };
14 9         19 bless $self, $class;
15              
16             $self->{quoter} =
17 9   33     61 $params{quoter} || SQL::Composer::Quoter->new(driver => $params{driver});
18              
19 9         22 my $sql = '';
20 9         17 my @bind;
21              
22 9         25 $sql .= 'INSERT INTO ';
23              
24 9         28 $sql .= $self->_quote($params{into});
25              
26 9 100 66     31 if ($params{values} && @{$params{values}}) {
  9         34  
27 7         15 my @columns;
28             my @values;
29 7         12 while (my ($key, $value) = splice @{$params{values}}, 0, 2) {
  17         56  
30 10         21 push @columns, $key;
31              
32 10 100       25 if (ref $value) {
33 2 100       8 if (ref $value eq 'SCALAR') {
    50          
34 1         3 push @values, $$value;
35             }
36             elsif (ref $value eq 'REF') {
37 1 50       4 if (ref $$value eq 'ARRAY') {
38 1         3 push @values, $$value->[0];
39 1         2 push @bind, @$$value[1 .. $#{$$value}];
  1         4  
40             }
41             else {
42 0         0 Carp::croak('unexpected reference');
43             }
44             }
45             else {
46 0         0 Carp::croak('unexpected reference');
47             }
48             }
49             else {
50 8         17 push @values, '?';
51 8         20 push @bind, $value;
52             }
53             }
54              
55 7 50       18 if (@columns) {
56 7         25 $sql .= ' (' . (join ',', map { $self->_quote($_) } @columns) . ')';
  10         24  
57 7         15 $sql .= ' VALUES (';
58 7         14 $sql .= join ',', @values;
59 7         11 $sql .= ')';
60             }
61              
62             # save this for later ...
63 7         18 $self->{columns} = \@columns;
64             }
65             else {
66 2         4 my $driver = $params{driver};
67 2 100 66     13 if ($driver && $driver =~ m/(?:sqlite|pg)/i) {
68 1         3 $sql .= ' DEFAULT VALUES';
69             }
70             else {
71 1         2 $sql .= ' () VALUES ()';
72             }
73             }
74              
75 9         20 $self->{sql} = $sql;
76 9         17 $self->{bind} = \@bind;
77              
78 9         27 return $self;
79             }
80              
81 1     1 0 587 sub table { shift->{table} }
82              
83 8     8 0 39 sub to_sql { shift->{sql} }
84 8 50   8 0 3538 sub to_bind { @{shift->{bind} || []} }
  8         64  
85              
86             sub _quote {
87 21     21   40 my $self = shift;
88 21         38 my ($column, $prefix) = @_;
89              
90 21         63 return $self->{quoter}->quote($column, $prefix);
91             }
92              
93             1;
94             __END__