Files

85 lines
2.1 KiB
PHP

<?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();
class DatabaseUnavailableException extends RuntimeException
{
}
/**
* Get a PDO connection to the database.
*/
function get_db_connection() {
static $pdo = null;
if ($pdo !== null) {
return $pdo;
}
if (!class_exists('PDO')) {
return null;
}
$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,
PDO::ATTR_TIMEOUT => 3,
]);
return $pdo;
} catch (\Exception $e) {
error_log("Database connection failed: " . $e->getMessage());
return null;
}
}