49 lines
1.5 KiB
PHP
49 lines
1.5 KiB
PHP
<?php
|
|
/**
|
|
* C-Relay-PG Admin — PDO database connection helper.
|
|
*
|
|
* Provides a singleton PDO connection to the relay's PostgreSQL database.
|
|
* All admin pages use db() to get the connection.
|
|
*/
|
|
|
|
require_once __DIR__ . '/config.php';
|
|
|
|
function db(): PDO {
|
|
static $pdo = null;
|
|
if ($pdo === null) {
|
|
$cfg = require __DIR__ . '/config.php';
|
|
// Build DSN — supports both TCP (host=localhost) and Unix socket
|
|
// (host=/var/run/postgresql). Omit password if empty (peer auth).
|
|
$dsn = sprintf(
|
|
'pgsql:host=%s;port=%d;dbname=%s;user=%s',
|
|
$cfg['db_host'],
|
|
$cfg['db_port'],
|
|
$cfg['db_name'],
|
|
$cfg['db_user']
|
|
);
|
|
if (!empty($cfg['db_password'])) {
|
|
$dsn .= ';password=' . $cfg['db_password'];
|
|
}
|
|
try {
|
|
$pdo = new PDO($dsn, null, null, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]);
|
|
} catch (PDOException $e) {
|
|
http_response_code(500);
|
|
die('Database connection failed: ' . htmlspecialchars($e->getMessage()));
|
|
}
|
|
}
|
|
return $pdo;
|
|
}
|
|
|
|
/** Get a config value from the admin config file. */
|
|
function cfg(string $key, $default = null) {
|
|
static $cfg = null;
|
|
if ($cfg === null) {
|
|
$cfg = require __DIR__ . '/config.php';
|
|
}
|
|
return $cfg[$key] ?? $default;
|
|
}
|