2026-05-21 14:14:10 +02:00
|
|
|
<?php
|
|
|
|
|
// Environment and Configuration Loader for FlixCooks
|
|
|
|
|
|
|
|
|
|
function load_env() {
|
|
|
|
|
$path = __DIR__ . '/.env';
|
|
|
|
|
if (!file_exists($path)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
|
|
|
|
foreach ($lines as $line) {
|
|
|
|
|
// Skip comments
|
|
|
|
|
if (strpos(trim($line), '#') === 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Parse Name=Value
|
|
|
|
|
if (strpos($line, '=') !== false) {
|
|
|
|
|
list($name, $value) = explode('=', $line, 2);
|
|
|
|
|
$name = trim($name);
|
|
|
|
|
$value = trim($value);
|
|
|
|
|
|
|
|
|
|
// Remove wrapping quotes if present
|
|
|
|
|
$value = trim($value, '"\'');
|
|
|
|
|
|
|
|
|
|
// Populate getenv(), $_ENV, $_SERVER
|
|
|
|
|
putenv("{$name}={$value}");
|
|
|
|
|
$_ENV[$name] = $value;
|
|
|
|
|
$_SERVER[$name] = $value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Automatically load on include
|
|
|
|
|
load_env();
|
|
|
|
|
|
2026-05-23 10:23:28 +02:00
|
|
|
class DatabaseUnavailableException extends RuntimeException
|
|
|
|
|
{
|
2026-05-23 09:52:26 +02:00
|
|
|
}
|
|
|
|
|
|
2026-05-22 19:07:03 +02:00
|
|
|
/**
|
|
|
|
|
* Get a PDO connection to the database.
|
|
|
|
|
*/
|
2026-05-22 19:25:06 +02:00
|
|
|
function get_db_connection() {
|
2026-05-22 19:07:03 +02:00
|
|
|
static $pdo = null;
|
|
|
|
|
|
|
|
|
|
if ($pdo !== null) {
|
|
|
|
|
return $pdo;
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-22 19:25:06 +02:00
|
|
|
if (!class_exists('PDO')) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-22 19:07:03 +02:00
|
|
|
$url = getenv('DATABASE_URL');
|
|
|
|
|
if (!$url) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$parsedUrl = parse_url($url);
|
|
|
|
|
if ($parsedUrl === false || !isset($parsedUrl['host'], $parsedUrl['user'], $parsedUrl['pass'], $parsedUrl['path'])) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$host = $parsedUrl['host'];
|
|
|
|
|
$port = $parsedUrl['port'] ?? 5432;
|
|
|
|
|
$user = $parsedUrl['user'];
|
|
|
|
|
$pass = $parsedUrl['pass'];
|
|
|
|
|
$db = ltrim($parsedUrl['path'], '/');
|
|
|
|
|
|
|
|
|
|
$dsn = "pgsql:host=$host;port=$port;dbname=$db";
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
$pdo = new PDO($dsn, $user, $pass, [
|
|
|
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
|
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
2026-05-22 19:25:06 +02:00
|
|
|
PDO::ATTR_TIMEOUT => 3,
|
2026-05-22 19:07:03 +02:00
|
|
|
]);
|
|
|
|
|
return $pdo;
|
2026-05-22 19:25:06 +02:00
|
|
|
} catch (\Exception $e) {
|
2026-05-22 19:07:03 +02:00
|
|
|
error_log("Database connection failed: " . $e->getMessage());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2026-05-21 14:14:10 +02:00
|
|
|
}
|