Support multiple databases at same time.

This commit is contained in:
KJ
2024-05-12 03:47:09 -04:00
parent e294eaa7af
commit f9b2c678f7
2 changed files with 32 additions and 23 deletions

View File

@ -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];
}
}
?>