use Scalar::Util 'reftype';
use Hash::Merge;
use List::Util qw/min max reduce/;
+use Context::Preserve 'preserve_context';
use Try::Tiny;
-use namespace::clean;
use namespace::clean -except => 'meta';
+=encoding utf8
+
=head1 NAME
DBIx::Class::Storage::DBI::Replicated - BETA Replicated database support
_prep_for_execute
is_datatype_numeric
_count_select
- _subq_update_delete
svp_rollback
svp_begin
svp_release
_select_args
_dbh_execute_for_fetch
_sql_maker
- _per_row_update_delete
_dbh_execute_inserts_with_no_binds
_select_args_to_query
_gen_sql_bind
_svp_generate_name
- _multipk_update_delete
_normalize_connect_info
_parse_connect_do
savepoints
_dbh_details
_dbh_get_info
+ _determine_connector_driver
+ _describe_connection
+ _warn_undetermined_driver
+
sql_limit_dialect
sql_quote_char
sql_name_sep
_prefetch_autovalues
+ _perform_autoinc_retrieval
+ _autoinc_supplied_for_op
_resolve_bindattrs
_max_column_bytesize
_is_lob_type
_is_binary_lob_type
+ _is_binary_type
_is_text_lob_type
sth
$self->_master_connect_info_opts(\%opts);
- my @res;
- if (wantarray) {
- @res = $self->$next($info, @extra);
- } else {
- $res[0] = $self->$next($info, @extra);
- }
-
- # Make sure master is blessed into the correct class and apply role to it.
- my $master = $self->master;
- $master->_determine_driver;
- Moose::Meta::Class->initialize(ref $master);
-
- DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master);
+ return preserve_context {
+ $self->$next($info, @extra);
+ } after => sub {
+ # Make sure master is blessed into the correct class and apply role to it.
+ my $master = $self->master;
+ $master->_determine_driver;
+ Moose::Meta::Class->initialize(ref $master);
- # link pool back to master
- $self->pool->master($master);
+ DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master);
- wantarray ? @res : $res[0];
+ # link pool back to master
+ $self->pool->master($master);
+ };
};
=head1 METHODS
=cut
sub execute_reliably {
- my ($self, $coderef, @args) = @_;
+ my $self = shift;
+ my $coderef = shift;
unless( ref $coderef eq 'CODE') {
$self->throw_exception('Second argument must be a coderef');
}
- ##Get copy of master storage
- my $master = $self->master;
-
- ##Get whatever the current read hander is
- my $current = $self->read_handler;
-
- ##Set the read handler to master
- $self->read_handler($master);
+ ## replace the current read handler for the remainder of the scope
+ local $self->{read_handler} = $self->master;
- ## do whatever the caller needs
- my @result;
- my $want_array = wantarray;
-
- try {
- if($want_array) {
- @result = $coderef->(@args);
- } elsif(defined $want_array) {
- ($result[0]) = ($coderef->(@args));
- } else {
- $coderef->(@args);
- }
+ my $args = \@_;
+ return try {
+ $coderef->(@$args);
} catch {
$self->throw_exception("coderef returned an error: $_");
- } finally {
- ##Reset to the original state
- $self->read_handler($current);
};
-
- return wantarray ? @result : $result[0];
}
=head2 set_reliable_storage