52 lines
1.5 KiB
PHP
52 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
final class DB
|
|
{
|
|
private static ?PDO $pdo = null;
|
|
|
|
public static function pdo(): PDO
|
|
{
|
|
if (self::$pdo instanceof PDO) {
|
|
return self::$pdo;
|
|
}
|
|
|
|
$dbPath = getenv('GLOBINOURS_DB_PATH') ?: __DIR__ . '/../../data/refuge.sqlite';
|
|
$dir = dirname($dbPath);
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
$pdo = new PDO('sqlite:' . $dbPath, null, null, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]);
|
|
|
|
$pdo->exec('PRAGMA foreign_keys = ON;');
|
|
$pdo->exec('PRAGMA journal_mode = WAL;');
|
|
$pdo->exec('PRAGMA busy_timeout = 3000;');
|
|
@chmod($dbPath, 0600);
|
|
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
|
$pdo->sqliteCreateFunction(
|
|
'search_fold',
|
|
static function (mixed $value): string {
|
|
$text = mb_strtolower(trim((string) $value), 'UTF-8');
|
|
$text = strtr($text, ['œ' => 'oe', 'æ' => 'ae', 'ø' => 'o', 'ß' => 'ss']);
|
|
$ascii = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $text);
|
|
return $ascii === false ? $text : strtolower($ascii);
|
|
},
|
|
1,
|
|
PDO::SQLITE_DETERMINISTIC,
|
|
);
|
|
|
|
self::$pdo = $pdo;
|
|
return $pdo;
|
|
}
|
|
|
|
public static function close(): void
|
|
{
|
|
self::$pdo = null;
|
|
}
|
|
}
|