@@ -10,19 +10,75 @@ final class PooledResultSet extends SqlPooledResultSet implements ResultSet
10
10
/** @var ConnectionResultSet */
11
11
private $ result ;
12
12
13
+ /** @var callable */
14
+ private $ release ;
15
+
16
+ /** @var Promise|null a*/
17
+ private $ nextResultPromise ;
18
+
13
19
/**
14
20
* @param ResultSet $result
15
- * @param callable $release
21
+ * @param callable $release
16
22
*/
17
23
public function __construct (ResultSet $ result , callable $ release )
18
24
{
19
- parent ::__construct ($ result , $ release );
20
25
$ 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 ;
21
59
}
22
60
23
61
public function nextResultSet (): Promise
24
62
{
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 ;
26
82
}
27
83
28
84
public function getFields (): Promise
0 commit comments