From c06a1280022b60c46fdc285da4c0f61e25a65bff Mon Sep 17 00:00:00 2001 From: Merleur l'enchantin Date: Thu, 18 Jan 2024 07:15:23 +0100 Subject: [PATCH 1/2] handle unix_socket urls ex.: `mysql://root:root@/chemin/vers.socket/my_db --- src/Connection/PDO.php | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Connection/PDO.php b/src/Connection/PDO.php index 04db4ec..2dee756 100644 --- a/src/Connection/PDO.php +++ b/src/Connection/PDO.php @@ -29,7 +29,6 @@ private function __construct(Url $dsn, array $options = []) $dsnPassword = $dsn->authority()->userInformation()->password(); $user = null; $password = null; - $charset = ''; if (!$dsnUser->equals(User::none())) { $user = $dsnUser->toString(); @@ -39,6 +38,17 @@ private function __construct(Url $dsn, array $options = []) $password = $dsnPassword->toString(); } + $this->pdo = new \PDO( + self::parseDsn($dsn), + $user, + $password, + $options, + ); + } + + private function parseDsn(Url $dsn): string + { + $charset = ''; if (!$dsn->query()->equals(UrlQuery::none())) { \parse_str($dsn->query()->toString(), $query); @@ -48,14 +58,29 @@ private function __construct(Url $dsn, array $options = []) } } - $this->pdo = new \PDO(\sprintf( + // si pas de port alors socket + if (!$dsn->authority()->port()->value()) { + $path = $dsn->path()->toString(); + $dbName = \basename($path); + $socketPath = \dirname($path); + + return \sprintf( + '%s:unix_socket=%s;dbname=%s%s', + $dsn->scheme()->toString(), + $socketPath, + $dbName, + $charset, + ); + } + + return \sprintf( '%s:host=%s;port=%s;dbname=%s%s', $dsn->scheme()->toString(), $dsn->authority()->host()->toString(), $dsn->authority()->port()->toString(), \substr($dsn->path()->toString(), 1), // substring to remove leading '/' $charset, - ), $user, $password, $options); + ); } public function __invoke(Query $query): Sequence From 54ae08c4d5770c41f7a8d3914f71583fc188c9a1 Mon Sep 17 00:00:00 2001 From: Merleur l'enchantin Date: Thu, 18 Jan 2024 07:46:21 +0100 Subject: [PATCH 2/2] style php-cs-fixer --- src/Connection/PDO.php | 59 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/Connection/PDO.php b/src/Connection/PDO.php index 2dee756..46799b7 100644 --- a/src/Connection/PDO.php +++ b/src/Connection/PDO.php @@ -46,9 +46,39 @@ private function __construct(Url $dsn, array $options = []) ); } + public function __invoke(Query $query): Sequence + { + return match (\get_class($query)) { + Query\StartTransaction::class => $this->transaction( + $query, + fn(): bool => $this->pdo->beginTransaction(), + ), + Query\Commit::class => $this->transaction( + $query, + fn(): bool => $this->pdo->commit(), + ), + Query\Rollback::class => $this->transaction( + $query, + fn(): bool => $this->pdo->rollBack(), + ), + default => $this->execute($query), + }; + } + + public static function of(Url $dsn): self + { + return new self($dsn); + } + + public static function persistent(Url $dsn): self + { + return new self($dsn, [\PDO::ATTR_PERSISTENT => true]); + } + private function parseDsn(Url $dsn): string { $charset = ''; + if (!$dsn->query()->equals(UrlQuery::none())) { \parse_str($dsn->query()->toString(), $query); @@ -83,35 +113,6 @@ private function parseDsn(Url $dsn): string ); } - public function __invoke(Query $query): Sequence - { - return match (\get_class($query)) { - Query\StartTransaction::class => $this->transaction( - $query, - fn(): bool => $this->pdo->beginTransaction(), - ), - Query\Commit::class => $this->transaction( - $query, - fn(): bool => $this->pdo->commit(), - ), - Query\Rollback::class => $this->transaction( - $query, - fn(): bool => $this->pdo->rollBack(), - ), - default => $this->execute($query), - }; - } - - public static function of(Url $dsn): self - { - return new self($dsn); - } - - public static function persistent(Url $dsn): self - { - return new self($dsn, [\PDO::ATTR_PERSISTENT => true]); - } - /** * @param callable(): bool $action *