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   26805 use strict;
  2         2  
  2         44  
4 2     2   5 use warnings;
  2         2  
  2         47  
5              
6 2     2   6 use Carp qw(croak);
  2         4  
  2         814  
7              
8             sub new {
9 39     39 1 27600 my $class = shift;
10 39         62 my (%params) = @_;
11              
12 39         40 my $self = {};
13 39         44 bless $self, $class;
14              
15 39 50       138 $self->{dbh} = $params{dbh} or croak 'dbh required';
16              
17 39         72 $self->{columns} = [qw/no created status error/];
18              
19 39         82 return $self;
20             }
21              
22             sub is_prepared {
23 25     25 1 427 my $self = shift;
24              
25 25     7   126 local $SIG{__WARN__} = sub { };
26              
27 25         24 my $rv;
28 25         25 eval { $rv = $self->{dbh}->do('SELECT 1 FROM mimi LIMIT 1') };
  25         98  
29              
30 25 100       754 return unless $rv;
31              
32 18         107 return 1;
33             }
34              
35             sub prepare {
36 19     19 1 42 my $self = shift;
37              
38 19         153 my $driver = $self->{dbh}->{Driver}->{Name};
39              
40 19 50       50 if ($driver eq 'SQLite') {
    0          
41 19         60 $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 10 my $self = shift;
65              
66 3         6 my $last_migration = $self->fetch_last_migration;
67 3 50       8 return unless $last_migration;
68              
69 3 50       20 $self->{dbh}->do("UPDATE mimi SET status = 'success', error = '' WHERE id=$last_migration->{id}") or die $!;
70              
71 3         120 return $self;
72             }
73              
74             sub create_migration {
75 19     19 1 2237 my $self = shift;
76 19         80 my (%migration) = @_;
77              
78 19   66     52 $migration{created} ||= time;
79              
80 19         48 my $columns = join ',', keys %migration;
81 19         37 my $values = join ',', map { "'$_'" } values %migration;
  64         117  
82              
83 19 50       102 $self->{dbh}->do("INSERT INTO mimi ($columns) VALUES ($values)") or die $!;
84              
85 19         886 return $self;
86             }
87              
88             sub fetch_last_migration {
89 29     29 1 779 my $self = shift;
90              
91             my $sth =
92             $self->{dbh}->prepare(
93 29         142 'SELECT id, no, created, status, error FROM mimi ORDER BY id DESC LIMIT 1');
94 29 50       1815 my $rv = $sth->execute or die $!;
95              
96 29         222 my $row = $sth->fetchall_arrayref->[0];
97 29 100       121 return unless $row;
98              
99 21         24 my $migration = {};
100 21         42 for (qw/id no created status error/) {
101 105         152 $migration->{$_} = shift @$row;
102             }
103              
104 21         232 return $migration;
105             }
106              
107             1;
108             __END__