DBIx-Class-StateMigrations

 view release on metacpan or  search on metacpan

lib/DBIx/Class/StateMigrations/Migration.pm  view on Meta::CPAN

package DBIx::Class::StateMigrations::Migration;

use strict;
use warnings;

# ABSTRACT: individual migration for a single version bump

use Moo;
use Types::Standard qw(:all);

use Scalar::Util 'blessed';
use Path::Class qw( file dir );
require Data::Dump;
require Module::Locate;
require Module::Runtime;
use Class::Inspector;
use Clone 'clone';
use Try::Tiny;

require DBIx::Class::StateMigrations;

use DBIx::Class::StateMigrations::Migration::Routine::PerlCode;
use DBIx::Class::StateMigrations::Migration::Routine::SQL;
use DBIx::Class::StateMigrations::Migration::Invalid;

our $LOADED_MIGRATION_SUBCLASSES = {};

sub BUILD {
  my $self = shift;
  
  my $name = $self->migration_name;
  
  die "invalid migration_name '$name' - can only contain alpha chars and underscore _" 
    unless($name =~ /^[a-zA-Z0-9\_]+$/);
  
  die "At least one trigger_SchemaState required" unless (
    scalar(@{ $self->trigger_SchemaStates }) > 0
  );
  
  $self->_validate_fingerprints;
}

sub invalid { 0 }

has 'migration_name', is => 'ro', lazy => 1, default => sub {
  my $self = shift;
  $self->_migration_name_from_classname
    ? $self->_migration_name_from_classname
    : join('_', 'sm', map { $_->fingerprint } @{ $self->trigger_SchemaStates })
}, isa => Str;

has 'trigger_SchemaStates', is => 'ro', required => 1, isa => ArrayRef[
  InstanceOf['DBIx::Class::StateMigrations::SchemaState']
];

has 'frozen_trigger_SchemaStates', is => 'ro', lazy => 1, default => sub {
  my $self = shift;
  clone( $self->trigger_SchemaStates )
}, isa => ArrayRef[InstanceOf['DBIx::Class::StateMigrations::SchemaState']];

has 'DBI_Driver_Name', is => 'ro', required => 1, isa => Str;

has 'completed_SchemaState', is => 'ro', isa => Maybe[
  InstanceOf['DBIx::Class::StateMigrations::SchemaState']
], default => sub { undef };

sub number_routines { scalar(@{ (shift)->Routines }) };

has 'Routines', is => 'ro', required => 1, lazy => 1, default => sub {
  my $self = shift;
  return [] unless ($self->is_migration_class && $self->directory);
  my $Dir = dir( $self->directory, 'routines' )->absolute;
  return [] unless (-d $Dir);
  
  my @routines = ();
  
  my @File_list = 
    sort { $a->basename cmp $b->basename }
    grep { ! $_->is_dir && -f $_ }
    $Dir->children;
  
  for my $File (@File_list) {

    if(my $ext = (reverse split(/\./,$File->basename))[0]) {
      if (lc($ext) eq 'pl') {
        push @routines, DBIx::Class::StateMigrations::Migration::Routine::PerlCode->new(
          file_path => $File->absolute->stringify,
          Migration => $self
        );
      }
      elsif (lc($ext) eq 'sql') {
        push @routines, DBIx::Class::StateMigrations::Migration::Routine::SQL->new(
          file_path => $File->absolute->stringify,
          Migration => $self
        );
      }
    }
  }
  
  return \@routines

}, isa => ArrayRef[InstanceOf['DBIx::Class::StateMigrations::Migration::Routine']];


sub routines_executed {
  my ($self, $set) = @_;
  $self->__routines_executed(1) if ($set && ! $self->__routines_executed);
  $self->__routines_executed
}
has '__routines_executed', is => 'rw', init_arg => undef, isa => Bool, default => sub { 0 };

sub execute_routines {



( run in 0.569 second using v1.01-cache-2.11-cpan-39bf76dae61 )