Skip to content

Commit 7ce51b1

Browse files
committed
Refactor to pass Query object from MysqlClient to Connection
1 parent 2db5b5e commit 7ce51b1

File tree

8 files changed

+123
-150
lines changed

8 files changed

+123
-150
lines changed

src/Io/Connection.php

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,8 @@ public function isBusy()
9090
return $this->parser->isBusy() || !$this->executor->isIdle();
9191
}
9292

93-
/**
94-
* {@inheritdoc}
95-
*/
96-
public function query($sql, array $params = [])
93+
public function query(Query $query)
9794
{
98-
$query = new Query($sql);
99-
if ($params) {
100-
$query->bindParamsFromArray($params);
101-
}
102-
10395
$command = new QueryCommand();
10496
$command->setQuery($query);
10597
try {
@@ -146,13 +138,8 @@ public function query($sql, array $params = [])
146138
return $deferred->promise();
147139
}
148140

149-
public function queryStream($sql, $params = [])
141+
public function queryStream(Query $query)
150142
{
151-
$query = new Query($sql);
152-
if ($params) {
153-
$query->bindParamsFromArray($params);
154-
}
155-
156143
$command = new QueryCommand();
157144
$command->setQuery($query);
158145
$this->_doCommand($command);

src/Io/Query.php

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,15 @@ class Query
4141
//"_" => "\\_",
4242
];
4343

44-
public function __construct($sql)
45-
{
46-
$this->sql = $this->builtSql = $sql;
47-
}
48-
4944
/**
50-
* Binding params for the query, multiple arguments support.
51-
*
45+
* @param string $sql
5246
* @param list<string|int|float|bool|null> $params
53-
* @return $this
5447
*/
55-
public function bindParamsFromArray(array $params)
48+
public function __construct($sql, array $params = [])
5649
{
57-
$this->builtSql = null;
58-
$this->params = $params;
59-
60-
return $this;
50+
$this->sql = $sql;
51+
$this->builtSql = $params ? null : $sql;
52+
$this->params = $params;
6153
}
6254

6355
public function escape($str)

src/MysqlClient.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use React\EventLoop\LoopInterface;
77
use React\Mysql\Io\Connection;
88
use React\Mysql\Io\Factory;
9+
use React\Mysql\Io\Query;
910
use React\Promise\Deferred;
1011
use React\Promise\Promise;
1112
use React\Promise\PromiseInterface;
@@ -163,8 +164,10 @@ public function query($sql, array $params = [])
163164
return \React\Promise\reject(new Exception('Connection closed'));
164165
}
165166

