| ... | ... |
@@ -52,13 +52,13 @@ sub clone {
|
| 52 | 52 |
# Attribute |
| 53 | 53 |
sub connect_info : Attr { type => 'hash', auto_build => sub { shift->connect_info({}) } }
|
| 54 | 54 |
|
| 55 |
-sub bind_filter : Attr {}
|
|
| 55 |
+sub bind_filter : Attr {}
|
|
| 56 | 56 |
sub fetch_filter : Attr {}
|
| 57 | 57 |
|
| 58 | 58 |
sub filters : Attr { type => 'hash', deref => 1, auto_build => sub { shift->filters({}) } }
|
| 59 | 59 |
sub add_filter { shift->filters(@_) }
|
| 60 |
-sub result_class : Attr { default => 'DBI::Custom::Result' }
|
|
| 61 | 60 |
|
| 61 |
+sub result_class : Attr { auto_build => sub { shift->result_class('DBI::Custom::Result') }}
|
|
| 62 | 62 |
sub dbh : Attr { auto_build => sub { shift->connect } }
|
| 63 | 63 |
sub sql_template : Attr { auto_build => sub { shift->sql_template(DBI::Custom::SQLTemplate->new) } }
|
| 64 | 64 |
|
| ... | ... |
@@ -87,20 +87,25 @@ sub connect {
|
| 87 | 87 |
} |
| 88 | 88 |
); |
| 89 | 89 |
|
| 90 |
- $self->auto_commit($self->dbh->{AutoCommit});
|
|
| 90 |
+ $self->auto_commit($dbh->{AutoCommit});
|
|
| 91 | 91 |
$self->dbh($dbh); |
| 92 | 92 |
} |
| 93 | 93 |
|
| 94 |
+sub DESTROY {
|
|
| 95 |
+ my $self = shift; |
|
| 96 |
+ $self->disconnect; |
|
| 97 |
+} |
|
| 98 |
+ |
|
| 94 | 99 |
# Is connected? |
| 95 | 100 |
sub connected {
|
| 96 | 101 |
my $self = shift; |
| 97 |
- return exists $sefl->{dbh};
|
|
| 102 |
+ return exists $self->{dbh} && eval {$self->dbh->can('prepare')};
|
|
| 98 | 103 |
} |
| 99 | 104 |
|
| 100 | 105 |
# Disconnect |
| 101 | 106 |
sub disconnect {
|
| 102 | 107 |
my $self = shift; |
| 103 |
- if ($self->conneced) {
|
|
| 108 |
+ if ($self->connected) {
|
|
| 104 | 109 |
$self->dbh->disconnect; |
| 105 | 110 |
delete $self->{dbh};
|
| 106 | 111 |
} |
| ... | ... |
@@ -109,10 +114,21 @@ sub disconnect {
|
| 109 | 114 |
# Reconnect |
| 110 | 115 |
sub reconnect {
|
| 111 | 116 |
my $self = shift; |
| 112 |
- $sefl->disconnect if $self->connected; |
|
| 117 |
+ $self->disconnect if $self->connected; |
|
| 113 | 118 |
$self->connect; |
| 114 | 119 |
} |
| 115 | 120 |
|
| 121 |
+sub dbh_option {
|
|
| 122 |
+ my $self = shift; |
|
| 123 |
+ croak("Not connected") unless $self->connected;
|
|
| 124 |
+ my $dbh = $self->dbh; |
|
| 125 |
+ if (@_ > 1) {
|
|
| 126 |
+ $dbh->{$_[0]} = $_[1];
|
|
| 127 |
+ return $self; |
|
| 128 |
+ } |
|
| 129 |
+ return $dbh->{$_[0]}
|
|
| 130 |
+} |
|
| 131 |
+ |
|
| 116 | 132 |
|
| 117 | 133 |
sub create_sql {
|
| 118 | 134 |
my $self = shift; |
| ... | ... |
@@ -125,11 +141,26 @@ sub create_sql {
|
| 125 | 141 |
sub query {
|
| 126 | 142 |
my ($self, $template, $values, $filter) = @_; |
| 127 | 143 |
|
| 144 |
+ my $sth_options; |
|
| 145 |
+ |
|
| 146 |
+ # Rearrange when argumets is hash referecne |
|
| 147 |
+ if (ref $template eq 'HASH') {
|
|
| 148 |
+ my $args = $template; |
|
| 149 |
+ ($template, $values, $filter, $sth_options) |
|
| 150 |
+ = @{$args}{qw/template values filter sth_options/};
|
|
| 151 |
+ } |
|
| 152 |
+ |
|
| 128 | 153 |
$filter ||= $self->bind_filter; |
| 129 | 154 |
|
| 130 | 155 |
my ($sql, @bind) = $self->create_sql($template, $values, $filter); |
| 131 |
- my ( |
|
| 132 | 156 |
my $sth = $self->dbh->prepare($sql); |
| 157 |
+ |
|
| 158 |
+ if ($sth_options) {
|
|
| 159 |
+ foreach my $key (keys %$sth_options) {
|
|
| 160 |
+ $sth->{$key} = $sth_options->{$key};
|
|
| 161 |
+ } |
|
| 162 |
+ } |
|
| 163 |
+ |
|
| 133 | 164 |
$sth->execute(@bind); |
| 134 | 165 |
|
| 135 | 166 |
# Select |
| ... | ... |
@@ -141,6 +172,7 @@ sub query {
|
| 141 | 172 |
return; |
| 142 | 173 |
} |
| 143 | 174 |
|
| 175 |
+ |
|
| 144 | 176 |
sub query_raw_sql {
|
| 145 | 177 |
my ($self, $sql, @bind) = @_; |
| 146 | 178 |
my $sth = $self->dbh->prepare($sql); |
| ... | ... |
@@ -148,7 +180,8 @@ sub query_raw_sql {
|
| 148 | 180 |
return $sth; |
| 149 | 181 |
} |
| 150 | 182 |
|
| 151 |
-sub auto_commit : Attr {
|
|
| 183 |
+sub auto_commit : Attr {}
|
|
| 184 |
+ |
|
| 152 | 185 |
|
| 153 | 186 |
Object::Simple->build_class; |
| 154 | 187 |
|
| ... | ... |
@@ -398,6 +431,18 @@ Version 0.0101 |
| 398 | 431 |
|
| 399 | 432 |
=head2 sql_template |
| 400 | 433 |
|
| 434 |
+=head2 auto_commit |
|
| 435 |
+ |
|
| 436 |
+=head2 connected |
|
| 437 |
+ |
|
| 438 |
+=head2 dbh_option |
|
| 439 |
+ |
|
| 440 |
+=head2 disconnect |
|
| 441 |
+ |
|
| 442 |
+=head2 reconnect |
|
| 443 |
+ |
|
| 444 |
+=head2 result_class |
|
| 445 |
+ |
|
| 401 | 446 |
=head1 AUTHOR |
| 402 | 447 |
|
| 403 | 448 |
Yuki Kimoto, C<< <kimoto.yuki at gmail.com> >> |
| ... | ... |
@@ -23,9 +23,12 @@ our ($U, $P, $D) = connect_info(); |
| 23 | 23 |
bind_filter => 'f', |
| 24 | 24 |
fetch_filter => 'g', |
| 25 | 25 |
dbh => 'e', |
| 26 |
+ result_class => 'g' |
|
| 26 | 27 |
); |
| 27 | 28 |
|
| 28 |
- is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}} ,filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g', dbh => 'e'}, 'new');
|
|
| 29 |
+ is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c',
|
|
| 30 |
+ options => {d => 1, e => 2}}, filters => {f => 3}, bind_filter => 'f',
|
|
| 31 |
+ fetch_filter => 'g', dbh => 'e', result_class => 'g'}, 'new'); |
|
| 29 | 32 |
|
| 30 | 33 |
isa_ok($dbi, 'DBI::Custom'); |
| 31 | 34 |
} |
| ... | ... |
@@ -65,9 +68,11 @@ our ($U, $P, $D) = connect_info(); |
| 65 | 68 |
}, |
| 66 | 69 |
bind_filter => 'fo', |
| 67 | 70 |
fetch_filter => 'go', |
| 71 |
+ result_class => 'ho' |
|
| 68 | 72 |
); |
| 69 | 73 |
|
| 70 |
- is_deeply($dbi,{connect_info => {user => 'ao', password => 'bo', data_source => 'co', options => {do => 10, eo => 20}} ,filters => {fo => 30}, bind_filter => 'fo', fetch_filter => 'go'}, 'new arguments');
|
|
| 74 |
+ is_deeply($dbi,{connect_info => {user => 'ao', password => 'bo', data_source => 'co', options => {do => 10, eo => 20}}
|
|
| 75 |
+ ,filters => {fo => 30}, bind_filter => 'fo', fetch_filter => 'go', result_class => 'ho'}, 'new arguments');
|
|
| 71 | 76 |
|
| 72 | 77 |
isa_ok($dbi, 'DBI::Custom::T1'); |
| 73 | 78 |
} |
| ... | ... |
@@ -75,7 +80,8 @@ our ($U, $P, $D) = connect_info(); |
| 75 | 80 |
{
|
| 76 | 81 |
my $dbi = DBI::Custom::T1->new; |
| 77 | 82 |
|
| 78 |
- is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}} ,filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g'}, 'new custom class');
|
|
| 83 |
+ is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}},
|
|
| 84 |
+ filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g', result_class => 'DBI::Custom::Result'}, 'new custom class');
|
|
| 79 | 85 |
|
| 80 | 86 |
isa_ok($dbi, 'DBI::Custom::T1'); |
| 81 | 87 |
|
| ... | ... |
@@ -89,7 +95,8 @@ our ($U, $P, $D) = connect_info(); |
| 89 | 95 |
{
|
| 90 | 96 |
my $dbi = DBI::Custom::T1_2->new; |
| 91 | 97 |
|
| 92 |
- is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}} ,filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g'}, 'new custom class inherit');
|
|
| 98 |
+ is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}},
|
|
| 99 |
+ filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g', result_class => 'DBI::Custom::Result'}, 'new custom class inherit');
|
|
| 93 | 100 |
|
| 94 | 101 |
isa_ok($dbi, 'DBI::Custom::T1_2'); |
| 95 | 102 |
} |
| ... | ... |
@@ -114,6 +121,8 @@ our ($U, $P, $D) = connect_info(); |
| 114 | 121 |
->bind_filter('fo')
|
| 115 | 122 |
->fetch_filter('go')
|
| 116 | 123 |
->dbh('eo')
|
| 124 |
+ ->result_class('ho');
|
|
| 125 |
+ |
|
| 117 | 126 |
}); |
| 118 | 127 |
|
| 119 | 128 |
} |
| ... | ... |
@@ -121,7 +130,8 @@ our ($U, $P, $D) = connect_info(); |
| 121 | 130 |
{
|
| 122 | 131 |
my $dbi = DBI::Custom::T1_3->new; |
| 123 | 132 |
|
| 124 |
- is_deeply($dbi,{connect_info => {user => 'ao', password => 'bo', data_source => 'co', options => {do => 10, eo => 20}} ,filters => {fo => 30}, bind_filter => 'fo', fetch_filter => 'go'}, 'new custom class');
|
|
| 133 |
+ is_deeply($dbi,{connect_info => {user => 'ao', password => 'bo', data_source => 'co', options => {do => 10, eo => 20}},
|
|
| 134 |
+ filters => {fo => 30}, bind_filter => 'fo', fetch_filter => 'go', result_class => 'ho'}, 'new custom class');
|
|
| 125 | 135 |
|
| 126 | 136 |
isa_ok($dbi, 'DBI::Custom::T1_3'); |
| 127 | 137 |
} |
| ... | ... |
@@ -140,9 +150,11 @@ our ($U, $P, $D) = connect_info(); |
| 140 | 150 |
bind_filter => 'f', |
| 141 | 151 |
fetch_filter => 'g', |
| 142 | 152 |
dbh => 'e', |
| 153 |
+ result_class => 'h' |
|
| 143 | 154 |
); |
| 144 | 155 |
|
| 145 |
- is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}} ,filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g', dbh => 'e'}, 'new');
|
|
| 156 |
+ is_deeply($dbi,{connect_info => {user => 'a', password => 'b', data_source => 'c', options => {d => 1, e => 2}},
|
|
| 157 |
+ filters => {f => 3}, bind_filter => 'f', fetch_filter => 'g', dbh => 'e', result_class => 'h'}, 'new');
|
|
| 146 | 158 |
|
| 147 | 159 |
isa_ok($dbi, 'DBI::Custom'); |
| 148 | 160 |
} |