- removed EXPERIMENTAL Prefork server safe implemen...
...tation, my implementation...
... | ... |
@@ -1,4 +1,6 @@ |
1 | 1 |
0.1672 |
2 |
+ - removed EXPERIMENTAL Prefork server safe implementation, my implementation is very buggy. |
|
3 |
+ - added EXPERIMETNAL connector() attribute. |
|
2 | 4 |
- change retern value to array refrence of EXPERIMENTAL replace() |
3 | 5 |
0,1671 |
4 | 6 |
- added environment variable DBIX_CUSTOM_DEBUG |
... | ... |
@@ -24,7 +24,7 @@ use constant DEBUG => $ENV{DBIX_CUSTOM_DEBUG} || 0; |
24 | 24 |
our @COMMON_ARGS = qw/table query filter type/; |
25 | 25 |
|
26 | 26 |
__PACKAGE__->attr( |
27 |
- [qw/data_source password pid user/], |
|
27 |
+ [qw/connector data_source password pid user/], |
|
28 | 28 |
cache => 0, |
29 | 29 |
cache_method => sub { |
30 | 30 |
sub { |
... | ... |
@@ -74,7 +74,7 @@ sub AUTOLOAD { |
74 | 74 |
if (my $method = $self->{_methods}->{$mname}) { |
75 | 75 |
return $self->$method(@_) |
76 | 76 |
} |
77 |
- elsif (my $dbh_method = $self->dbh->can($mname)) { |
|
77 |
+ elsif ($self->{dbh} && (my $dbh_method = $self->dbh->can($mname))) { |
|
78 | 78 |
$self->dbh->$dbh_method(@_); |
79 | 79 |
} |
80 | 80 |
else { |
... | ... |
@@ -166,11 +166,8 @@ sub column { |
166 | 166 |
sub connect { |
167 | 167 |
my $self = ref $_[0] ? shift : shift->new(@_);; |
168 | 168 |
|
169 |
- # Connect and get database handle |
|
170 |
- my $dbh = $self->_connect; |
|
171 |
- |
|
172 |
- # Set database handle |
|
173 |
- $self->dbh($dbh); |
|
169 |
+ # Connect |
|
170 |
+ $self->dbh; |
|
174 | 171 |
|
175 | 172 |
# Set process ID |
176 | 173 |
$self->pid($$); |
... | ... |
@@ -240,30 +237,15 @@ sub create_query { |
240 | 237 |
sub dbh { |
241 | 238 |
my $self = shift; |
242 | 239 |
|
243 |
- # Set |
|
244 |
- if (@_) { |
|
245 |
- $self->{dbh} = $_[0]; |
|
246 |
- return $self; |
|
247 |
- } |
|
248 |
- |
|
249 |
- # Get |
|
250 |
- else { |
|
251 |
- my $pid = $$; |
|
252 |
- |
|
253 |
- # Get database handle |
|
254 |
- if ($self->pid eq $pid) { |
|
255 |
- return $self->{dbh}; |
|
256 |
- } |
|
257 |
- |
|
258 |
- # Create new database handle in child process |
|
259 |
- else { |
|
260 |
- croak "Process is forked in transaction" |
|
261 |
- unless $self->{dbh}->{AutoCommit}; |
|
262 |
- $self->pid($pid); |
|
263 |
- $self->{dbh}->{InactiveDestroy} = 1; |
|
264 |
- return $self->{dbh} = $self->_connect; |
|
265 |
- } |
|
240 |
+ # From Connction manager |
|
241 |
+ if (my $connector = $self->connector) { |
|
242 |
+ croak "connector must have dbh() method" |
|
243 |
+ unless ref $connector && $connector->can('dbh'); |
|
244 |
+ |
|
245 |
+ return $connector->dbh; |
|
266 | 246 |
} |
247 |
+ |
|
248 |
+ return $self->{dbh} ||= $self->_connect; |
|
267 | 249 |
} |
268 | 250 |
|
269 | 251 |
our %DELETE_ARGS |
... | ... |
@@ -1541,6 +1523,26 @@ L<DBIx::Custom Wiki|https://github.com/yuki-kimoto/DBIx-Custom/wiki> |
1541 | 1523 |
|
1542 | 1524 |
=head1 ATTRIBUTES |
1543 | 1525 |
|
1526 |
+=head2 C<connector> EXPERIMENTAL |
|
1527 |
+ |
|
1528 |
+ my $connector = $dbi->connector; |
|
1529 |
+ $dbi = $dbi->connector(DBIx::Connector->new(...)); |
|
1530 |
+ |
|
1531 |
+Connection manager object. if connector is set, you can get C<dbh()> |
|
1532 |
+from connection manager. conection manager object must have dbh() mehtod. |
|
1533 |
+ |
|
1534 |
+This is L<DBIx::Connector> example. Please pass |
|
1535 |
+C<default_dbi_option> to L<DBIx::Connector>. |
|
1536 |
+ |
|
1537 |
+ my $connector = DBIx::Connector->new( |
|
1538 |
+ "dbi:mysql:database=$DATABASE", |
|
1539 |
+ $USER, |
|
1540 |
+ $PASSWORD, |
|
1541 |
+ DBIx::Custom->new->default_dbi_option |
|
1542 |
+ ); |
|
1543 |
+ |
|
1544 |
+ my $dbi = DBIx::Custom->new(connector => $connector); |
|
1545 |
+ |
|
1544 | 1546 |
=head2 C<data_source> |
1545 | 1547 |
|
1546 | 1548 |
my $data_source = $dbi->data_source; |
... | ... |
@@ -1732,11 +1734,9 @@ instead of other methods, such as C<insert>, C<update>. |
1732 | 1734 |
=head2 C<dbh> |
1733 | 1735 |
|
1734 | 1736 |
my $dbh = $dbi->dbh; |
1735 |
- $dbi = $dbi->dbh($dbh); |
|
1736 |
- |
|
1737 |
-Get and set database handle of L<DBI>. |
|
1738 | 1737 |
|
1739 |
-If process is spawn by forking, new connection is created automatically. |
|
1738 |
+Get L<DBI> database handle. if C<connector> is set, you can get |
|
1739 |
+database handle from C<connector>. |
|
1740 | 1740 |
|
1741 | 1741 |
=head2 C<each_column> |
1742 | 1742 |
|
... | ... |
@@ -36,7 +36,7 @@ sub AUTOLOAD { |
36 | 36 |
elsif (my $dbi_method = $self->dbi->can($mname)) { |
37 | 37 |
$self->dbi->$dbi_method(@_); |
38 | 38 |
} |
39 |
- elsif (my $dbh_method = $self->dbi->dbh->can($mname)) { |
|
39 |
+ elsif ($self->{dbh} && (my $dbh_method = $self->dbh->can($mname))) { |
|
40 | 40 |
$self->dbi->dbh->$dbh_method(@_); |
41 | 41 |
} |
42 | 42 |
else { |
... | ... |
@@ -97,12 +97,16 @@ is_deeply($rows, [{key1 => 1, key2 => 2}]); |
97 | 97 |
$dbi->delete_all(table => 'table1'); |
98 | 98 |
|
99 | 99 |
test 'fork'; |
100 |
+use DBIx::Connector; |
|
100 | 101 |
{ |
101 |
- $dbi = DBIx::Custom->connect( |
|
102 |
- data_source => "dbi:mysql:database=$DATABASE", |
|
103 |
- user => $USER, |
|
104 |
- password => $PASSWORD |
|
102 |
+ my $connector = DBIx::Connector->new( |
|
103 |
+ "dbi:mysql:database=$DATABASE", |
|
104 |
+ $USER, |
|
105 |
+ $PASSWORD, |
|
106 |
+ DBIx::Custom->new->default_dbi_option |
|
105 | 107 |
); |
108 |
+ |
|
109 |
+ $dbi = DBIx::Custom->new(connector => $connector); |
|
106 | 110 |
$dbi->delete_all(table => 'table1'); |
107 | 111 |
$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}); |
108 | 112 |
die "Can't fork" unless defined (my $pid = fork); |
... | ... |
@@ -119,23 +123,3 @@ test 'fork'; |
119 | 123 |
} |
120 | 124 |
} |
121 | 125 |
|
122 |
-test 'fork in transaction'; |
|
123 |
-{ |
|
124 |
- $dbi = DBIx::Custom->connect( |
|
125 |
- data_source => "dbi:mysql:database=$DATABASE", |
|
126 |
- user => $USER, |
|
127 |
- password => $PASSWORD |
|
128 |
- ); |
|
129 |
- |
|
130 |
- $dbi->begin_work; |
|
131 |
- die "Can't fork" unless defined (my $pid = fork); |
|
132 |
- |
|
133 |
- if ($pid) { |
|
134 |
- # Parent |
|
135 |
- } |
|
136 |
- else { |
|
137 |
- # Child |
|
138 |
- eval {$dbi->select(table => 'table1') }; |
|
139 |
- die "Not OK" unless $@ =~ /transaction/; |
|
140 |
- } |
|
141 |
-} |