Skip to content

Commit d9d8f79

Browse files
committed
Check for next result before releasing connection
1 parent 58bd8d2 commit d9d8f79

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

Diff for: src/PooledResultSet.php

+59-3
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,75 @@ final class PooledResultSet extends SqlPooledResultSet implements ResultSet
1010
/** @var ConnectionResultSet */
1111
private $result;
1212

13+
/** @var callable */
14+
private $release;
15+
16+
/** @var Promise|null a*/
17+
private $nextResultPromise;
18+
1319
/**
1420
* @param ResultSet $result
15-
* @param callable $release
21+
* @param callable $release
1622
*/
1723
public function __construct(ResultSet $result, callable $release)
1824
{
19-
parent::__construct($result, $release);
2025
$this->result = $result;
26+
$this->release = &$release;
27+
28+
parent::__construct($this->result, static function () use (&$release) {
29+
if ($release !== null) {
30+
$release();
31+
}
32+
});
33+
}
34+
35+
public function advance(): Promise
36+
{
37+
$promise = $this->result->advance();
38+
39+
$promise->onResolve(function (\Throwable $exception = null, bool $moreResults = null) {
40+
if ($moreResults || $this->release === null) {
41+
return;
42+
}
43+
44+
$this->nextResultPromise = $this->result->nextResultSet();
45+
$this->nextResultPromise->onResolve(function (\Throwable $exception = null, bool $moreResults = null) {
46+
$this->nextResultPromise = null;
47+
48+
if ($moreResults || $this->release === null) {
49+
return;
50+
}
51+
52+
$release = $this->release;
53+
$this->release = null;
54+
$release();
55+
});
56+
});
57+
58+
return $promise;
2159
}
2260

2361
public function nextResultSet(): Promise
2462
{
25-
return $this->result->nextResultSet();
63+
if ($this->nextResultPromise !== null) {
64+
$nextResultPromise = $this->nextResultPromise;
65+
$this->nextResultPromise = null;
66+
return $nextResultPromise;
67+
}
68+
69+
$promise = $this->result->nextResultSet();
70+
71+
$promise->onResolve(function (\Throwable $exception = null, bool $moreResults = null) {
72+
if ($moreResults || $this->release === null) {
73+
return;
74+
}
75+
76+
$release = $this->release;
77+
$this->release = null;
78+
$release();
79+
});
80+
81+
return $promise;
2682
}
2783

2884
public function getFields(): Promise

Diff for: test/LinkTest.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,14 @@ public function testMultiStmt()
9393
$this->assertSame([[6]], $got);
9494
$this->assertTrue(yield $resultset->nextResultSet());
9595

96+
$fields = yield $resultset->getFields();
97+
9698
$got = [];
9799
while (yield $resultset->advance()) {
98100
$got[] = $resultset->getCurrent();
99101
}
100102
$this->assertSame([["d" => 5, "c" => 5], ["d" => 6, "c" => 6]], $got);
101103

102-
$fields = yield $resultset->getFields();
103104
$this->assertCount(2, $fields);
104105
$this->assertSame($fields[0]["original_name"], "b");
105106
$this->assertSame($fields[0]["name"], "d");

0 commit comments

Comments
 (0)