diff --git a/src/StatementPool.php b/src/StatementPool.php index 55f1307..49eb26d 100644 --- a/src/StatementPool.php +++ b/src/StatementPool.php @@ -27,14 +27,14 @@ abstract class StatementPool implements Statement private $prepare; /** - * Performs any necessary actions to the statement to prepare it for execution, returning the same or a new - * Statement object if necessary. + * Performs any necessary actions to the statement to prepare it for execution, returning a promise for the same or + * a new Statement object if necessary. * * @param Statement $statement * - * @return Statement + * @return Promise */ - abstract protected function prepare(Statement $statement): Statement; + abstract protected function prepare(Statement $statement): Promise; /** * @param ResultSet $resultSet @@ -97,7 +97,8 @@ abstract class StatementPool implements Statement \assert($statement instanceof Statement); try { - $statement = $this->prepare($statement); + $statement = yield $this->prepare($statement); + \assert($statement instanceof Statement); $result = yield $statement->execute($params); } catch (\Throwable $exception) { $this->push($statement); diff --git a/test/StatementPoolTest.php b/test/StatementPoolTest.php index 0ea2f2a..3ffa3c1 100644 --- a/test/StatementPoolTest.php +++ b/test/StatementPoolTest.php @@ -8,6 +8,7 @@ use Amp\PHPUnit\TestCase; use Amp\Sql\Pool; use Amp\Sql\Statement; use Amp\Sql\StatementPool; +use Amp\Success; class StatementPoolTest extends TestCase { @@ -35,6 +36,11 @@ class StatementPoolTest extends TestCase ->setConstructorArgs([$pool, $statement, $this->createCallback(0)]) ->getMockForAbstractClass(); + $statementPool->method('prepare') + ->willReturnCallback(function (Statement $statement) { + return new Success($statement); + }); + $this->assertTrue($statementPool->isAlive()); $this->assertSame(\time(), $statementPool->getLastUsedAt()); @@ -71,6 +77,11 @@ class StatementPoolTest extends TestCase ->setConstructorArgs([$pool, $statement, $this->createCallback(1)]) ->getMockForAbstractClass(); + $statementPool->method('prepare') + ->willReturnCallback(function (Statement $statement) { + return new Success($statement); + }); + $this->assertTrue($statementPool->isAlive()); $this->assertSame(\time(), $statementPool->getLastUsedAt());