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