From ed9d2b1002a149037722de8022525ec04e2ed09d Mon Sep 17 00:00:00 2001 From: Aaron Piotrowski Date: Sat, 30 Jun 2018 08:56:50 -0500 Subject: [PATCH] Fix prepare for PooledStatement --- src/AbstractPool.php | 48 +++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/AbstractPool.php b/src/AbstractPool.php index 006e8af..faafab0 100644 --- a/src/AbstractPool.php +++ b/src/AbstractPool.php @@ -72,7 +72,7 @@ abstract class AbstractPool implements Pool $this->connections = $connections = new \SplObjectStorage; $this->idle = $idle = new \SplQueue; - $this->prepare = coroutine($this->callableFromInstanceMethod("doPrepare")); + $this->prepare = coroutine($this->callableFromInstanceMethod("createStatement")); $idleTimeout = &$this->idleTimeout; @@ -338,30 +338,36 @@ abstract class AbstractPool implements Pool public function prepare(string $sql): Promise { return call(function () use ($sql) { - $connection = yield from $this->pop(); - \assert($connection instanceof Link); - - try { - $statement = yield $connection->prepare($sql); - \assert($statement instanceof Statement); - - \assert( - $statement instanceof Operation, - Statement::class . " instances returned from connections must implement " . Operation::class - ); - } catch (\Throwable $exception) { - $this->push($connection); - throw $exception; - } - - $statement->onDestruct(function () use ($connection) { - $this->push($connection); - }); - + $statement = yield from $this->createStatement($sql); return new PooledStatement($this, $statement, $this->prepare); }); } + private function createStatement(string $sql): \Generator + { + $connection = yield from $this->pop(); + \assert($connection instanceof Link); + + try { + $statement = yield $connection->prepare($sql); + \assert($statement instanceof Statement); + + \assert( + $statement instanceof Operation, + Statement::class . " instances returned from connections must implement " . Operation::class + ); + } catch (\Throwable $exception) { + $this->push($connection); + throw $exception; + } + + $statement->onDestruct(function () use ($connection) { + $this->push($connection); + }); + + return $statement; + } + /** * {@inheritdoc} */