55 lines
1.9 KiB
PHP
55 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Core;
|
|
|
|
use PDO;
|
|
use Exception;
|
|
|
|
class Settings
|
|
{
|
|
private PDO $pdo;
|
|
|
|
public function __construct($db)
|
|
{
|
|
if ($db instanceof PDO) {
|
|
$this->pdo = $db;
|
|
} elseif (is_object($db) && method_exists($db, 'getConnection')) {
|
|
$pdo = $db->getConnection();
|
|
if (!$pdo instanceof PDO) {
|
|
throw new Exception('Settings: database wrapper did not return PDO');
|
|
}
|
|
$this->pdo = $pdo;
|
|
} else {
|
|
$type = is_object($db) ? get_class($db) : gettype($db);
|
|
throw new Exception("Settings: unsupported database type: {$type}");
|
|
}
|
|
$this->ensureTable();
|
|
}
|
|
|
|
private function ensureTable(): void
|
|
{
|
|
$driver = $this->pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
|
|
if ($driver === 'sqlite') {
|
|
$sql = "CREATE TABLE IF NOT EXISTS settings (\n `key` TEXT PRIMARY KEY,\n `value` TEXT,\n `updated_at` TEXT NOT NULL\n )";
|
|
} else {
|
|
$sql = "CREATE TABLE IF NOT EXISTS settings (\n `key` VARCHAR(191) NOT NULL PRIMARY KEY,\n `value` TEXT NULL,\n `updated_at` DATETIME NOT NULL\n ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
|
|
}
|
|
$this->pdo->exec($sql);
|
|
}
|
|
|
|
public function get(string $key, $default = null)
|
|
{
|
|
$stmt = $this->pdo->prepare('SELECT `value` FROM settings WHERE `key` = :k');
|
|
$stmt->execute([':k' => $key]);
|
|
$val = $stmt->fetchColumn();
|
|
if ($val === false) return $default;
|
|
return $val;
|
|
}
|
|
|
|
public function set(string $key, $value): bool
|
|
{
|
|
$stmt = $this->pdo->prepare('REPLACE INTO settings (`key`, `value`, `updated_at`) VALUES (:k, :v, NOW())');
|
|
return (bool)$stmt->execute([':k' => $key, ':v' => $value]);
|
|
}
|
|
}
|