summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2017-12-23 15:21:54 +0000
committerdakkar <dakkar@thenautilus.net>2017-12-23 15:21:54 +0000
commitcdac5cd0d0eae09b9d2f36ab53907ccefed82fa8 (patch)
treee48f629b937cad8f2fe26da41474d1f4c7428a6a
parentrough model to extract metadata from music files (diff)
downloadUltramarine-cdac5cd0d0eae09b9d2f36ab53907ccefed82fa8.tar.gz
Ultramarine-cdac5cd0d0eae09b9d2f36ab53907ccefed82fa8.tar.bz2
Ultramarine-cdac5cd0d0eae09b9d2f36ab53907ccefed82fa8.zip
minimal db model
-rw-r--r--lib/Ultramarine/Model/DB.pm642
-rw-r--r--lib/Ultramarine/Model/DBMigration.pm650
2 files changed, 92 insertions, 0 deletions
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<version>;
+ while (@.migrations[$version]) -> $migration {
+ $migration.($.dbh);
+ ++$version;
+ self!update-meta(:$version);
+ }
+ }
+}