summaryrefslogtreecommitdiff
path: root/lib/Ultramarine/Model/DBMigration.pm6
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Ultramarine/Model/DBMigration.pm6')
-rw-r--r--lib/Ultramarine/Model/DBMigration.pm650
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/Ultramarine/Model/DBMigration.pm6 b/lib/Ultramarine/Model/DBMigration.pm6
new file mode 100644
index 0000000..e2ac3b8
--- /dev/null
+++ b/lib/Ultramarine/Model/DBMigration.pm6
@@ -0,0 +1,50 @@
+use v6.d.PREVIEW;
+use DBI::Async;
+
+class Ultramarine::Model::DBMigration {
+ has $.dbh is required;
+ has Callable @.migrations = ();
+
+ method get-meta() {
+ return $.dbh.query(q:to/END/).hash;
+ SELECT *
+ FROM meta
+ ORDER BY version DESC
+ LIMIT 1
+ END
+ CATCH { when X::DBDish::DBError { return Nil } }
+ }
+
+ method !update-meta(*%new-values) {
+ my @columns = %new-values.keys;
+ my @values = %new-values{|@columns};
+ my $query = qq:to/END/;
+ INSERT INTO meta({@columns.join(',')})
+ VALUES ({@columns.map({'?'}).join(',')})
+ END
+ say $query;
+ $.dbh.query($query,@values).finish;
+ }
+
+ method !create-meta() {
+ $.dbh.query(q:to/END/).finish;
+ 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);
+ }
+ }
+}