diff options
Diffstat (limited to 'lib/App')
-rw-r--r-- | lib/App/MediaControl/DB.rakumod | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/lib/App/MediaControl/DB.rakumod b/lib/App/MediaControl/DB.rakumod index f49cfab..e69efad 100644 --- a/lib/App/MediaControl/DB.rakumod +++ b/lib/App/MediaControl/DB.rakumod @@ -5,14 +5,28 @@ class App::MediaControl::DB { has DB::SQLite $.pool is required; 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'); - KEEP { .commit with $conn }; - return $code($conn) with $conn; + sub do-it { + 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'); + KEEP { .commit with $conn }; + return $code($conn) with $conn; + } + + loop { + CATCH { + when DB::SQLite::Error { + note "DB error: {$_.gist}, retrying"; + sleep 0.5; + redo; + } + } + + return do-it(); + } } method ensure-schema() { |