Port to Moo
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / VersionHandler / ExplicitVersions.pm
CommitLineData
c703d15d 1package DBIx::Class::DeploymentHandler::VersionHandler::ExplicitVersions;
a976d6e4 2use Moo;
3use MooX::Types::MooseLike::Base qw(Str ArrayRef Int HashRef);
9deabd1f 4
5# ABSTRACT: Define your own list of versions to use for migrations
6
2c627d9e 7use Carp 'croak';
e70a1600 8
24794769 9with 'DBIx::Class::DeploymentHandler::HandlesVersioning';
2c627d9e 10
b539a216 11has schema_version => (
a976d6e4 12 isa => Str,
b539a216 13 is => 'ro',
14 required => 1,
15);
16
17has database_version => (
a976d6e4 18 isa => Str,
b539a216 19 is => 'ro',
20 required => 1,
21);
22
5232e8d0 23has to_version => (
b539a216 24 is => 'ro',
a976d6e4 25 isa => Str,
26 builder => '_build_to_version',
27 lazy => 1,
b539a216 28);
29
30sub _build_to_version { $_[0]->schema_version }
31
2c627d9e 32has ordered_versions => (
33 is => 'ro',
a976d6e4 34 isa => ArrayRef,
2c627d9e 35 required => 1,
2c627d9e 36);
37
8fdf6269 38has _index_of_versions => (
39 is => 'ro',
a976d6e4 40 isa => HashRef,
41 builder => '_build__index_of_versions',
42 lazy => 1,
8fdf6269 43);
44
45sub _build__index_of_versions {
46 my %ret;
47 my $i = 0;
48 for (@{ $_[0]->ordered_versions }) {
49 $ret{$_} = $i++;
50 }
51 \%ret;
52}
53
2c627d9e 54has _version_idx => (
55 is => 'rw',
a976d6e4 56 isa => Int,
57 builder => '_build__version_idx',
58 lazy => 1,
2c627d9e 59);
60
8fdf6269 61sub _build__version_idx { $_[0]->_index_of_versions->{$_[0]->database_version} }
62
58a5e27f 63sub _inc_version_idx { $_[0]->_version_idx($_[0]->_version_idx + 1 ) }
f344dd91 64sub _dec_version_idx { $_[0]->_version_idx($_[0]->_version_idx - 1 ) }
2c627d9e 65
2c627d9e 66
58a5e27f 67sub next_version_set {
24794769 68 my $self = shift;
8fdf6269 69 if (
70 $self->_index_of_versions->{$self->to_version} <
71 $self->_version_idx
72 ) {
73 croak "you are trying to upgrade and your current version is greater\n".
74 "than the version you are trying to upgrade to. Either downgrade\n".
75 "or update your schema"
76 } elsif ( $self->_version_idx == $self->_index_of_versions->{$self->to_version}) {
77 return undef
78 } else {
79 my $next_idx = $self->_inc_version_idx;
80 return [
81 $self->ordered_versions->[$next_idx - 1],
82 $self->ordered_versions->[$next_idx ],
83 ];
84 }
2c627d9e 85}
e70a1600 86
f344dd91 87sub previous_version_set {
88 my $self = shift;
8fdf6269 89 if (
90 $self->_index_of_versions->{$self->to_version} >
91 $self->_version_idx
92 ) {
93 croak "you are trying to downgrade and your current version is less\n".
94 "than the version you are trying to downgrade to. Either upgrade\n".
95 "or update your schema"
96 } elsif ( $self->_version_idx == $self->_index_of_versions->{$self->to_version}) {
97 return undef
98 } else {
99 my $next_idx = $self->_dec_version_idx;
100 return [
8fdf6269 101 $self->ordered_versions->[$next_idx + 1],
9b620a81 102 $self->ordered_versions->[$next_idx ],
8fdf6269 103 ];
104 }
f344dd91 105}
106
e70a1600 1071;
108
e52174e3 109# vim: ts=2 sw=2 expandtab
110
e70a1600 111__END__
112
ec167a97 113=head1 SEE ALSO
114
115This class is an implementation of
116L<DBIx::Class::DeploymentHandler::HandlesVersioning>. Pretty much all the
117documentation is there.