Fix prepare for PooledStatement

This commit is contained in:
Aaron Piotrowski 2018-06-30 08:56:50 -05:00
parent dcbc634543
commit ed9d2b1002
No known key found for this signature in database
GPG Key ID: ADD1EF783EDE9EEB

View File

@ -72,7 +72,7 @@ abstract class AbstractPool implements Pool
$this->connections = $connections = new \SplObjectStorage; $this->connections = $connections = new \SplObjectStorage;
$this->idle = $idle = new \SplQueue; $this->idle = $idle = new \SplQueue;
$this->prepare = coroutine($this->callableFromInstanceMethod("doPrepare")); $this->prepare = coroutine($this->callableFromInstanceMethod("createStatement"));
$idleTimeout = &$this->idleTimeout; $idleTimeout = &$this->idleTimeout;
@ -338,30 +338,36 @@ abstract class AbstractPool implements Pool
public function prepare(string $sql): Promise public function prepare(string $sql): Promise
{ {
return call(function () use ($sql) { return call(function () use ($sql) {
$connection = yield from $this->pop(); $statement = yield from $this->createStatement($sql);
\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 new PooledStatement($this, $statement, $this->prepare); 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} * {@inheritdoc}
*/ */