2024-09-13 13:48:44 -04:00
|
|
|
<?php
|
|
|
|
|
2024-12-30 13:58:47 -05:00
|
|
|
namespace Socialbox\Classes;
|
2024-09-13 13:48:44 -04:00
|
|
|
|
2024-12-30 13:58:47 -05:00
|
|
|
use PDO;
|
|
|
|
use PDOException;
|
|
|
|
use Socialbox\Classes\Configuration\DatabaseConfiguration;
|
|
|
|
use Socialbox\Exceptions\DatabaseOperationException;
|
2024-09-13 13:48:44 -04:00
|
|
|
|
2024-12-30 13:58:47 -05:00
|
|
|
class Database
|
2024-09-13 13:48:44 -04:00
|
|
|
{
|
2024-12-30 13:58:47 -05:00
|
|
|
private static ?PDO $instance = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return PDO
|
|
|
|
* @throws DatabaseOperationException
|
|
|
|
*/
|
|
|
|
public static function getConnection(): PDO
|
2024-09-13 13:48:44 -04:00
|
|
|
{
|
2024-12-30 13:58:47 -05:00
|
|
|
if (self::$instance === null)
|
2024-09-13 13:48:44 -04:00
|
|
|
{
|
2024-12-30 13:58:47 -05:00
|
|
|
$dsn = Configuration::getDatabaseConfiguration()->getDsn();
|
2024-09-13 13:48:44 -04:00
|
|
|
|
2024-12-30 13:58:47 -05:00
|
|
|
try
|
|
|
|
{
|
|
|
|
self::$instance = new PDO($dsn, Configuration::getDatabaseConfiguration()->getUsername(), Configuration::getDatabaseConfiguration()->getPassword());
|
|
|
|
|
|
|
|
// Set some common PDO attributes for better error handling
|
|
|
|
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
self::$instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
|
|
|
|
}
|
|
|
|
catch (PDOException $e)
|
|
|
|
{
|
|
|
|
throw new DatabaseOperationException('Failed to connect to the database using ' . $dsn, $e);
|
|
|
|
}
|
2024-09-13 13:48:44 -04:00
|
|
|
}
|
|
|
|
|
2024-12-30 13:58:47 -05:00
|
|
|
return self::$instance;
|
|
|
|
}
|
2024-09-13 13:48:44 -04:00
|
|
|
|
2024-12-30 13:58:47 -05:00
|
|
|
}
|