3 namespace Doctrine\Tests\DBAL\Functional;
5 use Doctrine\Tests\DbalFunctionalTestCase;
6 use Doctrine\DBAL\DriverManager;
11 class MasterSlaveConnectionTest extends DbalFunctionalTestCase
13 public function setUp()
17 if ($this->_conn->getDatabasePlatform()->getName() == "sqlite") {
18 $this->markTestSkipped('Test does not work on sqlite.');
22 /* @var $sm \Doctrine\DBAL\Schema\AbstractSchemaManager */
23 $table = new \Doctrine\DBAL\Schema\Table("master_slave_table");
24 $table->addColumn('test_int', 'integer');
25 $table->setPrimaryKey(array('test_int'));
27 $sm = $this->_conn->getSchemaManager();
28 $sm->createTable($table);
30 $this->_conn->insert('master_slave_table', array('test_int' => 1));
31 } catch(\Exception $e) {
35 public function createMasterSlaveConnection($keepSlave = false)
37 $params = $this->_conn->getParams();
38 $params['master'] = $params;
39 $params['slaves'] = array($params, $params);
40 $params['keepSlave'] = $keepSlave;
41 $params['wrapperClass'] = 'Doctrine\DBAL\Connections\MasterSlaveConnection';
43 return DriverManager::getConnection($params);
46 public function testMasterOnConnect()
48 $conn = $this->createMasterSlaveConnection();
50 $this->assertFalse($conn->isConnectedToMaster());
51 $conn->connect('slave');
52 $this->assertFalse($conn->isConnectedToMaster());
53 $conn->connect('master');
54 $this->assertTrue($conn->isConnectedToMaster());
57 public function testNoMasterOnExecuteQuery()
59 $conn = $this->createMasterSlaveConnection();
61 $sql = "SELECT count(*) as num FROM master_slave_table";
62 $data = $conn->fetchAll($sql);
63 $data[0] = array_change_key_case($data[0], CASE_LOWER);
65 $this->assertEquals(1, $data[0]['num']);
66 $this->assertFalse($conn->isConnectedToMaster());
69 public function testMasterOnWriteOperation()
71 $conn = $this->createMasterSlaveConnection();
72 $conn->insert('master_slave_table', array('test_int' => 30));
74 $this->assertTrue($conn->isConnectedToMaster());
76 $sql = "SELECT count(*) as num FROM master_slave_table";
77 $data = $conn->fetchAll($sql);
78 $data[0] = array_change_key_case($data[0], CASE_LOWER);
80 $this->assertEquals(2, $data[0]['num']);
81 $this->assertTrue($conn->isConnectedToMaster());
87 public function testKeepSlaveBeginTransactionStaysOnMaster()
89 $conn = $this->createMasterSlaveConnection($keepSlave = true);
90 $conn->connect('slave');
92 $conn->insert('master_slave_table', array('test_int' => 40));
94 $this->assertTrue($conn->isConnectedToMaster());
97 $this->assertTrue($conn->isConnectedToMaster());
99 $conn->connect('slave');
100 $this->assertFalse($conn->isConnectedToMaster());