File Coverage

blib/lib/App/mimi/db.pm
Criterion Covered Total %
statement 49 50 98.0
branch 10 18 55.5
condition 2 3 66.6
subroutine 10 10 100.0
pod 6 6 100.0
total 77 87 88.5


line stmt bran cond sub pod time code
1             package App::mimi::db;
2              
3 2     2   29110 use strict;
  2         3  
  2         90  
4 2     2   8 use warnings;
  2         2  
  2         58  
5              
6 2     2   8 use Carp qw(croak);
  2         5  
  2         830  
7              
8             sub new {
9 39     39 1 33266 my $class = shift;
10 39         72 my (%params) = @_;
11              
12 39         40 my $self = {};
13 39         42 bless $self, $class;
14              
15 39 50       98 $self->{dbh} = $params{dbh} or croak 'dbh required';
16              
17 39         69 $self->{columns} = [qw/no created status error/];
18              
19 39         78 return $self;
20             }
21              
22             sub is_prepared {
23 25     25 1 458 my $self = shift;
24              
25 25     7   117 local $SIG{__WARN__} = sub { };
26              
27 25         27 my $rv;
28 25         20 eval { $rv = $self->{dbh}->do('SELECT 1 FROM mimi LIMIT 1') };
  25         91  
29              
30 25 100       728 return unless $rv;
31              
32 18         104 return 1;
33             }
34              
35             sub prepare {
36 19     19 1 49 my $self = shift;
37              
38 19         147 my $driver = $self->{dbh}->{Driver}->{Name};
39              
40 19 50       54 if ($driver eq 'SQLite') {
    0          
41 19         52 $self->{dbh}->do(<<'EOF');
42             CREATE TABLE mimi (
43             id INTEGER PRIMARY KEY AUTOINCREMENT,
44             created INTEGER NOT NULL,
45             no INTEGER NOT NULL,
46             status VARCHAR(32) NOT NULL,
47             error VARCHAR(255)
48             );
49             EOF
50             } elsif ($driver eq 'Pg') {
51 0         0 $self->{dbh}->do(<<'EOF');
52             CREATE TABLE mimi (
53             id serial PRIMARY KEY,
54             created INTEGER NOT NULL,
55             no INTEGER NOT NULL,
56             status VARCHAR(32) NOT NULL,
57             error VARCHAR(255)
58             );
59             EOF
60             }
61             }
62              
63             sub fix_last_migration {
64 3     3 1 8 my $self = shift;
65              
66 3         7 my $last_migration = $self->fetch_last_migration;
67 3 50       8 return unless $last_migration;
68              
69 3 50       19 $self->{dbh}->do("UPDATE mimi SET status = 'success', error = '' WHERE id=$last_migration->{id}") or die $!;
70              
71 3         124 return $self;
72             }
73              
74             sub create_migration {
75 19     19 1 2253 my $self = shift;
76 19         57 my (%migration) = @_;
77              
78 19   66     52 $migration{created} ||= time;
79              
80 19         50 my $columns = join ',', keys %migration;
81 19         33 my $values = join ',', map { "'$_'" } values %migration;
  64         116  
82              
83 19 50       89 $self->{dbh}->do("INSERT INTO mimi ($columns) VALUES ($values)") or die $!;
84              
85 19         841 return $self;
86             }
87              
88             sub fetch_last_migration {
89 29     29 1 875 my $self = shift;
90              
91             my $sth =
92             $self->{dbh}->prepare(
93 29         98 'SELECT id, no, created, status, error FROM mimi ORDER BY id DESC LIMIT 1');
94 29 50       1663 my $rv = $sth->execute or die $!;
95              
96 29         221 my $row = $sth->fetchall_arrayref->[0];
97 29 100       124 return unless $row;
98              
99 21         27 my $migration = {};
100 21         41 for (qw/id no created status error/) {
101 105         137 $migration->{$_} = shift @$row;
102             }
103              
104 21         196 return $migration;
105             }
106              
107             1;
108             __END__