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   349162 use 5.008;
  2         15  
5 2     2   7 use strict;
  2         3  
  2         27  
6 2     2   6 use warnings;
  2         3  
  2         58  
7              
8             our $VERSION = '1.14'; # VERSION
9              
10 2     2   2140 use DBI 1.40;
  2         25617  
  2         96  
11 2     2   721 use parent 'DBI';
  2         436  
  2         9  
12              
13             {
14 2     2   87 no warnings 'once';
  2         3  
  2         348  
15             *errstr = \*DBI::errstr;
16             }
17              
18             our $_dq_parser_cache = {};
19              
20             sub _connect {
21 3     3   9 my ( $self, $dsn, $user, $pass, $attr, $connect ) = @_;
22              
23 3 100       12 $attr = ($attr) ? \%$attr : {};
24 3 50       13 $attr->{PrintError} = 0 unless ( exists $attr->{PrintError} );
25 3 100       10 $attr->{RaiseError} = 1 unless ( exists $attr->{RaiseError} );
26              
27 3 50       34 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 69 my ( $self, $dsn, $user, $pass, $attr ) = @_;
36 2         8 return $self->_connect( $dsn, $user, $pass, $attr, 'connect_cached' );
37             }
38              
39             sub connect_uncached {
40 1     1 1 164 my ( $self, $dsn, $user, $pass, $attr ) = @_;
41 1         5 return $self->_connect( $dsn, $user, $pass, $attr, 'connect' );
42             }
43              
44             #-----------------------------------------------------------------------------
45              
46             {
47             package DBIx::Query::_Common;
48 2     2   11 use strict;
  2         4  
  2         35  
49 2     2   7 use warnings;
  2         4  
  2         55  
50 2     2   10 use Carp 'croak';
  2         4  
  2         327  
51              
52             sub _param {
53 557     557   58013 my $self = shift;
54 557         547 my $name = shift;
55              
56 557 50       673 return unless ($name);
57 557 100       1515 $self->{'private_dq_stash'}{$name} = shift if (@_);
58 557         2735 return $self->{'private_dq_stash'}{$name};
59             }
60              
61             sub _try {
62 196     196   246 my ( $self, $cb ) = @_;
63              
64 196         178 local $@;
65 196         230 eval { $cb->() };
  196         209  
66 196 50       4582 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   10 use strict;
  2         3  
  2         44  
78 2     2   8 use warnings;
  2         4  
  2         40  
79 2     2   1145 use SQL::Parser;
  2         69375  
  2         96  
80 2     2   775 use SQL::Abstract::Complete;
  2         40365  
  2         90  
81 2     2   14 use Carp 'carp';
  2         3  
  2         78  
82              
83 2     2   9 use vars '@ISA';
  2         4  
  2         2537  
84             @ISA = qw( DBI::db DBIx::Query::_Common );
85              
86             sub connected {
87 3     3   11073 my $self = shift;
88              
89 3         6 my $connection = {};
90 3         8 @{$connection}{qw( dsn user pass attr )} = @_;
  3         11  
91              
92 3         15 $self->_param( 'connection' => $connection );
93 3         30 $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     26 : undef;
98 3   50     13 $dialect ||= 'ANSI';
99              
100 3         26 $self->_param(
101             'sql_parser' => SQL::Parser->new(
102             $dialect, { 'RaiseError' => 0, 'PrintError' => 0 }
103             )
104             );
105              
106 3         12 return;
107             }
108              
109             sub connection {
110 7     7   5767 my $self = shift;
111              
112             return
113 2         9 ( @_ == 0 and wantarray ) ? @{ $self->_param('connection') }{ qw( dsn user pass attr ) } :
114             ( @_ == 0 and not wantarray ) ? $self->_param('connection') :
115 1         4 ( @_ > 1 and wantarray ) ? @{ $self->_param('connection') }{@_} :
116 1         4 ( @_ > 1 and not wantarray ) ? [ @{ $self->_param('connection') }{@_} ] :
117 7 100 100     50 @{ $self->_param('connection') }{@_};
  1 100 66     3  
    100 100        
    100 66        
118             }
119              
120             sub _sth_setup {
121 76     76   98 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
122              
123 76         70 my $sth;
124             $self->_try( sub {
125 76 100 66 76   424 $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         285 } );
129              
130 76         229 return $sth;
131             }
132              
133             sub _query {
134 75     75   109 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
135 75   100     226 $cache_type //= 3;
136              
137 75         127 my $sth = $self->_sth_setup( $sql, $attr, $cache_type, $variables );
138              
139 75         842 $sql =~ s/(\r?\n|\s+)/ /g;
140 75         374 $sql =~ s/^\s+|\s+$//g;
141              
142 75         154 $sth->_param( 'sql' => $sql );
143 75         149 $sth->_param( 'dq' => $self );
144 75         140 $sth->_param( 'variables' => $variables );
145              
146 75         334 return $sth;
147             }
148              
149             sub sql {
150 40     40   3360 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
151 40 50       78 $self->_croak('SQL input missing in sql() call') unless ( length $sql );
152 40         76 return $self->_query( $sql, $attr, $cache_type, $variables );
153             }
154              
155             sub get {
156 35     35   1346 my ( $self, $tables, $columns, $where, $meta, $attr, $cache_type ) = @_;
157 35         66 my ( $sql, @variables ) = $self->_param('sql_abstract')->select( $tables, $columns, $where, $meta );
158 35         16121 my $sth = $self->_query( $sql, $attr, $cache_type, \@variables );
159              
160 35         202 $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         104 return $sth;
172             }
173              
174             sub sql_uncached {
175 2     2   26 my ( $self, $sql, $attr, $cache_type, $variables ) = @_;
176 2         6 $cache_type = -1;
177 2         6 return $self->sql( $sql, $attr, $cache_type, $variables );
178             }
179              
180             sub get_uncached {
181 2     2   7 my ( $self, $tables, $columns, $where, $meta, $attr, $cache_type ) = @_;
182 2         5 $cache_type = -1;
183 2         5 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   356 my ( $self, $table_name, $params, $attr, $cache_type ) = @_;
200 2         8 my ( $sql, @variables ) = $self->_param('sql_abstract')->insert( $table_name, $params );
201              
202             $self->_try( sub {
203 2     2   7 my $sth = $self->sql( $sql, $attr, $cache_type, \@variables );
204 2 50       4 $sth->execute( @{ $sth->_param('variables') || [] } );
  2         5  
205 2         2932 } );
206              
207 2         7 my $pk;
208 2         3 eval {
209             $pk = $self->last_insert_id(
210             undef,
211             undef,
212 2   33     43 delete $attr->{'last_insert_table'} || $table_name,
213             undef,
214             $attr,
215             );
216             };
217              
218 2         8 $self->_param( 'table' => $table_name );
219              
220 2         11 return $pk;
221             }
222              
223             sub rm {
224 2     2   7 my ( $self, $table_name, $params, $attr, $cache_type ) = @_;
225              
226 2         5 my ( $sql, @variables ) = $self->_param('sql_abstract')->delete( $table_name, $params );
227 2         1473 my $sth = $self->sql( $sql, $attr, $cache_type, \@variables );
228              
229 2         7 $sth->run;
230 2         11 return $self;
231             }
232              
233             sub update {
234 2     2   7 my ( $self, $table_name, $params, $where, $attr, $cache_type ) = @_;
235              
236 2         6 my ( $sql, @variables ) = $self->_param('sql_abstract')->update( $table_name, $params, $where );
237 2         2471 my $sth = $self->sql( $sql, $attr, $cache_type, \@variables );
238              
239 2         7 $sth->run;
240 2         7 return $self;
241             }
242              
243             sub get_run {
244 9     9   12 my $self = shift;
245 9         16 my $sth = $self->get(@_);
246              
247             $self->_try( sub {
248 9 50   9   10 $sth->execute( @{ $sth->_param('variables') || [] } );
  9         13  
249 9         45 } );
250              
251 9         24 return $sth;
252             }
253              
254             sub fetch_value {
255 2     2   343 my $self = shift;
256 2         7 my $sth = $self->get_run(@_);
257 2         4 my $value;
258              
259             $self->_try( sub {
260 2     2   16 $value = ( $sth->fetchrow_array )[0];
261 2         20 $sth->finish;
262 2         10 } );
263              
264 2         8 return $value;
265             }
266              
267             sub fetchall_arrayref {
268 4     4   374 my $self = shift;
269 4         9 my $sth = $self->get_run(@_);
270 4         6 my $value;
271              
272             $self->_try( sub {
273 4     4   31 $value = $sth->fetchall_arrayref;
274 4         229 $sth->finish;
275 4         15 } );
276              
277 4         18 return $value;
278             }
279              
280             sub fetchall_hashref {
281 2     2   358 my $self = shift;
282 2         6 my $sth = $self->get_run(@_);
283 2         4 my $value;
284              
285             $self->_try( sub {
286 2     2   9 $value = $sth->fetchall_arrayref({});
287 2         213 $sth->finish;
288 2         8 } );
289              
290 2         12 return $value;
291             }
292              
293             sub fetch_column_arrayref {
294 2     2   352 my $self = shift;
295 2         4 return [ map { $_->[0] } @{ $self->fetchall_arrayref(@_) } ];
  22         33  
  2         6  
296             }
297              
298             sub fetchrow_hashref {
299 1     1   4 my ( $self, $sql ) = ( shift, shift );
300 1 50       3 $self->_croak('SQL input missing in sql() call') unless ( length $sql );
301              
302 1         3 my ( $variables, $attr, $cache_type );
303 1 50 33     5 if ( not defined $_[0] or ref $_[0] eq 'HASH' ) {
304 0         0 ( $variables, $attr, $cache_type ) = @_;
305             }
306             else {
307 1         2 $variables = \@_;
308             }
309 1   50     5 $cache_type //= 3;
310              
311 1         1 my $row;
312             $self->_try( sub {
313 1     1   2 my $sth = $self->_sth_setup( $sql, $attr, $cache_type, $variables );
314 1         11 $sth->execute(@$variables);
315 1         20 $row = $sth->fetchrow_hashref;
316 1         5 $sth->finish;
317 1         5 } );
318              
319 1         6 return $row;
320             }
321             }
322              
323             #-----------------------------------------------------------------------------
324              
325             {
326             package DBIx::Query::st;
327 2     2   15 use strict;
  2         12  
  2         56  
328 2     2   9 use warnings;
  2         3  
  2         140  
329 2     2   17 use Carp 'croak';
  2         5  
  2         82  
330              
331 2     2   10 use vars '@ISA';
  2         2  
  2         699  
332             @ISA = qw( DBI::st DBIx::Query::_Common );
333              
334             sub where {
335 4     4   6 my $self = shift;
336              
337 4 50       7 croak('Unable to call where() because upstream query not originated with get()')
338             unless ( $self->_param('query') );
339              
340 4 50 33     16 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         6 my $query = $self->_param('query');
344 4 100       8 $query->{'where'} = { %{ $query->{'where'} || {} }, ( ref( $_[0] ) eq 'HASH' ) ? %{ $_[0] } : @_ };
  4 50       19  
  0         0  
345              
346 4         8 return $self->up->get( @{$query}{ qw( tables columns where meta attr cache_type ) } );
  4         14  
347             }
348              
349             sub run {
350 54     54   65 my $self = shift;
351 54         69 my @input = @_;
352              
353             $self->_try( sub {
354 54 100   54   354 $self->execute( (@input) ? @input : @{ $self->_param('variables') || [] } );
  33 100       42  
355 54         189 } );
356              
357 54         183 return DBIx::Query::_Dq::RowSet->new($self);
358             }
359              
360             sub sql {
361 3     3   12 my ( $self, $sql ) = @_;
362 3 50       10 return ($sql) ? $self->_param('dq')->sql($sql) : $self->_param('sql');
363             }
364              
365             sub structure {
366 38     38   328 my $self = shift;
367              
368 38         51 my $structure = $self->_param('structure');
369              
370 38 100       115 return $structure if ($structure);
371 15 50       23 return if ( $self->_param('no_structure') );
372              
373 15         28 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     50 not $DBIx::Query::_dq_parser_cache->{$sql} and
      66        
377             $self->_param('dq')->_param('sql_parser')->parse($sql)
378             );
379              
380 15         80 $self->_param( 'wildcard_column' => 0 );
381              
382 15 50       36 if ( $DBIx::Query::_dq_parser_cache->{$sql} ) {
383 15         20 my $structure = $DBIx::Query::_dq_parser_cache->{$sql};
384 15         18 my $column_index = 0;
385 15         15 my %aliases;
386              
387             {
388 2     2   12 no warnings;
  2         2  
  2         533  
  15         14  
389             $structure->{'column_lookup'} = {
390             map {
391 27         29 my $index = $column_index++;
392 27 50       40 $aliases{ $_->{'alias'} } = $index if ( $_->{'alias'} );
393 27 100       45 $self->_param( 'wildcard_column' => 1 ) if ( $_->{'value'} eq '*' );
394 27         75 $_->{'value'} => $index;
395 15         18 } @{ $structure->{'column_defs'} }
  15         25  
396             };
397             };
398              
399             $structure->{'column_invert_lookup'} = {
400 15         24 map { $structure->{'column_lookup'}->{$_} => $_ } keys %{ $structure->{'column_lookup'} }
  27         64  
  15         36  
401             };
402 15         37 foreach ( keys %aliases ) {
403 0         0 $structure->{'column_lookup'}{$_} = $aliases{$_};
404 0         0 $structure->{'column_invert_lookup'}{ $aliases{$_} } = $_;
405             }
406              
407 15         29 $self->_param( 'structure' => $structure );
408 15         84 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   13 return shift->structure->{'table_names'}[0];
418             }
419              
420             sub _wildcard_column {
421 18     18   23 my $self = shift;
422              
423 18         28 my $wildcard_column = $self->_param('wildcard_column');
424 18 100       47 return $wildcard_column if ( defined $wildcard_column );
425              
426 12         29 $self->structure;
427 12         17 return $self->_param('wildcard_column');
428             }
429              
430             sub up {
431 10     10   17 return shift->_param('dq');
432             }
433             }
434              
435             #-----------------------------------------------------------------------------
436              
437             {
438             package DBIx::Query::_Dq::RowSet;
439 2     2   11 use strict;
  2         26  
  2         34  
440 2     2   9 use warnings;
  2         8  
  2         65  
441 2     2   10 use Carp 'croak';
  2         4  
  2         1151  
442              
443             sub new {
444 54     54   86 my ( $self, $sth ) = @_;
445 54         188 return bless( { 'sth' => $sth }, $self );
446             }
447              
448             sub next {
449 17     17   32 my ( $self, $skip ) = @_;
450 17   100     60 $skip ||= 0;
451              
452 17 100       40 my $method = ( $self->{'sth'}->_wildcard_column ) ? 'fetchrow_hashref' : 'fetchrow_arrayref';
453              
454 17         20 my $value;
455             DBIx::Query::_Common::_try( $self, sub {
456 17     17   78 $self->{'sth'}->fetchrow_arrayref while ( $skip-- );
457              
458 17 100       176 if ( my $row = $self->{'sth'}->$method ) {
459 16         69 $value = DBIx::Query::_Dq::Row->new( $row, $self );
460             }
461              
462 17         63 } );
463              
464 17 100       97 return $value if ($value);
465             }
466              
467             sub all {
468 11     11   13 my $self = shift;
469 11         13 my @input = @_;
470              
471 11         12 my $value;
472             DBIx::Query::_Common::_try( $self, sub {
473 11     11   94 $value = $self->{'sth'}->fetchall_arrayref(@input);
474 11         420 $self->{'sth'}->finish;
475 11         34 } );
476              
477 11         63 return $value;
478             }
479              
480             sub each {
481 1     1   2 my ( $self, $code ) = @_;
482 1 50       2 my $method = ( $self->{'sth'}->_wildcard_column ) ? 'fetchrow_hashref' : 'fetchrow_arrayref';
483              
484             DBIx::Query::_Common::_try( $self, sub {
485 1     1   14 $code->( DBIx::Query::_Dq::Row->new( $_, $self ) ) while ( $_ = $self->{'sth'}->$method );
486 1         4 $self->{'sth'}->finish;
487 1         5 } );
488              
489 1         4 return $self;
490             }
491              
492             sub value {
493 15     15   19 my $self = shift;
494              
495 15         17 my @value;
496             DBIx::Query::_Common::_try( $self, sub {
497 15     15   104 @value = $self->{'sth'}->fetchrow_array;
498 15         44 $self->{'sth'}->finish;
499 15         45 } );
500              
501 15         34 my $wantarray = wantarray;
502 15 50       44 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       23 if ( @value < 2 ) {
507 14         64 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   4 my ( $self, $type ) = @_;
520 2 100       8 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   37 $value = $self->{'sth'}->$method;
525 2         12 $self->{'sth'}->finish;
526 2         6 } );
527              
528 2         15 return $value;
529             }
530              
531             sub column {
532 2     2   3 my $self = shift;
533 2         3 my @values = map { $_->[0] } @{ ( $self->all )[0] };
  22         24  
  2         3  
534              
535 2 100       13 return (wantarray) ? @values : \@values;
536             }
537              
538             sub up {
539 29     29   50 return shift->{'sth'};
540             }
541             }
542              
543             #-----------------------------------------------------------------------------
544              
545             {
546             package DBIx::Query::_Dq::Row;
547 2     2   39 use strict;
  2         4  
  2         52  
548 2     2   8 use warnings;
  2         4  
  2         46  
549 2     2   8 use Carp 'croak';
  2         4  
  2         1689  
550              
551             sub new {
552 18     18   27 my ( $self, $row, $set ) = @_;
553 18         51 return bless(
554             {
555             'row' => $row,
556             'set' => $set,
557             },
558             $self,
559             );
560             }
561              
562             sub cell {
563 8     8   16 my ( $self, $index, $new_value ) = @_;
564 8         13 my ( $name, $structure, $value ) = ( $index, $self->up->up->structure, undef );
565              
566 8 50       20 croak('Query used earlier in chain failed to parse, so cell() cannot be called')
567             unless ( ref($structure) eq 'HASH' );
568              
569 8 100       17 if ( ref( $self->{'row'} ) eq 'ARRAY' ) {
570 5 100       20 unless ( $index =~ /^\d+$/ ) {
571 4         5 $name = $index;
572 4         7 $index = $structure->{'column_lookup'}{$index};
573             }
574 5 50 33     14 return undef unless ( defined $index and $index < @{ $self->{'row'} } );
  5         13  
575 5         12 $value = $self->{'row'}[$index];
576             }
577             else {
578 3 50       8 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         5 $value = $self->{'row'}{$index};
583             }
584              
585 8 100       22 if ( defined $new_value ) {
586 2 100       6 if ( ref( $self->{'row'} ) eq 'ARRAY' ) {
587 1         2 $self->{'row'}[$index] = $new_value;
588             }
589             else {
590 1         2 $self->{'row'}{$name} = $new_value;
591             }
592 2         2 $value = $new_value;
593             }
594              
595 8         27 return DBIx::Query::_Dq::Cell->new( $name, $value, $index, $self );
596             }
597              
598             sub each {
599 1     1   2 my ( $self, $code ) = @_;
600              
601             croak('each() called on a row object that does not have columns defined')
602 1 50       5 if ( ref( $self->{'row'} ) ne 'ARRAY' );
603              
604 1         2 for ( my $i = 0 ; $i < @{ $self->{'row'} } ; $i++ ) {
  3         5  
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   19 my ($self) = @_;
619              
620 11 100       21 if ( ref( $self->{'row'} ) eq 'ARRAY' ) {
621 8         14 my $structure = $self->up->up->structure;
622 8 50 33     29 if ( ref($structure) eq 'HASH' and $structure->{'column_invert_lookup'} ) {
623             return {
624             map {
625 18         62 $structure->{'column_invert_lookup'}->{$_} => $self->{'row'}[$_]
626 8         12 } ( 0 .. scalar( @{ $self->{'row'} } ) - 1 )
  8         14  
627             };
628             }
629             else {
630 0         0 croak('Unable to parse SQL, therefore data() unavailable; use row() instead');
631             }
632             }
633             else {
634 3         17 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       3 unless ( ref( $self->{'row'} ) eq 'ARRAY' );
642 1         5 return $self->{'row'};
643             }
644              
645             sub save {
646 5     5   8 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         7 my $data = $self->data;
651 5 100       12 if ( ref($params) eq 'HASH' ) {
652 4         4 $data->{$_} = $params->{$_} foreach ( keys %{$params} );
  4         13  
653             }
654              
655 5         9 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       9 { map { $_ => delete $data->{$_} } ( ref($key) ? @{$key} : $key ) },
  5         24  
  0         0  
661             );
662 5         6540 my $sth = $dq->sql( $sql, undef, $cache_type, \@variables );
663              
664 5         11 $sth->run;
665 5         19 return $self;
666             }
667              
668             sub up {
669 29     29   63 return shift->{'set'};
670             }
671             }
672              
673             #-----------------------------------------------------------------------------
674              
675             {
676             package DBIx::Query::_Dq::Cell;
677 2     2   18 use strict;
  2         3  
  2         39  
678 2     2   8 use warnings;
  2         2  
  2         385  
679              
680             sub new {
681 10     10   19 my ( $self, $name, $value, $index, $row ) = @_;
682 10         46 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   6 return shift->{'name'};
695             }
696              
697             sub value {
698 7     7   12 my ( $self, $new_value ) = @_;
699 7 50       30 return ( defined $new_value ) ? $self->up->cell( $self->name, $new_value ) : $self->{'value'};
700             }
701              
702             sub index {
703 1     1   3 return shift->{'index'};
704             }
705              
706             sub save {
707 2     2   4 return shift->up->save(@_);
708             }
709              
710             sub up {
711 4     4   16 return shift->{'row'};
712             }
713             }
714              
715             1;
716              
717             __END__