File Coverage

blib/lib/DBIx/Query.pm
Criterion Covered Total %
statement 364 382 95.2
branch 84 114 73.6
condition 27 47 57.4
subroutine 91 93 97.8
pod 2 2 100.0
total 568 638 89.0


line stmt bran cond sub pod time code
1             package DBIx::Query;
2             # ABSTRACT: Simplified abstracted chained DBI subclass
3              
4 2     2   398284 use 5.008;
  2         32  
5 2     2   9 use strict;
  2         3  
  2         33  
6 2     2   8 use warnings;
  2         3  
  2         92  
7              
8             our $VERSION = '1.13'; # VERSION
9              
10 2     2   3855 use DBI 1.40;
  2         30568  
  2         148  
11 2     2   960 use parent 'DBI';
  2         529  
  2         9  
12              
13             {
14 2     2   104 no warnings 'once';
  2         5  
  2         393  
15             *errstr = \*DBI::errstr;
16             }
17              
18             our $_dq_parser_cache = {};
19              
20             sub _connect {
21 3     3   13 my ( $self, $dsn, $user, $pass, $attr, $connect ) = @_;
22              
23 3 100       13 $attr = ($attr) ? \%$attr : {};
24 3 50       15 $attr->{PrintError} = 0 unless ( exists $attr->{PrintError} );
25 3 100       12 $attr->{RaiseError} = 1 unless ( exists $attr->{RaiseError} );
26              
27 3 50       38 return $self->SUPER::connect( $dsn, $user, $pass, {
28             %$attr,
29             dbi_connect_method => ( $DBI::connect_via eq 'Apache::DBI::connect' )
30             ? 'Apache::DBI::connect' : $connect,
31             } );
32             }
33              
34             sub connect {
35 2     2 1 141 my ( $self, $dsn, $user, $pass, $attr ) = @_;
36 2         10 return $self->_connect( $dsn, $user, $pass, $attr, 'connect_cached' );
37             }
38              
39             sub connect_uncached {
40 1     1 1 191 my ( $self, $dsn, $user, $pass, $attr ) = @_;
41 1         6 return $self->_connect( $dsn, $user, $pass, $attr, 'connect' );
42             }
43              
44             #-----------------------------------------------------------------------------
45              
46             {
47             package DBIx::Query::_Common;
48 2     2   13 use strict;
  2         3  
  2         43  
49 2     2   8 use warnings;
  2         4  
  2         81  
50 2     2   10 use Carp 'croak';
  2         2  
  2         435  
51              
52             sub _param {
53 557     557   72972 my $self = shift;
54 557         643 my $name = shift;
55              
56 557 50       784 return unless ($name);
57 557 100       1911 $self->{'private_dq_stash'}{$name} = shift if (@_);
58 557         3629 return $self->{'private_dq_stash'}{$name};
59             }
60              
61             sub _try {
62 196     196   289 my ( $self, $cb ) = @_;
63              
64 196         242 local $@;
65 196         252 eval { $cb->() };
  196         274  
66 196 50       6934 if ($@) {
67 0         0 ( my $error = $@ ) =~ s/\s*at.+?line \d+\.\s*//;
68 0         0 croak $error;
69             }
70             }
71             }
72              
73             #-----------------------------------------------------------------------------
74              
75             {
76             package DBIx::Query::db;
77 2     2   13 use strict;
  2         9  
  2         53  
78 2     2   8 use warnings;
  2         3  
  2         58  
79 2     2   1342 use SQL::Parser;
  2         76101  
  2         106  
80 2     2   922 use SQL::Abstract::Complete;
  2         45595  
  2         101  
81 2     2   18 use Carp 'carp';
  2         4  
  2         86  
82              
83 2     2   10 use vars '@ISA';
  2         5  
  2         2874  
84             @ISA = qw( DBI::db DBIx::Query::_Common );
85              
86             sub connected {
87 3     3   20392 my $self = shift;
88              
89 3         10 my $connection = {};
90 3         10 @{$connection}{qw( dsn user pass attr )} = @_;
  3         15  
91              
92 3         17 $self->_param( 'connection' => $connection );
93 3         33 $self->_param( 'sql_abstract' => SQL::Abstract::Complete->new );
94              
95             my $dialect = ( ref $connection eq 'HASH' and ref $connection->{attr} eq 'HASH' )
96             ? $connection->{attr}{dq_dialect}
97 3 50 33     38 : undef;
98 3   50     17 $dialect ||= 'ANSI';
99              
100 3         29 $self->_param(
101             'sql_parser' => SQL::Parser->new(
102             $dialect, { 'RaiseError' => 0, 'PrintError' => 0 }
103             )
104             );
105              
106 3         15 return;
107             }
108              
109             sub connection {
110 7     7   6568 my $self = shift;
111              
112             return
113 2         10 ( @_ == 0 and wantarray ) ? @{ $self->_param('connection') }{ qw( dsn user pass attr ) } :
114             ( @_ == 0 and not wantarray ) ? $self->_param('connection') :
115 1         3 ( @_ > 1 and wantarray ) ? @{ $self->_param('connection') }{@_} :
116 1         3 ( @_ > 1 and not wantarray ) ? [ @{ $self->_param('connection') }{@_} ] :
117 7 100 100     58 @{ $self->_param('connection') }{@_};
  1 100 66     3  
    100 100        
    100 66        
118             }
119              
120             sub _sth_setup {
121 76     76   139 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
122              
123 76         91 my $sth;
124             $self->_try( sub {
125 76 100 66 76   626 $sth = ( defined $cache_type and $cache_type == -1 )
126             ? $self->SUPER::prepare( $sql, $attr )
127             : $self->SUPER::prepare_cached( $sql, $attr, $cache_type );
128 76         417 } );
129              
130 76         273 return $sth;
131             }
132              
133             sub _query {
134 75     75   137 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
135 75   100     298 $cache_type //= 3;
136              
137 75         184 my $sth = $self->_sth_setup( $sql, $attr, $cache_type, $variables );
138              
139 75         983 $sql =~ s/(\r?\n|\s+)/ /g;
140 75         435 $sql =~ s/^\s+|\s+$//g;
141              
142 75         192 $sth->_param( 'sql' => $sql );
143 75         236 $sth->_param( 'dq' => $self );
144 75         164 $sth->_param( 'variables' => $variables );
145              
146 75         203 return $sth;
147             }
148              
149             sub sql {
150 40     40   4440 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
151 40 50       123 $self->_croak('SQL input missing in sql() call') unless ( length $sql );
152 40         112 return $self->_query( $sql, $attr, $cache_type, $variables );
153             }
154              
155             sub get {
156 35     35   2239 my ( $self, $tables, $columns, $where, $meta, $attr, $cache_type ) = @_;
157 35         85 my ( $sql, @variables ) = $self->_param('sql_abstract')->select( $tables, $columns, $where, $meta );
158 35         19441 my $sth = $self->_query( $sql, $attr, $cache_type, \@variables );
159              
160 35         285 $sth->_param( 'query' => {
161             'tables' => $tables,
162             'columns' => $columns,
163             'where' => $where,
164             'meta' => $meta,
165             'attr' => $attr,
166             'cache_type' => $cache_type,
167             'sql' => $sql,
168             'variables' => \@variables,
169             } );
170              
171 35         129 return $sth;
172             }
173              
174             sub sql_uncached {
175 2     2   31 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
176 2         6 $cache_type = -1;
177 2         9 return $self->sql( $sql, $attr, $cache_type, $variables );
178             }
179              
180             sub get_uncached {
181 2     2   6 my ( $self, $tables, $columns, $where, $meta, $attr, $cache_type ) = @_;
182 2         5 $cache_type = -1;
183 2         9 return $self->get( $tables, $columns, $where, $meta, $attr, $cache_type );
184             }
185              
186             sub sql_fast {
187 0     0   0 my $self = shift;
188 0         0 carp('sql_fast() is deprecated in favor of sql()');
189 0         0 return $self->sql(@_);
190             }
191              
192             sub get_fast {
193 0     0   0 my $self = shift;
194 0         0 carp('get_fast() is deprecated in favor of get()');
195 0         0 return $self->get(@_);
196             }
197              
198             sub add {
199 2     2   418 my ( $self, $table_name, $params, $attr, $cache_type ) = @_;
200 2         7 my ( $sql, @variables ) = $self->_param('sql_abstract')->insert( $table_name, $params );
201              
202             $self->_try( sub {
203 2     2   9 my $sth = $self->sql( $sql, $attr, $cache_type, \@variables );
204 2 50       3 $sth->execute( @{ $sth->_param('variables') || [] } );
  2         10  
205 2         3404 } );
206              
207 2         9 my $pk;
208 2         5 eval {
209             $pk = $self->last_insert_id(
210             undef,
211             undef,
212 2   33     52 delete $attr->{'last_insert_table'} || $table_name,
213             undef,
214             $attr,
215             );
216             };
217              
218 2         13 $self->_param( 'table' => $table_name );
219              
220 2         20 return $pk;
221             }
222              
223             sub rm {
224 2     2   10 my ( $self, $table_name, $params, $attr, $cache_type ) = @_;
225              
226 2         6 my ( $sql, @variables ) = $self->_param('sql_abstract')->delete( $table_name, $params );
227 2         1724 my $sth = $self->sql( $sql, $attr, $cache_type, \@variables );
228              
229 2         9 $sth->run;
230 2         11 return $self;
231             }
232              
233             sub update {
234 2     2   8 my ( $self, $table_name, $params, $where, $attr, $cache_type ) = @_;
235              
236 2         9 my ( $sql, @variables ) = $self->_param('sql_abstract')->update( $table_name, $params, $where );
237 2         2942 my $sth = $self->sql( $sql, $attr, $cache_type, \@variables );
238              
239 2         9 $sth->run;
240 2         8 return $self;
241             }
242              
243             sub get_run {
244 9     9   13 my $self = shift;
245 9         18 my $sth = $self->get(@_);
246              
247             $self->_try( sub {
248 9 50   9   12 $sth->execute( @{ $sth->_param('variables') || [] } );
  9         35  
249 9         38 } );
250              
251 9         26 return $sth;
252             }
253              
254             sub fetch_value {
255 2     2   605 my $self = shift;
256 2         8 my $sth = $self->get_run(@_);
257 2         4 my $value;
258              
259             $self->_try( sub {
260 2     2   26 $value = ( $sth->fetchrow_array )[0];
261 2         24 $sth->finish;
262 2         10 } );
263              
264 2         8 return $value;
265             }
266              
267             sub fetchall_arrayref {
268 4     4   431 my $self = shift;
269 4         12 my $sth = $self->get_run(@_);
270 4         8 my $value;
271              
272             $self->_try( sub {
273 4     4   41 $value = $sth->fetchall_arrayref;
274 4         240 $sth->finish;
275 4         17 } );
276              
277 4         17 return $value;
278             }
279              
280             sub fetchall_hashref {
281 2     2   430 my $self = shift;
282 2         8 my $sth = $self->get_run(@_);
283 2         5 my $value;
284              
285             $self->_try( sub {
286 2     2   20 $value = $sth->fetchall_arrayref({});
287 2         284 $sth->finish;
288 2         10 } );
289              
290 2         15 return $value;
291             }
292              
293             sub fetch_column_arrayref {
294 2     2   383 my $self = shift;
295 2         6 return [ map { $_->[0] } @{ $self->fetchall_arrayref(@_) } ];
  22         37  
  2         6  
296             }
297              
298             sub fetchrow_hashref {
299 1     1   4 my ( $self, $sql ) = ( shift, shift );
300 1 50       5 $self->_croak('SQL input missing in sql() call') unless ( length $sql );
301              
302 1         2 my ( $variables, $attr, $cache_type );
303 1 50 33     9 if ( not defined $_[0] or ref $_[0] eq 'HASH' ) {
304 0         0 ( $variables, $attr, $cache_type ) = @_;
305             }
306             else {
307 1         3 $variables = \@_;
308             }
309 1   50     6 $cache_type //= 3;
310              
311 1         1 my $row;
312             $self->_try( sub {
313 1     1   4 my $sth = $self->_sth_setup( $sql, $attr, $cache_type, $variables );
314 1         24 $sth->execute(@$variables);
315 1         31 $row = $sth->fetchrow_hashref;
316 1         21 $sth->finish;
317 1         8 } );
318              
319 1         8 return $row;
320             }
321             }
322              
323             #-----------------------------------------------------------------------------
324              
325             {
326             package DBIx::Query::st;
327 2     2   16 use strict;
  2         10  
  2         58  
328 2     2   10 use warnings;
  2         2  
  2         80  
329 2     2   11 use Carp 'croak';
  2         4  
  2         105  
330              
331 2     2   11 use vars '@ISA';
  2         4  
  2         802  
332             @ISA = qw( DBI::st DBIx::Query::_Common );
333              
334             sub where {
335 4     4   11 my $self = shift;
336              
337 4 50       9 croak('Unable to call where() because upstream query not originated with get()')
338             unless ( $self->_param('query') );
339              
340 4 50 33     27 croak('where() requires a hashref or an even number of items in a list')
341             if ( ref( $_[0] ) ne 'HASH' and @_ % 2 );
342              
343 4         9 my $query = $self->_param('query');
344 4 100       9 $query->{'where'} = { %{ $query->{'where'} || {} }, ( ref( $_[0] ) eq 'HASH' ) ? %{ $_[0] } : @_ };
  4 50       32  
  0         0  
345              
346 4         16 return $self->up->get( @{$query}{ qw( tables columns where meta attr cache_type ) } );
  4         29  
347             }
348              
349             sub run {
350 54     54   83 my $self = shift;
351 54         101 my @input = @_;
352              
353             $self->_try( sub {
354 54 100   54   577 $self->execute( (@input) ? @input : @{ $self->_param('variables') || [] } );
  33 100       58  
355 54         271 } );
356              
357 54         305 return DBIx::Query::_Dq::RowSet->new($self);
358             }
359              
360             sub sql {
361 3     3   10 my ( $self, $sql ) = @_;
362 3 50       9 return ($sql) ? $self->_param('dq')->sql($sql) : $self->_param('sql');
363             }
364              
365             sub structure {
366 38     38   380 my $self = shift;
367              
368 38         70 my $structure = $self->_param('structure');
369              
370 38 100       178 return $structure if ($structure);
371 15 50       31 return if ( $self->_param('no_structure') );
372              
373 15         39 my $sql = $self->_param('sql');
374              
375             $DBIx::Query::_dq_parser_cache->{$sql} ||= $self->_param('dq')->_param('sql_parser')->structure if (
376 15 100 33     68 not $DBIx::Query::_dq_parser_cache->{$sql} and
      66        
377             $self->_param('dq')->_param('sql_parser')->parse($sql)
378             );
379              
380 15         95 $self->_param( 'wildcard_column' => 0 );
381              
382 15 50       47 if ( $DBIx::Query::_dq_parser_cache->{$sql} ) {
383 15         24 my $structure = $DBIx::Query::_dq_parser_cache->{$sql};
384 15         20 my $column_index = 0;
385 15         22 my %aliases;
386              
387             {
388 2     2   14 no warnings;
  2         3  
  2         595  
  15         20  
389             $structure->{'column_lookup'} = {
390             map {
391 27         38 my $index = $column_index++;
392 27 50       66 $aliases{ $_->{'alias'} } = $index if ( $_->{'alias'} );
393 27 100       55 $self->_param( 'wildcard_column' => 1 ) if ( $_->{'value'} eq '*' );
394 27         99 $_->{'value'} => $index;
395 15         17 } @{ $structure->{'column_defs'} }
  15         33  
396             };
397             };
398              
399             $structure->{'column_invert_lookup'} = {
400 15         27 map { $structure->{'column_lookup'}->{$_} => $_ } keys %{ $structure->{'column_lookup'} }
  27         92  
  15         44  
401             };
402 15         41 foreach ( keys %aliases ) {
403 0         0 $structure->{'column_lookup'}{$_} = $aliases{$_};
404 0         0 $structure->{'column_invert_lookup'}{ $aliases{$_} } = $_;
405             }
406              
407 15         35 $self->_param( 'structure' => $structure );
408 15         60 return $structure;
409             }
410             else {
411 0         0 $self->_param( 'no_structure' => 1 );
412 0         0 return;
413             }
414             }
415              
416             sub table {
417 6     6   17 return shift->structure->{'table_names'}[0];
418             }
419              
420             sub _wildcard_column {
421 18     18   29 my $self = shift;
422              
423 18         34 my $wildcard_column = $self->_param('wildcard_column');
424 18 100       64 return $wildcard_column if ( defined $wildcard_column );
425              
426 12         39 $self->structure;
427 12         27 return $self->_param('wildcard_column');
428             }
429              
430             sub up {
431 10     10   25 return shift->_param('dq');
432             }
433             }
434              
435             #-----------------------------------------------------------------------------
436              
437             {
438             package DBIx::Query::_Dq::RowSet;
439 2     2   12 use strict;
  2         32  
  2         51  
440 2     2   9 use warnings;
  2         2  
  2         73  
441 2     2   12 use Carp 'croak';
  2         3  
  2         1311  
442              
443             sub new {
444 54     54   113 my ( $self, $sth ) = @_;
445 54         275 return bless( { 'sth' => $sth }, $self );
446             }
447              
448             sub next {
449 17     17   47 my ( $self, $skip ) = @_;
450 17   100     69 $skip ||= 0;
451              
452 17 100       48 my $method = ( $self->{'sth'}->_wildcard_column ) ? 'fetchrow_hashref' : 'fetchrow_arrayref';
453              
454 17         23 my $value;
455             DBIx::Query::_Common::_try( $self, sub {
456 17     17   95 $self->{'sth'}->fetchrow_arrayref while ( $skip-- );
457              
458 17 100       261 if ( my $row = $self->{'sth'}->$method ) {
459 16         90 $value = DBIx::Query::_Dq::Row->new( $row, $self );
460             }
461              
462 17         88 } );
463              
464 17 100       133 return $value if ($value);
465             }
466              
467             sub all {
468 11     11   23 my $self = shift;
469 11         24 my @input = @_;
470              
471 11         17 my $value;
472             DBIx::Query::_Common::_try( $self, sub {
473 11     11   160 $value = $self->{'sth'}->fetchall_arrayref(@input);
474 11         688 $self->{'sth'}->finish;
475 11         50 } );
476              
477 11         85 return $value;
478             }
479              
480             sub each {
481 1     1   4 my ( $self, $code ) = @_;
482 1 50       5 my $method = ( $self->{'sth'}->_wildcard_column ) ? 'fetchrow_hashref' : 'fetchrow_arrayref';
483              
484             DBIx::Query::_Common::_try( $self, sub {
485 1     1   33 $code->( DBIx::Query::_Dq::Row->new( $_, $self ) ) while ( $_ = $self->{'sth'}->$method );
486 1         7 $self->{'sth'}->finish;
487 1         10 } );
488              
489 1         5 return $self;
490             }
491              
492             sub value {
493 15     15   31 my $self = shift;
494              
495 15         22 my @value;
496             DBIx::Query::_Common::_try( $self, sub {
497 15     15   182 @value = $self->{'sth'}->fetchrow_array;
498 15         69 $self->{'sth'}->finish;
499 15         74 } );
500              
501 15         77 my $wantarray = wantarray;
502 15 50       57 if ( not defined $wantarray ) {
    100          
503 0         0 croak('value() must not be called in void context');
504             }
505             elsif ( not wantarray ) {
506 14 50       41 if ( @value < 2 ) {
507 14         103 return $value[0];
508             }
509             else {
510 0         0 croak('value() called in scalar context but multiple values fetched');
511             }
512             }
513             else {
514 1         6 return @value;
515             }
516             }
517              
518             sub first {
519 2     2   5 my ( $self, $type ) = @_;
520 2 100       9 my $method = ( ref $type eq 'HASH' ) ? 'fetchrow_hashref' : 'fetchrow_arrayref';
521              
522 2         3 my $value;
523             DBIx::Query::_Common::_try( $self, sub {
524 2     2   56 $value = $self->{'sth'}->$method;
525 2         15 $self->{'sth'}->finish;
526 2         9 } );
527              
528 2         18 return $value;
529             }
530              
531             sub column {
532 2     2   4 my $self = shift;
533 2         5 my @values = map { $_->[0] } @{ ( $self->all )[0] };
  22         30  
  2         7  
534              
535 2 100       19 return (wantarray) ? @values : \@values;
536             }
537              
538             sub up {
539 29     29   81 return shift->{'sth'};
540             }
541             }
542              
543             #-----------------------------------------------------------------------------
544              
545             {
546             package DBIx::Query::_Dq::Row;
547 2     2   15 use strict;
  2         3  
  2         37  
548 2     2   7 use warnings;
  2         10  
  2         59  
549 2     2   10 use Carp 'croak';
  2         3  
  2         1610  
550              
551             sub new {
552 18     18   36 my ( $self, $row, $set ) = @_;
553 18         75 return bless(
554             {
555             'row' => $row,
556             'set' => $set,
557             },
558             $self,
559             );
560             }
561              
562             sub cell {
563 8     8   22 my ( $self, $index, $new_value ) = @_;
564 8         28 my ( $name, $structure, $value ) = ( $index, $self->up->up->structure, undef );
565              
566 8 50       31 croak('Query used earlier in chain failed to parse, so cell() cannot be called')
567             unless ( ref($structure) eq 'HASH' );
568              
569 8 100       24 if ( ref( $self->{'row'} ) eq 'ARRAY' ) {
570 5 100       25 unless ( $index =~ /^\d+$/ ) {
571 4         26 $name = $index;
572 4         11 $index = $structure->{'column_lookup'}{$index};
573             }
574 5 50 33     19 return undef unless ( defined $index and $index < @{ $self->{'row'} } );
  5         18  
575 5         13 $value = $self->{'row'}[$index];
576             }
577             else {
578 3 50       13 croak('cell() called with integer index but query does not support integer indexing')
579             if ( $index =~ /^\d+$/ );
580              
581 3 50       7 return undef unless ( exists $self->{'row'}{$index} );
582 3         6 $value = $self->{'row'}{$index};
583             }
584              
585 8 100       22 if ( defined $new_value ) {
586 2 100       7 if ( ref( $self->{'row'} ) eq 'ARRAY' ) {
587 1         3 $self->{'row'}[$index] = $new_value;
588             }
589             else {
590 1         3 $self->{'row'}{$name} = $new_value;
591             }
592 2         4 $value = $new_value;
593             }
594              
595 8         36 return DBIx::Query::_Dq::Cell->new( $name, $value, $index, $self );
596             }
597              
598             sub each {
599 1     1   4 my ( $self, $code ) = @_;
600              
601             croak('each() called on a row object that does not have columns defined')
602 1 50       4 if ( ref( $self->{'row'} ) ne 'ARRAY' );
603              
604 1         3 for ( my $i = 0 ; $i < @{ $self->{'row'} } ; $i++ ) {
  3         9  
605             $code->(
606             DBIx::Query::_Dq::Cell->new(
607             $self->up->up->structure->{'column_lookup'}{$i},
608 2         5 $self->{'row'}[$i],
609             $i, $self,
610             )
611             );
612             }
613              
614 1         2 return $self;
615             }
616              
617             sub data {
618 11     11   28 my ($self) = @_;
619              
620 11 100       38 if ( ref( $self->{'row'} ) eq 'ARRAY' ) {
621 8         22 my $structure = $self->up->up->structure;
622 8 50 33     45 if ( ref($structure) eq 'HASH' and $structure->{'column_invert_lookup'} ) {
623             return {
624             map {
625 18         86 $structure->{'column_invert_lookup'}->{$_} => $self->{'row'}[$_]
626 8         22 } ( 0 .. scalar( @{ $self->{'row'} } ) - 1 )
  8         24  
627             };
628             }
629             else {
630 0         0 croak('Unable to parse SQL, therefore data() unavailable; use row() instead');
631             }
632             }
633             else {
634 3         27 return $self->{'row'};
635             }
636             }
637              
638             sub row {
639 1     1   3 my ($self) = @_;
640             croak('For this particular query, use data() instead')
641 1 50       5 unless ( ref( $self->{'row'} ) eq 'ARRAY' );
642 1         6 return $self->{'row'};
643             }
644              
645             sub save {
646 5     5   14 my ( $self, $key, $params, $cache_type ) = @_;
647              
648 5 50       10 croak('save() called without a key or set of keys') unless ($key);
649              
650 5         20 my $data = $self->data;
651 5 100       15 if ( ref($params) eq 'HASH' ) {
652 4         10 $data->{$_} = $params->{$_} foreach ( keys %{$params} );
  4         18  
653             }
654              
655 5         14 my $dq = $self->up->up->up;
656              
657             my ( $sql, @variables ) = $dq->_param('sql_abstract')->update(
658             $self->up->up->table,
659             $data,
660 5 50       14 { map { $_ => delete $data->{$_} } ( ref($key) ? @{$key} : $key ) },
  5         43  
  0         0  
661             );
662 5         8422 my $sth = $dq->sql( $sql, undef, $cache_type, \@variables );
663              
664 5         23 $sth->run;
665 5         25 return $self;
666             }
667              
668             sub up {
669 29     29   73 return shift->{'set'};
670             }
671             }
672              
673             #-----------------------------------------------------------------------------
674              
675             {
676             package DBIx::Query::_Dq::Cell;
677 2     2   14 use strict;
  2         4  
  2         43  
678 2     2   8 use warnings;
  2         3  
  2         423  
679              
680             sub new {
681 10     10   30 my ( $self, $name, $value, $index, $row ) = @_;
682 10         80 return bless(
683             {
684             'name' => $name,
685             'value' => $value,
686             'index' => $index,
687             'row' => $row,
688             },
689             $self,
690             );
691             }
692              
693             sub name {
694 1     1   11 return shift->{'name'};
695             }
696              
697             sub value {
698 7     7   17 my ( $self, $new_value ) = @_;
699 7 50       43 return ( defined $new_value ) ? $self->up->cell( $self->name, $new_value ) : $self->{'value'};
700             }
701              
702             sub index {
703 1     1   5 return shift->{'index'};
704             }
705              
706             sub save {
707 2     2   8 return shift->up->save(@_);
708             }
709              
710             sub up {
711 4     4   24 return shift->{'row'};
712             }
713             }
714              
715             1;
716              
717             __END__