... | ... |
@@ -61,7 +61,20 @@ sub add_filter { shift->filters(@_) } |
61 | 61 |
sub result_class : Attr { auto_build => sub { shift->result_class('DBI::Custom::Result') }} |
62 | 62 |
sub dbh : Attr {} |
63 | 63 |
sub sql_template : Attr { auto_build => sub { shift->sql_template(DBI::Custom::SQLTemplate->new) } } |
64 |
-sub auto_commit : Attr {} |
|
64 |
+ |
|
65 |
+# Auto commit |
|
66 |
+sub auto_commit { |
|
67 |
+ my $self = shift; |
|
68 |
+ |
|
69 |
+ croak("Cannot change AutoCommit becouse of not connected") |
|
70 |
+ unless $self->dbh; |
|
71 |
+ |
|
72 |
+ if (@_) { |
|
73 |
+ $self->dbh->{AutoCommit} = $_[0]; |
|
74 |
+ return $self; |
|
75 |
+ } |
|
76 |
+ return $self->dbh->{AutoCommit}; |
|
77 |
+} |
|
65 | 78 |
|
66 | 79 |
|
67 | 80 |
our %VALID_CONNECT_INFO = map {$_ => 1} qw/data_source user password options/; |
... | ... |
@@ -88,8 +101,8 @@ sub connect { |
88 | 101 |
} |
89 | 102 |
); |
90 | 103 |
|
91 |
- $self->auto_commit($dbh->{AutoCommit}); |
|
92 | 104 |
$self->dbh($dbh); |
105 |
+ return $self; |
|
93 | 106 |
} |
94 | 107 |
|
95 | 108 |
sub DESTROY { |
... | ... |
@@ -122,12 +135,14 @@ sub reconnect { |
122 | 135 |
# Commit |
123 | 136 |
sub commit { |
124 | 137 |
my $self = shift; |
138 |
+ croak("Connection is not established") unless $self->connected; |
|
125 | 139 |
return $self->dbh->commit; |
126 | 140 |
} |
127 | 141 |
|
128 | 142 |
# Rollback |
129 | 143 |
sub rollback { |
130 | 144 |
my $self = shift; |
145 |
+ croak("Connection is not established") unless $self->connected; |
|
131 | 146 |
return $self->dbh->rollback; |
132 | 147 |
} |
133 | 148 |
|
... | ... |
@@ -220,65 +235,59 @@ use Object::Simple; |
220 | 235 |
sub sth : Attr {} |
221 | 236 |
sub fetch_filter : Attr {} |
222 | 237 |
|
223 |
-sub fetchrow_arrayref { |
|
224 |
- my $self = shift; |
|
225 |
- my $sth = $self->{sth}; |
|
226 |
- |
|
227 |
- my $array = $sth->fetchrow_arrayref; |
|
238 |
+sub fetch { |
|
239 |
+ my ($self, $type) = @_; |
|
240 |
+ my $sth = $self->sth; |
|
241 |
+ $type ||= 'array'; |
|
228 | 242 |
|
229 |
- return $array unless $array; |
|
230 |
- |
|
231 |
- my $keys = $sth->{NAME_lc}; |
|
232 | 243 |
my $fetch_filter = $self->fetch_filter; |
233 |
- if ($fetch_filter) { |
|
234 |
- for (my $i = 0; $i < @$keys; $i++) { |
|
235 |
- $array->[$i] = $fetch_filter->($keys->[$i], $array->[$i]); |
|
244 |
+ if ($type eq 'hash') { |
|
245 |
+ my $hash = $sth->fetchrow_hashref; |
|
246 |
+ return unless $hash; |
|
247 |
+ if ($fetch_filter) { |
|
248 |
+ foreach my $key (keys %$hash) { |
|
249 |
+ $hash->{$key} = $fetch_filter->($key, $hash->{$key}); |
|
250 |
+ } |
|
236 | 251 |
} |
252 |
+ return wantarray ? %$hash : $hash; |
|
237 | 253 |
} |
238 |
- return $array; |
|
239 |
-} |
|
240 |
- |
|
241 |
-sub fetchrow_array { |
|
242 |
- my $self = shift; |
|
243 |
- my $sth = $self->{sth}; |
|
244 |
- |
|
245 |
- my @array = $sth->fetchrow_array; |
|
246 |
- |
|
247 |
- return unless @array; |
|
248 |
- |
|
249 |
- my $keys = $sth->{NAME_lc}; |
|
250 |
- |
|
251 |
- my $fetch_filter = $self->fetch_filter; |
|
252 |
- if ($fetch_filter) { |
|
253 |
- for (my $i = 0; $i < @$keys; $i++) { |
|
254 |
- $array[$i] = $fetch_filter->($keys->[$i], $array[$i]); |
|
254 |
+ else { |
|
255 |
+ my $array = $sth->fetchrow_arrayref; |
|
256 |
+ return unless $array; |
|
257 |
+ if ($fetch_filter) { |
|
258 |
+ my $keys = $sth->{NAME_lc}; |
|
259 |
+ for (my $i = 0; $i < @$keys; $i++) { |
|
260 |
+ $array->[$i] = $fetch_filter->($keys->[$i], $array->[$i]); |
|
261 |
+ } |
|
255 | 262 |
} |
263 |
+ return wantarray ? @$array : $array; |
|
256 | 264 |
} |
257 |
- return @array; |
|
258 | 265 |
} |
259 | 266 |
|
260 |
-sub fetchrow_hashref { |
|
261 |
- my $self = shift; |
|
262 |
- my $sth = $self->{sth}; |
|
267 |
+sub fetch_all { |
|
268 |
+ my ($self, $type) = @_; |
|
269 |
+ $type ||= 'array'; |
|
263 | 270 |
|
264 |
- my $hash = $sth->fetchrow_hashref; |
|
265 |
- |
|
266 |
- return unless $hash; |
|
267 |
- my $fetch_filter = $self->fetch_filter; |
|
268 |
- |
|
269 |
- if ($fetch_filter) { |
|
270 |
- foreach my $key (keys %$hash) { |
|
271 |
- $hash->{$key} = $fetch_filter->($key, $hash->{$key}); |
|
271 |
+ if ($type eq 'hash') { |
|
272 |
+ my $array_of_hash = []; |
|
273 |
+ while(my %hash = $self->fetch('hash')) { |
|
274 |
+ push @$array_of_hash, {%hash}; |
|
272 | 275 |
} |
276 |
+ return wantarray ? @$array_of_hash : $array_of_hash; |
|
277 |
+ } |
|
278 |
+ else { |
|
279 |
+ my $array_of_array = []; |
|
280 |
+ while(my %array = $self->fetch('hash')) { |
|
281 |
+ push @$array_of_array, {%array}; |
|
282 |
+ } |
|
283 |
+ return wantarray ? @$array_of_array : $array_of_array; |
|
273 | 284 |
} |
274 |
- return $hash; |
|
275 | 285 |
} |
276 | 286 |
|
277 | 287 |
sub err { shift->sth->err } |
278 | 288 |
sub errstr { shift->sth->errstr } |
279 |
-sub finish { shift->sth->finish } |
|
280 |
-sub rows { shift->sth->rows } |
|
281 | 289 |
sub state { shift->sth->state } |
290 |
+sub finish { shift->sth->finish } |
|
282 | 291 |
|
283 | 292 |
Object::Simple->build_class; |
284 | 293 |
|
... | ... |
@@ -31,7 +31,7 @@ $dbi->query_raw_sql("create table t1 (k1 char(10), k2 char(10))"); |
31 | 31 |
|
32 | 32 |
my $result = $dbi->query("select k1, k2 from t1"); |
33 | 33 |
|
34 |
- my $row = $result->fetchrow_arrayref; |
|
34 |
+ my $row = $result->fetch; |
|
35 | 35 |
my @values = @$row; |
36 | 36 |
$result->finish; |
37 | 37 |
|