<?php
namespace Garradin;
use KD2\DB\SQLite3;
class DB extends SQLite3
{
/**
* Application ID pour SQLite
* @link https://www.sqlite.org/pragma.html#pragma_application_id
*/
const APPID = 0x5da2d811;
static protected $_instance = null;
static public function getInstance($create = false, $readonly = false)
{
if (null === self::$_instance) {
self::$_instance = new DB('sqlite', ['file' => DB_FILE]);
}
return self::$_instance;
}
private function __clone()
{
// Désactiver le clonage, car on ne veut qu'une seule instance
}
public function connect(): void
{
if (null !== $this->db) {
return;
}
parent::connect();
// Activer les contraintes des foreign keys
$this->db->exec('PRAGMA foreign_keys = ON;');
// 10 secondes
$this->db->busyTimeout(10 * 1000);
// Performance enhancement
// see https://www.cs.utexas.edu/~jaya/slides/apsys17-sqlite-slides.pdf
// https://ericdraken.com/sqlite-performance-testing/
$this->exec(sprintf('PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA journal_size_limit = %d;', 32 * 1024 * 1024));
$this->db->createFunction('transliterate_to_ascii', ['Garradin\Utils', 'transliterateToAscii']);
}
public function close(): void
{
parent::close();
self::$_instance = null;
}
public function beginSchemaUpdate()
{
$this->toggleForeignKeys(false);
$this->begin();
}
public function commitSchemaUpdate()
{
$this->commit();
$this->toggleForeignKeys(true);
}
/**
* @see https://www.sqlite.org/lang_altertable.html
*/
public function toggleForeignKeys($enable)
{
assert(is_bool($enable));
if (!$enable) {
$this->db->exec('PRAGMA legacy_alter_table = ON;');
$this->db->exec('PRAGMA foreign_keys = OFF;');
}
else {
$this->db->exec('PRAGMA legacy_alter_table = OFF;');
$this->db->exec('PRAGMA foreign_keys = ON;');
}
}
}