Compare commits

..

No commits in common. "d1fe3a7cf59ebdd8b3410d34d3b4aa1a01bb8dbb" and "16826b93bfe22fe32bc1de121e5023d0d6bce158" have entirely different histories.

1 changed files with 11 additions and 58 deletions

View File

@ -1,42 +1,20 @@
<?php <?php
/**
* Class Database
* Manages database connections for SQLite and MySQL (or MariaDB).
*/
class Database { class Database {
/**
* @var PDO|null $pdo The PDO instance representing the database connection.
*/
private $pdo; private $pdo;
/**
* Database constructor.
* Initializes the database connection based on provided options.
*
* @param array $options An associative array with database connection options:
* - type: The database type ('sqlite', 'mysql', or 'mariadb').
* - dbFile: The path to the SQLite database file (required for SQLite).
* - host: The database host (required for MySQL).
* - port: The port for MySQL (optional, default: 3306).
* - dbname: The name of the MySQL database (required for MySQL).
* - user: The username for MySQL (required for MySQL).
* - password: The password for MySQL (optional).
*
* @throws Exception If required extensions are not loaded or options are invalid.
*/
public function __construct($options) { public function __construct($options) {
// check if PDO extension is loaded // pdo needed
if ( !extension_loaded('pdo') ) { if ( !extension_loaded('pdo') ) {
throw new Exception('PDO extension not loaded.'); $error = getError('PDO extension not loaded.');
} }
// options check // options check
if (empty($options['type'])) { if (empty($options['type'])) {
throw new Exception('Database type is not set.'); $error = getError('Database type is not set.');
} }
// connect based on database type // database type
switch ($options['type']) { switch ($options['type']) {
case 'sqlite': case 'sqlite':
$this->connectSqlite($options); $this->connectSqlite($options);
@ -45,27 +23,19 @@ class Database {
$this->connectMysql($options); $this->connectMysql($options);
break; break;
default: default:
throw new Exception("Database type \"{$options['type']}\" is not supported."); $error = getError("Database type \"{$options['type']}\" is not supported.");
} }
} }
/**
* Establishes a connection to a SQLite database.
*
* @param array $options An associative array with SQLite connection options:
* - dbFile: The path to the SQLite database file.
*
* @throws Exception If the SQLite PDO extension is not loaded or the database file is missing.
*/
private function connectSqlite($options) { private function connectSqlite($options) {
// pdo_sqlite extension is needed // pdo_sqlite extension is needed
if (!extension_loaded('pdo_sqlite')) { if (!extension_loaded('pdo_sqlite')) {
throw new Exception('PDO extension for SQLite not loaded.'); $error = getError('PDO extension for SQLite not loaded.');
} }
// SQLite options // SQLite options
if (empty($options['dbFile']) || !file_exists($options['dbFile'])) { if (empty($options['dbFile']) || !file_exists($options['dbFile'])) {
throw new Exception("SQLite database file \"{$options['dbFile']}\" not found."); $error = getError("SQLite database file \"{$dbFile}\" not found.");
} }
// connect to SQLite // connect to SQLite
@ -75,31 +45,19 @@ class Database {
// enable foreign key constraints (not ON by default in SQLite3) // enable foreign key constraints (not ON by default in SQLite3)
$this->pdo->exec('PRAGMA foreign_keys = ON;'); $this->pdo->exec('PRAGMA foreign_keys = ON;');
} catch (PDOException $e) { } catch (PDOException $e) {
throw new Exception('SQLite connection failed: ' . $e->getMessage()); $error = getError('SQLite connection failed: ', $e->getMessage());
} }
} }
/**
* Establishes a connection to a MySQL (or MariaDB) database.
*
* @param array $options An associative array with MySQL connection options:
* - host: The database host.
* - port: The database port (default: 3306).
* - dbname: The name of the database.
* - user: The database username.
* - password: The database password (optional).
*
* @throws Exception If the MySQL PDO extension is not loaded or required options are missing.
*/
private function connectMysql($options) { private function connectMysql($options) {
// pdo_mysql extension is needed // pdo_mysql extension is needed
if (!extension_loaded('pdo_mysql')) { if (!extension_loaded('pdo_mysql')) {
throw new Exception('PDO extension for MySQL not loaded.'); $error = getError('PDO extension for MySQL not loaded.');
} }
// MySQL options // MySQL options
if (empty($options['host']) || empty($options['dbname']) || empty($options['user'])) { if (empty($options['host']) || empty($options['dbname']) || empty($options['user'])) {
throw new Exception('MySQL connection data is missing.'); $error = getError('MySQL connection data is missing.');
} }
// Connect to MySQL // Connect to MySQL
@ -108,15 +66,10 @@ class Database {
$this->pdo = new PDO($dsn, $options['user'], $options['password'] ?? ''); $this->pdo = new PDO($dsn, $options['user'], $options['password'] ?? '');
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) { } catch (PDOException $e) {
throw new Exception('MySQL connection failed: ' . $e->getMessage()); $error = getError('MySQL connection failed: ', $e->getMessage(), $config['environment']);
} }
} }
/**
* Retrieves the current PDO connection instance.
*
* @return PDO|null The PDO instance or null if no connection is established.
*/
public function getConnection() { public function getConnection() {
return $this->pdo; return $this->pdo;
} }