File Coverage

blib/lib/App/Schema/Deploy.pm
Criterion Covered Total %
statement 36 57 63.1
branch 3 16 18.7
condition 6 6 100.0
subroutine 7 7 100.0
pod 2 2 100.0
total 54 88 61.3


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