aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2021-12-29 13:01:46 +0000
committerdakkar <dakkar@thenautilus.net>2021-12-29 13:01:46 +0000
commit9afdf4ca771cc84ddea3245d59191ecf7ccb01e3 (patch)
tree6335a51dacaeaa70a622de3a6c00ff2b322a3b72
parentdatabase (diff)
downloadmedia-control-9afdf4ca771cc84ddea3245d59191ecf7ccb01e3.tar.gz
media-control-9afdf4ca771cc84ddea3245d59191ecf7ccb01e3.tar.bz2
media-control-9afdf4ca771cc84ddea3245d59191ecf7ccb01e3.zip
better db
-rw-r--r--lib/App/MediaControl/DB.rakumod45
1 files changed, 35 insertions, 10 deletions
diff --git a/lib/App/MediaControl/DB.rakumod b/lib/App/MediaControl/DB.rakumod
index b5771bb..7ce562e 100644
--- a/lib/App/MediaControl/DB.rakumod
+++ b/lib/App/MediaControl/DB.rakumod
@@ -22,16 +22,41 @@ class App::MediaControl::DB {
'table', 'files',
).value.defined };
- self!db: { .execute(q:to/END/);
- CREATE TABLE files (
- id INTEGER PRIMARY KEY,
- parent_id INTEGER NULL REFERENCES files(id),
- is_dir BOOLEAN NOT NULL,
- name TEXT NOT NULL,
- matpath TEXT NOT NULL,
- watched_time INTEGER NULL
- )
- END
+ self!db: {
+ .query(q:to/END/);
+ CREATE TABLE files (
+ id INTEGER PRIMARY KEY,
+ parent_id INTEGER NULL REFERENCES files(id),
+ matpath TEXT NOT NULL,
+ name TEXT NOT NULL,
+ is_dir BOOLEAN NOT NULL,
+ watched_time INTEGER NULL,
+ UNIQUE (matpath, name)
+ )
+ END
+ }
+ }
+
+ method add-entry(Str :$path! is copy, Str :$name!, Bool :$is-dir!) {
+ $path ~~ s{<!after '/'>$} = '/';
+ $path ~~ s{<!before '/'>^} = '/';
+
+ note "add-entry($path,$name)";
+ self!db: {
+ .query(q:to/END/, :$path, :$name, :is_dir($is-dir));
+ WITH parent(id,path) AS (
+ SELECT id, matpath || name || '/' FROM files
+ ),
+ newrow(path,name,is_dir) AS (
+ VALUES($path, $name, $is_dir)
+ )
+ INSERT INTO files(parent_id,matpath,name,is_dir)
+ SELECT id, newrow.path, name, is_dir
+ FROM newrow
+ LEFT JOIN parent ON parent.path=newrow.path
+ WHERE true
+ ON CONFLICT (matpath,name) DO NOTHING
+ END
}
}
}