summaryrefslogtreecommitdiff
path: root/lib/Ultramarine/Model/DBMigration.pm6
blob: 7f68ef560ac49afdc7a182b12e98c639347e1e6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use v6.d.PREVIEW;
use DBIish;
 
class Ultramarine::Model::DBMigration {
    has $.dbh is required;
    has Callable @.migrations = ();
 
    method get-meta() {
        my $sth = $.dbh.prepare(q:to/END/); 
        SELECT *
        FROM meta
        ORDER BY version DESC
        LIMIT 1
        END
        $sth.execute;
        return $sth.row(:hash);
        CATCH { when X::DBDish::DBError { return Nil } }
        LEAVE { .finish with $sth }
    }
 
    method !update-meta(*%new-values{
        my @columns = %new-values.keys;
        my @values = %new-values{|@columns};
 
        $.dbh.do(qq:to/END/,@values); 
        INSERT INTO meta({@columns.join(',')})
        VALUES ({@columns.map({'?'}).join(',')})
        END
    }
 
    method !create-meta() {
        $.dbh.do(q:to/END/); 
        CREATE TABLE meta (
            version INTEGER NOT NULL,
            done_at TEXT DEFAULT (datetime('now'))
        )
        END
        self!update-meta(:0version);
        return %(:0version);
    }
 
    method ensure-schema() {
        my %meta = self.get-meta() //
            self!create-meta();
        my $version = %meta<version>;
        while (@.migrations[$version]) -> $migration {
            $migration.($.dbh);
            ++$version;
            self!update-meta(:$version);
        }
    }
}