aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2021-12-30 17:06:35 +0000
committerdakkar <dakkar@thenautilus.net>2021-12-30 17:06:35 +0000
commitd8623278929c620e22cfb943b5724c66e5f5fb91 (patch)
tree9bb2612b84236360afc07de10d46c547aeca87b5
parentfix wrapping (diff)
downloadmedia-control-d8623278929c620e22cfb943b5724c66e5f5fb91.tar.gz
media-control-d8623278929c620e22cfb943b5724c66e5f5fb91.tar.bz2
media-control-d8623278929c620e22cfb943b5724c66e5f5fb91.zip
batch inserts!
-rw-r--r--lib/App/MediaControl.rakumod6
-rw-r--r--lib/App/MediaControl/DB.rakumod23
2 files changed, 21 insertions, 8 deletions
diff --git a/lib/App/MediaControl.rakumod b/lib/App/MediaControl.rakumod
index 82dc0dd..442ccb9 100644
--- a/lib/App/MediaControl.rakumod
+++ b/lib/App/MediaControl.rakumod
@@ -40,6 +40,7 @@ class App::MediaControl {
method !start-scan() {
my $root = $.config<media><root>;
$!db.clear-seen();
+ my Supplier $to-add .= new;
start react {
whenever scan-dir($root) -> $item {
when $item ~~ $root {}
@@ -54,9 +55,12 @@ class App::MediaControl {
}
else {
my $is-dir = $item.d;
- $!db.add-entry(:$path,:$name,:$is-dir);
+ $to-add.emit(%(:$path,:$name,:$is-dir));
}
}
+ whenever $to-add.Supply.batch(:100elems,:2seconds) -> $items {
+ $!db.add-entries($items);
+ }
}
}
diff --git a/lib/App/MediaControl/DB.rakumod b/lib/App/MediaControl/DB.rakumod
index 20fe956..f4e908c 100644
--- a/lib/App/MediaControl/DB.rakumod
+++ b/lib/App/MediaControl/DB.rakumod
@@ -54,19 +54,28 @@ class App::MediaControl::DB {
END
}
}
-
- method add-entry(Str:D() :$path! is copy, Str:D() :$name!, Bool:D() :$is-dir!) {
- $path ~~ s{<!after '/'>$} = '/';
- $path ~~ s{<!before '/'>^} = '/';
- note "add-entry($path,$name)";
+ subset Entry of Associative where :(
+ Str:D() :path($)! is copy,
+ Str:D() :name($)!,
+ Bool:D() :is-dir($)!,
+ );
+ method add-entries(@entries where { .all ~~ Entry }) {
+ my $values = 'VALUES ' ~ ('(?, ?, ?)' xx @entries).join(',');
+ my @binds = @entries.map(
+ -> (:$path is copy, :$name, :$is-dir) {
+ $path ~~ s{<!after '/'>$} = '/';
+ $path ~~ s{<!before '/'>^} = '/';
+ ($path,$name,$is-dir).Slip;
+ });
+
self!db: {
- .query(q:to/END/, :$path, :$name, :is_dir($is-dir));
+ .query(qq:to/END/, |@binds);
WITH parent(id,path) AS (
SELECT id, path || name || '/' FROM files
),
newrow(path,name,is_dir) AS (
- VALUES($path, $name, $is_dir)
+ $values
)
INSERT INTO files(parent_id,path,name,is_dir,seen)
SELECT id, newrow.path, name, is_dir, true