X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated.pm;h=930a3be51e5d0928cd6bbc56a19f08e226afe869;hb=336feb8ef85d16d22ae0b131b0c7a85abc9e9435;hp=a5de335989593cb4b479a38cd55e2aa4b36c7a74;hpb=e666c5fd810f9103a8e2ae1994e45828169e703d;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated.pm b/lib/DBIx/Class/Storage/DBI/Replicated.pm index a5de335..930a3be 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated.pm @@ -15,7 +15,7 @@ use DBIx::Class::Storage::DBI::Replicated::Types qw/BalancerClassNamePart DBICSc use MooseX::Types::Moose qw/ClassName HashRef Object/; use Scalar::Util 'reftype'; use Hash::Merge; -use List::Util qw/min max/; +use List::Util qw/min max reduce/; use namespace::clean -except => 'meta'; @@ -306,8 +306,8 @@ has 'write_handler' => ( backup is_datatype_numeric + _supports_insert_returning _count_select - _subq_count_select _subq_update_delete svp_rollback svp_begin @@ -342,7 +342,6 @@ has 'write_handler' => ( _dbh_commit _execute_array _placeholders_supported - _verify_pid savepoints _sqlt_minimum_version _sql_maker_opts @@ -365,9 +364,24 @@ has 'write_handler' => ( _do_query _dbh_sth _dbh_execute + _prefetch_insert_auto_nextvals + _server_info_hash /], ); +my @unimplemented = qw( + _arm_global_destructor + _preserve_foreign_dbh + _verify_pid + _verify_tid +); + +for my $method (@unimplemented) { + __PACKAGE__->meta->add_method($method, sub { + croak "$method must not be called on ".(blessed shift).' objects'; + }); +} + has _master_connect_info_opts => (is => 'rw', isa => HashRef, default => sub { {} }); @@ -384,7 +398,7 @@ around connect_info => sub { my $wantarray = wantarray; - my $merge = Hash::Merge->new; + my $merge = Hash::Merge->new('LEFT_PRECEDENT'); my %opts; for my $arg (@$info) { @@ -555,7 +569,7 @@ around connect_replicants => sub { $self->throw_exception('too many hashrefs in connect_info') if @hashes > 2; - my $merge = Hash::Merge->new; + my $merge = Hash::Merge->new('LEFT_PRECEDENT'); my %opts = %{ $merge->merge(reverse @hashes) }; # delete them @@ -1006,6 +1020,36 @@ sub _ping { return min map $_->_ping, $self->all_storages; } +my $numify_ver = sub { + my $ver = shift; + my @numparts = split /\D+/, $ver; + my $format = '%d.' . (join '', ('%05d') x (@numparts - 1)); + + return sprintf $format, @numparts; +}; + +sub _server_info { + my $self = shift; + + if (not $self->_server_info_hash) { + my $min_version_info = ( + reduce { $a->[0] < $b->[0] ? $a : $b } + map [ $numify_ver->($_->{dbms_version}), $_ ], + map $_->_server_info, $self->all_storages + )->[1]; + + $self->_server_info_hash($min_version_info); # on master + } + + return $self->_server_info_hash; +} + +sub _get_server_version { + my $self = shift; + + return $self->_server_info->{dbms_version}; +} + =head1 GOTCHAS Due to the fact that replicants can lag behind a master, you must take care to