From cdac5cd0d0eae09b9d2f36ab53907ccefed82fa8 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 23 Dec 2017 15:21:54 +0000 Subject: minimal db model --- lib/Ultramarine/Model/DB.pm6 | 42 +++++++++++++++++++++++++++++ lib/Ultramarine/Model/DBMigration.pm6 | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 lib/Ultramarine/Model/DB.pm6 create mode 100644 lib/Ultramarine/Model/DBMigration.pm6 diff --git a/lib/Ultramarine/Model/DB.pm6 b/lib/Ultramarine/Model/DB.pm6 new file mode 100644 index 0000000..cbc353d --- /dev/null +++ b/lib/Ultramarine/Model/DB.pm6 @@ -0,0 +1,42 @@ +use v6.d.PREVIEW; +use DBI::Async; +use Ultramarine::Model::DBMigration; + +class Ultramarine::Model::DB { + has $.db-driver is required; + has %.db-args is required; + + my @migrations = ( + -> $dbh { + $dbh.query(q:to/END/).finish; + CREATE TABLE songs ( + path TEXT PRIMARY KEY, + title TEXT, + artist TEXT + ); + END + }, + ); + + has $!dbh = do { + my DBI::Async $dbh .= new($!db-driver, |%!db-args); + my Ultramarine::Model::DBMigration $migration .= new(:$dbh,:@migrations); + $migration.ensure-schema; + $dbh; + }; + + method add-song(:$path!,:$title,:$artist) { + $!dbh.query(q:to/END/,$path,$title,$artist); + INSERT INTO songs(path,artist,title) + VALUES (?,?,?) + END + } + + method get-song($path) { + $!dbh.query(q:to/END/,$path).hash; + SELECT * + FROM songs + WHERE path=? + END + } +} 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; + while (@.migrations[$version]) -> $migration { + $migration.($.dbh); + ++$version; + self!update-meta(:$version); + } + } +} -- cgit v1.2.3