... | ... |
@@ -1,3 +1,6 @@ |
1 |
+0.1694 |
|
2 |
+ - DBIx::Custom::Model type attribute is DEPRECATED! |
|
3 |
+ this is renamed to bind_type. |
|
1 | 4 |
0.1693 |
2 | 5 |
- separate DBIx::Custom type_rule from filter |
3 | 6 |
- DBIx::Custom::Model filter attrribute is DEPRECATED! |
... | ... |
@@ -1,6 +1,6 @@ |
1 | 1 |
package DBIx::Custom; |
2 | 2 |
|
3 |
-our $VERSION = '0.1693'; |
|
3 |
+our $VERSION = '0.1694'; |
|
4 | 4 |
use 5.008001; |
5 | 5 |
|
6 | 6 |
use Object::Simple -base; |
... | ... |
@@ -19,7 +19,8 @@ use Encode qw/encode encode_utf8 decode_utf8/; |
19 | 19 |
use constant DEBUG => $ENV{DBIX_CUSTOM_DEBUG} || 0; |
20 | 20 |
use constant DEBUG_ENCODING => $ENV{DBIX_CUSTOM_DEBUG_ENCODING} || 'UTF-8'; |
21 | 21 |
|
22 |
-our @COMMON_ARGS = qw/table query filter type id primary_key type_rule_off/; |
|
22 |
+our @COMMON_ARGS = qw/bind_type table query filter id primary_key |
|
23 |
+ type_rule_off type/; |
|
23 | 24 |
|
24 | 25 |
has [qw/connector dsn password user/], |
25 | 26 |
cache => 0, |
... | ... |
@@ -359,8 +360,8 @@ sub execute { |
359 | 360 |
$tables = [$tables] unless ref $tables eq 'ARRAY'; |
360 | 361 |
my $filter = delete $args{filter}; |
361 | 362 |
$filter = _array_to_hash($filter); |
362 |
- my $type = delete $args{type}; |
|
363 |
- $type = _array_to_hash($type); |
|
363 |
+ my $bind_type = delete $args{bind_type} || delete $args{type}; |
|
364 |
+ $bind_type = _array_to_hash($bind_type); |
|
364 | 365 |
my $type_rule_off = delete $args{type_rule_off}; |
365 | 366 |
my $query_return = delete $args{query}; |
366 | 367 |
|
... | ... |
@@ -434,7 +435,7 @@ sub execute { |
434 | 435 |
$query->columns, |
435 | 436 |
$filter, |
436 | 437 |
$type_filter, |
437 |
- $type |
|
438 |
+ $bind_type |
|
438 | 439 |
); |
439 | 440 |
|
440 | 441 |
# Execute |
... | ... |
@@ -442,8 +443,12 @@ sub execute { |
442 | 443 |
my $affected; |
443 | 444 |
eval { |
444 | 445 |
for (my $i = 0; $i < @$bind; $i++) { |
445 |
- my $type = $bind->[$i]->{type}; |
|
446 |
- $sth->bind_param($i + 1, $bind->[$i]->{value}, $type ? $type : ()); |
|
446 |
+ my $bind_type = $bind->[$i]->{bind_type}; |
|
447 |
+ $sth->bind_param( |
|
448 |
+ $i + 1, |
|
449 |
+ $bind->[$i]->{value}, |
|
450 |
+ $bind_type ? $bind_type : () |
|
451 |
+ ); |
|
447 | 452 |
} |
448 | 453 |
$affected = $sth->execute; |
449 | 454 |
}; |
... | ... |
@@ -1173,7 +1178,7 @@ sub _apply_filter { |
1173 | 1178 |
} |
1174 | 1179 |
|
1175 | 1180 |
sub _create_bind_values { |
1176 |
- my ($self, $params, $columns, $filter, $type_filter, $type) = @_; |
|
1181 |
+ my ($self, $params, $columns, $filter, $type_filter, $bind_type) = @_; |
|
1177 | 1182 |
|
1178 | 1183 |
# Create bind values |
1179 | 1184 |
my $bind = []; |
... | ... |
@@ -1210,7 +1215,7 @@ sub _create_bind_values { |
1210 | 1215 |
$value = $tf->($value) if $tf; |
1211 | 1216 |
|
1212 | 1217 |
# Bind values |
1213 |
- push @$bind, {value => $value, type => $type->{$column}}; |
|
1218 |
+ push @$bind, {value => $value, bind_type => $bind_type->{$column}}; |
|
1214 | 1219 |
|
1215 | 1220 |
# Count up |
1216 | 1221 |
$count->{$column}++; |
... | ... |
@@ -1409,7 +1414,7 @@ sub _where_to_obj { |
1409 | 1414 |
|
1410 | 1415 |
# Check where argument |
1411 | 1416 |
croak qq{"where" must be hash reference or DBIx::Custom::Where object} |
1412 |
- . qq{or array reference, which contains where clause and paramter} |
|
1417 |
+ . qq{or array reference, which contains where clause and parameter} |
|
1413 | 1418 |
. _subname |
1414 | 1419 |
unless ref $obj eq 'DBIx::Custom::Where'; |
1415 | 1420 |
|
... | ... |
@@ -1862,7 +1867,9 @@ Query builder, default to L<DBIx::Custom::QueryBuilder> object. |
1862 | 1867 |
my reserved_word_quote = $dbi->reserved_word_quote; |
1863 | 1868 |
$dbi = $dbi->reserved_word_quote('"'); |
1864 | 1869 |
|
1865 |
-Reserved word quote, default to empty string. |
|
1870 |
+Reserved word quote. |
|
1871 |
+Default to double quote '"' except for mysql. |
|
1872 |
+In mysql, default to back quote '`' |
|
1866 | 1873 |
|
1867 | 1874 |
=head2 C<result_class> |
1868 | 1875 |
|
... | ... |
@@ -2081,7 +2088,7 @@ Specify database data type. |
2081 | 2088 |
type => [image => DBI::SQL_BLOB] |
2082 | 2089 |
type => [[qw/image audio/] => DBI::SQL_BLOB] |
2083 | 2090 |
|
2084 |
-This is used to bind paramter by C<bind_param()> of statment handle. |
|
2091 |
+This is used to bind parameter by C<bind_param()> of statment handle. |
|
2085 | 2092 |
|
2086 | 2093 |
$sth->bind_param($pos, $value, DBI::SQL_BLOB); |
2087 | 2094 |
|
... | ... |
@@ -2305,7 +2312,7 @@ See L<DBIx::Custom::Model> to know model features. |
2305 | 2312 |
|
2306 | 2313 |
my $param = $dbi->merge_param({key1 => 1}, {key1 => 1, key2 => 2}); |
2307 | 2314 |
|
2308 |
-Merge paramters. |
|
2315 |
+Merge parameters. |
|
2309 | 2316 |
|
2310 | 2317 |
$param: |
2311 | 2318 |
|
... | ... |
@@ -1,5 +1,4 @@ |
1 | 1 |
package DBIx::Custom::Model; |
2 |
- |
|
3 | 2 |
use Object::Simple -base; |
4 | 3 |
|
5 | 4 |
use Carp 'croak'; |
... | ... |
@@ -9,9 +8,9 @@ use DBIx::Custom::Util '_subname'; |
9 | 8 |
push @DBIx::Custom::CARP_NOT, __PACKAGE__; |
10 | 9 |
|
11 | 10 |
has [qw/dbi table/], |
11 |
+ bind_type => sub { [] }, |
|
12 | 12 |
columns => sub { [] }, |
13 | 13 |
join => sub { [] }, |
14 |
- type => sub { [] }, |
|
15 | 14 |
primary_key => sub { [] }; |
16 | 15 |
|
17 | 16 |
our $AUTOLOAD; |
... | ... |
@@ -48,8 +47,9 @@ foreach my $method (@methods) { |
48 | 47 |
|
49 | 48 |
my @args = ( |
50 | 49 |
table => $self->table, |
51 |
- type => $self->type, |
|
52 |
- primary_key => $self->primary_key |
|
50 |
+ bind_type => $self->bind_type, |
|
51 |
+ primary_key => $self->primary_key, |
|
52 |
+ type => $self->type, # DEPRECATED! |
|
53 | 53 |
); |
54 | 54 |
push @args, (join => $self->join) if $method =~ /^select/; |
55 | 55 |
unshift @args, shift if @_ % 2; |
... | ... |
@@ -101,6 +101,7 @@ sub new { |
101 | 101 |
# DEPRECATED! |
102 | 102 |
has filter => sub { [] }; |
103 | 103 |
has 'name'; |
104 |
+has type => sub { [] }; |
|
104 | 105 |
|
105 | 106 |
1; |
106 | 107 |
|
... | ... |
@@ -119,43 +120,42 @@ my $table = DBIx::Custom::Model->new(table => 'books'); |
119 | 120 |
=head2 C<dbi> |
120 | 121 |
|
121 | 122 |
my $dbi = $model->dbi; |
122 |
- $model = $model->dbi($dbi); |
|
123 |
+ $model = $model->dbi($dbi); |
|
123 | 124 |
|
124 | 125 |
L<DBIx::Custom> object. |
125 | 126 |
|
126 | 127 |
=head2 C<join> |
127 | 128 |
|
128 | 129 |
my $join = $model->join; |
129 |
- $model = $model->join( |
|
130 |
+ $model = $model->join( |
|
130 | 131 |
['left outer join company on book.company_id = company.id'] |
131 | 132 |
); |
132 | 133 |
|
133 |
-Join clause, this is used as C<select()>'s C<join> option. |
|
134 |
+Join clause, this value is passed to C<select> method. |
|
134 | 135 |
|
135 | 136 |
=head2 C<primary_key> |
136 | 137 |
|
137 | 138 |
my $primary_key = $model->primary_key; |
138 |
- $model = $model->primary_key(['id', 'number']); |
|
139 |
+ $model = $model->primary_key(['id', 'number']); |
|
139 | 140 |
|
140 |
-Foreign key, this is used as C<primary_key> of C<insert_at>,C<update_at()>, |
|
141 |
-C<delete_at()>,C<select_at()>. |
|
141 |
+Primary key,this is passed to C<insert>, C<update>, |
|
142 |
+C<delete>, and C<select> method. |
|
142 | 143 |
|
143 | 144 |
=head2 C<table> |
144 | 145 |
|
145 | 146 |
my $table = $model->table; |
146 |
- $model = $model->table('book'); |
|
147 |
+ $model = $model->table('book'); |
|
147 | 148 |
|
148 |
-Table name, this is used as C<select()> C<table> option. |
|
149 |
-Generally, this is automatically set from class name. |
|
149 |
+Table name, this is passed to C<select> method. |
|
150 | 150 |
|
151 |
-=head2 C<type> |
|
151 |
+=head2 C<bind_type> |
|
152 | 152 |
|
153 |
- my $type = $model->type; |
|
154 |
- $model = $model->type(['image' => DBI::SQL_BLOB]); |
|
153 |
+ my $type = $model->bind_type; |
|
154 |
+ $model = $model->bind_type(['image' => DBI::SQL_BLOB]); |
|
155 | 155 |
|
156 |
-Database data type, this is used as type optioon of C<insert()>, C<insert_at()>, |
|
157 |
-C<update()>, C<update_at()>, C<update_all>, C<delete()>, C<delete_all()>, |
|
158 |
-C<select()>, C<select_at()> |
|
156 |
+Database data type, this is used as type optioon of C<insert>, |
|
157 |
+C<update>, C<update_all>, C<delete>, C<delete_all>, |
|
158 |
+C<select>, and C<execute> method |
|
159 | 159 |
|
160 | 160 |
=head1 METHODS |
161 | 161 |
|
... | ... |
@@ -167,21 +167,21 @@ and implements the following new ones. |
167 | 167 |
|
168 | 168 |
$table->delete(...); |
169 | 169 |
|
170 |
-Same as C<delete()> of L<DBIx::Custom> except that |
|
170 |
+Same as C<delete> of L<DBIx::Custom> except that |
|
171 | 171 |
you don't have to specify C<table> option. |
172 | 172 |
|
173 | 173 |
=head2 C<delete_all> |
174 | 174 |
|
175 | 175 |
$table->delete_all(...); |
176 | 176 |
|
177 |
-Same as C<delete_all()> of L<DBIx::Custom> except that |
|
177 |
+Same as C<delete_all> of L<DBIx::Custom> except that |
|
178 | 178 |
you don't have to specify C<table> option. |
179 | 179 |
|
180 | 180 |
=head2 C<insert> |
181 | 181 |
|
182 | 182 |
$table->insert(...); |
183 | 183 |
|
184 |
-Same as C<insert()> of L<DBIx::Custom> except that |
|
184 |
+Same as C<insert> of L<DBIx::Custom> except that |
|
185 | 185 |
you don't have to specify C<table> option. |
186 | 186 |
|
187 | 187 |
=head2 C<method> |
... | ... |
@@ -227,21 +227,21 @@ Create a L<DBIx::Custom::Table> object. |
227 | 227 |
|
228 | 228 |
$table->select(...); |
229 | 229 |
|
230 |
-Same as C<select()> of L<DBIx::Custom> except that |
|
230 |
+Same as C<select> of L<DBIx::Custom> except that |
|
231 | 231 |
you don't have to specify C<table> option. |
232 | 232 |
|
233 | 233 |
=head2 C<update> |
234 | 234 |
|
235 | 235 |
$table->update(...); |
236 | 236 |
|
237 |
-Same as C<update()> of L<DBIx::Custom> except that |
|
237 |
+Same as C<update> of L<DBIx::Custom> except that |
|
238 | 238 |
you don't have to specify C<table> option. |
239 | 239 |
|
240 | 240 |
=head2 C<update_all> |
241 | 241 |
|
242 | 242 |
$table->update_all(param => \%param); |
243 | 243 |
|
244 |
-Same as C<update_all()> of L<DBIx::Custom> except that |
|
244 |
+Same as C<update_all> of L<DBIx::Custom> except that |
|
245 | 245 |
you don't have to specify table name. |
246 | 246 |
|
247 | 247 |
=cut |
... | ... |
@@ -1,13 +1,11 @@ |
1 | 1 |
package DBIx::Custom::Where; |
2 |
- |
|
3 | 2 |
use Object::Simple -base; |
4 | 3 |
|
4 |
+use Carp 'croak'; |
|
5 |
+use DBIx::Custom::Util '_subname'; |
|
5 | 6 |
use overload 'bool' => sub {1}, fallback => 1; |
6 | 7 |
use overload '""' => sub { shift->to_string }, fallback => 1; |
7 | 8 |
|
8 |
-use DBIx::Custom::Util '_subname'; |
|
9 |
-use Carp 'croak'; |
|
10 |
- |
|
11 | 9 |
# Carp trust relationship |
12 | 10 |
push @DBIx::Custom::CARP_NOT, __PACKAGE__; |
13 | 11 |
|
... | ... |
@@ -102,12 +100,14 @@ sub _parse { |
102 | 100 |
croak qq{Each part contains one column name: "$clause" (} |
103 | 101 |
. _subname . ")"; |
104 | 102 |
} |
105 |
- |
|
103 |
+ |
|
104 |
+ # Remove quote |
|
106 | 105 |
my $column = $columns->[0]; |
107 | 106 |
if (my $q = $self->reserved_word_quote) { |
108 | 107 |
$column =~ s/$q//g; |
109 | 108 |
} |
110 | 109 |
|
110 |
+ # Check safety |
|
111 | 111 |
my $safety = $self->safety_character; |
112 | 112 |
croak qq{"$column" is not safety column name (} . _subname . ")" |
113 | 113 |
unless $column =~ /^[$safety\.]+$/; |
... | ... |
@@ -151,38 +151,51 @@ DBIx::Custom::Where - Where clause |
151 | 151 |
=head1 SYNOPSYS |
152 | 152 |
|
153 | 153 |
my $where = DBIx::Custom::Where->new; |
154 |
+ my $string_where = "$where"; |
|
154 | 155 |
|
155 | 156 |
=head1 ATTRIBUTES |
156 | 157 |
|
157 | 158 |
=head2 C<clause> |
158 | 159 |
|
159 |
- $where->clause( |
|
160 |
- ['and', '{= title}', ['or', '{< date}', '{> date}']] |
|
160 |
+ my $clause = $where->clause; |
|
161 |
+ $where = $where->clause( |
|
162 |
+ ['and', |
|
163 |
+ 'title = :title', |
|
164 |
+ ['or', 'date < :date', 'date > :date'] |
|
165 |
+ ] |
|
161 | 166 |
); |
162 | 167 |
|
163 | 168 |
Where clause. Above one is expanded to the following SQL by to_string |
164 | 169 |
If all parameter names is exists. |
165 | 170 |
|
166 |
- "where ( {= title} and ( {< date} or {> date} ) )" |
|
171 |
+ "where ( title = :title and ( date < :date or date > :date ) )" |
|
167 | 172 |
|
168 | 173 |
=head2 C<param> |
169 | 174 |
|
170 | 175 |
my $param = $where->param; |
171 |
- $where = $where->param({title => 'Perl', |
|
172 |
- date => ['2010-11-11', '2011-03-05']}, |
|
173 |
- name => ['Ken', 'Taro']); |
|
176 |
+ $where = $where->param({ |
|
177 |
+ title => 'Perl', |
|
178 |
+ date => ['2010-11-11', '2011-03-05'], |
|
179 |
+ }); |
|
174 | 180 |
|
175 | 181 |
=head2 C<safety_character> |
176 | 182 |
|
177 | 183 |
my $safety_character = $self->safety_character; |
178 |
- $dbi = $self->safety_character($name); |
|
184 |
+ $where = $self->safety_character("\w"); |
|
179 | 185 |
|
180 | 186 |
=head1 METHODS |
181 | 187 |
|
188 |
+L<DBIx::Custom::Where> inherits all methods from L<Object::Simple> |
|
189 |
+and implements the following new ones. |
|
190 |
+ |
|
182 | 191 |
=head2 C<to_string> |
183 | 192 |
|
184 | 193 |
$where->to_string; |
185 | 194 |
|
186 |
-Convert where clause to string correspoinding to param name. |
|
195 |
+Convert where clause to string. |
|
196 |
+ |
|
197 |
+double quote is override to execute C<to_string> method. |
|
198 |
+ |
|
199 |
+ my $string_where = "$where"; |
|
187 | 200 |
|
188 | 201 |
=cut |
... | ... |
@@ -2207,7 +2207,7 @@ $result = $model->select( |
2207 | 2207 |
is_deeply($result->one, |
2208 | 2208 |
{'table2_alias-key1' => 1, 'table2_alias-key3' => 4}); |
2209 | 2209 |
|
2210 |
-test 'type() option'; |
|
2210 |
+test 'type option'; # DEPRECATED! |
|
2211 | 2211 |
$dbi = DBIx::Custom->connect( |
2212 | 2212 |
data_source => 'dbi:SQLite:dbname=:memory:', |
2213 | 2213 |
dbi_option => { |
... | ... |
@@ -2232,6 +2232,50 @@ $result = $dbi->execute('select length(key1) as key1_length from table1'); |
2232 | 2232 |
$row = $result->one; |
2233 | 2233 |
is($row->{key1_length}, length $binary); |
2234 | 2234 |
|
2235 |
+ |
|
2236 |
+test 'bind_type option'; |
|
2237 |
+$dbi = DBIx::Custom->connect( |
|
2238 |
+ data_source => 'dbi:SQLite:dbname=:memory:', |
|
2239 |
+ dbi_option => { |
|
2240 |
+ $DBD::SQLite::VERSION > 1.26 ? (sqlite_unicode => 1) : (unicode => 1) |
|
2241 |
+ } |
|
2242 |
+); |
|
2243 |
+$binary = pack("I3", 1, 2, 3); |
|
2244 |
+$dbi->execute('create table table1(key1, key2)'); |
|
2245 |
+$dbi->insert(table => 'table1', param => {key1 => $binary, key2 => 'あ'}, bind_type => [key1 => DBI::SQL_BLOB]); |
|
2246 |
+$result = $dbi->select(table => 'table1'); |
|
2247 |
+$row = $result->one; |
|
2248 |
+is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
2249 |
+$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
2250 |
+$row = $result->one; |
|
2251 |
+is($row->{key1_length}, length $binary); |
|
2252 |
+ |
|
2253 |
+$dbi->insert(table => 'table1', param => {key1 => $binary, key2 => 'あ'}, bind_type => [['key1'] => DBI::SQL_BLOB]); |
|
2254 |
+$result = $dbi->select(table => 'table1'); |
|
2255 |
+$row = $result->one; |
|
2256 |
+is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
2257 |
+$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
2258 |
+$row = $result->one; |
|
2259 |
+is($row->{key1_length}, length $binary); |
|
2260 |
+ |
|
2261 |
+test 'model type attribute'; |
|
2262 |
+$dbi = DBIx::Custom->connect( |
|
2263 |
+ data_source => 'dbi:SQLite:dbname=:memory:', |
|
2264 |
+ dbi_option => { |
|
2265 |
+ $DBD::SQLite::VERSION > 1.26 ? (sqlite_unicode => 1) : (unicode => 1) |
|
2266 |
+ } |
|
2267 |
+); |
|
2268 |
+$binary = pack("I3", 1, 2, 3); |
|
2269 |
+$dbi->execute('create table table1(key1, key2)'); |
|
2270 |
+$model = $dbi->create_model(table => 'table1', bind_type => [key1 => DBI::SQL_BLOB]); |
|
2271 |
+$model->insert(param => {key1 => $binary, key2 => 'あ'}); |
|
2272 |
+$result = $dbi->select(table => 'table1'); |
|
2273 |
+$row = $result->one; |
|
2274 |
+is_deeply($row, {key1 => $binary, key2 => 'あ'}, "basic"); |
|
2275 |
+$result = $dbi->execute('select length(key1) as key1_length from table1'); |
|
2276 |
+$row = $result->one; |
|
2277 |
+is($row->{key1_length}, length $binary); |
|
2278 |
+ |
|
2235 | 2279 |
test 'create_model'; |
2236 | 2280 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
2237 | 2281 |
$dbi->execute($CREATE_TABLE->{0}); |