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 --- vendor/doctrine/dbal/src/Portability/Converter.php | 280 +++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 vendor/doctrine/dbal/src/Portability/Converter.php (limited to 'vendor/doctrine/dbal/src/Portability/Converter.php') 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)); + }); + } +} -- cgit v1.2.3