From bf6655a534a6775d30cafa67bd801276bda1d98d Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 13 Aug 2024 23:45:21 +0200 Subject: =?UTF-8?q?VERSION=200.2=20doctrine=20ORM=20et=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../doctrine/dbal/src/Portability/Connection.php | 41 +++ vendor/doctrine/dbal/src/Portability/Converter.php | 280 +++++++++++++++++++++ vendor/doctrine/dbal/src/Portability/Driver.php | 69 +++++ .../doctrine/dbal/src/Portability/Middleware.php | 25 ++ .../dbal/src/Portability/OptimizeFlags.php | 42 ++++ vendor/doctrine/dbal/src/Portability/Result.php | 68 +++++ vendor/doctrine/dbal/src/Portability/Statement.php | 31 +++ 7 files changed, 556 insertions(+) create mode 100644 vendor/doctrine/dbal/src/Portability/Connection.php create mode 100644 vendor/doctrine/dbal/src/Portability/Converter.php create mode 100644 vendor/doctrine/dbal/src/Portability/Driver.php create mode 100644 vendor/doctrine/dbal/src/Portability/Middleware.php create mode 100644 vendor/doctrine/dbal/src/Portability/OptimizeFlags.php create mode 100644 vendor/doctrine/dbal/src/Portability/Result.php create mode 100644 vendor/doctrine/dbal/src/Portability/Statement.php (limited to 'vendor/doctrine/dbal/src/Portability') diff --git a/vendor/doctrine/dbal/src/Portability/Connection.php b/vendor/doctrine/dbal/src/Portability/Connection.php new file mode 100644 index 0000000..4a821d8 --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/Connection.php @@ -0,0 +1,41 @@ +converter, + ); + } + + public function query(string $sql): Result + { + return new Result( + parent::query($sql), + $this->converter, + ); + } +} diff --git a/vendor/doctrine/dbal/src/Portability/Converter.php b/vendor/doctrine/dbal/src/Portability/Converter.php new file mode 100644 index 0000000..09a4712 --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/Converter.php @@ -0,0 +1,280 @@ +createConvertValue($convertEmptyStringToNull, $rightTrimString); + $convertNumeric = $this->createConvertRow($convertValue, null); + $convertAssociative = $this->createConvertRow($convertValue, $case); + + $this->convertNumeric = $this->createConvert($convertNumeric); + $this->convertAssociative = $this->createConvert($convertAssociative); + $this->convertOne = $this->createConvert($convertValue); + + $this->convertAllNumeric = $this->createConvertAll($convertNumeric); + $this->convertAllAssociative = $this->createConvertAll($convertAssociative); + $this->convertFirstColumn = $this->createConvertAll($convertValue); + } + + /** + * @param array|false $row + * + * @return list|false + */ + public function convertNumeric(array|false $row): array|false + { + return ($this->convertNumeric)($row); + } + + /** + * @param array|false $row + * + * @return array|false + */ + public function convertAssociative(array|false $row): array|false + { + return ($this->convertAssociative)($row); + } + + public function convertOne(mixed $value): mixed + { + return ($this->convertOne)($value); + } + + /** + * @param list> $data + * + * @return list> + */ + public function convertAllNumeric(array $data): array + { + return ($this->convertAllNumeric)($data); + } + + /** + * @param list> $data + * + * @return list> + */ + public function convertAllAssociative(array $data): array + { + return ($this->convertAllAssociative)($data); + } + + /** + * @param list $data + * + * @return list + */ + public function convertFirstColumn(array $data): array + { + return ($this->convertFirstColumn)($data); + } + + /** + * @param T $value + * + * @return T + * + * @template T + */ + private static function id(mixed $value): mixed + { + return $value; + } + + /** + * @param T $value + * + * @return T|null + * + * @template T + */ + private static function convertEmptyStringToNull(mixed $value): mixed + { + if ($value === '') { + return null; + } + + return $value; + } + + /** + * @param T $value + * + * @return T|string + * @psalm-return (T is string ? string : T) + * + * @template T + */ + private static function rightTrimString(mixed $value): mixed + { + if (! is_string($value)) { + return $value; + } + + return rtrim($value); + } + + /** + * Creates a function that will convert each individual value retrieved from the database + * + * @param bool $convertEmptyStringToNull Whether each empty string should be converted to NULL + * @param bool $rightTrimString Whether each string should right-trimmed + * + * @return Closure|null The resulting function or NULL if no conversion is needed + */ + private function createConvertValue(bool $convertEmptyStringToNull, bool $rightTrimString): ?Closure + { + $functions = []; + + if ($convertEmptyStringToNull) { + $functions[] = self::convertEmptyStringToNull(...); + } + + if ($rightTrimString) { + $functions[] = self::rightTrimString(...); + } + + return $this->compose(...$functions); + } + + /** + * Creates a function that will convert each array-row retrieved from the database + * + * @param Closure|null $function The function that will convert each value + * @param self::CASE_LOWER|self::CASE_UPPER|null $case Column name case + * + * @return Closure|null The resulting function or NULL if no conversion is needed + */ + private function createConvertRow(?Closure $function, ?int $case): ?Closure + { + $functions = []; + + if ($function !== null) { + $functions[] = $this->createMapper($function); + } + + if ($case !== null) { + $functions[] = static fn (array $row): array => array_change_key_case($row, $case); + } + + return $this->compose(...$functions); + } + + /** + * Creates a function that will be applied to the return value of Statement::fetch*() + * or an identity function if no conversion is needed + * + * @param Closure|null $function The function that will convert each tow + */ + private function createConvert(?Closure $function): Closure + { + if ($function === null) { + return self::id(...); + } + + return /** + * @param T $value + * + * @psalm-return (T is false ? false : T) + * + * @template T + */ + static function (mixed $value) use ($function): mixed { + if ($value === false) { + return false; + } + + return $function($value); + }; + } + + /** + * Creates a function that will be applied to the return value of Statement::fetchAll*() + * or an identity function if no transformation is required + * + * @param Closure|null $function The function that will transform each value + */ + private function createConvertAll(?Closure $function): Closure + { + if ($function === null) { + return self::id(...); + } + + return $this->createMapper($function); + } + + /** + * Creates a function that maps each value of the array using the given function + * + * @param Closure $function The function that maps each value of the array + * + * @return Closure(array):array + */ + private function createMapper(Closure $function): Closure + { + return static fn (array $array): array => array_map($function, $array); + } + + /** + * Creates a composition of the given set of functions + * + * @param Closure(T):T ...$functions The functions to compose + * + * @return Closure(T):T|null + * + * @template T + */ + private function compose(Closure ...$functions): ?Closure + { + return array_reduce($functions, static function (?Closure $carry, Closure $item): Closure { + if ($carry === null) { + return $item; + } + + return /** + * @param T $value + * + * @return T + * + * @template T + */ + static fn (mixed $value): mixed => $item($carry($value)); + }); + } +} diff --git a/vendor/doctrine/dbal/src/Portability/Driver.php b/vendor/doctrine/dbal/src/Portability/Driver.php new file mode 100644 index 0000000..bb67c25 --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/Driver.php @@ -0,0 +1,69 @@ +getDatabasePlatform($connection), + $this->mode, + ); + + $case = null; + + if ($this->case !== null && ($portability & Connection::PORTABILITY_FIX_CASE) !== 0) { + $nativeConnection = $connection->getNativeConnection(); + + $case = match ($this->case) { + ColumnCase::LOWER => CASE_LOWER, + ColumnCase::UPPER => CASE_UPPER, + }; + + if ($nativeConnection instanceof PDO) { + $portability &= ~Connection::PORTABILITY_FIX_CASE; + $nativeConnection->setAttribute(PDO::ATTR_CASE, $case); + } + } + + $convertEmptyStringToNull = ($portability & Connection::PORTABILITY_EMPTY_TO_NULL) !== 0; + $rightTrimString = ($portability & Connection::PORTABILITY_RTRIM) !== 0; + + if (! $convertEmptyStringToNull && ! $rightTrimString && $case === null) { + return $connection; + } + + return new Connection( + $connection, + new Converter($convertEmptyStringToNull, $rightTrimString, $case), + ); + } +} diff --git a/vendor/doctrine/dbal/src/Portability/Middleware.php b/vendor/doctrine/dbal/src/Portability/Middleware.php new file mode 100644 index 0000000..b97897c --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/Middleware.php @@ -0,0 +1,25 @@ +mode !== 0) { + return new Driver($driver, $this->mode, $this->case); + } + + return $driver; + } +} diff --git a/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php b/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php new file mode 100644 index 0000000..c985d4b --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php @@ -0,0 +1,42 @@ + + */ + private static array $platforms = [ + DB2Platform::class => 0, + OraclePlatform::class => Connection::PORTABILITY_EMPTY_TO_NULL, + PostgreSQLPlatform::class => 0, + SQLitePlatform::class => 0, + SQLServerPlatform::class => 0, + ]; + + public function __invoke(AbstractPlatform $platform, int $flags): int + { + foreach (self::$platforms as $class => $mask) { + if ($platform instanceof $class) { + $flags &= ~$mask; + + break; + } + } + + return $flags; + } +} diff --git a/vendor/doctrine/dbal/src/Portability/Result.php b/vendor/doctrine/dbal/src/Portability/Result.php new file mode 100644 index 0000000..d158683 --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/Result.php @@ -0,0 +1,68 @@ +converter->convertNumeric( + parent::fetchNumeric(), + ); + } + + public function fetchAssociative(): array|false + { + return $this->converter->convertAssociative( + parent::fetchAssociative(), + ); + } + + public function fetchOne(): mixed + { + return $this->converter->convertOne( + parent::fetchOne(), + ); + } + + /** + * {@inheritDoc} + */ + public function fetchAllNumeric(): array + { + return $this->converter->convertAllNumeric( + parent::fetchAllNumeric(), + ); + } + + /** + * {@inheritDoc} + */ + public function fetchAllAssociative(): array + { + return $this->converter->convertAllAssociative( + parent::fetchAllAssociative(), + ); + } + + /** + * {@inheritDoc} + */ + public function fetchFirstColumn(): array + { + return $this->converter->convertFirstColumn( + parent::fetchFirstColumn(), + ); + } +} diff --git a/vendor/doctrine/dbal/src/Portability/Statement.php b/vendor/doctrine/dbal/src/Portability/Statement.php new file mode 100644 index 0000000..de0c76f --- /dev/null +++ b/vendor/doctrine/dbal/src/Portability/Statement.php @@ -0,0 +1,31 @@ +Statement and applies portability measures. + */ + public function __construct(DriverStatement $stmt, private readonly Converter $converter) + { + parent::__construct($stmt); + } + + public function execute(): ResultInterface + { + return new Result( + parent::execute(), + $this->converter, + ); + } +} -- cgit v1.2.3