Skip to content

Commit

Permalink
Merge pull request #3305 from BradCrumb/master-slave-fetch-mode
Browse files Browse the repository at this point in the history
Fix Fetch mode query in MasterSlaveConnection
  • Loading branch information
morozov committed Dec 7, 2018
2 parents 1b19356 + 2b49635 commit af38e25
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/Doctrine/DBAL/Connections/MasterSlaveConnection.php
Expand Up @@ -354,6 +354,8 @@ public function query()

$statement = $this->_conn->query(...$args);

$statement->setFetchMode($this->defaultFetchMode);

if ($logger) {
$logger->stopQuery();
}
Expand Down
51 changes: 51 additions & 0 deletions tests/Doctrine/Tests/DBAL/Functional/MasterSlaveConnectionTest.php
Expand Up @@ -3,6 +3,7 @@
namespace Doctrine\Tests\DBAL\Functional;

use Doctrine\DBAL\Connections\MasterSlaveConnection;
use Doctrine\DBAL\Driver\Statement;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\Table;
use Doctrine\Tests\DbalFunctionalTestCase;
Expand Down Expand Up @@ -187,4 +188,54 @@ public function testMasterSlaveConnectionCloseAndReconnect()
$conn->connect('master');
self::assertTrue($conn->isConnectedToMaster());
}

public function testQueryOnMaster()
{
$conn = $this->createMasterSlaveConnection();

$query = 'SELECT count(*) as num FROM master_slave_table';

$statement = $conn->query($query);

self::assertInstanceOf(Statement::class, $statement);

//Query must be executed only on Master
self::assertTrue($conn->isConnectedToMaster());

$data = $statement->fetchAll();

//Default fetchmode is FetchMode::ASSOCIATIVE
self::assertArrayHasKey(0, $data);
self::assertArrayHasKey('num', $data[0]);

//Could be set in other fetchmodes
self::assertArrayNotHasKey(0, $data[0]);
self::assertEquals(1, $data[0]['num']);
}

public function testQueryOnSlave()
{
$conn = $this->createMasterSlaveConnection();
$conn->connect('slave');

$query = 'SELECT count(*) as num FROM master_slave_table';

$statement = $conn->query($query);

self::assertInstanceOf(Statement::class, $statement);

//Query must be executed only on Master, even when we connect to the slave
self::assertTrue($conn->isConnectedToMaster());

$data = $statement->fetchAll();

//Default fetchmode is FetchMode::ASSOCIATIVE
self::assertArrayHasKey(0, $data);
self::assertArrayHasKey('num', $data[0]);

//Could be set in other fetchmodes
self::assertArrayNotHasKey(0, $data[0]);

self::assertEquals(1, $data[0]['num']);
}
}

0 comments on commit af38e25

Please sign in to comment.