X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FDeploymentHandler%2FVersionHandler%2FExplicitVersions.pm;h=60b01ffdd01172dbac2b1cc6e461fc9dbd0b014f;hb=e52174e31b95fe335f6ab8cfdbf23cc2a0c05673;hp=62ba103102d452f0ae43ee99cf248c0923fac478;hpb=a3bc8ff9fe93d95c1151017eef8f44c69fe74c8d;p=dbsrgits%2FDBIx-Class-DeploymentHandler.git diff --git a/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm b/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm index 62ba103..60b01ff 100644 --- a/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm +++ b/lib/DBIx/Class/DeploymentHandler/VersionHandler/ExplicitVersions.pm @@ -1,6 +1,5 @@ package DBIx::Class::DeploymentHandler::VersionHandler::ExplicitVersions; use Moose; -use Method::Signatures::Simple; use Carp 'croak'; with 'DBIx::Class::DeploymentHandler::HandlesVersioning'; @@ -17,10 +16,9 @@ has database_version => ( required => 1, ); -has to_version => ( # configuration +has to_version => ( is => 'ro', - lazy_build => 1, # builder comes from another role... - # which is... probably not how we want it + lazy_build => 1, ); sub _build_to_version { $_[0]->schema_version } @@ -29,58 +27,80 @@ has ordered_versions => ( is => 'ro', isa => 'ArrayRef', required => 1, - trigger => sub { - my $to_version = $_[0]->to_version; - my $db_version = $_[0]->database_version; - - croak 'to_version not in ordered_versions' - unless grep { $to_version eq $_ } @{ $_[1] }; - - for (@{ $_[1] }) { - return if $_ eq $db_version; - croak 'to_version is before database version in ordered_versions' - if $_ eq $to_version; - } - }, ); +has _index_of_versions => ( + is => 'ro', + isa => 'HashRef', + lazy_build => 1, +); + +sub _build__index_of_versions { + my %ret; + my $i = 0; + for (@{ $_[0]->ordered_versions }) { + $ret{$_} = $i++; + } + \%ret; +} + has _version_idx => ( is => 'rw', isa => 'Int', lazy_build => 1, ); -method _inc_version_idx { $self->_version_idx($self->_version_idx + 1 ) } +sub _build__version_idx { $_[0]->_index_of_versions->{$_[0]->database_version} } -method _build__version_idx { - my $start = $self->database_version; - my $idx = 0; - for (@{$self->ordered_versions}) { - return $idx - if $_ eq $self->database_version; - $idx++; +sub _inc_version_idx { $_[0]->_version_idx($_[0]->_version_idx + 1 ) } +sub _dec_version_idx { $_[0]->_version_idx($_[0]->_version_idx - 1 ) } + + +sub next_version_set { + my $self = shift; + if ( + $self->_index_of_versions->{$self->to_version} < + $self->_version_idx + ) { + croak "you are trying to upgrade and your current version is greater\n". + "than the version you are trying to upgrade to. Either downgrade\n". + "or update your schema" + } elsif ( $self->_version_idx == $self->_index_of_versions->{$self->to_version}) { + return undef + } else { + my $next_idx = $self->_inc_version_idx; + return [ + $self->ordered_versions->[$next_idx - 1], + $self->ordered_versions->[$next_idx ], + ]; } - croak 'database version not found in ordered_versions!'; } -sub next_version_set { # sub instead of method because of when roles get composed +sub previous_version_set { my $self = shift; - return undef - if $self->ordered_versions->[$self->_version_idx] eq $self->to_version; - - my $next_idx = $self->_inc_version_idx; - return [ - $self->ordered_versions->[$next_idx - 1], - $self->ordered_versions->[$next_idx ], - ] if $next_idx <= $#{ $self->ordered_versions }; - - croak 'this should never happen'; + if ( + $self->_index_of_versions->{$self->to_version} > + $self->_version_idx + ) { + croak "you are trying to downgrade and your current version is less\n". + "than the version you are trying to downgrade to. Either upgrade\n". + "or update your schema" + } elsif ( $self->_version_idx == $self->_index_of_versions->{$self->to_version}) { + return undef + } else { + my $next_idx = $self->_dec_version_idx; + return [ + $self->ordered_versions->[$next_idx ], + $self->ordered_versions->[$next_idx + 1], + ]; + } } __PACKAGE__->meta->make_immutable; 1; +# vim: ts=2 sw=2 expandtab + __END__ -vim: ts=2 sw=2 expandtab