| ... | ... |
@@ -229,38 +229,12 @@ sub dbh {
|
| 229 | 229 |
} |
| 230 | 230 |
} |
| 231 | 231 |
|
| 232 |
-sub _where_clause_and_param {
|
|
| 233 |
- my ($self, $where, $param) = @_; |
|
| 234 |
- |
|
| 235 |
- $where ||= {};
|
|
| 236 |
- $param ||= {};
|
|
| 237 |
- my $w = {};
|
|
| 238 |
- my $where_clause = ''; |
|
| 239 |
- if (ref $where eq 'ARRAY' && !ref $where->[0]) {
|
|
| 240 |
- $w->{clause} = "where " . $where->[0];
|
|
| 241 |
- $w->{param} = $where->[1];
|
|
| 242 |
- } |
|
| 243 |
- elsif (ref $where) {
|
|
| 244 |
- $where = $self->_where_to_obj($where); |
|
| 245 |
- $w->{param} = keys %$param
|
|
| 246 |
- ? $self->merge_param($param, $where->param) |
|
| 247 |
- : $where->param; |
|
| 248 |
- $w->{clause} = $where->to_string;
|
|
| 249 |
- } |
|
| 250 |
- elsif ($where) {
|
|
| 251 |
- $w->{clause} = "where $where";
|
|
| 252 |
- $w->{param} = $param;
|
|
| 253 |
- } |
|
| 254 |
- |
|
| 255 |
- return $w; |
|
| 256 |
-} |
|
| 257 |
- |
|
| 258 | 232 |
sub delete {
|
| 259 | 233 |
my ($self, %opt) = @_; |
| 260 | 234 |
warn "delete method where_param option is DEPRECATED!" |
| 261 | 235 |
if $opt{where_param};
|
| 262 | 236 |
|
| 263 |
- # Don't allow delete all row |
|
| 237 |
+ # Don't allow delete all rows |
|
| 264 | 238 |
croak qq{delete method where or id option must be specified } . _subname
|
| 265 | 239 |
if !$opt{where} && !defined $opt{id} && !$opt{allow_delete_all};
|
| 266 | 240 |
|
| ... | ... |
@@ -628,42 +602,6 @@ sub insert {
|
| 628 | 602 |
return $self->execute($sql, $param, %opt); |
| 629 | 603 |
} |
| 630 | 604 |
|
| 631 |
-sub update_or_insert {
|
|
| 632 |
- my $self = shift; |
|
| 633 |
- |
|
| 634 |
- # Arguments |
|
| 635 |
- my $param = shift; |
|
| 636 |
- my %opt = @_; |
|
| 637 |
- my $id = $opt{id};
|
|
| 638 |
- my $primary_key = $opt{primary_key};
|
|
| 639 |
- $primary_key = [$primary_key] unless ref $primary_key eq 'ARRAY'; |
|
| 640 |
- croak "update_or_insert method need primary_key option " . |
|
| 641 |
- "when id is specified" . _subname |
|
| 642 |
- if defined $id && !defined $primary_key; |
|
| 643 |
- my $table = $opt{table};
|
|
| 644 |
- croak qq{"table" option must be specified } . _subname
|
|
| 645 |
- unless defined $table; |
|
| 646 |
- my $select_option = $opt{select_option};
|
|
| 647 |
- |
|
| 648 |
- my $rows = $self->select(table => $table, id => $id, |
|
| 649 |
- primary_key => $primary_key, %$select_option)->all; |
|
| 650 |
- |
|
| 651 |
- croak "selected row count must be one or zero" . _subname |
|
| 652 |
- if @$rows > 1; |
|
| 653 |
- |
|
| 654 |
- my $row = $rows->[0]; |
|
| 655 |
- my @options = (table => $table); |
|
| 656 |
- push @options, id => $id, primary_key => $primary_key if defined $id; |
|
| 657 |
- push @options, %opt; |
|
| 658 |
- |
|
| 659 |
- if ($row) {
|
|
| 660 |
- return $self->update($param, @options); |
|
| 661 |
- } |
|
| 662 |
- else {
|
|
| 663 |
- return $self->insert($param, @options); |
|
| 664 |
- } |
|
| 665 |
-} |
|
| 666 |
- |
|
| 667 | 605 |
sub insert_timestamp {
|
| 668 | 606 |
my $self = shift; |
| 669 | 607 |
|
| ... | ... |
@@ -1085,11 +1023,6 @@ sub type_rule {
|
| 1085 | 1023 |
return $self->{type_rule} || {};
|
| 1086 | 1024 |
} |
| 1087 | 1025 |
|
| 1088 |
-sub _create_where {
|
|
| 1089 |
- my $self = shift; |
|
| 1090 |
- |
|
| 1091 |
-} |
|
| 1092 |
- |
|
| 1093 | 1026 |
sub update {
|
| 1094 | 1027 |
my $self = shift; |
| 1095 | 1028 |
|
| ... | ... |
@@ -1103,6 +1036,10 @@ sub update {
|
| 1103 | 1036 |
my $where = $opt{where} || {};
|
| 1104 | 1037 |
my $where_param = $opt{where_param} || {};
|
| 1105 | 1038 |
|
| 1039 |
+ # Don't allow update all rows |
|
| 1040 |
+ croak qq{update method where option must be specified } . _subname
|
|
| 1041 |
+ if !$opt{where} && !defined $opt{id} && !$opt{allow_update_all};
|
|
| 1042 |
+ |
|
| 1106 | 1043 |
# Timestamp |
| 1107 | 1044 |
if ($opt{timestamp} && (my $update_timestamp = $self->update_timestamp)) {
|
| 1108 | 1045 |
my $columns = $update_timestamp->[0]; |
| ... | ... |
@@ -1133,8 +1070,6 @@ sub update {
|
| 1133 | 1070 |
$where_clause = $where->to_string; |
| 1134 | 1071 |
} |
| 1135 | 1072 |
elsif ($where) { $where_clause = "where $where" }
|
| 1136 |
- croak qq{"where" must be specified } . _subname
|
|
| 1137 |
- if "$where_clause" eq '' && !$opt{allow_update_all};
|
|
| 1138 | 1073 |
|
| 1139 | 1074 |
# Merge where parameter to parameter |
| 1140 | 1075 |
$param = $self->merge_param($param, $where_param) if keys %$where_param; |
| ... | ... |
@@ -1150,6 +1085,42 @@ sub update {
|
| 1150 | 1085 |
|
| 1151 | 1086 |
sub update_all { shift->update(allow_update_all => 1, @_) };
|
| 1152 | 1087 |
|
| 1088 |
+sub update_or_insert {
|
|
| 1089 |
+ my $self = shift; |
|
| 1090 |
+ |
|
| 1091 |
+ # Arguments |
|
| 1092 |
+ my $param = shift; |
|
| 1093 |
+ my %opt = @_; |
|
| 1094 |
+ my $id = $opt{id};
|
|
| 1095 |
+ my $primary_key = $opt{primary_key};
|
|
| 1096 |
+ $primary_key = [$primary_key] unless ref $primary_key eq 'ARRAY'; |
|
| 1097 |
+ croak "update_or_insert method need primary_key option " . |
|
| 1098 |
+ "when id is specified" . _subname |
|
| 1099 |
+ if defined $id && !defined $primary_key; |
|
| 1100 |
+ my $table = $opt{table};
|
|
| 1101 |
+ croak qq{"table" option must be specified } . _subname
|
|
| 1102 |
+ unless defined $table; |
|
| 1103 |
+ my $select_option = $opt{select_option};
|
|
| 1104 |
+ |
|
| 1105 |
+ my $rows = $self->select(table => $table, id => $id, |
|
| 1106 |
+ primary_key => $primary_key, %$select_option)->all; |
|
| 1107 |
+ |
|
| 1108 |
+ croak "selected row count must be one or zero" . _subname |
|
| 1109 |
+ if @$rows > 1; |
|
| 1110 |
+ |
|
| 1111 |
+ my $row = $rows->[0]; |
|
| 1112 |
+ my @opt = (table => $table); |
|
| 1113 |
+ push @opt, id => $id, primary_key => $primary_key if defined $id; |
|
| 1114 |
+ push @opt, %opt; |
|
| 1115 |
+ |
|
| 1116 |
+ if ($row) {
|
|
| 1117 |
+ return $self->update($param, @opt); |
|
| 1118 |
+ } |
|
| 1119 |
+ else {
|
|
| 1120 |
+ return $self->insert($param, @opt); |
|
| 1121 |
+ } |
|
| 1122 |
+} |
|
| 1123 |
+ |
|
| 1153 | 1124 |
sub update_timestamp {
|
| 1154 | 1125 |
my $self = shift; |
| 1155 | 1126 |
|
| ... | ... |
@@ -1598,6 +1569,32 @@ sub _where_to_obj {
|
| 1598 | 1569 |
return $obj; |
| 1599 | 1570 |
} |
| 1600 | 1571 |
|
| 1572 |
+sub _where_clause_and_param {
|
|
| 1573 |
+ my ($self, $where, $param) = @_; |
|
| 1574 |
+ |
|
| 1575 |
+ $where ||= {};
|
|
| 1576 |
+ $param ||= {};
|
|
| 1577 |
+ my $w = {};
|
|
| 1578 |
+ my $where_clause = ''; |
|
| 1579 |
+ if (ref $where eq 'ARRAY' && !ref $where->[0]) {
|
|
| 1580 |
+ $w->{clause} = "where " . $where->[0];
|
|
| 1581 |
+ $w->{param} = $where->[1];
|
|
| 1582 |
+ } |
|
| 1583 |
+ elsif (ref $where) {
|
|
| 1584 |
+ $where = $self->_where_to_obj($where); |
|
| 1585 |
+ $w->{param} = keys %$param
|
|
| 1586 |
+ ? $self->merge_param($param, $where->param) |
|
| 1587 |
+ : $where->param; |
|
| 1588 |
+ $w->{clause} = $where->to_string;
|
|
| 1589 |
+ } |
|
| 1590 |
+ elsif ($where) {
|
|
| 1591 |
+ $w->{clause} = "where $where";
|
|
| 1592 |
+ $w->{param} = $param;
|
|
| 1593 |
+ } |
|
| 1594 |
+ |
|
| 1595 |
+ return $w; |
|
| 1596 |
+} |
|
| 1597 |
+ |
|
| 1601 | 1598 |
sub _apply_filter {
|
| 1602 | 1599 |
my ($self, $table, @cinfos) = @_; |
| 1603 | 1600 |
|
| ... | ... |
@@ -660,7 +660,7 @@ $dbi->update(table => $table1, param => {$key1 => 3}, where => $where);
|
| 660 | 660 |
$result = $dbi->select(table => $table1); |
| 661 | 661 |
is_deeply($result->all, [{$key1 => 3, $key2 => 2}], 'update() where');
|
| 662 | 662 |
|
| 663 |
-eval{$dbi->update(table => $table1, param => {';' => 1})};
|
|
| 663 |
+eval{$dbi->update(table => $table1, param => {';' => 1}, where => {$key1 => 1})};
|
|
| 664 | 664 |
like($@, qr/safety/); |
| 665 | 665 |
|
| 666 | 666 |
eval{$dbi->update(table => $table1, param => {$key1 => 1}, where => {';' => 1})};
|