... | ... |
@@ -1,4 +1,5 @@ |
1 | 1 |
0.1667 |
2 |
+ - added EXPERIMENTAL updat_param no_set option. |
|
2 | 3 |
- added EXPERIMENTAL reserved_word_quote attribute. |
3 | 4 |
0.1666 |
4 | 5 |
- removed from cache() and cache_method() document for a while and cache() value |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
package DBIx::Custom; |
2 | 2 |
|
3 |
-our $VERSION = '0.1667'; |
|
3 |
+our $VERSION = '0.1668'; |
|
4 | 4 |
|
5 | 5 |
use 5.008001; |
6 | 6 |
use strict; |
... | ... |
@@ -655,17 +655,25 @@ sub insert_param { |
655 | 655 |
my ($self, $param) = @_; |
656 | 656 |
|
657 | 657 |
# Insert parameter tag |
658 |
- my @tag; |
|
659 |
- push @tag, '{insert_param'; |
|
658 |
+ my @names; |
|
659 |
+ my @placeholders; |
|
660 |
+ |
|
660 | 661 |
my $safety = $self->safety_character; |
662 |
+ my $q = $self->reserved_word_quote; |
|
663 |
+ |
|
661 | 664 |
foreach my $column (keys %$param) { |
662 | 665 |
croak qq{"$column" is not safety column name} |
663 | 666 |
unless $column =~ /^[$safety\.]+$/; |
664 |
- push @tag, $column; |
|
667 |
+ |
|
668 |
+ my $c = "$q$column$q"; |
|
669 |
+ $c =~ s/\./$q.$q/; |
|
670 |
+ |
|
671 |
+ push @names, $c; |
|
672 |
+ push @placeholders, "{? $c}"; |
|
665 | 673 |
} |
666 |
- push @tag, '}'; |
|
667 | 674 |
|
668 |
- return join ' ', @tag; |
|
675 |
+ return '(' . join(', ', @names) . ') ' . 'values' . |
|
676 |
+ ' (' . join(', ', @placeholders) . ')'; |
|
669 | 677 |
} |
670 | 678 |
|
671 | 679 |
sub include_model { |
... | ... |
@@ -731,6 +739,27 @@ sub include_model { |
731 | 739 |
return $self; |
732 | 740 |
} |
733 | 741 |
|
742 |
+sub merge_param { |
|
743 |
+ my ($self, @params) = @_; |
|
744 |
+ |
|
745 |
+ my $param = {}; |
|
746 |
+ |
|
747 |
+ foreach my $p (@params) { |
|
748 |
+ foreach my $column (keys %$p) { |
|
749 |
+ if (exists $param->{$column}) { |
|
750 |
+ $param->{$column} = [$param->{$column}] |
|
751 |
+ unless ref $param->{$column} eq 'ARRAY'; |
|
752 |
+ push @{$param->{$column}}, $p->{$column}; |
|
753 |
+ } |
|
754 |
+ else { |
|
755 |
+ $param->{$column} = $p->{$column}; |
|
756 |
+ } |
|
757 |
+ } |
|
758 |
+ } |
|
759 |
+ |
|
760 |
+ return $param; |
|
761 |
+} |
|
762 |
+ |
|
734 | 763 |
sub method { |
735 | 764 |
my $self = shift; |
736 | 765 |
|
... | ... |
@@ -1150,20 +1179,29 @@ sub update_at { |
1150 | 1179 |
} |
1151 | 1180 |
|
1152 | 1181 |
sub update_param { |
1153 |
- my ($self, $param) = @_; |
|
1182 |
+ my ($self, $param, $opt) = @_; |
|
1183 |
+ |
|
1184 |
+ # Insert parameter tag |
|
1185 |
+ my @params; |
|
1154 | 1186 |
|
1155 |
- # Update parameter tag |
|
1156 |
- my @tag; |
|
1157 |
- push @tag, '{update_param'; |
|
1158 | 1187 |
my $safety = $self->safety_character; |
1188 |
+ my $q = $self->reserved_word_quote; |
|
1189 |
+ |
|
1159 | 1190 |
foreach my $column (keys %$param) { |
1160 | 1191 |
croak qq{"$column" is not safety column name} |
1161 | 1192 |
unless $column =~ /^[$safety\.]+$/; |
1162 |
- push @tag, $column; |
|
1193 |
+ |
|
1194 |
+ my $c = "$q$column$q"; |
|
1195 |
+ $c =~ s/\./$q.$q/; |
|
1196 |
+ |
|
1197 |
+ push @params, "$c = {? $c}"; |
|
1163 | 1198 |
} |
1164 |
- push @tag, '}'; |
|
1165 | 1199 |
|
1166 |
- return join ' ', @tag; |
|
1200 |
+ my $clause; |
|
1201 |
+ $clause .= 'set ' unless $opt->{no_set}; |
|
1202 |
+ $clause .= join(', ', @params); |
|
1203 |
+ |
|
1204 |
+ return $clause; |
|
1167 | 1205 |
} |
1168 | 1206 |
|
1169 | 1207 |
sub where { |
... | ... |
@@ -2140,7 +2178,7 @@ Place holders are set to 5 and 'Perl'. |
2140 | 2178 |
|
2141 | 2179 |
Create insert parameter tag. |
2142 | 2180 |
|
2143 |
- {insert_param title age} |
|
2181 |
+ (title, author) values ({? title}, {? author}); |
|
2144 | 2182 |
|
2145 | 2183 |
=head2 C<include_model> EXPERIMENTAL |
2146 | 2184 |
|
... | ... |
@@ -2190,6 +2228,16 @@ You can get model object by C<model()>. |
2190 | 2228 |
|
2191 | 2229 |
See L<DBIx::Custom::Model> to know model features. |
2192 | 2230 |
|
2231 |
+=head2 C<merge_param> EXPERIMENTAL |
|
2232 |
+ |
|
2233 |
+ my $param = $dbi->merge_param({key1 => 1}, {key1 => 1, key2 => 2}); |
|
2234 |
+ |
|
2235 |
+Merge paramters. |
|
2236 |
+ |
|
2237 |
+$param: |
|
2238 |
+ |
|
2239 |
+ {key1 => [1, 1], key2 => 2} |
|
2240 |
+ |
|
2193 | 2241 |
=head2 C<method> EXPERIMENTAL |
2194 | 2242 |
|
2195 | 2243 |
$dbi->method( |
... | ... |
@@ -2699,7 +2747,16 @@ Place holders are set to 'Perl' and 5. |
2699 | 2747 |
|
2700 | 2748 |
Create update parameter tag. |
2701 | 2749 |
|
2702 |
- {update_param title age} |
|
2750 |
+ set title = {? title}, author = {? author} |
|
2751 |
+ |
|
2752 |
+You can create tag without 'set ' by C<no_set> option. This option is EXPERIMENTAL. |
|
2753 |
+ |
|
2754 |
+ my $update_param = $dbi->update_param( |
|
2755 |
+ {title => 'a', age => 2} |
|
2756 |
+ {no_set => 1} |
|
2757 |
+ ); |
|
2758 |
+ |
|
2759 |
+ title = {? title}, author = {? author} |
|
2703 | 2760 |
|
2704 | 2761 |
=head2 C<where> |
2705 | 2762 |
|
... | ... |
@@ -1788,6 +1788,43 @@ is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 3, key4 => 4, key5 => 5}, |
1788 | 1788 |
"basic"); |
1789 | 1789 |
|
1790 | 1790 |
|
1791 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
1792 |
+$dbi->execute($CREATE_TABLE->{1}); |
|
1793 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
1794 |
+$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
|
1795 |
+ |
|
1796 |
+$param = {key2 => 11, key3 => 33}; |
|
1797 |
+$update_param = $dbi->update_param($param); |
|
1798 |
+$sql = <<"EOS"; |
|
1799 |
+update {table table1} $update_param |
|
1800 |
+where key1 = 1 |
|
1801 |
+EOS |
|
1802 |
+$dbi->execute($sql, param => $param); |
|
1803 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
1804 |
+$rows = $result->fetch_hash_all; |
|
1805 |
+is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 33, key4 => 4, key5 => 5}, |
|
1806 |
+ {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
|
1807 |
+ "basic"); |
|
1808 |
+ |
|
1809 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
1810 |
+$dbi->execute($CREATE_TABLE->{1}); |
|
1811 |
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
1812 |
+$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
|
1813 |
+ |
|
1814 |
+$param = {key2 => 11, key3 => 33}; |
|
1815 |
+$update_param = $dbi->update_param($param, {no_set => 1}); |
|
1816 |
+$sql = <<"EOS"; |
|
1817 |
+update {table table1} set $update_param |
|
1818 |
+where key1 = 1 |
|
1819 |
+EOS |
|
1820 |
+$dbi->execute($sql, param => $param); |
|
1821 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
1822 |
+$rows = $result->fetch_hash_all; |
|
1823 |
+is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 33, key4 => 4, key5 => 5}, |
|
1824 |
+ {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
|
1825 |
+ "update param no_set"); |
|
1826 |
+ |
|
1827 |
+ |
|
1791 | 1828 |
eval { $dbi->update_param({";" => 1}) }; |
1792 | 1829 |
like($@, qr/not safety/); |
1793 | 1830 |
|
... | ... |
@@ -1795,14 +1832,26 @@ like($@, qr/not safety/); |
1795 | 1832 |
test 'insert_param'; |
1796 | 1833 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
1797 | 1834 |
$dbi->execute($CREATE_TABLE->{1}); |
1798 |
-$param = {key1 => 1}; |
|
1835 |
+$param = {key1 => 1, key2 => 2}; |
|
1799 | 1836 |
$insert_param = $dbi->insert_param($param); |
1800 | 1837 |
$sql = <<"EOS"; |
1801 | 1838 |
insert into {table table1} $insert_param |
1802 | 1839 |
EOS |
1840 |
+$dbi->execute($sql, param => $param); |
|
1841 |
+is($dbi->select(table => 'table1')->fetch_hash_first->{key1}, 1); |
|
1842 |
+is($dbi->select(table => 'table1')->fetch_hash_first->{key2}, 2); |
|
1803 | 1843 |
|
1844 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
1845 |
+$dbi->reserved_word_quote('"'); |
|
1846 |
+$dbi->execute($CREATE_TABLE->{1}); |
|
1847 |
+$param = {key1 => 1, key2 => 2}; |
|
1848 |
+$insert_param = $dbi->insert_param($param); |
|
1849 |
+$sql = <<"EOS"; |
|
1850 |
+insert into {table table1} $insert_param |
|
1851 |
+EOS |
|
1804 | 1852 |
$dbi->execute($sql, param => $param); |
1805 | 1853 |
is($dbi->select(table => 'table1')->fetch_hash_first->{key1}, 1); |
1854 |
+is($dbi->select(table => 'table1')->fetch_hash_first->{key2}, 2); |
|
1806 | 1855 |
|
1807 | 1856 |
eval { $dbi->insert_param({";" => 1}) }; |
1808 | 1857 |
like($@, qr/not safety/); |
... | ... |
@@ -2044,3 +2093,13 @@ $model = $dbi->create_model( |
2044 | 2093 |
); |
2045 | 2094 |
$model->method(foo => sub { shift->select(@_) }); |
2046 | 2095 |
is_deeply($model->foo->fetch_hash_first, {key1 => 1, key3 => 3}); |
2096 |
+ |
|
2097 |
+test 'merge_param'; |
|
2098 |
+{ |
|
2099 |
+ my $dbi = DBIx::Custom->new; |
|
2100 |
+ my $param1 = {key1 => 1, key2 => 2, key3 => 3}; |
|
2101 |
+ my $param2 = {key1 => 1, key2 => 2}; |
|
2102 |
+ my $param3 = {key1 => 1}; |
|
2103 |
+ my $param = $dbi->merge_param($param1, $param2, $param3); |
|
2104 |
+ is_deeply($param, {key1 => [1, 1, 1], key2 => [2, 2], key3 => 3}); |
|
2105 |
+} |