... | ... |
@@ -9,3 +9,4 @@ blib/* |
9 | 9 |
*.tar.gz |
10 | 10 |
cover_db/* |
11 | 11 |
*.tmp |
12 |
+t/*.db |
... | ... |
@@ -1,3 +1,8 @@ |
1 |
+0.1612 |
|
2 |
+ add tests |
|
3 |
+ updated document |
|
4 |
+ removed DBIx::Custom::SQLite last_insert_rawid() mehtod(not backword compatible) |
|
5 |
+ removed DBIx::Custom::MySQL last_insert_id() method(not backword compatible) |
|
1 | 6 |
0.1611 |
2 | 7 |
renamed update tag to update_param |
3 | 8 |
renamed insert tag to insert_param |
... | ... |
@@ -13,3 +13,4 @@ |
13 | 13 |
\.gz$ |
14 | 14 |
^\.git |
15 | 15 |
^cover_db/ |
16 |
+\.db$ |
... | ... |
@@ -93,7 +93,7 @@ sub insert { |
93 | 93 |
|
94 | 94 |
# Check arguments |
95 | 95 |
foreach my $name (keys %args) { |
96 |
- croak qq{"$name" is invalid name} |
|
96 |
+ croak qq{"$name" is invalid argument} |
|
97 | 97 |
unless $VALID_INSERT_ARGS{$name}; |
98 | 98 |
} |
99 | 99 |
|
... | ... |
@@ -126,7 +126,7 @@ sub update { |
126 | 126 |
|
127 | 127 |
# Check arguments |
128 | 128 |
foreach my $name (keys %args) { |
129 |
- croak qq{"$name" is invalid name} |
|
129 |
+ croak qq{"$name" is invalid argument} |
|
130 | 130 |
unless $VALID_UPDATE_ARGS{$name}; |
131 | 131 |
} |
132 | 132 |
|
... | ... |
@@ -134,7 +134,7 @@ sub update { |
134 | 134 |
my $table = $args{table} || ''; |
135 | 135 |
my $param = $args{param} || {}; |
136 | 136 |
my $where = $args{where} || {}; |
137 |
- my $append_statement = $args{append} || ''; |
|
137 |
+ my $append = $args{append} || ''; |
|
138 | 138 |
my $filter = $args{filter}; |
139 | 139 |
my $allow_update_all = $args{allow_update_all}; |
140 | 140 |
|
... | ... |
@@ -145,7 +145,8 @@ sub update { |
145 | 145 |
my @where_keys = keys %$where; |
146 | 146 |
|
147 | 147 |
# Not exists where keys |
148 |
- croak qq{"where" must contain the pairs of column name and value} |
|
148 |
+ croak qq{"where" argument must be specified and } . |
|
149 |
+ qq{contains the pairs of column name and value} |
|
149 | 150 |
if !@where_keys && !$allow_update_all; |
150 | 151 |
|
151 | 152 |
# Update clause |
... | ... |
@@ -157,16 +158,13 @@ sub update { |
157 | 158 |
|
158 | 159 |
if (@where_keys) { |
159 | 160 |
$where_clause = 'where '; |
160 |
- foreach my $where_key (@where_keys) { |
|
161 |
- |
|
162 |
- $where_clause .= "{= $where_key} and "; |
|
163 |
- } |
|
161 |
+ $where_clause .= "{= $_} and " for @where_keys; |
|
164 | 162 |
$where_clause =~ s/ and $//; |
165 | 163 |
} |
166 | 164 |
|
167 |
- # Template for update |
|
165 |
+ # Source of SQL |
|
168 | 166 |
my $source = "update $table $update_clause $where_clause"; |
169 |
- $source .= " $append_statement" if $append_statement; |
|
167 |
+ $source .= " $append" if $append; |
|
170 | 168 |
|
171 | 169 |
# Rearrange parameters |
172 | 170 |
foreach my $wkey (@where_keys) { |
... | ... |
@@ -184,7 +182,7 @@ sub update { |
184 | 182 |
|
185 | 183 |
# Execute query |
186 | 184 |
my $ret_val = $self->execute($source, param => $param, |
187 |
- filter => $filter); |
|
185 |
+ filter => $filter); |
|
188 | 186 |
|
189 | 187 |
return $ret_val; |
190 | 188 |
} |
... | ... |
@@ -199,14 +197,14 @@ sub delete { |
199 | 197 |
|
200 | 198 |
# Check arguments |
201 | 199 |
foreach my $name (keys %args) { |
202 |
- croak qq{"$name" is invalid name} |
|
200 |
+ croak qq{"$name" is invalid argument} |
|
203 | 201 |
unless $VALID_DELETE_ARGS{$name}; |
204 | 202 |
} |
205 | 203 |
|
206 | 204 |
# Arguments |
207 | 205 |
my $table = $args{table} || ''; |
208 | 206 |
my $where = $args{where} || {}; |
209 |
- my $append_statement = $args{append}; |
|
207 |
+ my $append = $args{append}; |
|
210 | 208 |
my $filter = $args{filter}; |
211 | 209 |
my $allow_delete_all = $args{allow_delete_all}; |
212 | 210 |
|
... | ... |
@@ -214,26 +212,25 @@ sub delete { |
214 | 212 |
my @where_keys = keys %$where; |
215 | 213 |
|
216 | 214 |
# Not exists where keys |
217 |
- croak qq{Key-value pairs for where clause must be specified to "delete" second argument} |
|
215 |
+ croak qq{"where" argument must be specified and } . |
|
216 |
+ qq{contains the pairs of column name and value} |
|
218 | 217 |
if !@where_keys && !$allow_delete_all; |
219 | 218 |
|
220 | 219 |
# Where clause |
221 | 220 |
my $where_clause = ''; |
222 | 221 |
if (@where_keys) { |
223 | 222 |
$where_clause = 'where '; |
224 |
- foreach my $wkey (@where_keys) { |
|
225 |
- $where_clause .= "{= $wkey} and "; |
|
226 |
- } |
|
223 |
+ $where_clause .= "{= $_} and " for @where_keys; |
|
227 | 224 |
$where_clause =~ s/ and $//; |
228 | 225 |
} |
229 | 226 |
|
230 |
- # Template for delete |
|
227 |
+ # Source of SQL |
|
231 | 228 |
my $source = "delete from $table $where_clause"; |
232 |
- $source .= " $append_statement" if $append_statement; |
|
229 |
+ $source .= " $append" if $append; |
|
233 | 230 |
|
234 | 231 |
# Execute query |
235 | 232 |
my $ret_val = $self->execute($source, param => $where, |
236 |
- filter => $filter); |
|
233 |
+ filter => $filter); |
|
237 | 234 |
|
238 | 235 |
return $ret_val; |
239 | 236 |
} |
... | ... |
@@ -248,7 +245,7 @@ sub select { |
248 | 245 |
|
249 | 246 |
# Check arguments |
250 | 247 |
foreach my $name (keys %args) { |
251 |
- croak qq{"$name" is invalid name} |
|
248 |
+ croak qq{"$name" is invalid argument} |
|
252 | 249 |
unless $VALID_SELECT_ARGS{$name}; |
253 | 250 |
} |
254 | 251 |
|
... | ... |
@@ -261,7 +258,7 @@ sub select { |
261 | 258 |
my $append = $args{append}; |
262 | 259 |
my $filter = $args{filter}; |
263 | 260 |
|
264 |
- # SQL template for select statement |
|
261 |
+ # Source of SQL |
|
265 | 262 |
my $source = 'select '; |
266 | 263 |
|
267 | 264 |
# Column clause |
... | ... |
@@ -342,9 +339,10 @@ sub create_query { |
342 | 339 |
my $builder = $self->query_builder; |
343 | 340 |
|
344 | 341 |
# Create query |
345 |
- $query = eval{$builder->build_query($source)}; |
|
346 |
- croak $@ if $@; |
|
347 |
- |
|
342 |
+ { |
|
343 |
+ local $Carp::CarpLevel += 1; |
|
344 |
+ $query = $builder->build_query($source); |
|
345 |
+ } |
|
348 | 346 |
# Cache query |
349 | 347 |
$self->cache_method->($self, $source, |
350 | 348 |
{sql => $query->sql, |
... | ... |
@@ -353,8 +351,13 @@ sub create_query { |
353 | 351 |
} |
354 | 352 |
|
355 | 353 |
# Prepare statement handle |
356 |
- my $sth = eval {$self->dbh->prepare($query->{sql})}; |
|
357 |
- croak qq{$@ SQL: "$query->{sql}"} if $@; |
|
354 |
+ my $sth; |
|
355 |
+ eval { $sth = $self->dbh->prepare($query->{sql})}; |
|
356 |
+ if ($@) { |
|
357 |
+ my $error = $@; |
|
358 |
+ $error =~ s/\s+at\s+.*?\s+line\s+\d+.*$//s; |
|
359 |
+ croak qq{$error. SQL: "$query->{sql}"}; |
|
360 |
+ } |
|
358 | 361 |
|
359 | 362 |
# Set statement handle |
360 | 363 |
$query->sth($sth); |
... | ... |
@@ -369,13 +372,13 @@ sub execute{ |
369 | 372 |
|
370 | 373 |
# Check arguments |
371 | 374 |
foreach my $name (keys %args) { |
372 |
- croak qq{"$name" is invalid name} |
|
375 |
+ croak qq{"$name" is invalid argument} |
|
373 | 376 |
unless $VALID_EXECUTE_ARGS{$name}; |
374 | 377 |
} |
375 | 378 |
|
376 | 379 |
my $params = $args{param} || {}; |
377 | 380 |
|
378 |
- # First argument is SQL template |
|
381 |
+ # First argument is the soruce of SQL |
|
379 | 382 |
$query = $self->create_query($query) |
380 | 383 |
unless ref $query; |
381 | 384 |
|
... | ... |
@@ -386,8 +389,13 @@ sub execute{ |
386 | 389 |
|
387 | 390 |
# Execute |
388 | 391 |
my $sth = $query->sth; |
389 |
- my $affected = eval {$sth->execute(@$bind_values)}; |
|
390 |
- croak $@ if $@; |
|
392 |
+ my $affected; |
|
393 |
+ eval {$affected = $sth->execute(@$bind_values)}; |
|
394 |
+ if ($@) { |
|
395 |
+ my $error = $@; |
|
396 |
+ $error =~ s/\s+at\s+.*?\s+line\s+\d+.*$//s; |
|
397 |
+ croak $error; |
|
398 |
+ } |
|
391 | 399 |
|
392 | 400 |
# Return resultset if select statement is executed |
393 | 401 |
if ($sth->{NUM_OF_FIELDS}) { |
... | ... |
@@ -426,31 +434,14 @@ sub _build_bind_values { |
426 | 434 |
my $count = {}; |
427 | 435 |
foreach my $column (@{$query->columns}) { |
428 | 436 |
|
429 |
- croak qq{"$column" is not exists in params} |
|
430 |
- unless exists $params->{$column}; |
|
431 |
- |
|
432 | 437 |
# Value |
433 | 438 |
my $value = ref $params->{$column} eq 'ARRAY' |
434 | 439 |
? $params->{$column}->[$count->{$column} || 0] |
435 | 440 |
: $params->{$column}; |
436 | 441 |
|
437 |
- # Filter name |
|
442 |
+ # Filtering |
|
438 | 443 |
my $fname = $filter->{$column} || $self->default_bind_filter || ''; |
439 |
- |
|
440 |
- my $filter_func; |
|
441 |
- if ($fname) { |
|
442 |
- |
|
443 |
- if (ref $fname eq 'CODE') { |
|
444 |
- $filter_func = $fname; |
|
445 |
- } |
|
446 |
- else { |
|
447 |
- my $filters = $self->filters; |
|
448 |
- croak qq{Not exists filter "$fname"} |
|
449 |
- unless exists $filters->{$fname}; |
|
450 |
- $filter_func = $filters->{$fname}; |
|
451 |
- } |
|
452 |
- } |
|
453 |
- |
|
444 |
+ my $filter_func = $fname ? $self->filters->{$fname} : undef; |
|
454 | 445 |
push @bind_values, $filter_func |
455 | 446 |
? $filter_func->($value) |
456 | 447 |
: $value; |
... | ... |
@@ -489,7 +480,7 @@ DBIx::Custom - DBI interface, having hash parameter binding and filtering system |
489 | 480 |
|
490 | 481 |
=cut |
491 | 482 |
|
492 |
-our $VERSION = '0.1611'; |
|
483 |
+our $VERSION = '0.1612'; |
|
493 | 484 |
|
494 | 485 |
=head1 STABILITY |
495 | 486 |
|
... | ... |
@@ -28,8 +28,6 @@ sub connect { |
28 | 28 |
return $self->SUPER::connect; |
29 | 29 |
} |
30 | 30 |
|
31 |
-sub last_insert_id { shift->dbh->{mysql_insertid} } |
|
32 |
- |
|
33 | 31 |
1; |
34 | 32 |
|
35 | 33 |
=head1 NAME |
... | ... |
@@ -100,11 +98,4 @@ This method overrides C<DBIx::Custom::connect()> method. |
100 | 98 |
You can specify all attributes of L<DBIx::Custom> |
101 | 99 |
and L<DBIx::Custom::MySQL>, such as C<database>, C<host>, C<port>. |
102 | 100 |
|
103 |
-=head2 C<last_insert_id> |
|
104 |
- |
|
105 |
- my $last_insert_id = $dbi->last_insert_id; |
|
106 |
- |
|
107 |
-Get last insert id. |
|
108 |
-This is same as C<last_insert_id()> function in MySQL. |
|
109 |
- |
|
110 | 101 |
=cut |
... | ... |
@@ -137,7 +137,11 @@ sub _build_query { |
137 | 137 |
unless ref $tag_processor eq 'CODE'; |
138 | 138 |
|
139 | 139 |
# Execute tag processor |
140 |
- my $r = $tag_processor->(@$tag_args); |
|
140 |
+ my $r; |
|
141 |
+ { |
|
142 |
+ local $Carp::CarpLevel += 1; |
|
143 |
+ $r = $tag_processor->(@$tag_args); |
|
144 |
+ } |
|
141 | 145 |
|
142 | 146 |
# Check tag processor return value |
143 | 147 |
croak qq{Tag processor "$tag_name" must return [STRING, ARRAY_REFERENCE]} |
... | ... |
@@ -27,7 +27,7 @@ sub expand_placeholder_tag { |
27 | 27 |
my $column = shift; |
28 | 28 |
|
29 | 29 |
# Check arguments |
30 |
- croak qq{Column must be specified in tag "{? }"} |
|
30 |
+ croak qq{Column name must be specified in tag "{? }"} |
|
31 | 31 |
unless $column; |
32 | 32 |
|
33 | 33 |
return ['?', [$column]]; |
... | ... |
@@ -14,8 +14,9 @@ sub connect { |
14 | 14 |
my $self = ref $proto ? $proto : $proto->new(@_); |
15 | 15 |
|
16 | 16 |
# Data source |
17 |
- if (!$self->data_source && (my $database = $self->database)) { |
|
18 |
- $self->data_source("dbi:SQLite:dbname=$database"); |
|
17 |
+ my $database = $self->database; |
|
18 |
+ if (!$self->data_source && $database) { |
|
19 |
+ $self->data_source("dbi:SQLite:dbname=$database") |
|
19 | 20 |
} |
20 | 21 |
|
21 | 22 |
return $self->SUPER::connect; |
... | ... |
@@ -33,8 +34,6 @@ sub connect_memory { |
33 | 34 |
return $self; |
34 | 35 |
} |
35 | 36 |
|
36 |
-sub last_insert_rowid { shift->dbh->func('last_insert_rowid') } |
|
37 |
- |
|
38 | 37 |
1; |
39 | 38 |
|
40 | 39 |
=head1 NAME |
... | ... |
@@ -88,11 +87,4 @@ and L<DBIx::Custom::SQLite>, such as C<database>. |
88 | 87 |
|
89 | 88 |
Create a new L<DBIx::Custom::SQLite> object and connect to the memory database. |
90 | 89 |
|
91 |
-=head2 C<last_insert_rowid> |
|
92 |
- |
|
93 |
- my $last_insert_rowid = $dbi->last_insert_rowid; |
|
94 |
- |
|
95 |
-Get last insert row id. |
|
96 |
-This is same as C<last_insert_rowid()> function in SQLite. |
|
97 |
- |
|
98 | 90 |
=cut |
... | ... |
@@ -28,7 +28,7 @@ my $CREATE_TABLE = { |
28 | 28 |
2 => 'create table table2 (key1 char(255), key3 char(255));' |
29 | 29 |
}; |
30 | 30 |
|
31 |
-my $SELECT_TMPLS = { |
|
31 |
+my $SELECT_SOURCES = { |
|
32 | 32 |
0 => 'select * from table1;' |
33 | 33 |
}; |
34 | 34 |
|
... | ... |
@@ -45,9 +45,9 @@ my $dbi; |
45 | 45 |
my $sth; |
46 | 46 |
my $source; |
47 | 47 |
my @sources; |
48 |
-my $select_tmpl; |
|
49 |
-my $insert_tmpl; |
|
50 |
-my $update_tmpl; |
|
48 |
+my $select_SOURCE; |
|
49 |
+my $insert_SOURCE; |
|
50 |
+my $update_SOURCE; |
|
51 | 51 |
my $params; |
52 | 52 |
my $sql; |
53 | 53 |
my $result; |
... | ... |
@@ -106,9 +106,9 @@ ok($ret_val, $test); |
106 | 106 |
test 'Direct query'; |
107 | 107 |
$dbi->execute($DROP_TABLE->{0}); |
108 | 108 |
$dbi->execute($CREATE_TABLE->{0}); |
109 |
-$insert_tmpl = "insert into table1 {insert_param key1 key2}"; |
|
110 |
-$dbi->execute($insert_tmpl, param => {key1 => 1, key2 => 2}); |
|
111 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
109 |
+$insert_SOURCE = "insert into table1 {insert_param key1 key2}"; |
|
110 |
+$dbi->execute($insert_SOURCE, param => {key1 => 1, key2 => 2}); |
|
111 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
112 | 112 |
$rows = $result->fetch_hash_all; |
113 | 113 |
is_deeply($rows, [{key1 => 1, key2 => 2}], $test); |
114 | 114 |
|
... | ... |
@@ -118,22 +118,22 @@ $dbi->execute($CREATE_TABLE->{0}); |
118 | 118 |
$dbi->register_filter(twice => sub { $_[0] * 2}, |
119 | 119 |
three_times => sub { $_[0] * 3}); |
120 | 120 |
|
121 |
-$insert_tmpl = "insert into table1 {insert_param key1 key2};"; |
|
122 |
-$insert_query = $dbi->create_query($insert_tmpl); |
|
121 |
+$insert_SOURCE = "insert into table1 {insert_param key1 key2};"; |
|
122 |
+$insert_query = $dbi->create_query($insert_SOURCE); |
|
123 | 123 |
$insert_query->filter({key1 => 'twice'}); |
124 | 124 |
$dbi->execute($insert_query, param => {key1 => 1, key2 => 2}); |
125 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
125 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
126 | 126 |
$rows = $result->filter({key2 => 'three_times'})->fetch_hash_all; |
127 | 127 |
is_deeply($rows, [{key1 => 2, key2 => 6}], "$test : filter fetch_filter"); |
128 | 128 |
$dbi->execute($DROP_TABLE->{0}); |
129 | 129 |
|
130 | 130 |
test 'Filter in'; |
131 | 131 |
$dbi->execute($CREATE_TABLE->{0}); |
132 |
-$insert_tmpl = "insert into table1 {insert_param key1 key2};"; |
|
133 |
-$insert_query = $dbi->create_query($insert_tmpl); |
|
132 |
+$insert_SOURCE = "insert into table1 {insert_param key1 key2};"; |
|
133 |
+$insert_query = $dbi->create_query($insert_SOURCE); |
|
134 | 134 |
$dbi->execute($insert_query, param => {key1 => 2, key2 => 4}); |
135 |
-$select_tmpl = "select * from table1 where {in table1.key1 2} and {in table1.key2 2}"; |
|
136 |
-$select_query = $dbi->create_query($select_tmpl); |
|
135 |
+$select_SOURCE = "select * from table1 where {in table1.key1 2} and {in table1.key2 2}"; |
|
136 |
+$select_query = $dbi->create_query($select_SOURCE); |
|
137 | 137 |
$select_query->filter({'table1.key1' => 'twice'}); |
138 | 138 |
$result = $dbi->execute($select_query, param => {'table1.key1' => [1,5], 'table1.key2' => [2,4]}); |
139 | 139 |
$rows = $result->fetch_hash_all; |
... | ... |
@@ -171,23 +171,23 @@ is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$te |
171 | 171 |
|
172 | 172 |
test 'DBIx::Custom::SQLTemplate insert tag'; |
173 | 173 |
$dbi->execute("delete from table1"); |
174 |
-$insert_tmpl = 'insert into table1 {insert_param key1 key2 key3 key4 key5}'; |
|
175 |
-$dbi->execute($insert_tmpl, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
174 |
+$insert_SOURCE = 'insert into table1 {insert_param key1 key2 key3 key4 key5}'; |
|
175 |
+$dbi->execute($insert_SOURCE, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
176 | 176 |
|
177 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
177 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
178 | 178 |
$rows = $result->fetch_hash_all; |
179 | 179 |
is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic"); |
180 | 180 |
|
181 | 181 |
test 'DBIx::Custom::SQLTemplate update tag'; |
182 | 182 |
$dbi->execute("delete from table1"); |
183 |
-$insert_tmpl = "insert into table1 {insert_param key1 key2 key3 key4 key5}"; |
|
184 |
-$dbi->execute($insert_tmpl, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
185 |
-$dbi->execute($insert_tmpl, param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
|
183 |
+$insert_SOURCE = "insert into table1 {insert_param key1 key2 key3 key4 key5}"; |
|
184 |
+$dbi->execute($insert_SOURCE, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
|
185 |
+$dbi->execute($insert_SOURCE, param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
|
186 | 186 |
|
187 |
-$update_tmpl = 'update table1 {update_param key1 key2 key3 key4} where {= key5}'; |
|
188 |
-$dbi->execute($update_tmpl, param => {key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5}); |
|
187 |
+$update_SOURCE = 'update table1 {update_param key1 key2 key3 key4} where {= key5}'; |
|
188 |
+$dbi->execute($update_SOURCE, param => {key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5}); |
|
189 | 189 |
|
190 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
190 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
191 | 191 |
$rows = $result->fetch_hash_all; |
192 | 192 |
is_deeply($rows, [{key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5}, |
193 | 193 |
{key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : basic"); |
... | ... |
@@ -205,7 +205,7 @@ $dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
205 | 205 |
$dbi->execute($CREATE_TABLE->{0}); |
206 | 206 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
207 | 207 |
$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4}); |
208 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
208 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
209 | 209 |
$rows = $result->fetch_hash_all; |
210 | 210 |
is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : basic"); |
211 | 211 |
|
... | ... |
@@ -216,7 +216,7 @@ $dbi->register_filter( |
216 | 216 |
); |
217 | 217 |
$dbi->default_bind_filter('twice'); |
218 | 218 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}, filter => {key1 => 'three_times'}); |
219 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
219 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
220 | 220 |
$rows = $result->fetch_hash_all; |
221 | 221 |
is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : filter"); |
222 | 222 |
$dbi->default_bind_filter(undef); |
... | ... |
@@ -228,7 +228,7 @@ $rows = $dbi->select(table => 'table1')->fetch_hash_all; |
228 | 228 |
is_deeply($rows, [{key1 => 1, key2 => 2}], 'insert append'); |
229 | 229 |
|
230 | 230 |
eval{$dbi->insert(table => 'table1', noexist => 1)}; |
231 |
-like($@, qr/noexist/, "$test: invalid name"); |
|
231 |
+like($@, qr/noexist/, "$test: invalid argument"); |
|
232 | 232 |
|
233 | 233 |
|
234 | 234 |
test 'update'; |
... | ... |
@@ -237,7 +237,7 @@ $dbi->execute($CREATE_TABLE->{1}); |
237 | 237 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
238 | 238 |
$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
239 | 239 |
$dbi->update(table => 'table1', param => {key2 => 11}, where => {key1 => 1}); |
240 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
240 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
241 | 241 |
$rows = $result->fetch_hash_all; |
242 | 242 |
is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 3, key4 => 4, key5 => 5}, |
243 | 243 |
{key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
... | ... |
@@ -247,19 +247,26 @@ $dbi->execute("delete from table1"); |
247 | 247 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
248 | 248 |
$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
249 | 249 |
$dbi->update(table => 'table1', param => {key2 => 12}, where => {key2 => 2, key3 => 3}); |
250 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
250 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
251 | 251 |
$rows = $result->fetch_hash_all; |
252 | 252 |
is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5}, |
253 | 253 |
{key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
254 | 254 |
"$test : update key same as search key"); |
255 | 255 |
|
256 |
+$dbi->update(table => 'table1', param => {key2 => [12]}, where => {key2 => 2, key3 => 3}); |
|
257 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
258 |
+$rows = $result->fetch_hash_all; |
|
259 |
+is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5}, |
|
260 |
+ {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
|
261 |
+ "$test : update key same as search key : param is array ref"); |
|
262 |
+ |
|
256 | 263 |
$dbi->execute("delete from table1"); |
257 | 264 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}); |
258 | 265 |
$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
259 | 266 |
$dbi->register_filter(twice => sub { $_[0] * 2 }); |
260 | 267 |
$dbi->update(table => 'table1', param => {key2 => 11}, where => {key1 => 1}, |
261 | 268 |
filter => {key2 => 'twice'}); |
262 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
269 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
263 | 270 |
$rows = $result->fetch_hash_all; |
264 | 271 |
is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5}, |
265 | 272 |
{key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
... | ... |
@@ -268,7 +275,7 @@ is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5}, |
268 | 275 |
$result = $dbi->update(table => 'table1', param => {key2 => 11}, where => {key1 => 1}, append => ' '); |
269 | 276 |
|
270 | 277 |
eval{$dbi->update(table => 'table1', noexist => 1)}; |
271 |
-like($@, qr/noexist/, "$test: invalid name"); |
|
278 |
+like($@, qr/noexist/, "$test: invalid argument"); |
|
272 | 279 |
|
273 | 280 |
eval{$dbi->update(table => 'table1')}; |
274 | 281 |
like($@, qr/where/, "$test: not contain where"); |
... | ... |
@@ -281,7 +288,7 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 |
281 | 288 |
$dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}); |
282 | 289 |
$dbi->register_filter(twice => sub { $_[0] * 2 }); |
283 | 290 |
$dbi->update_all(table => 'table1', param => {key2 => 10}, filter => {key2 => 'twice'}); |
284 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
291 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
285 | 292 |
$rows = $result->fetch_hash_all; |
286 | 293 |
is_deeply($rows, [{key1 => 1, key2 => 20, key3 => 3, key4 => 4, key5 => 5}, |
287 | 294 |
{key1 => 6, key2 => 20, key3 => 8, key4 => 9, key5 => 10}], |
... | ... |
@@ -294,7 +301,7 @@ $dbi->execute($CREATE_TABLE->{0}); |
294 | 301 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
295 | 302 |
$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4}); |
296 | 303 |
$dbi->delete(table => 'table1', where => {key1 => 1}); |
297 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
304 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
298 | 305 |
$rows = $result->fetch_hash_all; |
299 | 306 |
is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : basic"); |
300 | 307 |
|
... | ... |
@@ -303,7 +310,7 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
303 | 310 |
$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4}); |
304 | 311 |
$dbi->register_filter(twice => sub { $_[0] * 2 }); |
305 | 312 |
$dbi->delete(table => 'table1', where => {key2 => 1}, filter => {key2 => 'twice'}); |
306 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
313 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
307 | 314 |
$rows = $result->fetch_hash_all; |
308 | 315 |
is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : filter"); |
309 | 316 |
|
... | ... |
@@ -317,14 +324,14 @@ $rows = $dbi->select(table => 'table1')->fetch_hash_all; |
317 | 324 |
is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : delete multi key"); |
318 | 325 |
|
319 | 326 |
eval{$dbi->delete(table => 'table1', noexist => 1)}; |
320 |
-like($@, qr/noexist/, "$test: invalid name"); |
|
327 |
+like($@, qr/noexist/, "$test: invalid argument"); |
|
321 | 328 |
|
322 | 329 |
|
323 | 330 |
test 'delete error'; |
324 | 331 |
$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
325 | 332 |
$dbi->execute($CREATE_TABLE->{0}); |
326 | 333 |
eval{$dbi->delete(table => 'table1')}; |
327 |
-like($@, qr/Key-value pairs for where clause must be specified to "delete" second argument/, |
|
334 |
+like($@, qr/"where" argument must be specified and contains the pairs of column name and value/, |
|
328 | 335 |
"$test : where key-value pairs not specified"); |
329 | 336 |
|
330 | 337 |
test 'delete_all'; |
... | ... |
@@ -333,7 +340,7 @@ $dbi->execute($CREATE_TABLE->{0}); |
333 | 340 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
334 | 341 |
$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4}); |
335 | 342 |
$dbi->delete_all(table => 'table1'); |
336 |
-$result = $dbi->execute($SELECT_TMPLS->{0}); |
|
343 |
+$result = $dbi->execute($SELECT_SOURCES->{0}); |
|
337 | 344 |
$rows = $result->fetch_hash_all; |
338 | 345 |
is_deeply($rows, [], "$test : basic"); |
339 | 346 |
|
... | ... |
@@ -385,7 +392,7 @@ $rows = $dbi->select( |
385 | 392 |
is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}], "$test : relation : no exists where"); |
386 | 393 |
|
387 | 394 |
eval{$dbi->select(table => 'table1', noexist => 1)}; |
388 |
-like($@, qr/noexist/, "$test: invalid name"); |
|
395 |
+like($@, qr/noexist/, "$test: invalid argument"); |
|
389 | 396 |
|
390 | 397 |
|
391 | 398 |
test 'fetch filter'; |
... | ... |
@@ -530,3 +537,20 @@ eval{$dbi->select(table => 'table1', filter => {not_exists => 'encode_utf8'})}; |
530 | 537 |
like($@, qr/\QColumn name "not_exists" in bind filter is not found in paramters/, |
531 | 538 |
"$test : fetch_filter"); |
532 | 539 |
|
540 |
+test 'execute'; |
|
541 |
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0}); |
|
542 |
+$dbi->execute($CREATE_TABLE->{0}); |
|
543 |
+eval{$dbi->execute('select * frm table1')}; |
|
544 |
+like($@, qr/\Qselect * frm table1;/, "$test : fail prepare"); |
|
545 |
+ |
|
546 |
+eval{$dbi->execute('select * from table1', no_exists => 1)}; |
|
547 |
+like($@, qr/\Q"no_exists" is invalid argument/, "$test : invald SQL"); |
|
548 |
+ |
|
549 |
+$query = $dbi->create_query('select * from table1 where {= key1}'); |
|
550 |
+$dbi->dbh->disconnect; |
|
551 |
+eval{$dbi->execute($query, param => {key1 => {a => 1}})}; |
|
552 |
+ok($@, "$test: execute fail"); |
|
553 |
+ |
|
554 |
+eval{$dbi->create_query('select * from table1 where {0 key1}')}; |
|
555 |
+like($@, qr/\Q.t /, "$test : caller spec"); |
|
556 |
+ |
... | ... |
@@ -30,18 +30,17 @@ sub connect_info { |
30 | 30 |
} |
31 | 31 |
|
32 | 32 |
|
33 |
-# Constat variables for tests |
|
34 |
-my $CLASS = 'DBIx::Custom::MySQL'; |
|
35 |
- |
|
36 | 33 |
# Varialbes for tests |
37 | 34 |
my $dbi; |
35 |
+my $dbname; |
|
38 | 36 |
|
39 | 37 |
use DBIx::Custom::MySQL; |
40 | 38 |
|
41 | 39 |
test 'connect'; |
42 |
-$dbi = $CLASS->new(user => $USER, password => $PASSWORD, |
|
43 |
- database => $DATABASE); |
|
40 |
+$dbi = DBIx::Custom::MySQL->new(user => $USER, password => $PASSWORD, |
|
41 |
+ database => $DATABASE, host => 'localhost', port => '10000'); |
|
44 | 42 |
$dbi->connect; |
43 |
+like($dbi->data_source, qr/dbi:mysql:database=.*;host=localhost;port=10000;/, "$test : created data source"); |
|
45 | 44 |
is(ref $dbi->dbh, 'DBI::db', $test); |
46 | 45 |
|
47 | 46 |
test 'attributes'; |
... | ... |
@@ -84,6 +84,8 @@ isa_ok($ret_val, 'DBIx::Custom::QueryBuilder'); |
84 | 84 |
test "Tag processor error case"; |
85 | 85 |
$builder = DBIx::Custom::QueryBuilder->new; |
86 | 86 |
|
87 |
+eval{$builder->build_query('{? }')}; |
|
88 |
+like($@, qr/\QColumn name must be specified in tag "{? }"/, "$test : ? not arguments"); |
|
87 | 89 |
|
88 | 90 |
eval{$builder->build_query("{a }")}; |
89 | 91 |
like($@, qr/\QTag "a" in "{a }" is not registered/, "$test : tag_processor not exist"); |
... | ... |
@@ -44,7 +44,7 @@ $dbh->do("insert into table1 (key1, key2) values ('3', '4');"); |
44 | 44 |
|
45 | 45 |
$sql = "select key1, key2 from table1"; |
46 | 46 |
|
47 |
-test 'fetch scalar context'; |
|
47 |
+test 'fetch'; |
|
48 | 48 |
$result = query($dbh, $sql); |
49 | 49 |
@rows = (); |
50 | 50 |
while (my $row = $result->fetch) { |
... | ... |
@@ -53,7 +53,7 @@ while (my $row = $result->fetch) { |
53 | 53 |
is_deeply(\@rows, [[1, 2], [3, 4]], $test); |
54 | 54 |
|
55 | 55 |
|
56 |
-test 'fetch_hash scalar context'; |
|
56 |
+test 'fetch_hash'; |
|
57 | 57 |
$result = query($dbh, $sql); |
58 | 58 |
@rows = (); |
59 | 59 |
while (my $row = $result->fetch_hash) { |
... | ... |
@@ -77,6 +77,11 @@ is_deeply($row, {key1 => 1, key2 => 2}, "$test : row"); |
77 | 77 |
$row = $result->fetch_hash; |
78 | 78 |
ok(!$row, "$test : finished"); |
79 | 79 |
|
80 |
+$result = query($dbh, 'create table table2 (key1, key2);'); |
|
81 |
+$result = query($dbh, 'select * from table2'); |
|
82 |
+$row = $result->fetch_hash_first; |
|
83 |
+ok(!$row, "$test : no row fetch"); |
|
84 |
+ |
|
80 | 85 |
|
81 | 86 |
test 'fetch_multi'; |
82 | 87 |
$dbh->do("insert into table1 (key1, key2) values ('5', '6');"); |
... | ... |
@@ -51,13 +51,11 @@ ok(-f $db_file, "$test : database file"); |
51 | 51 |
$ret_val = $dbi->execute($CREATE_TABLE->{0}); |
52 | 52 |
ok(defined $ret_val, "$test : database"); |
53 | 53 |
$dbi->dbh->disconnect; |
54 |
+ |
|
54 | 55 |
unlink $db_file if -f $db_file; |
56 |
+$dbi = DBIx::Custom::SQLite->connect(database => $db_file); |
|
57 |
+ok($dbi, "$test : called from class name"); |
|
55 | 58 |
|
56 |
-test 'last_insert_rowid'; |
|
57 |
-$dbi = DBIx::Custom::SQLite->connect_memory; |
|
58 |
-$ret_val = $dbi->execute($CREATE_TABLE->{0}); |
|
59 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
60 |
-is($dbi->last_insert_rowid, 1, "$test: first"); |
|
61 |
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
|
62 |
-is($dbi->last_insert_rowid, 2, "$test: second"); |
|
63 |
-$dbi->dbh->disconnect; |
|
59 |
+unlink $db_file if -f $db_file; |
|
60 |
+$dbi = DBIx::Custom::SQLite->connect(data_source => "dbi:SQLite:dbname=$db_file"); |
|
61 |
+ok($dbi, "$test : specified data source"); |