... | ... |
@@ -8,10 +8,10 @@ |
8 | 8 |
- update_timestamp method is DEPRECATED! |
9 | 9 |
use use now method |
10 | 10 |
- added EXPEREIMTNAL now method |
11 |
- - added EXPERIMENTAL execute created_at method |
|
12 |
- - added EXPERIMETNAL execute updated_at method |
|
11 |
+ - added EXPERIMENTAL insert created_at option |
|
12 |
+ - added EXPERIMETNAL insert updated_at option |
|
13 |
+ - added EXPERIMETNAL update updated_at option |
|
13 | 14 |
- added new timestamp system using the above methods and options |
14 |
- |
|
15 | 15 |
0.1738 |
16 | 16 |
- micro optimization |
17 | 17 |
- removed example that query pass execute method in documentation |
... | ... |
@@ -57,7 +57,9 @@ has [qw/connector dsn password quote user exclude_table user_table_info |
57 | 57 |
my ($sec, $min, $hour, $mday, $mon, $year) = localtime; |
58 | 58 |
$mon++; |
59 | 59 |
$year += 1900; |
60 |
- return sprintf("%04d-%02d-%02d %02d:%02d:%02d"); |
|
60 |
+ my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d", |
|
61 |
+ $year, $mon, $mday, $hour, $min, $sec); |
|
62 |
+ return $now; |
|
61 | 63 |
} |
62 | 64 |
}, |
63 | 65 |
query_builder => sub { |
... | ... |
@@ -371,6 +373,7 @@ sub execute { |
371 | 373 |
|
372 | 374 |
# Merge second parameter |
373 | 375 |
my @cleanup; |
376 |
+ my $saved_param; |
|
374 | 377 |
if (ref $param eq 'ARRAY') { |
375 | 378 |
my $param2 = $param->[1]; |
376 | 379 |
$param = $param->[0]; |
... | ... |
@@ -382,7 +385,9 @@ sub execute { |
382 | 385 |
else { |
383 | 386 |
delete $param->{$_} for @cleanup; |
384 | 387 |
@cleanup = (); |
388 |
+ $saved_param = $param; |
|
385 | 389 |
$param = $self->merge_param($param, $param2); |
390 |
+ delete $saved_param->{$_} for (@{$opt{cleanup} || []}); |
|
386 | 391 |
last; |
387 | 392 |
} |
388 | 393 |
} |
... | ... |
@@ -436,19 +441,6 @@ sub execute { |
436 | 441 |
} |
437 | 442 |
} |
438 | 443 |
|
439 |
- # Created time and updated time |
|
440 |
- if (defined $opt{created_at} || defined $opt{updated_at}) { |
|
441 |
- my $now = $self->now->(); |
|
442 |
- if (defined $opt{create_at}) { |
|
443 |
- $param->{$opt{created_at}} = $now; |
|
444 |
- push @cleanup, $opt{created_at}; |
|
445 |
- } |
|
446 |
- if (defined $opt{updated_at}) { |
|
447 |
- $param->{$opt{updated_at}} = $now; |
|
448 |
- push @cleanup, $opt{updated_at}; |
|
449 |
- } |
|
450 |
- } |
|
451 |
- |
|
452 | 444 |
# Cleanup tables(DEPRECATED!) |
453 | 445 |
$tables = $self->_remove_duplicate_table($tables, $main_table) |
454 | 446 |
if @$tables > 1; |
... | ... |
@@ -527,8 +519,7 @@ sub execute { |
527 | 519 |
. qq{$query->{sql}\n} . _subname) if $@; |
528 | 520 |
|
529 | 521 |
# Remove id from parameter |
530 |
- delete $param->{$_} for @cleanup; |
|
531 |
- |
|
522 |
+ delete $param->{$_} for (@cleanup, @{$opt{cleanup} || []}); |
|
532 | 523 |
|
533 | 524 |
# DEBUG message |
534 | 525 |
if ($ENV{DBIX_CUSTOM_DEBUG}) { |
... | ... |
@@ -626,7 +617,7 @@ sub insert { |
626 | 617 |
warn "insert method param option is DEPRECATED!" if $opt{param}; |
627 | 618 |
$param ||= delete $opt{param} || {}; |
628 | 619 |
|
629 |
- # Timestamp |
|
620 |
+ # Timestamp(DEPRECATED!) |
|
630 | 621 |
if ($opt{timestamp} && (my $insert_timestamp = $self->insert_timestamp)) { |
631 | 622 |
warn "insert timestamp option is DEPRECATED! use created_at with now attribute"; |
632 | 623 |
my $columns = $insert_timestamp->[0]; |
... | ... |
@@ -635,6 +626,20 @@ sub insert { |
635 | 626 |
$value = $value->() if ref $value eq 'CODE'; |
636 | 627 |
$param->{$_} = $value for @$columns; |
637 | 628 |
} |
629 |
+ |
|
630 |
+ # Created time and updated time |
|
631 |
+ my @timestamp_cleanup; |
|
632 |
+ if (defined $opt{created_at} || defined $opt{updated_at}) { |
|
633 |
+ my $now = $self->now->(); |
|
634 |
+ if (defined $opt{created_at}) { |
|
635 |
+ $param->{$opt{created_at}} = $now; |
|
636 |
+ push @timestamp_cleanup, $opt{created_at}; |
|
637 |
+ } |
|
638 |
+ if (defined $opt{updated_at}) { |
|
639 |
+ $param->{$opt{updated_at}} = $now; |
|
640 |
+ push @timestamp_cleanup, $opt{updated_at}; |
|
641 |
+ } |
|
642 |
+ } |
|
638 | 643 |
|
639 | 644 |
# Merge id to parameter |
640 | 645 |
my @cleanup; |
... | ... |
@@ -663,6 +668,7 @@ sub insert { |
663 | 668 |
|
664 | 669 |
# Execute query |
665 | 670 |
$opt{statement} = 'insert'; |
671 |
+ $opt{cleanup} = \@timestamp_cleanup; |
|
666 | 672 |
$self->execute($sql, $param, %opt); |
667 | 673 |
} |
668 | 674 |
|
... | ... |
@@ -1085,7 +1091,7 @@ sub update { |
1085 | 1091 |
croak qq{update method where option must be specified } . _subname |
1086 | 1092 |
if !$opt{where} && !defined $opt{id} && !$opt{allow_update_all}; |
1087 | 1093 |
|
1088 |
- # Timestamp |
|
1094 |
+ # Timestamp(DEPRECATED!) |
|
1089 | 1095 |
if ($opt{timestamp} && (my $update_timestamp = $self->update_timestamp)) { |
1090 | 1096 |
warn "update timestamp option is DEPRECATED! use updated_at and now method"; |
1091 | 1097 |
my $columns = $update_timestamp->[0]; |
... | ... |
@@ -1095,6 +1101,13 @@ sub update { |
1095 | 1101 |
$param->{$_} = $value for @$columns; |
1096 | 1102 |
} |
1097 | 1103 |
|
1104 |
+ # Created time and updated time |
|
1105 |
+ my @timestamp_cleanup; |
|
1106 |
+ if (defined $opt{updated_at}) { |
|
1107 |
+ $param->{$opt{updated_at}} = $self->now->(); |
|
1108 |
+ push @timestamp_cleanup, $opt{updated_at}; |
|
1109 |
+ } |
|
1110 |
+ |
|
1098 | 1111 |
# Assign clause |
1099 | 1112 |
my $assign_clause = $self->assign_clause($param, {wrap => $opt{wrap}}); |
1100 | 1113 |
|
... | ... |
@@ -1109,6 +1122,7 @@ sub update { |
1109 | 1122 |
|
1110 | 1123 |
# Execute query |
1111 | 1124 |
$opt{statement} = 'update'; |
1125 |
+ $opt{cleanup} = \@timestamp_cleanup; |
|
1112 | 1126 |
$self->execute($sql, [$param, $w->{param}], %opt); |
1113 | 1127 |
} |
1114 | 1128 |
|
... | ... |
@@ -2596,14 +2610,6 @@ This is used to bind parameter by C<bind_param> of statment handle. |
2596 | 2610 |
|
2597 | 2611 |
$sth->bind_param($pos, $value, DBI::SQL_BLOB); |
2598 | 2612 |
|
2599 |
-=item C<created_at EXPERIMETNAL> |
|
2600 |
- |
|
2601 |
- created_at => 'created_datetime' |
|
2602 |
- |
|
2603 |
-Created timestamp column name. time when row is created is set to the column. |
|
2604 |
-default time format is "YYYY-mm-dd HH:MM:SS", which can be changed by |
|
2605 |
-C<now> attribute. |
|
2606 |
- |
|
2607 | 2613 |
=item C<filter> |
2608 | 2614 |
|
2609 | 2615 |
filter => { |
... | ... |
@@ -2721,14 +2727,6 @@ Turn C<into1> type rule off. |
2721 | 2727 |
|
2722 | 2728 |
Turn C<into2> type rule off. |
2723 | 2729 |
|
2724 |
-=item C<updated_at EXPERIMETNAL> |
|
2725 |
- |
|
2726 |
- updated_at => 'updated_datetime' |
|
2727 |
- |
|
2728 |
-Updated timestamp column name. time when row is updated is set to the column. |
|
2729 |
-default time format is C<YYYY-mm-dd HH:MM:SS>, which can be changed by |
|
2730 |
-C<now> attribute. |
|
2731 |
- |
|
2732 | 2730 |
=back |
2733 | 2731 |
|
2734 | 2732 |
=head2 C<get_column_info> |
... | ... |
@@ -2794,6 +2792,14 @@ and use the following new ones. |
2794 | 2792 |
|
2795 | 2793 |
=over 4 |
2796 | 2794 |
|
2795 |
+=item C<created_at EXPERIMETNAL> |
|
2796 |
+ |
|
2797 |
+ created_at => 'created_datetime' |
|
2798 |
+ |
|
2799 |
+Created timestamp column name. time when row is created is set to the column. |
|
2800 |
+default time format is "YYYY-mm-dd HH:MM:SS", which can be changed by |
|
2801 |
+C<now> attribute. |
|
2802 |
+ |
|
2797 | 2803 |
=item C<id> |
2798 | 2804 |
|
2799 | 2805 |
id => 4 |
... | ... |
@@ -2830,6 +2836,10 @@ prefix before table name section |
2830 | 2836 |
|
2831 | 2837 |
Table name. |
2832 | 2838 |
|
2839 |
+=item C<updated_at EXPERIMENTAL> |
|
2840 |
+ |
|
2841 |
+This option is same as C<update> method C<updated_at> option. |
|
2842 |
+ |
|
2833 | 2843 |
=item C<wrap> |
2834 | 2844 |
|
2835 | 2845 |
wrap => {price => sub { "max($_[0])" }} |
... | ... |
@@ -3307,6 +3317,14 @@ is executed, the following SQL is executed. |
3307 | 3317 |
|
3308 | 3318 |
update book set price = ? + 5; |
3309 | 3319 |
|
3320 |
+=item C<updated_at EXPERIMETNAL> |
|
3321 |
+ |
|
3322 |
+ updated_at => 'updated_datetime' |
|
3323 |
+ |
|
3324 |
+Updated timestamp column name. time when row is updated is set to the column. |
|
3325 |
+default time format is C<YYYY-mm-dd HH:MM:SS>, which can be changed by |
|
3326 |
+C<now> attribute. |
|
3327 |
+ |
|
3310 | 3328 |
=back |
3311 | 3329 |
|
3312 | 3330 |
=head2 C<update_all> |
... | ... |
@@ -546,6 +546,38 @@ $result = $dbi->execute("select * from $table1"); |
546 | 546 |
$rows = $result->all; |
547 | 547 |
is($rows->[0]->{$key1}, $rows->[0]->{$key2}); |
548 | 548 |
|
549 |
+eval { $dbi->execute("drop table $table1") }; |
|
550 |
+$dbi->execute($create_table1_2); |
|
551 |
+$param = {$key1 => 1}; |
|
552 |
+$dbi->insert(table => $table1, param => $param, created_at => $key2); |
|
553 |
+$result = $dbi->select(table => $table1); |
|
554 |
+is_deeply($param, {$key1 => 1}); |
|
555 |
+$row = $result->one; |
|
556 |
+is($row->{$key1}, 1); |
|
557 |
+like($row->{$key2}, qr/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/); |
|
558 |
+ |
|
559 |
+eval { $dbi->execute("drop table $table1") }; |
|
560 |
+$dbi->execute($create_table1_2); |
|
561 |
+$param = {$key1 => 1}; |
|
562 |
+$dbi->insert(table => $table1, param => $param, updated_at => $key3); |
|
563 |
+$result = $dbi->select(table => $table1); |
|
564 |
+is_deeply($param, {$key1 => 1}); |
|
565 |
+$row = $result->one; |
|
566 |
+is($row->{$key1}, 1); |
|
567 |
+like($row->{$key3}, qr/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/); |
|
568 |
+ |
|
569 |
+eval { $dbi->execute("drop table $table1") }; |
|
570 |
+$dbi->execute($create_table1_2); |
|
571 |
+$param = {$key1 => 1}; |
|
572 |
+$dbi->insert(table => $table1, param => $param, created_at => $key2, updated_at => $key3); |
|
573 |
+$result = $dbi->select(table => $table1); |
|
574 |
+is_deeply($param, {$key1 => 1}); |
|
575 |
+$row = $result->one; |
|
576 |
+is($row->{$key1}, 1); |
|
577 |
+like($row->{$key2}, qr/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/); |
|
578 |
+like($row->{$key3}, qr/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/); |
|
579 |
+is($row->{$key2}, $row->{$key3}); |
|
580 |
+ |
|
549 | 581 |
test 'update_or_insert'; |
550 | 582 |
eval { $dbi->execute("drop table $table1") }; |
551 | 583 |
$dbi->execute($create_table1); |
... | ... |
@@ -793,6 +825,28 @@ is_deeply($rows, [{$key1 => 1, $key2 => 11, $key3 => 3, $key4 => 4, $key5 => 5}, |
793 | 825 |
{$key1 => 6, $key2 => 7, $key3 => 8, $key4 => 9, $key5 => 10}], |
794 | 826 |
"basic"); |
795 | 827 |
|
828 |
+eval { $dbi->execute("drop table $table1") }; |
|
829 |
+$dbi->execute($create_table1_2); |
|
830 |
+$param = {$key3 => 4}; |
|
831 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3}); |
|
832 |
+$dbi->update(table => $table1, param => $param, updated_at => $key2, where => {$key1 => 1}); |
|
833 |
+$result = $dbi->select(table => $table1); |
|
834 |
+is_deeply($param, {$key3 => 4}); |
|
835 |
+$row = $result->one; |
|
836 |
+is($row->{$key3}, 4); |
|
837 |
+like($row->{$key2}, qr/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/); |
|
838 |
+ |
|
839 |
+eval { $dbi->execute("drop table $table1") }; |
|
840 |
+$dbi->execute($create_table1_2); |
|
841 |
+$param = {$key3 => 4}; |
|
842 |
+$dbi->insert(table => $table1, param => {$key1 => 1, $key2 => 2, $key3 => 3}); |
|
843 |
+$dbi->update(table => $table1, param => $param, updated_at => $key2, where => {$key3 => 3}); |
|
844 |
+$result = $dbi->select(table => $table1); |
|
845 |
+is_deeply($param, {$key3 => 4}); |
|
846 |
+$row = $result->one; |
|
847 |
+is($row->{$key3}, 4); |
|
848 |
+like($row->{$key2}, qr/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/); |
|
849 |
+ |
|
796 | 850 |
test 'update_all'; |
797 | 851 |
eval { $dbi->execute("drop table $table1") }; |
798 | 852 |
$dbi->execute($create_table1_2); |