From 5e4d506b284bb3405662d29a47cc34c234271b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Fri, 10 Feb 2023 19:30:37 -0800 Subject: [PATCH] Enable Sqlite WAL mode by default WAL provides more concurrency as readers do not block writers and, a writer does not block readers. Reading and writing can proceed concurrently. This change might reduce the number of errors related to locked databases. For reference: https://sqlite.org/wal.html --- app/ServiceProvider/DatabaseProvider.php | 5 +++-- app/constants.php | 1 + libs/picodb/lib/PicoDb/Driver/Sqlite.php | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/ServiceProvider/DatabaseProvider.php b/app/ServiceProvider/DatabaseProvider.php index 0a223f75a..dfa5e06db 100644 --- a/app/ServiceProvider/DatabaseProvider.php +++ b/app/ServiceProvider/DatabaseProvider.php @@ -117,10 +117,11 @@ class DatabaseProvider implements ServiceProviderInterface { require_once __DIR__.'/../Schema/Sqlite.php'; - return new Database(array( + return new Database([ 'driver' => 'sqlite', 'filename' => DB_FILENAME, - )); + 'wal_mode' => DB_WAL_MODE, + ]); } /** diff --git a/app/constants.php b/app/constants.php index 3fc1d329d..5c7ce3360 100644 --- a/app/constants.php +++ b/app/constants.php @@ -43,6 +43,7 @@ defined('DB_DRIVER') or define('DB_DRIVER', getenv('DB_DRIVER') ?: 'sqlite'); // Sqlite configuration defined('DB_FILENAME') or define('DB_FILENAME', getenv('DB_FILENAME') ?: DATA_DIR.DIRECTORY_SEPARATOR.'db.sqlite'); +defined('DB_WAL_MODE') or define('DB_WAL_MODE', getenv('DB_WAL_MODE') ? strtolower(getenv('DB_WAL_MODE')) === 'true' : true); // Mysql/Postgres configuration defined('DB_USERNAME') or define('DB_USERNAME', getenv('DB_USERNAME') ?: 'root'); diff --git a/libs/picodb/lib/PicoDb/Driver/Sqlite.php b/libs/picodb/lib/PicoDb/Driver/Sqlite.php index 0503d336b..2dd17698d 100644 --- a/libs/picodb/lib/PicoDb/Driver/Sqlite.php +++ b/libs/picodb/lib/PicoDb/Driver/Sqlite.php @@ -36,6 +36,12 @@ class Sqlite extends Base } $this->pdo = new PDO('sqlite:'.$settings['filename'], null, null, $options); + + // Official docs: https://sqlite.org/wal.html + if (isset($settings['wal_mode']) && $settings['wal_mode'] === true) { + $this->pdo->exec('PRAGMA journal_mode=wal'); + } + $this->enableForeignKeys(); }