Skip to content

Commit cf98cc9

Browse files
authored
Merge pull request #3201 from stof/parse_url
Fix support for URL to account for master-slave and pooling-shard connections
2 parents 7bbed59 + 09aadef commit cf98cc9

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

lib/Doctrine/DBAL/DriverManager.php

+22
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,28 @@ public static function getConnection(
155155

156156
$params = self::parseDatabaseUrl($params);
157157

158+
// URL support for MasterSlaveConnection
159+
if (isset($params['master'])) {
160+
$params['master'] = self::parseDatabaseUrl($params['master']);
161+
}
162+
163+
if (isset($params['slaves'])) {
164+
foreach ($params['slaves'] as $key => $slaveParams) {
165+
$params['slaves'][$key] = self::parseDatabaseUrl($slaveParams);
166+
}
167+
}
168+
169+
// URL support for PoolingShardConnection
170+
if (isset($params['global'])) {
171+
$params['global'] = self::parseDatabaseUrl($params['global']);
172+
}
173+
174+
if (isset($params['shards'])) {
175+
foreach ($params['shards'] as $key => $shardParams) {
176+
$params['shards'][$key] = self::parseDatabaseUrl($shardParams);
177+
}
178+
}
179+
158180
// check for existing pdo object
159181
if (isset($params['pdo']) && ! $params['pdo'] instanceof \PDO) {
160182
throw DBALException::invalidPdoInstance();

tests/Doctrine/Tests/DBAL/DriverManagerTest.php

+71
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
namespace Doctrine\Tests\DBAL;
44

5+
use Doctrine\DBAL\Connections\MasterSlaveConnection;
56
use Doctrine\DBAL\DBALException;
67
use Doctrine\DBAL\Driver\DrizzlePDOMySql\Driver as DrizzlePDOMySqlDriver;
78
use Doctrine\DBAL\Driver\PDOMySql\Driver as PDOMySQLDriver;
89
use Doctrine\DBAL\Driver\PDOSqlite\Driver as PDOSqliteDriver;
910
use Doctrine\DBAL\Driver\SQLSrv\Driver as SQLSrvDriver;
1011
use Doctrine\DBAL\DriverManager;
12+
use Doctrine\DBAL\Sharding\PoolingShardConnection;
13+
use Doctrine\DBAL\Sharding\ShardChoser\MultiTenantShardChoser;
1114
use Doctrine\Tests\DBAL\Mocks\MockPlatform;
1215
use Doctrine\Tests\DbalTestCase;
1316
use Doctrine\Tests\Mocks\ConnectionMock;
@@ -133,6 +136,74 @@ public function testValidDriverClass()
133136
self::assertInstanceOf(PDOMySQLDriver::class, $conn->getDriver());
134137
}
135138

139+
public function testDatabaseUrlMasterSlave()
140+
{
141+
$options = [
142+
'driver' => 'pdo_mysql',
143+
'master' => ['url' => 'mysql://foo:bar@localhost:11211/baz'],
144+
'slaves' => [
145+
'slave1' => ['url' => 'mysql://foo:bar@localhost:11211/baz_slave'],
146+
],
147+
'wrapperClass' => MasterSlaveConnection::class,
148+
];
149+
150+
$conn = DriverManager::getConnection($options);
151+
152+
$params = $conn->getParams();
153+
self::assertInstanceOf(PDOMySQLDriver::class, $conn->getDriver());
154+
155+
$expected = [
156+
'user' => 'foo',
157+
'password' => 'bar',
158+
'host' => 'localhost',
159+
'port' => 11211,
160+
];
161+
162+
foreach ($expected as $key => $value) {
163+
self::assertEquals($value, $params['master'][$key]);
164+
self::assertEquals($value, $params['slaves']['slave1'][$key]);
165+
}
166+
167+
self::assertEquals('baz', $params['master']['dbname']);
168+
self::assertEquals('baz_slave', $params['slaves']['slave1']['dbname']);
169+
}
170+
171+
public function testDatabaseUrlShard()
172+
{
173+
$options = [
174+
'driver' => 'pdo_mysql',
175+
'shardChoser' => MultiTenantShardChoser::class,
176+
'global' => ['url' => 'mysql://foo:bar@localhost:11211/baz'],
177+
'shards' => [
178+
[
179+
'id' => 1,
180+
'url' => 'mysql://foo:bar@localhost:11211/baz_slave',
181+
],
182+
],
183+
'wrapperClass' => PoolingShardConnection::class,
184+
];
185+
186+
$conn = DriverManager::getConnection($options);
187+
188+
$params = $conn->getParams();
189+
self::assertInstanceOf(PDOMySQLDriver::class, $conn->getDriver());
190+
191+
$expected = [
192+
'user' => 'foo',
193+
'password' => 'bar',
194+
'host' => 'localhost',
195+
'port' => 11211,
196+
];
197+
198+
foreach ($expected as $key => $value) {
199+
self::assertEquals($value, $params['global'][$key]);
200+
self::assertEquals($value, $params['shards'][0][$key]);
201+
}
202+
203+
self::assertEquals('baz', $params['global']['dbname']);
204+
self::assertEquals('baz_slave', $params['shards'][0]['dbname']);
205+
}
206+
136207
/**
137208
* @dataProvider databaseUrls
138209
*/

0 commit comments

Comments
 (0)