From d8623278929c620e22cfb943b5724c66e5f5fb91 Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 30 Dec 2021 17:06:35 +0000 Subject: batch inserts! --- lib/App/MediaControl.rakumod | 6 +++++- lib/App/MediaControl/DB.rakumod | 23 ++++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'lib') 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; $!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{$} = '/'; - $path ~~ s{^} = '/'; - 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{$} = '/'; + $path ~~ s{^} = '/'; + ($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 -- cgit v1.2.3