DBIx-Deployer

 view release on metacpan or  search on metacpan

lib/DBIx/Deployer.pm  view on Meta::CPAN

use 5.14.2;
use Modern::Perl;
use Moops;


class DBIx::Deployer::Patch 1.2.3 {
    use Digest::MD5;
    use Term::ANSIColor qw(colored);
    use Data::Printer colored => 1;

    has deployed => ( is => 'rw', isa => Bool, default => 0 );
    has verified => ( is => 'rw', isa => Bool, default => 0 );
    has name => ( is => 'ro', isa => Str, required => true );
    has supports_transactions => ( is => 'ro', isa => Bool, default => true );
    has dependencies => ( is => 'ro', isa => Maybe[ArrayRef] );
    has deploy_sql => ( is => 'ro', isa => Maybe[Str] );
    has deploy_sql_args => ( is => 'rw', isa => Maybe[ArrayRef] );
    has deploy_script => ( is => 'ro', isa => Maybe[Str] );
    has deploy_script_args => ( is => 'rw', isa => Maybe[ArrayRef] );
    has no_verify => ( is => 'ro', isa => Bool, default => false );
    has verify_sql => ( is => 'ro', isa => Str );
    has verify_sql_args => ( is => 'rw', isa => ArrayRef );
    has verify_expects => ( is => 'ro', isa => ArrayRef );
    has db => ( is => 'ro', isa => InstanceOf['DBI::db'], required => true );

    method deploy {
        if($self->deploy_sql && $self->deploy_script) {
            $self->handle_error('Patch cannot have both deploy_sql and deploy_script.');
        }
        elsif($self->deploy_sql) {
            if($self->deploy_sql_args){
              $self->db->do($self->deploy_sql, {}, @{ $self->deploy_sql_args })
                or $self->handle_error($self->db->errstr);
            }
            else{
              $self->db->do($self->deploy_sql) or $self->handle_error($self->db->errstr);
            }
        }
        elsif($self->deploy_script) {
            if( my $status = system $self->deploy_script, @{ $self->deploy_script_args || [] } ) {
                $self->handle_error("Exited with status $status.");
            } 
        }
        else {
            $self->handle_error('Patch has neither deploy_sql nor deploy_script.');
        }
    }

    before deploy {
        die colored(['red'], 'Patch "' . $self->name . '" is already deployed') if $self->deployed;
        if($self->supports_transactions && !$self->deploy_script){ $self->db->begin_work; }
    }

    after deploy {
        $self->deployed(1);
        $self->verify;
    }

    method verify {
        if($self->no_verify){
            $self->verified(1);
            return;
        }

        unless($self->verify_sql && @{ $self->verify_expects || [] }){
            $self->handle_error('Patch is missing verification attributes');
        }

        my $result;

        if($self->verify_sql_args){
            $result = $self->db->selectall_arrayref($self->verify_sql, {}, @{ $self->verify_sql_args })
              or $self->handle_error($self->db->errstr);
        }
        else{
            $result = $self->db->selectall_arrayref($self->verify_sql)
              or $self->handle_error($self->db->errstr);
        }

        $self->verified($self->_check_signature($result));
    }

    after verify {



( run in 1.440 second using v1.01-cache-2.11-cpan-437f7b0c052 )