From f9b2c678f7ecf1d7ad0b004288ebd18633015810 Mon Sep 17 00:00:00 2001 From: KJ Date: Sun, 12 May 2024 03:47:09 -0400 Subject: [PATCH] Support multiple databases at same time. --- src/Libs/Database.php | 34 +++++++++++++++++----------------- src/Libs/Model.php | 21 +++++++++++++++------ 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/Libs/Database.php b/src/Libs/Database.php index da8f212..5d6161f 100644 --- a/src/Libs/Database.php +++ b/src/Libs/Database.php @@ -3,11 +3,6 @@ * Database - DuckBrain * * Clase diseñada para crear y devolver una única instancia PDO (database). - * Hace uso de las siguientes constantes: - * DB_TYPE, DB_NAME, DB_HOST, DB_USER, DB_PASS - * - * Si DB_TYPE es sqlite, usará DB_NAME como el nombre del archivo sqlite. - * Además DB_USER y DB_PASS, no será necesariop que estén definidos. * * @author KJ * @website https://kj2.me @@ -21,7 +16,7 @@ use PDOException; use Exception; class Database extends PDO { - static private ?PDO $db = null; + static private array $databases = []; private function __construct() {} @@ -30,29 +25,34 @@ class Database extends PDO { * * @return PDO */ - static public function getInstance(): PDO + static public function getInstance( + string $type = 'mysql', + string $host = 'localhost', + string $name = '', + string $user = '', + string $pass = '', + ): PDO { - if (is_null(self::$db)) { + $key = $type.'/'.$host.'/'.$name.'/'.$user; + if (empty(static::$databases[$key])) { - if (DB_TYPE == 'sqlite') { - $dsn = DB_TYPE .':'. DB_NAME; - !defined('DB_USER') && define('DB_USER', ''); - !defined('DB_PASS') && define('DB_PASS', ''); + if ($type == 'sqlite') { + $dsn = $type .':'. $name; } else - $dsn = DB_TYPE.':dbname='.DB_NAME.';host='.DB_HOST; + $dsn = $type.':dbname='.$name.';host='.$host; try { - self::$db = new PDO($dsn, DB_USER, DB_PASS); + static::$databases[$key] = new PDO($dsn, $user, $pass); } catch (PDOException $e) { throw new Exception( 'Error at connect to database: ' . $e->getMessage() ); } - self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - self::$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + static::$databases[$key]->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + static::$databases[$key]->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } - return self::$db; + return static::$databases[$key]; } } ?> diff --git a/src/Libs/Model.php b/src/Libs/Model.php index 1966cfa..76565e4 100644 --- a/src/Libs/Model.php +++ b/src/Libs/Model.php @@ -3,7 +3,8 @@ * Model - DuckBrain * * Modelo ORM para objetos que hagan uso de una base de datos. - * Depende de Libs\Database. + * Depende de Libs\Database y hace uso de las constantes + * DB_TYPE, DB_HOST, DB_NAME, DB_USER y DB_PASS. * * @author KJ * @website https://kj2.me @@ -30,7 +31,6 @@ class Model { static protected array $forceSave = []; static protected string $table; static protected string $tableSufix = 's'; - static protected ?PDO $db = null; static protected array $queryVars = []; static protected array $querySelect = [ 'select' => ['*'], @@ -51,10 +51,19 @@ class Model { */ protected static function db(): PDO { - if (is_null(static::$db)) - static::$db = Database::getInstance(); - - return static::$db; + if (DB_TYPE == 'sqlite') + return Database::getInstance( + type: DB_TYPE, + name: DB_NAME + ); + else + return Database::getInstance( + DB_TYPE, + DB_HOST, + DB_NAME, + DB_USER, + DB_PASS + ); } /**