... | ... |
@@ -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 |
} |