. */ namespace SP\Infrastructure\Database; use Exception; use SP\Domain\Database\Ports\DbStorageHandler; use function SP\processException; /** * Class DBUtil con utilidades de la BD */ class DatabaseUtil { /** * @var array Tablas de la BBDD */ public const TABLES = [ 'Client', 'Category', 'Tag', 'UserGroup', 'UserProfile', 'User', 'Account', 'AccountToFavorite', 'AccountFile', 'AccountToUserGroup', 'AccountHistory', 'AccountToTag', 'AccountToUser', 'AuthToken', 'Config', 'CustomFieldType', 'CustomFieldDefinition', 'CustomFieldData', 'EventLog', 'PublicLink', 'UserPassRecover', 'UserToUserGroup', 'Plugin', 'Track', 'Notification', 'account_data_v', 'account_search_v', ]; /** * DatabaseUtil constructor. */ public function __construct(private readonly DbStorageHandler $dbStorage) { } /** * Comprobar que la base de datos existe. */ public function checkDatabaseTables(string $dbName): bool { try { $tables = implode( ',', array_map( static function ($value) { return '\'' . $value . '\''; }, self::TABLES ) ); $query = /** @lang SQL */ sprintf( 'SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = \'%s\' AND `table_name` IN (%s)', $dbName, $tables ); $numTables = $this->dbStorage ->getConnection() ->query($query) ->fetchColumn(); return (int)$numTables === count(self::TABLES); } catch (Exception $e) { processException($e); } return false; } public function checkDatabaseConnection(): bool { try { $this->dbStorage->getConnection(); return true; } catch (Exception $e) { processException($e); } return false; } /** * Obtener la información del servidor de base de datos */ public function getDBinfo(): array { $dbinfo = []; try { $db = $this->dbStorage->getConnection(); $attributes = [ 'SERVER_VERSION', 'CLIENT_VERSION', 'SERVER_INFO', 'CONNECTION_STATUS', ]; foreach ($attributes as $val) { $dbinfo[$val] = $db->getAttribute(constant('PDO::ATTR_' . $val)); } } catch (Exception $e) { processException($e); } return $dbinfo; } /** * Escapar una cadena de texto con funciones de mysqli. */ public function escape(string $str): string { try { return $this->dbStorage->getConnection()->quote(trim($str)); } catch (Exception $e) { processException($e); } return $str; } }