166-
return $this->getConnection()->then(function (Connection $connection) use ($sql, $params) {
167-
return $connection->query($sql, $params)->then(function (MysqlResult $result) use ($connection) {
167+
$query = new Query($sql, $params);
168+
169+
return $this->getConnection()->then(function (Connection $connection) use ($query) {
170+
return $connection->query($query)->then(function (MysqlResult $result) use ($connection) {
168171
$this->handleConnectionReady($connection);
169172
return $result;
170173
}, function (\Exception $e) use ($connection) {
@@ -239,9 +242,11 @@ public function queryStream($sql, array $params = [])
239242
throw new Exception('Connection closed');
240243
}
241244

245+
$query = new Query($sql, $params);
246+
242247
return \React\Promise\Stream\unwrapReadable(
243-
$this->getConnection()->then(function (Connection $connection) use ($sql, $params) {
244-
$stream = $connection->queryStream($sql, $params);
248+
$this->getConnection()->then(function (Connection $connection) use ($query) {
249+
$stream = $connection->queryStream($query);
245250

246251
$stream->on('end', function () use ($connection) {
247252
$this->handleConnectionReady($connection);

tests/Io/ConnectionTest.php

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace React\Tests\Mysql\Io;
44

55
use React\Mysql\Io\Connection;
6+
use React\Mysql\Io\Query;
67
use React\Tests\Mysql\BaseTestCase;
78

89
class ConnectionTest extends BaseTestCase
@@ -22,7 +23,7 @@ public function testIsBusyReturnsTrueWhenParserIsBusy()
2223

2324
$connection = new Connection($stream, $executor, $parser, $loop, null);
2425

25-
$connection->query('SELECT 1');
26+
$connection->query(new Query('SELECT 1'));
2627

2728
$this->assertTrue($connection->isBusy());
2829
}
@@ -57,7 +58,7 @@ public function testQueryWillEnqueueOneCommand()
5758
$loop->expects($this->never())->method('addTimer');
5859

5960
$conn = new Connection($stream, $executor, $parser, $loop, null);
60-
$conn->query('SELECT 1');
61+
$conn->query(new Query('SELECT 1'));
6162
}
6263

6364
public function testQueryWillReturnResolvedPromiseAndStartIdleTimerWhenQueryCommandEmitsSuccess()
@@ -81,7 +82,7 @@ public function testQueryWillReturnResolvedPromiseAndStartIdleTimerWhenQueryComm
8182

8283
$this->assertNull($currentCommand);
8384

84-
$promise = $connection->query('SELECT 1');
85+
$promise = $connection->query(new Query('SELECT 1'));
8586

8687
$promise->then($this->expectCallableOnceWith($this->isInstanceOf('React\Mysql\MysqlResult')));
8788

@@ -110,7 +111,7 @@ public function testQueryWillReturnResolvedPromiseAndStartIdleTimerWhenQueryComm
110111

111112
$this->assertNull($currentCommand);
112113

113-
$promise = $connection->query('SELECT 1');
114+
$promise = $connection->query(new Query('SELECT 1'));
114115

115116
$promise->then($this->expectCallableOnceWith($this->isInstanceOf('React\Mysql\MysqlResult')));
116117

@@ -139,7 +140,7 @@ public function testQueryWillReturnResolvedPromiseAndStartIdleTimerWhenIdlePerio
139140

140141
$this->assertNull($currentCommand);
141142

142-
$promise = $connection->query('SELECT 1');
143+
$promise = $connection->query(new Query('SELECT 1'));
143144

144145
$promise->then($this->expectCallableOnceWith($this->isInstanceOf('React\Mysql\MysqlResult')));
145146

@@ -166,7 +167,7 @@ public function testQueryWillReturnResolvedPromiseAndNotStartIdleTimerWhenIdlePe
166167

167168
$this->assertNull($currentCommand);
168169

169-
$promise = $connection->query('SELECT 1');
170+
$promise = $connection->query(new Query('SELECT 1'));
170171

171172
$promise->then($this->expectCallableOnceWith($this->isInstanceOf('React\Mysql\MysqlResult')));
172173

@@ -195,7 +196,7 @@ public function testQueryWillReturnRejectedPromiseAndStartIdleTimerWhenQueryComm
195196

196197
$this->assertNull($currentCommand);
197198

198-
$promise = $connection->query('SELECT 1');
199+
$promise = $connection->query(new Query('SELECT 1'));
199200

200201
$promise->then(null, $this->expectCallableOnce());
201202

@@ -230,7 +231,7 @@ public function testQueryFollowedByIdleTimerWillQuitUnderlyingConnectionAndEmitC
230231

231232
$this->assertNull($currentCommand);
232233

233-
$connection->query('SELECT 1');
234+
$connection->query(new Query('SELECT 1'));
234235

235236
$this->assertNotNull($currentCommand);
236237
$currentCommand->emit('success');
@@ -269,7 +270,7 @@ public function testQueryFollowedByIdleTimerWillQuitUnderlyingConnectionAndEmitC
269270

270271
$this->assertNull($currentCommand);
271272

272-
$connection->query('SELECT 1');
273+
$connection->query(new Query('SELECT 1'));
273274

274275
$this->assertNotNull($currentCommand);
275276
$currentCommand->emit('success');
@@ -300,8 +301,8 @@ public function testQueryTwiceWillEnqueueSecondQueryWithoutStartingIdleTimerWhen
300301

301302
$this->assertNull($currentCommand);
302303

303-
$connection->query('SELECT 1');
304-
$connection->query('SELECT 2');
304+
$connection->query(new Query('SELECT 1'));
305+
$connection->query(new Query('SELECT 2'));
305306

306307
$this->assertNotNull($currentCommand);
307308
$currentCommand->emit('success');
@@ -328,12 +329,12 @@ public function testQueryTwiceAfterIdleTimerWasStartedWillCancelIdleTimerAndEnqu
328329

329330
$this->assertNull($currentCommand);
330331

331-
$connection->query('SELECT 1');
332+
$connection->query(new Query('SELECT 1'));
332333

333334
$this->assertNotNull($currentCommand);
334335
$currentCommand->emit('success');
335336

336-
$connection->query('SELECT 2');
337+
$connection->query(new Query('SELECT 2'));
337338
}
338339

339340
public function testQueryStreamWillEnqueueOneCommand()
@@ -350,7 +351,7 @@ public function testQueryStreamWillEnqueueOneCommand()
350351
$loop->expects($this->never())->method('addTimer');
351352

352353
$conn = new Connection($stream, $executor, $parser, $loop, null);
353-
$conn->queryStream('SELECT 1');
354+
$conn->queryStream(new Query('SELECT 1'));
354355
}
355356

356357
public function testQueryStreamWillReturnStreamThatWillEmitEndEventAndStartIdleTimerWhenQueryCommandEmitsSuccess()
@@ -374,7 +375,7 @@ public function testQueryStreamWillReturnStreamThatWillEmitEndEventAndStartIdleT
374375

375376
$this->assertNull($currentCommand);
376377

377-
$stream = $connection->queryStream('SELECT 1');
378+
$stream = $connection->queryStream(new Query('SELECT 1'));
378379

379380
$stream->on('end', $this->expectCallableOnce());
380381
$stream->on('close', $this->expectCallableOnce());
@@ -404,7 +405,7 @@ public function testQueryStreamWillReturnStreamThatWillEmitErrorEventAndStartIdl
404405

405406
$this->assertNull($currentCommand);
406407

407-
$stream = $connection->queryStream('SELECT 1');
408+
$stream = $connection->queryStream(new Query('SELECT 1'));
408409

409410
$stream->on('error', $this->expectCallableOnceWith($this->isInstanceOf('RuntimeException')));
410411
$stream->on('close', $this->expectCallableOnce());
@@ -641,7 +642,7 @@ public function testQueryAfterQuitRejectsImmediately()
641642

642643
$conn = new Connection($stream, $executor, $parser, $loop, null);
643644
$conn->quit();
644-
$promise = $conn->query('SELECT 1');
645+
$promise = $conn->query(new Query('SELECT 1'));
645646

646647
$promise->then(null, $this->expectCallableOnceWith(
647648
$this->logicalAnd(
@@ -668,7 +669,7 @@ public function testQueryAfterCloseRejectsImmediately()
668669

669670
$conn = new Connection($stream, $executor, $parser, $loop, null);
670671
$conn->close();
671-
$promise = $conn->query('SELECT 1');
672+
$promise = $conn->query(new Query('SELECT 1'));
672673

673674
$promise->then(null, $this->expectCallableOnceWith(
674675
$this->logicalAnd(
@@ -697,7 +698,7 @@ public function testQueryStreamAfterQuitThrows()
697698
$conn->quit();
698699

699700
try {
700-
$conn->queryStream('SELECT 1');
701+
$conn->queryStream(new Query('SELECT 1'));
701702
} catch (\RuntimeException $e) {
702703
$this->assertEquals('Connection closing (ENOTCONN)', $e->getMessage());
703704
$this->assertEquals(defined('SOCKET_ENOTCONN') ? SOCKET_ENOTCONN : 107, $e->getCode());

tests/Io/QueryTest.php

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,57 +9,42 @@ class QueryTest extends TestCase
99
{
1010
public function testBindParams()
1111
{
12-
$query = new Query('select * from test where id = ? and name = ?');
13-
$sql = $query->bindParamsFromArray([100, 'test'])->getSql();
14-
$this->assertEquals("select * from test where id = 100 and name = 'test'", $sql);
12+
$query = new Query('select * from test where id = ? and name = ?', [100, 'test']);
13+
$this->assertEquals("select * from test where id = 100 and name = 'test'", $query->getSql());
1514

16-
$query = new Query('select * from test where id in (?,?) and name = ?');
17-
$sql = $query->bindParamsFromArray([1, 2, 'test'])->getSql();
18-
$this->assertEquals("select * from test where id in (1,2) and name = 'test'", $sql);
15+
$query = new Query('select * from test where id in (?,?) and name = ?', [1, 2, 'test']);
16+
$this->assertEquals("select * from test where id in (1,2) and name = 'test'", $query->getSql());
1917
/*
20-
$query = new Query('select * from test where id = :id and name = :name');
21-
$sql = $query->bindParamsFromArray([':id' => 100, ':name' => 'test'])->getSql();
22-
$this->assertEquals("select * from test where id = 100 and name = 'test'", $sql);
18+
$query = new Query('select * from test where id = :id and name = :name', [':id' => 100, ':name' => 'test']);
19+
$this->assertEquals("select * from test where id = 100 and name = 'test'", $query->getSql());
2320
24-
$query = new Query('select * from test where id = :id and name = ?');
25-
$sql = $query->bindParamsFromArray(['test', ':id' => 100])->getSql();
26-
$this->assertEquals("select * from test where id = 100 and name = 'test'", $sql);
21+
$query = new Query('select * from test where id = :id and name = ?', ['test', ':id' => 100]);
22+
$this->assertEquals("select * from test where id = 100 and name = 'test'", $query->getSql());
2723
*/
2824
}
2925

3026
public function testGetSqlReturnsQuestionMarkReplacedWhenBound()
3127
{
32-
$query = new Query('select ?');
33-
$sql = $query->bindParamsFromArray(['hello'])->getSql();
34-
$this->assertEquals("select 'hello'", $sql);
35-
}
36-
37-
public function testGetSqlReturnsQuestionMarkReplacedWhenBoundFromLastCall()
38-
{
39-
$query = new Query('select ?');
40-
$sql = $query->bindParamsFromArray(['foo'])->bindParamsFromArray(['bar'])->getSql();
41-
$this->assertEquals("select 'bar'", $sql);
28+
$query = new Query('select ?', ['hello']);
29+
$this->assertEquals("select 'hello'", $query->getSql());
4230
}
4331

4432
public function testGetSqlReturnsQuestionMarkReplacedWithNullValueWhenBound()
4533
{
46-
$query = new Query('select ?');
47-
$sql = $query->bindParamsFromArray([null])->getSql();
48-
$this->assertEquals("select NULL", $sql);
34+
$query = new Query('select ?', [null]);
35+
$this->assertEquals("select NULL", $query->getSql());
4936
}
5037

5138
public function testGetSqlReturnsQuestionMarkReplacedFromBoundWhenBound()
5239
{
53-
$query = new Query('select CONCAT(?, ?)');
54-
$sql = $query->bindParamsFromArray(['hello??', 'world??'])->getSql();
55-
$this->assertEquals("select CONCAT('hello??', 'world??')", $sql);
40+
$query = new Query('select CONCAT(?, ?)', ['hello??', 'world??']);
41+
$this->assertEquals("select CONCAT('hello??', 'world??')", $query->getSql());
5642
}
5743

5844
public function testGetSqlReturnsQuestionMarksAsIsWhenNotBound()
5945
{
6046
$query = new Query('select "hello?"');
61-
$sql = $query->getSql();
62-
$this->assertEquals("select \"hello?\"", $sql);
47+
$this->assertEquals("select \"hello?\"", $query->getSql());
6348
}
6449

6550
public function testEscapeChars()

0 commit comments

Comments
 (0)