File Coverage

blib/lib/App/Schema/Deploy.pm
Criterion Covered Total %
statement 53 65 81.5
branch 11 22 50.0
condition 6 6 100.0
subroutine 7 7 100.0
pod 2 2 100.0
total 79 102 77.4


line stmt bran cond sub pod time code
1             package App::Schema::Deploy;
2              
3 4     4   165437 use strict;
  4         10  
  4         181  
4 4     4   22 use warnings;
  4         8  
  4         286  
5              
6 4     4   3656 use English;
  4         18461  
  4         27  
7 4     4   4687 use Error::Pure qw(err);
  4         41252  
  4         101  
8 4     4   2616 use Getopt::Std;
  4         10877  
  4         5921  
9              
10             our $VERSION = 0.05;
11              
12             # Constructor.
13             sub new {
14 6     6 1 751692 my ($class, @params) = @_;
15              
16             # Create object.
17 6         29 my $self = bless {}, $class;
18              
19             # Object.
20 6         81 return $self;
21             }
22              
23             # Run.
24             sub run {
25 5     5 1 16 my $self = shift;
26              
27             # Process arguments.
28 5         93 $self->{'_opts'} = {
29             'd' => 0,
30             'h' => 0,
31             'p' => '',
32             'q' => 0,
33             'u' => '',
34             'v' => undef,
35             };
36 5 100 100     53 if (! getopts('dhp:qu:v:', $self->{'_opts'})
      100        
37             || $self->{'_opts'}->{'h'}
38             || @ARGV < 2) {
39              
40 3         820 print STDERR "Usage: $0 [-d] [-h] [-p password] [-q] [-u user] [-v schema_version] ".
41             "[--version] dsn schema_module\n";
42 3         151 print STDERR "\t-d\t\t\tDrop tables.\n";
43 3         46 print STDERR "\t-h\t\t\tPrint help.\n";
44 3         43 print STDERR "\t-p password\t\tDatabase password.\n";
45 3         55 print STDERR "\t-q\t\t\tQuiet mode.\n";
46 3         142 print STDERR "\t-u user\t\t\tDatabase user.\n";
47 3         51 print STDERR "\t-v schema_version\tSchema version (default is ".
48             "latest version).\n";
49 3         40 print STDERR "\t--version\t\tPrint version.\n";
50 3         45 print STDERR "\tdsn\t\t\tDatabase DSN. e.g. dbi:SQLite:dbname=ex1.db\n";
51 3         131 print STDERR "\tschema_module\t\tName of Schema module.\n";
52 3         26 return 1;
53             }
54 2         146 $self->{'_dsn'} = shift @ARGV;
55 2         8 $self->{'_schema_module'} = shift @ARGV;
56              
57 2         265 eval "require $self->{'_schema_module'}";
58 2 100       17 if ($EVAL_ERROR) {
59             err 'Cannot load Schema module.',
60 1         13 'Module name', $self->{'_schema_module'},
61             'Error', $EVAL_ERROR,
62             ;
63             }
64              
65 1         3 my $schema_module;
66             my $schema_version;
67 1 50       17 if ($self->{'_schema_module'}->can('new')) {
68             my $versioned_schema = $self->{'_schema_module'}->new(
69             $self->{'_opts'}->{'v'} ? (
70 1 50       9 'version' => $self->{'_opts'}->{'v'},
71             ) : (),
72             );
73 1         215956 $schema_module = $versioned_schema->schema;
74 1         16 $schema_version = $versioned_schema->version;
75              
76             } else {
77 0         0 $schema_module = $self->{'_schema_module'};
78             }
79              
80 1         20 my $schema = eval {
81             $schema_module->connect($self->{'_dsn'},
82 1         14 $self->{'_opts'}->{'u'}, $self->{'_opts'}->{'p'}, {});
83             };
84 1 50       96163 if ($EVAL_ERROR) {
85 0         0 err 'Cannot connect to database.',
86             'Error', $EVAL_ERROR,
87             ;
88             }
89 1 50       15 if (! $schema->isa('DBIx::Class::Schema')) {
90 0         0 err "Instance of schema must be a 'DBIx::Class::Schema' object.",
91             'Reference', $schema->isa,
92             ;
93             }
94              
95             # Deploy.
96 1         4 my $sqlt_args_hr = {};
97 1 50       9 if ($self->{'_opts'}->{'d'}) {
98 0         0 $sqlt_args_hr->{'add_drop_table'} = 1;
99             }
100 1         3 eval {
101 1         10 $schema->deploy($sqlt_args_hr);
102             };
103 1 50       603622 if ($EVAL_ERROR) {
104             my %err = (
105 0         0 'Error' => $EVAL_ERROR->{'msg'},
106             );
107 0 0       0 if ($EVAL_ERROR->{'msg'} =~ m/DBI Connection failed/) {
108 0         0 err "Cannot connect to database.",
109             %err,
110             ;
111             } else {
112 0         0 err 'Cannot deploy schema.',
113             %err,
114             ;
115             }
116             }
117              
118 1 50       13 if (! $self->{'_opts'}->{'q'}) {
119 0         0 my $print_version = '';
120 0 0       0 if (defined $schema_version) {
121 0         0 $print_version = '(v'.$schema_version.') ';
122             }
123 0         0 print "Schema ${print_version}from '$self->{'_schema_module'}' was ".
124             "deployed to '$self->{'_dsn'}'.\n";
125             }
126              
127 1         26 return 0;
128             }
129              
130             1;
131              
132              
133             __END__