50 lines
1.4 KiB
PHP
50 lines
1.4 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace NeonBlog;
|
|
|
|
use PDO;
|
|
|
|
final class Database
|
|
{
|
|
public static function connect(string $path): PDO
|
|
{
|
|
$dir = dirname($path);
|
|
if (!is_dir($dir)) {
|
|
mkdir($dir, 0775, true);
|
|
}
|
|
|
|
$pdo = new PDO('sqlite:' . $path);
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
|
$pdo->exec('PRAGMA foreign_keys = ON');
|
|
$pdo->exec('PRAGMA journal_mode = WAL');
|
|
|
|
self::migrate($pdo);
|
|
|
|
return $pdo;
|
|
}
|
|
|
|
private static function migrate(PDO $pdo): void
|
|
{
|
|
$pdo->exec(
|
|
'CREATE TABLE IF NOT EXISTS comments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
slug TEXT NOT NULL,
|
|
author TEXT NOT NULL,
|
|
email TEXT NOT NULL,
|
|
website TEXT DEFAULT "",
|
|
body TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT "pending",
|
|
ip_hash TEXT NOT NULL DEFAULT "",
|
|
user_agent TEXT NOT NULL DEFAULT "",
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
)'
|
|
);
|
|
|
|
$pdo->exec('CREATE INDEX IF NOT EXISTS comments_slug_status_idx ON comments(slug, status)');
|
|
$pdo->exec('CREATE INDEX IF NOT EXISTS comments_status_created_idx ON comments(status, created_at)');
|
|
}
|
|
}
|