File Coverage

blib/lib/SQL/Composer/Update.pm
Criterion Covered Total %
statement 56 58 96.5
branch 16 20 80.0
condition 3 9 33.3
subroutine 9 9 100.0
pod 0 4 0.0
total 84 100 84.0


line stmt bran cond sub pod time code
1             package SQL::Composer::Update;
2              
3 3     3   13718 use strict;
  3         6  
  3         69  
4 3     3   16 use warnings;
  3         17  
  3         79  
5              
6             require Carp;
7 3     3   292 use SQL::Composer::Quoter;
  3         5  
  3         52  
8 3     3   335 use SQL::Composer::Expression;
  3         5  
  3         1853  
9              
10             sub new {
11 7     7 0 10652 my $class = shift;
12 7         30 my (%params) = @_;
13              
14 7         19 my $self = { table => $params{table} };
15 7         17 bless $self, $class;
16              
17             $self->{quoter} =
18 7   33     47 $params{quoter} || SQL::Composer::Quoter->new(driver => $params{driver});
19              
20 7         18 my $sql = '';
21 7         11 my @bind;
22              
23 7         14 $sql .= 'UPDATE ';
24              
25 7         22 $sql .= $self->_quote($params{table});
26              
27 7 50 33     25 if ($params{values} || $params{set}) {
28 7   33     19 my $values = $params{values} || $params{set};
29 7 100       31 my @values = ref $values eq 'HASH' ? %$values : @$values;
30              
31 7         15 $sql .= ' SET ';
32              
33 7         10 my @pairs;
34 7         28 while (my ($key, $value) = splice @values, 0, 2) {
35 7 100       18 if (ref $value) {
36 2 100       8 if (ref $value eq 'SCALAR') {
    50          
37 1         3 $value = $$value;
38             }
39             elsif (ref $value eq 'REF') {
40 1 50       5 if (ref $$value eq 'ARRAY') {
41 1         3 push @bind, @$$value[1 .. $#{$$value}];
  1         3  
42 1         3 $value = $$value->[0];
43             }
44             else {
45 0         0 Carp::croak('unexpected reference');
46             }
47             }
48             else {
49 0         0 Carp::croak('unexpected reference');
50             }
51             }
52             else {
53 5         10 push @bind, $value;
54 5         13 $value = '?';
55             }
56              
57 7         18 push @pairs, $self->_quote($key) . ' = ' . $value;
58             }
59              
60 7         23 $sql .= join ',', @pairs;
61             }
62              
63 7 100       21 if ($params{where}) {
64             my $expr = SQL::Composer::Expression->new(
65             quoter => $self->{quoter},
66             expr => $params{where}
67 1         9 );
68 1         5 $sql .= ' WHERE ' . $expr->to_sql;
69 1         4 push @bind, $expr->to_bind;
70             }
71              
72 7 100       20 if (defined(my $limit = $params{limit})) {
73 2         5 $sql .= ' LIMIT ' . $limit;
74             }
75              
76 7 100       18 if (defined(my $offset = $params{offset})) {
77 1         3 $sql .= ' OFFSET ' . $offset;
78             }
79              
80 7         14 $self->{sql} = $sql;
81 7         15 $self->{bind} = \@bind;
82              
83 7         21 return $self;
84             }
85              
86 1     1 0 698 sub table { shift->{table} }
87              
88 6     6 0 28 sub to_sql { shift->{sql} }
89 6 50   6 0 2994 sub to_bind { @{shift->{bind} || []} }
  6         45  
90              
91             sub _quote {
92 14     14   22 my $self = shift;
93 14         27 my ($column) = @_;
94              
95 14         37 return $self->{quoter}->quote($column);
96             }
97              
98             1;
99             __END__