Skip to content

Commit

Permalink
Merge pull request #2 from cadrephp/1.x-connection-factory
Browse files Browse the repository at this point in the history
Introducing ConnectionFactory
  • Loading branch information
andrewshell committed Feb 17, 2017
2 parents c029114 + 877bfa2 commit 253321e
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 8 deletions.
24 changes: 24 additions & 0 deletions README.md
Expand Up @@ -41,3 +41,27 @@ $debugbar->addCollector(
new Cadre\AtlasOrmDebugBarBridge\AtlasOrmCollector($atlasContainer)
);
```

## Multiple Connections

```php
$atlasContainer = Cadre\AtlasOrmDebugBarBridge\AtlasContainer(
'mysql:host=localhost;dbname=testdb',
'username',
'password'
);

$factory = new Cadre\AtlasOrmDebugBarBridge\ConnectionFactory(
'mysql:host=localhost;dbname=slavedb',
'readonly',
'password'
);

$atlasContainer->setReadConnection('readonly', $factory);

$collector = new Cadre\AtlasOrmDebugBarBridge\AtlasOrmCollector($container);
$collector->addConnectionFactory($factory, 'readonly');

$debugbar = new DebugBar\StandardDebugBar();
$debugbar->addCollector($collector);
```
33 changes: 29 additions & 4 deletions src/AtlasContainer.php
Expand Up @@ -8,9 +8,34 @@ class AtlasContainer extends BaseAtlasContainer
{
protected function setConnectionLocator(array $args)
{
$this->connectionLocator = new ConnectionLocator();
$this->connectionLocator->setDefault(function () use ($args) {
return new ExtendedPdo(...$args);
});
switch (true) {

case $args[0] instanceof ExtendedPdo:
$extendedPdo = $args[0];
$default = function () use ($extendedPdo) {
return $extendedPdo;
};
$driver = $extendedPdo->getAttribute(PDO::ATTR_DRIVER_NAME);
break;

case $args[0] instanceof PDO:
$extendedPdo = $args[0];
$default = function () use ($pdo) {
return new ExtendedPdo($pdo);
};
$driver = $pdo->getAttribute(ExtendedPdo::ATTR_DRIVER_NAME);
break;

default:
$default = function () use ($args) {
return new ExtendedPdo(...$args);
};
$parts = explode(':', $args[0]);
$driver = array_shift($parts);
break;
}

$this->connectionLocator = new ConnectionLocator($default);
return $driver;
}
}
5 changes: 5 additions & 0 deletions src/AtlasOrmCollector.php
Expand Up @@ -17,4 +17,9 @@ public function __construct(
}
parent::__construct($pdo, $timeCollector);
}

public function addConnectionFactory(ConnectionFactory $factory, $name = null)
{
$factory->setCollector($this, $name);
}
}
65 changes: 65 additions & 0 deletions src/ConnectionFactory.php
@@ -0,0 +1,65 @@
<?php
namespace Cadre\AtlasOrmDebugBarBridge;

use Aura\Sql\ExtendedPdo as BaseExtendedPdo;
use DebugBar\DataCollector\PDO\TraceablePDO;
use PDO;

class ConnectionFactory
{
private $dsn;
private $username;
private $password;
private $options = array();
private $attributes = array();
private $pdo;

public function __construct(
$dsn,
$username = null,
$password = null,
array $options = array(),
array $attributes = array()
) {
if ($dsn instanceof ExtendedPdo) {
$this->pdo = $dsn;
} elseif ($dsn instanceof BaseExtendedPdo) {
$this->pdo = new ExtendedPdo(new TraceablePDO($dsn->getPdo()));
} elseif ($dsn instanceof TraceablePDO) {
$this->pdo = new ExtendedPdo($dsn);
} elseif ($dsn instanceof PDO) {
$this->pdo = new ExtendedPdo(new TraceablePDO($dsn));
} else {
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->options = $options;
$this->attributes = array_replace($this->attributes, $attributes);
}
}

public function __invoke()
{
if (!isset($this->pdo)) {
$this->pdo = new ExtendedPdo(
$this->dsn,
$this->username,
$this->password,
$this->options,
$this->attributes
);
}

if (isset($this->collector)) {
$this->collector->addConnection($this->pdo->getPdo(), $this->name);
}

return $this->pdo;
}

public function setCollector(AtlasOrmCollector $collector, $name = null)
{
$this->collector = $collector;
$this->name = $name;
}
}
20 changes: 18 additions & 2 deletions tests/AtlasContainerTest.php
@@ -1,6 +1,4 @@
<?php
declare(strict_types=1);

namespace Cadre\AtlasOrmDebugBarBridge;

use Aura\Sql\ConnectionLocator;
Expand All @@ -23,4 +21,22 @@ public function testContainer()
$this->assertInstanceOf(ExtendedPdo::class, $extended);
$this->assertInstanceOf(TraceablePDO::class, $pdo);
}

public function testContainerWithConnectionFactory()
{
$container = new AtlasContainer('sqlite::memory:');
$factory = new ConnectionFactory('sqlite::memory:');
$container->setReadConnection('readonly', $factory);

$locator = $container->getConnectionLocator();
$extended = $locator->getRead('readonly');
$pdo = $extended->getPdo();

// Shouldn't reconnect
$extended->connect();

$this->assertInstanceOf(ConnectionLocator::class, $locator);
$this->assertInstanceOf(ExtendedPdo::class, $extended);
$this->assertInstanceOf(TraceablePDO::class, $pdo);
}
}
24 changes: 22 additions & 2 deletions tests/AtlasOrmCollectorTest.php
@@ -1,6 +1,4 @@
<?php
declare(strict_types=1);

namespace Cadre\AtlasOrmDebugBarBridge;

use Aura\Sql\ConnectionLocator;
Expand Down Expand Up @@ -34,4 +32,26 @@ public function testCollectorWithDefaultConnection()
$this->assertArrayHasKey('default', $collections);
$this->assertSame($pdo, $collections['default']);
}

public function testCollectorWithConnectionFactory()
{
$container = new AtlasContainer('sqlite::memory:');
$factory = new ConnectionFactory('sqlite::memory:');
$container->setReadConnection('readonly', $factory);

$collector = new AtlasOrmCollector($container);
$collector->addConnectionFactory($factory, 'readonly');

$collections = $collector->getConnections();

$this->assertArrayHasKey('default', $collections);
$this->assertArrayNotHasKey('readonly', $collections);

$extended = $container->getConnectionLocator()->getRead('readonly');

$collections = $collector->getConnections();
$this->assertArrayHasKey('default', $collections);
$this->assertArrayHasKey('readonly', $collections);
$this->assertNotSame($collections['default'], $collections['readonly']);
}
}
64 changes: 64 additions & 0 deletions tests/ConnectionFactoryTest.php
@@ -0,0 +1,64 @@
<?php
namespace Cadre\AtlasOrmDebugBarBridge;

use Aura\Sql\ExtendedPdo as BaseExtendedPdo;
use DebugBar\DataCollector\PDO\TraceablePDO;
use PDO;
use PHPUnit\Framework\TestCase;

class ConnectionFactoryTest extends TestCase
{
public function testConnectionFactoryWithConfig()
{
$factory = new ConnectionFactory('sqlite::memory:');
$extended = ($factory)();

$this->assertInstanceOf(ExtendedPdo::class, $extended);
}

public function testConnectionFactoryWithExtendedPdo()
{
$pdo = new ExtendedPdo('sqlite::memory:');

$factory = new ConnectionFactory($pdo);
$extended = ($factory)();

$this->assertInstanceOf(ExtendedPdo::class, $extended);
$this->assertSame($pdo, $extended);
}

public function testConnectionFactoryWithTraceablePdo()
{
$pdo = new TraceablePDO(new PDO('sqlite::memory:'));

$factory = new ConnectionFactory($pdo);
$extended = ($factory)();

$this->assertInstanceOf(ExtendedPdo::class, $extended);
$this->assertSame($pdo, $extended->getPdo());
}

public function testConnectionFactoryWithPdo()
{
$pdo = new PDO('sqlite::memory:');

$factory = new ConnectionFactory($pdo);
$extended = ($factory)();
$traceable = $extended->getPdo();

$this->assertInstanceOf(ExtendedPdo::class, $extended);
$this->assertInstanceOf(TraceablePDO::class, $traceable);
}

public function testConnectionFactoryWithBaseExtendedPdo()
{
$pdo = new BaseExtendedPdo('sqlite::memory:');

$factory = new ConnectionFactory($pdo);
$extended = ($factory)();
$traceable = $extended->getPdo();

$this->assertInstanceOf(ExtendedPdo::class, $extended);
$this->assertInstanceOf(TraceablePDO::class, $traceable);
}
}

0 comments on commit 253321e

Please sign in to comment.