diff options
Diffstat (limited to 'lib/App/MediaControl/DB.rakumod')
-rw-r--r-- | lib/App/MediaControl/DB.rakumod | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/lib/App/MediaControl/DB.rakumod b/lib/App/MediaControl/DB.rakumod index da86d24..cfa2dc3 100644 --- a/lib/App/MediaControl/DB.rakumod +++ b/lib/App/MediaControl/DB.rakumod @@ -4,16 +4,15 @@ use DB::SQLite; class App::MediaControl::DB { has DB::SQLite $.pool is required; - method !db(Callable $code) { + method !db(Callable:D $code) { my $conn = self.pool.db; # we need an explicit LEAVE block because on 2021.10, `will # leave { .finish }` kills precomp LEAVE { .finish with $conn }; $conn.begin; $conn.execute('PRAGMA foreign_keys=true'); - my $result = $code($conn) with $conn; - $conn.commit; - return $result; + KEEP { .commit with $conn }; + return $code($conn) with $conn; } method ensure-schema() { @@ -56,7 +55,7 @@ class App::MediaControl::DB { } } - method add-entry(Str :$path! is copy, Str :$name!, Bool :$is-dir!) { + method add-entry(Str:D() :$path! is copy, Str:D() :$name!, Bool:D() :$is-dir!) { $path ~~ s{<!after '/'>$} = '/'; $path ~~ s{<!before '/'>^} = '/'; @@ -79,7 +78,7 @@ class App::MediaControl::DB { } } - method remove-entry(Str :$path! is copy, Str :$name!) { + method remove-entry(Str:D() :$path! is copy, Str:D() :$name!) { $path ~~ s{<!after '/'>$} = '/'; $path ~~ s{<!before '/'>^} = '/'; @@ -92,4 +91,30 @@ class App::MediaControl::DB { END } } + + multi method get-children-of(Any:U $id) { + self!get-children('IS NULL'); + } + multi method get-children-of(Int:D() $id) { + self!get-children('=$id',$id); + } + method !get-children(Str $clause, *@binds) { + self!db: { + .query(qq:to/END/,|@binds).hashes; + SELECT id, name, is_dir + FROM files + WHERE parent_id $clause + END + } + } + + method get-entry(Int:D() $id) { + self!db: { + .query(q:to/END/,$id).hash; + SELECT id, matpath, name, is_dir + FROM files + WHERE id=$id + END + } + } } |