... | ... |
@@ -454,9 +454,11 @@ sub last_insert_id { |
454 | 454 |
|
455 | 455 |
# Insert |
456 | 456 |
sub insert { |
457 |
- my ($self, $table, $insert_params, $query_edit_cb) = @_; |
|
458 |
- $table ||= ''; |
|
459 |
- $insert_params ||= {}; |
|
457 |
+ my $self = shift; |
|
458 |
+ my $table = shift || ''; |
|
459 |
+ my $insert_params = shift || {}; |
|
460 |
+ my $append_statement = shift unless ref $_[0]; |
|
461 |
+ my $query_edit_cb = shift; |
|
460 | 462 |
|
461 | 463 |
# Insert keys |
462 | 464 |
my @insert_keys = keys %$insert_params; |
... | ... |
@@ -467,7 +469,7 @@ sub insert { |
467 | 469 |
|
468 | 470 |
# Templte for insert |
469 | 471 |
my $template = "insert into $table {insert " . join(' ', @insert_keys) . '}'; |
470 |
- |
|
472 |
+ $template .= " $append_statement" if $append_statement; |
|
471 | 473 |
# Create query |
472 | 474 |
my $query = $self->create_query($template); |
473 | 475 |
|
... | ... |
@@ -486,12 +488,13 @@ sub insert { |
486 | 488 |
|
487 | 489 |
# Update |
488 | 490 |
sub update { |
489 |
- my ($self, $table, $update_params, |
|
490 |
- $where_params, $query_edit_cb, $options) = @_; |
|
491 |
- |
|
492 |
- $table ||= ''; |
|
493 |
- $update_params ||= {}; |
|
494 |
- $where_params ||= {}; |
|
491 |
+ my $self = shift; |
|
492 |
+ my $table = shift || ''; |
|
493 |
+ my $update_params = shift || {}; |
|
494 |
+ my $where_params = shift || {}; |
|
495 |
+ my $append_statement = shift unless ref $_[0]; |
|
496 |
+ my $query_edit_cb = shift; |
|
497 |
+ my $options = shift; |
|
495 | 498 |
|
496 | 499 |
# Update keys |
497 | 500 |
my @update_keys = keys %$update_params; |
... | ... |
@@ -522,6 +525,7 @@ sub update { |
522 | 525 |
|
523 | 526 |
# Template for update |
524 | 527 |
my $template = "update $table $update_clause $where_clause"; |
528 |
+ $template .= " $append_statement" if $append_statement; |
|
525 | 529 |
|
526 | 530 |
# Create query |
527 | 531 |
my $query = $self->create_query($template); |
... | ... |
@@ -544,17 +548,25 @@ sub update { |
544 | 548 |
|
545 | 549 |
# Update all rows |
546 | 550 |
sub update_all { |
547 |
- my ($self, $table, $update_params, $query_edit_cb) = @_; |
|
548 |
- |
|
549 |
- return $self->update($table, $update_params, {}, $query_edit_cb, |
|
550 |
- {allow_update_all => 1}); |
|
551 |
+ my $self = shift; |
|
552 |
+ my $table = shift || ''; |
|
553 |
+ my $update_params = shift || {}; |
|
554 |
+ my $append_statement = shift unless ref $_[0]; |
|
555 |
+ my $query_edit_cb = shift; |
|
556 |
+ my $options = {allow_update_all => 1}; |
|
557 |
+ |
|
558 |
+ return $self->update($table, $update_params, {}, $append_statement, |
|
559 |
+ $query_edit_cb, $options); |
|
551 | 560 |
} |
552 | 561 |
|
553 | 562 |
# Delete |
554 | 563 |
sub delete { |
555 |
- my ($self, $table, $where_params, $query_edit_cb, $options) = @_; |
|
556 |
- $table ||= ''; |
|
557 |
- $where_params ||= {}; |
|
564 |
+ my $self = shift; |
|
565 |
+ my $table = shift || ''; |
|
566 |
+ my $where_params = shift || {}; |
|
567 |
+ my $append_statement = shift unless ref $_[0]; |
|
568 |
+ my $query_edit_cb = shift; |
|
569 |
+ my $options = shift; |
|
558 | 570 |
|
559 | 571 |
# Where keys |
560 | 572 |
my @where_keys = keys %$where_params; |
... | ... |
@@ -575,6 +587,7 @@ sub delete { |
575 | 587 |
|
576 | 588 |
# Template for delete |
577 | 589 |
my $template = "delete from $table $where_clause"; |
590 |
+ $template .= " $append_statement" if $append_statement; |
|
578 | 591 |
|
579 | 592 |
# Create query |
580 | 593 |
my $query = $self->create_query($template); |
... | ... |
@@ -594,8 +607,14 @@ sub delete { |
594 | 607 |
|
595 | 608 |
# Delete all rows |
596 | 609 |
sub delete_all { |
597 |
- my ($self, $table) = @_; |
|
598 |
- return $self->delete($table, {}, undef, {allow_delete_all => 1}); |
|
610 |
+ my $self = shift; |
|
611 |
+ my $table = shift || ''; |
|
612 |
+ my $append_statement = shift unless ref $_[0]; |
|
613 |
+ my $query_edit_cb = shift; |
|
614 |
+ my $options = {allow_delete_all => 1}; |
|
615 |
+ |
|
616 |
+ return $self->delete($table, {}, $append_statement, $query_edit_cb, |
|
617 |
+ $options); |
|
599 | 618 |
} |
600 | 619 |
|
601 | 620 |
sub _select_usage { return << 'EOS' } |
... | ... |
@@ -1,86 +0,0 @@ |
1 |
-package DBIx::Custom::DB2; |
|
2 |
-use base 'DBIx::Custom::Basic'; |
|
3 |
- |
|
4 |
-use warnings; |
|
5 |
-use strict; |
|
6 |
- |
|
7 |
-my $class = __PACKAGE__; |
|
8 |
- |
|
9 |
-$class->add_format( |
|
10 |
- datetime => $class->formats->{SQL99_datetime}, |
|
11 |
- date => $class->formats->{SQL99_date}, |
|
12 |
- time => $class->formats->{SQL99_time}, |
|
13 |
-); |
|
14 |
- |
|
15 |
- |
|
16 |
-sub connect { |
|
17 |
- my $self = shift; |
|
18 |
- |
|
19 |
- if (!$self->data_source && (my $database = $self->database)) { |
|
20 |
- $self->data_source("dbi:DB2:dbname=$database"); |
|
21 |
- } |
|
22 |
- |
|
23 |
- return $self->SUPER::connect; |
|
24 |
-} |
|
25 |
- |
|
26 |
-=head1 NAME |
|
27 |
- |
|
28 |
-DBIx::Custom::DB2 - DBIx::Custom DB2 implementation |
|
29 |
- |
|
30 |
-=head1 Version |
|
31 |
- |
|
32 |
-Version 0.0102 |
|
33 |
- |
|
34 |
-=head1 Synopsys |
|
35 |
- |
|
36 |
- # New |
|
37 |
- my $dbi = DBIx::Custom::DB2->new(user => 'taro', $password => 'kliej&@K', |
|
38 |
- database => 'sample_db'); |
|
39 |
- # Insert |
|
40 |
- $dbi->insert('books', {title => 'perl', author => 'taro'}); |
|
41 |
- |
|
42 |
- # Update |
|
43 |
- # same as 'update books set (title = 'aaa', author = 'ken') where id = 5; |
|
44 |
- $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5}); |
|
45 |
- |
|
46 |
- # Delete |
|
47 |
- $dbi->delete('books', {author => 'taro'}); |
|
48 |
- |
|
49 |
- # select * from books; |
|
50 |
- $dbi->select('books'); |
|
51 |
- |
|
52 |
- # select * from books where ahthor = 'taro'; |
|
53 |
- $dbi->select('books', {author => 'taro'}); |
|
54 |
- |
|
55 |
-=head1 See DBIx::Custom and DBI::Custom::Basic documentation |
|
56 |
- |
|
57 |
-This class is L<DBIx::Custom::Basic> subclass, |
|
58 |
-and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass. |
|
59 |
- |
|
60 |
-You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom> |
|
61 |
-Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation. |
|
62 |
- |
|
63 |
-=head1 Object methods |
|
64 |
- |
|
65 |
-=head2 connect |
|
66 |
- |
|
67 |
- This method override DBIx::Custom::connect |
|
68 |
- |
|
69 |
- If database attribute is set, automatically data source is created and connect |
|
70 |
- |
|
71 |
-=head1 Author |
|
72 |
- |
|
73 |
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >> |
|
74 |
- |
|
75 |
-Github L<http://github.com/yuki-kimoto> |
|
76 |
- |
|
77 |
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom> |
|
78 |
- |
|
79 |
-=head1 Copyright & license |
|
80 |
- |
|
81 |
-Copyright 2009 Yuki Kimoto, all rights reserved. |
|
82 |
- |
|
83 |
-This program is free software; you can redistribute it and/or modify it |
|
84 |
-under the same terms as Perl itself. |
|
85 |
- |
|
86 |
- |
... | ... |
@@ -1,60 +0,0 @@ |
1 |
-package DBIx::Custom::ODBC; |
|
2 |
-use base 'DBIx::Custom::Basic'; |
|
3 |
- |
|
4 |
-use warnings; |
|
5 |
-use strict; |
|
6 |
- |
|
7 |
-my $class = __PACKAGE__; |
|
8 |
- |
|
9 |
-sub connect { |
|
10 |
- my $self = shift; |
|
11 |
- |
|
12 |
- if (!$self->data_source && (my $database = $self->database)) { |
|
13 |
- $self->data_source("dbi:ODBC:dbname=$database"); |
|
14 |
- } |
|
15 |
- |
|
16 |
- return $self->SUPER::connect; |
|
17 |
-} |
|
18 |
- |
|
19 |
-=head1 NAME |
|
20 |
- |
|
21 |
-DBIx::Custom::ODBC - DBIx::Custom ODBC implementation |
|
22 |
- |
|
23 |
-=head1 Version |
|
24 |
- |
|
25 |
-Version 0.0102 |
|
26 |
- |
|
27 |
-=head1 Synopsys |
|
28 |
- |
|
29 |
-=head1 See DBIx::Custom and DBI::Custom::Basic documentation |
|
30 |
- |
|
31 |
-This class is L<DBIx::Custom::Basic> subclass, |
|
32 |
-and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass. |
|
33 |
- |
|
34 |
-You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom> |
|
35 |
-Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation. |
|
36 |
- |
|
37 |
-=head1 Object methods |
|
38 |
- |
|
39 |
-=head2 connect |
|
40 |
- |
|
41 |
- This method override DBIx::Custom::connect |
|
42 |
- |
|
43 |
- If database attribute is set, automatically data source is created and connect |
|
44 |
- |
|
45 |
-=head1 Author |
|
46 |
- |
|
47 |
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >> |
|
48 |
- |
|
49 |
-Github L<http://github.com/yuki-kimoto> |
|
50 |
- |
|
51 |
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom> |
|
52 |
- |
|
53 |
-=head1 Copyright & license |
|
54 |
- |
|
55 |
-Copyright 2009 Yuki Kimoto, all rights reserved. |
|
56 |
- |
|
57 |
-This program is free software; you can redistribute it and/or modify it |
|
58 |
-under the same terms as Perl itself. |
|
59 |
- |
|
60 |
- |
... | ... |
@@ -1,75 +0,0 @@ |
1 |
-package DBIx::Custom::Oracle; |
|
2 |
-use base 'DBIx::Custom::Basic'; |
|
3 |
- |
|
4 |
-use warnings; |
|
5 |
-use strict; |
|
6 |
- |
|
7 |
-my $class = __PACKAGE__; |
|
8 |
- |
|
9 |
-sub connect { |
|
10 |
- my $self = shift; |
|
11 |
- |
|
12 |
- if (!$self->data_source && (my $database = $self->database)) { |
|
13 |
- $self->data_source("dbi:Oracle:dbname=$database"); |
|
14 |
- } |
|
15 |
- |
|
16 |
- return $self->SUPER::connect; |
|
17 |
-} |
|
18 |
- |
|
19 |
-=head1 NAME |
|
20 |
- |
|
21 |
-DBIx::Custom::Oracle - DBIx::Custom Oracle implementation |
|
22 |
- |
|
23 |
-=head1 Synopsys |
|
24 |
- |
|
25 |
- # New |
|
26 |
- my $dbi = DBIx::Custom::Oracle->new(user => 'taro', $password => 'kliej&@K', |
|
27 |
- database => 'sample_db'); |
|
28 |
- # Insert |
|
29 |
- $dbi->insert('books', {title => 'perl', author => 'taro'}); |
|
30 |
- |
|
31 |
- # Update |
|
32 |
- # same as 'update books set (title = 'aaa', author = 'ken') where id = 5; |
|
33 |
- $dbi->update('books', {title => 'aaa', author => 'ken'}, {id => 5}); |
|
34 |
- |
|
35 |
- # Delete |
|
36 |
- $dbi->delete('books', {author => 'taro'}); |
|
37 |
- |
|
38 |
- # select * from books; |
|
39 |
- $dbi->select('books'); |
|
40 |
- |
|
41 |
- # select * from books where ahthor = 'taro'; |
|
42 |
- $dbi->select('books', {author => 'taro'}); |
|
43 |
- |
|
44 |
-=head1 See DBIx::Custom and DBI::Custom::Basic documentation |
|
45 |
- |
|
46 |
-This class is L<DBIx::Custom::Basic> subclass, |
|
47 |
-and L<DBIx::Custom::Basic> is L<DBIx::Custom> subclass. |
|
48 |
- |
|
49 |
-You can use all methods of L<DBIx::Custom::Basic> and <DBIx::Custom> |
|
50 |
-Please see L<DBIx::Custom::Basic> and <DBIx::Custom> documentation. |
|
51 |
- |
|
52 |
-=head1 Object methods |
|
53 |
- |
|
54 |
-=head2 connect |
|
55 |
- |
|
56 |
- This method override DBIx::Custom::connect |
|
57 |
- |
|
58 |
- If database attribute is set, automatically data source is created and connect |
|
59 |
- |
|
60 |
-=head1 Author |
|
61 |
- |
|
62 |
-Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >> |
|
63 |
- |
|
64 |
-Github L<http://github.com/yuki-kimoto> |
|
65 |
- |
|
66 |
-I develope this module L<http://github.com/yuki-kimoto/DBIx-Custom> |
|
67 |
- |
|
68 |
-=head1 Copyright & license |
|
69 |
- |
|
70 |
-Copyright 2009 Yuki Kimoto, all rights reserved. |
|
71 |
- |
|
72 |
-This program is free software; you can redistribute it and/or modify it |
|
73 |
-under the same terms as Perl itself. |
|
74 |
- |
|
75 |
- |
... | ... |
@@ -495,12 +495,17 @@ $result = $dbi->execute($SELECT_TMPL->{0}); |
495 | 495 |
$rows = $result->fetch_hash_all; |
496 | 496 |
is_deeply($rows, [{key1 => 3, key2 => 2}], "$test : edit_query_callback"); |
497 | 497 |
|
498 |
+$dbi->insert('table1', {key1 => 1, key2 => 2}, ' ', sub { |
|
499 |
+ my $query = shift; |
|
500 |
+ like($query->sql, qr/insert into table1 \(.+\) values \(\?, \?\) ;/, |
|
501 |
+ "$test: append statement"); |
|
502 |
+}); |
|
498 | 503 |
|
499 | 504 |
test 'insert error'; |
500 | 505 |
eval{$dbi->insert('table1')}; |
501 | 506 |
like($@, qr/Key-value pairs for insert must be specified to 'insert' second argument/, "$test : insert key-value not specifed"); |
502 | 507 |
|
503 |
-eval{$dbi->insert('table1', {key1 => 1, key2 => 2}, 'aaa')}; |
|
508 |
+eval{$dbi->insert('table1', {key1 => 1, key2 => 2}, '', 'aaa')}; |
|
504 | 509 |
like($@, qr/Query edit callback must be code reference/, "$test : query edit callback not code ref"); |
505 | 510 |
|
506 | 511 |
|
... | ... |
@@ -545,6 +550,12 @@ is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5}, |
545 | 550 |
{key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], |
546 | 551 |
"$test : query edit callback"); |
547 | 552 |
|
553 |
+$dbi->update('table1', {key2 => 11}, {key1 => 1}, ' ', sub { |
|
554 |
+ my $query = shift; |
|
555 |
+ is($query->sql, 'update table1 set key2 = ? where key1 = ? ;', |
|
556 |
+ "$test: append statement"); |
|
557 |
+}); |
|
558 |
+ |
|
548 | 559 |
|
549 | 560 |
test 'update error'; |
550 | 561 |
$dbi = DBIx::Custom->new($NEW_ARGS->{0}); |
... | ... |
@@ -557,7 +568,7 @@ eval{$dbi->update('table1', {key2 => 1})}; |
557 | 568 |
like($@, qr/Key-value pairs for where clause must be specified to 'update' third argument/, |
558 | 569 |
"$test : where key-value pairs not specified"); |
559 | 570 |
|
560 |
-eval{$dbi->update('table1', {key2 => 1}, {key2 => 3}, 'aaa')}; |
|
571 |
+eval{$dbi->update('table1', {key2 => 1}, {key2 => 3}, '', 'aaa')}; |
|
561 | 572 |
like($@, qr/Query edit callback must be code reference/, |
562 | 573 |
"$test : query edit callback not code reference"); |
563 | 574 |
|
... | ... |
@@ -605,6 +616,13 @@ $result = $dbi->execute($SELECT_TMPL->{0}); |
605 | 616 |
$rows = $result->fetch_hash_all; |
606 | 617 |
is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : query edit callback"); |
607 | 618 |
|
619 |
+$dbi->delete('table1', {key1 => 1}, ' ', sub { |
|
620 |
+ my $query = shift; |
|
621 |
+ is($query->sql, 'delete from table1 where key1 = ? ;', |
|
622 |
+ "$test: append statement"); |
|
623 |
+}); |
|
624 |
+ |
|
625 |
+ |
|
608 | 626 |
$dbi->delete_all('table1'); |
609 | 627 |
$dbi->insert('table1', {key1 => 1, key2 => 2}); |
610 | 628 |
$dbi->insert('table1', {key1 => 3, key2 => 4}); |
... | ... |
@@ -620,7 +638,7 @@ eval{$dbi->delete('table1')}; |
620 | 638 |
like($@, qr/Key-value pairs for where clause must be specified to 'delete' second argument/, |
621 | 639 |
"$test : where key-value pairs not specified"); |
622 | 640 |
|
623 |
-eval{$dbi->delete('table1', {key1 => 1}, 'aaa')}; |
|
641 |
+eval{$dbi->delete('table1', {key1 => 1}, '', 'aaa')}; |
|
624 | 642 |
like($@, qr/Query edit callback must be code reference/, |
625 | 643 |
"$test : query edit callback not code ref"); |
626 | 644 |
|