select, update, and delete where option can receive...
...string where clause
... | ... |
@@ -1,3 +1,5 @@ |
1 |
+0.1680 |
|
2 |
+ - select, update, and delete where option can receive string where clause |
|
1 | 3 |
0.1679 |
2 | 4 |
- added EXPERIMENTAL select() wrap option to support Oracle ROWNUM |
3 | 5 |
0.1678 |
... | ... |
@@ -265,7 +265,7 @@ sub dbh { |
265 | 265 |
} |
266 | 266 |
|
267 | 267 |
our %DELETE_ARGS |
268 |
- = map { $_ => 1 } @COMMON_ARGS, qw/where append allow_delete_all/; |
|
268 |
+ = map { $_ => 1 } @COMMON_ARGS, qw/where append allow_delete_all param/; |
|
269 | 269 |
|
270 | 270 |
sub delete { |
271 | 271 |
my ($self, %args) = @_; |
... | ... |
@@ -284,12 +284,19 @@ sub delete { |
284 | 284 |
my $append = delete $args{append}; |
285 | 285 |
my $allow_delete_all = delete $args{allow_delete_all}; |
286 | 286 |
my $query_return = delete $args{query}; |
287 |
+ my $param = delete $args{param} || {}; |
|
287 | 288 |
|
288 | 289 |
# Where |
289 |
- $where = $self->_where_to_obj($where); |
|
290 |
- |
|
291 |
- # Where clause |
|
292 |
- my $where_clause = $where->to_string; |
|
290 |
+ my $where_clause = ''; |
|
291 |
+ if (ref $where) { |
|
292 |
+ $where = $self->_where_to_obj($where); |
|
293 |
+ $param = keys %$param ? $self->merge_param($param, $where->param) |
|
294 |
+ : $where->param; |
|
295 |
+ |
|
296 |
+ # String where |
|
297 |
+ $where_clause = $where->to_string; |
|
298 |
+ } |
|
299 |
+ elsif ($where) { $where_clause = "where $where" } |
|
293 | 300 |
croak qq{"where" must be specified } . _subname |
294 | 301 |
if $where_clause eq '' && !$allow_delete_all; |
295 | 302 |
|
... | ... |
@@ -307,7 +314,7 @@ sub delete { |
307 | 314 |
# Execute query |
308 | 315 |
return $self->execute( |
309 | 316 |
$query, |
310 |
- param => $where->param, |
|
317 |
+ param => $param, |
|
311 | 318 |
table => $table, |
312 | 319 |
%args |
313 | 320 |
); |
... | ... |
@@ -869,7 +876,7 @@ sub select { |
869 | 876 |
unshift @$tables, @{$self->_search_tables(join(' ', keys %$param) || '')}; |
870 | 877 |
|
871 | 878 |
# Where |
872 |
- my $where_clause; |
|
879 |
+ my $where_clause = ''; |
|
873 | 880 |
if (ref $where) { |
874 | 881 |
$where = $self->_where_to_obj($where); |
875 | 882 |
$param = keys %$param ? $self->merge_param($param, $where->param) |
... | ... |
@@ -878,9 +885,7 @@ sub select { |
878 | 885 |
# String where |
879 | 886 |
$where_clause = $where->to_string; |
880 | 887 |
} |
881 |
- else { |
|
882 |
- $where_clause = $where; |
|
883 |
- } |
|
888 |
+ elsif ($where) { $where_clause = "where $where" } |
|
884 | 889 |
|
885 | 890 |
# Add table names in where clause |
886 | 891 |
unshift @$tables, @{$self->_search_tables($where_clause)}; |
... | ... |
@@ -1003,8 +1008,16 @@ sub update { |
1003 | 1008 |
my $update_clause = '{update_param ' . join(' ', @columns) . '}'; |
1004 | 1009 |
|
1005 | 1010 |
# Where |
1006 |
- $where = $self->_where_to_obj($where); |
|
1007 |
- my $where_clause = $where->to_string; |
|
1011 |
+ my $where_clause = ''; |
|
1012 |
+ if (ref $where) { |
|
1013 |
+ $where = $self->_where_to_obj($where); |
|
1014 |
+ $param = keys %$param ? $self->merge_param($param, $where->param) |
|
1015 |
+ : $where->param; |
|
1016 |
+ |
|
1017 |
+ # String where |
|
1018 |
+ $where_clause = $where->to_string; |
|
1019 |
+ } |
|
1020 |
+ elsif ($where) { $where_clause = "where $where" } |
|
1008 | 1021 |
croak qq{"where" must be specified } . _subname |
1009 | 1022 |
if "$where_clause" eq '' && !$allow_update_all; |
1010 | 1023 |
|
... | ... |
@@ -1013,9 +1026,6 @@ sub update { |
1013 | 1026 |
push @sql, "update $q$table$q $update_clause $where_clause"; |
1014 | 1027 |
push @sql, $append if $append; |
1015 | 1028 |
|
1016 |
- # Merge parameters |
|
1017 |
- $param = $self->merge_param($param, $where->param); |
|
1018 |
- |
|
1019 | 1029 |
# SQL |
1020 | 1030 |
my $sql = join(' ', @sql); |
1021 | 1031 |
|
... | ... |
@@ -78,7 +78,7 @@ sub _build_query { |
78 | 78 |
|| $self->tags->{$tag_name}; |
79 | 79 |
|
80 | 80 |
# Tag is not registered |
81 |
- croak qq{Tag "$tag_name" in "{a }" is not registered } . _subname |
|
81 |
+ croak qq{Tag "$tag_name" is not registered } . _subname |
|
82 | 82 |
unless $tag; |
83 | 83 |
|
84 | 84 |
# Tag not sub reference |
... | ... |
@@ -2151,8 +2151,6 @@ $dbi->select( |
2151 | 2151 |
}; |
2152 | 2152 |
like($@, qr/array/); |
2153 | 2153 |
|
2154 |
-__END__ |
|
2155 |
- |
|
2156 | 2154 |
test 'select() string where'; |
2157 | 2155 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
2158 | 2156 |
$dbi->execute($CREATE_TABLE->{0}); |
... | ... |
@@ -2160,8 +2158,33 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
2160 | 2158 |
$dbi->insert(table => 'table1', param => {key1 => 2, key2 => 3}); |
2161 | 2159 |
$rows = $dbi->select( |
2162 | 2160 |
table => 'table1', |
2163 |
- column => 'key1', |
|
2164 |
- where => '{= key1} and {=key2}', |
|
2161 |
+ where => '{= key1} and {= key2}', |
|
2165 | 2162 |
param => {key1 => 1, key2 => 2} |
2166 | 2163 |
)->fetch_hash_all; |
2167 | 2164 |
is_deeply($rows, [{key1 => 1, key2 => 2}]); |
2165 |
+ |
|
2166 |
+test 'delete() string where'; |
|
2167 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
2168 |
+$dbi->execute($CREATE_TABLE->{0}); |
|
2169 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
2170 |
+$dbi->insert(table => 'table1', param => {key1 => 2, key2 => 3}); |
|
2171 |
+$dbi->delete( |
|
2172 |
+ table => 'table1', |
|
2173 |
+ where => '{= key1} and {= key2}', |
|
2174 |
+ param => {key1 => 1, key2 => 2} |
|
2175 |
+); |
|
2176 |
+$rows = $dbi->select(table => 'table1')->fetch_hash_all; |
|
2177 |
+is_deeply($rows, [{key1 => 2, key2 => 3}]); |
|
2178 |
+ |
|
2179 |
+ |
|
2180 |
+test 'update() string where'; |
|
2181 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
2182 |
+$dbi->execute($CREATE_TABLE->{0}); |
|
2183 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
2184 |
+$dbi->update( |
|
2185 |
+ table => 'table1', |
|
2186 |
+ param => {key1 => [5, 1], key2 => 2}, |
|
2187 |
+ where => '{= key1} and {= key2}' |
|
2188 |
+); |
|
2189 |
+$rows = $dbi->select(table => 'table1')->fetch_hash_all; |
|
2190 |
+is_deeply($rows, [{key1 => 5, key2 => 2}]); |
... | ... |
@@ -87,7 +87,7 @@ eval{$builder->build_query('{? }')}; |
87 | 87 |
like($@, qr/\QColumn name must be specified in tag "{? }"/, "? not arguments"); |
88 | 88 |
|
89 | 89 |
eval{$builder->build_query("{a }")}; |
90 |
-like($@, qr/\QTag "a" in "{a }" is not registered/, "tag not exist"); |
|
90 |
+like($@, qr/\QTag "a" is not registered/, "tag not exist"); |
|
91 | 91 |
|
92 | 92 |
$builder->register_tag({ |
93 | 93 |
q => 'string' |