Skip to content

Commit 9519dca

Browse files
authored
Merge pull request laminas#274 from laminas/2.16.x-merge-up-into-2.17.x_O9scDwq0
Merge release 2.16.3 into 2.17.x
2 parents eff7c7d + dadd9a1 commit 9519dca

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

src/Adapter/Driver/Pdo/Result.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,11 @@ public function rewind()
201201
'This result is a forward only result set, calling rewind() after moving forward is not supported'
202202
);
203203
}
204-
$this->currentData = $this->resource->fetch($this->fetchMode);
205-
$this->currentComplete = true;
206-
$this->position = 0;
204+
if (! $this->currentComplete) {
205+
$this->currentData = $this->resource->fetch($this->fetchMode);
206+
$this->currentComplete = true;
207+
}
208+
$this->position = 0;
207209
}
208210

209211
/**

test/unit/Adapter/Driver/Pdo/ResultTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
use Laminas\Db\Adapter\Driver\Pdo\Result;
66
use Laminas\Db\Adapter\Exception\InvalidArgumentException;
77
use PDO;
8+
use PDOStatement;
89
use PHPUnit\Framework\TestCase;
910
use stdClass;
1011

12+
use function assert;
1113
use function uniqid;
1214

1315
/**
@@ -80,4 +82,35 @@ public function testFetchModeRange()
8082
self::assertEquals(11, $result->getFetchMode());
8183
self::assertInstanceOf('stdClass', $result->current());
8284
}
85+
86+
public function testMultipleRewind()
87+
{
88+
$data = [
89+
['test' => 1],
90+
['test' => 2],
91+
];
92+
$position = 0;
93+
94+
$stub = $this->getMockBuilder('PDOStatement')->getMock();
95+
assert($stub instanceof PDOStatement); // to suppress IDE type warnings
96+
$stub->expects($this->any())
97+
->method('fetch')
98+
->will($this->returnCallback(function () use ($data, &$position) {
99+
return $data[$position++];
100+
}));
101+
$result = new Result();
102+
$result->initialize($stub, null);
103+
104+
$result->rewind();
105+
$result->rewind();
106+
107+
$this->assertEquals(0, $result->key());
108+
$this->assertEquals(1, $position);
109+
$this->assertEquals($data[0], $result->current());
110+
111+
$result->next();
112+
$this->assertEquals(1, $result->key());
113+
$this->assertEquals(2, $position);
114+
$this->assertEquals($data[1], $result->current());
115+
}
83116
}

test/unit/ResultSet/AbstractResultSetTest.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@
33
namespace LaminasTest\Db\ResultSet;
44

55
use ArrayIterator;
6+
use Laminas\Db\Adapter\Driver\Pdo\Result;
67
use Laminas\Db\Adapter\Driver\ResultInterface;
78
use Laminas\Db\ResultSet\AbstractResultSet;
89
use Laminas\Db\ResultSet\Exception\InvalidArgumentException;
910
use Laminas\Db\ResultSet\Exception\RuntimeException;
11+
use PDOStatement;
1012
use PHPUnit\Framework\MockObject\MockObject;
1113
use PHPUnit\Framework\TestCase;
1214

15+
use function assert;
16+
1317
class AbstractResultSetTest extends TestCase
1418
{
1519
/** @var MockObject */
@@ -266,4 +270,53 @@ public function testBufferIterations()
266270
$data = $resultSet->current();
267271
self::assertEquals(3, $data['id']);
268272
}
273+
274+
/**
275+
* Test multiple iterations with buffer with multiple rewind() calls
276+
*
277+
* @group issue-6845
278+
*/
279+
public function testMultipleRewindBufferIterations()
280+
{
281+
$resultSet = $this->getMockForAbstractClass(AbstractResultSet::class);
282+
$result = new Result();
283+
$stub = $this->getMockBuilder(PDOStatement::class)->getMock();
284+
$data = new ArrayIterator([
285+
['id' => 1, 'name' => 'one'],
286+
['id' => 2, 'name' => 'two'],
287+
['id' => 3, 'name' => 'three'],
288+
]);
289+
assert($stub instanceof PDOStatement); // to suppress IDE type warnings
290+
$stub->expects($this->any())
291+
->method('fetch')
292+
->will($this->returnCallback(function () use ($data) {
293+
$r = $data->current();
294+
$data->next();
295+
return $r;
296+
}));
297+
$result->initialize($stub, null);
298+
$result->rewind();
299+
$result->rewind();
300+
$resultSet->initialize($result);
301+
$resultSet->buffer();
302+
$resultSet->rewind();
303+
$resultSet->rewind();
304+
305+
$data = $resultSet->current();
306+
self::assertEquals(1, $data['id']);
307+
$resultSet->next();
308+
$data = $resultSet->current();
309+
self::assertEquals(2, $data['id']);
310+
311+
$resultSet->rewind();
312+
$resultSet->rewind();
313+
$data = $resultSet->current();
314+
self::assertEquals(1, $data['id']);
315+
$resultSet->next();
316+
$data = $resultSet->current();
317+
self::assertEquals(2, $data['id']);
318+
$resultSet->next();
319+
$data = $resultSet->current();
320+
self::assertEquals(3, $data['id']);
321+
}
269322
}

0 commit comments

Comments
 (0)