namespace DataAccess\DataMapper;\r
\r
use Domain\Entities\IDivineEntity;\r
+use DataAccess\IDatabaseFactory;\r
use DataAccess\DataMapper\IDataMapper;\r
use DataAccess\Queries\IQueryBuilder;\r
use DataAccess\DataMapper\Helpers\AbstractPopulationHelper;\r
use ReflectionClass;\r
-use PDO;\r
\r
class DataMapper implements IDataMapper\r
{\r
private $_db;\r
private $_maps;\r
\r
- public function __construct($maps, $dbCredentials)\r
+ public function __construct($maps, IDatabaseFactory $databaseFactory)\r
{\r
- $credentials = include $dbCredentials;\r
- //TODO: should probably do all this through a configuration object or something\r
- $dsn = 'mysql:host=localhost;dbname=divinelegy;charset=utf8';\r
- $username = 'root';\r
- $password = 'toor';\r
- $options = array(PDO::ATTR_EMULATE_PREPARES => false,\r
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);\r
- \r
- $this->_db = new PDO($dsn, $credentials['user'], $credentials['pass'], $options); \r
+ $this->_db = $databaseFactory->createInstance(); \r
$this->_maps = include $maps;\r
}\r
\r
--- /dev/null
+<?php
+
+namespace DataAccess;
+
+use DataAccess\IDatabaseFactory;
+
+use PDO;
+
+class DatabaseFactory implements IDatabaseFactory {
+
+ private $_username;
+ private $_password;
+ private $_dsn;
+
+ public function __construct($dbCredentials)
+ {
+ $credentials = include $dbCredentials;
+ //TODO: should probably do all this through a configuration object or something
+ $this->_dsn = $credentials['dsn'];
+ $this->_username = $credentials['user'];
+ $this->_password = $credentials['pass'];
+ }
+
+ public function createInstance()
+ {
+ $options = array(PDO::ATTR_EMULATE_PREPARES => false,
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
+ return new PDO($this->_dsn, $this->_username, $this->_password, $options);
+ }
+}
--- /dev/null
+<?php
+
+namespace DataAccess;
+
+interface IDatabaseFactory {
+ public function createInstance();
+}
protected $_whereClauses = array();
protected $_limitClause;
- protected $_joinClause;
+ protected $_joinClauses = array();
public function buildQuery()
{
- $this->applyJoinClause()
+ $this->applyJoinClauses()
->applyWhereClauses()
->applyLimitClause();
public function join($type, $tableA, $columnA, $tableB, $columnB)
{
- $this->_joinClause = sprintf(' %s JOIN %s ON %s.%s = %s.%s', $type, $tableB, $tableA, $columnA, $tableB, $columnB);
+ $this->_joinClauses[] = sprintf(' %s JOIN %s ON %s.%s = %s.%s', $type, $tableB, $tableA, $columnA, $tableB, $columnB);
return $this;
}
- private function applyJoinClause()
+ private function applyJoinClauses()
{
- $this->_queryString .= $this->_joinClause;
+ foreach($this->_joinClauses as $joinClause)
+ {
+ $this->_queryString .= $joinClause;
+ }
+
return $this;
}
\r
//DA\r
'DataAccess\StepMania\ISimfileRepository' => DI\object('DataAccess\StepMania\SimfileRepository'),\r
+ 'DataAccess\IDatabaseFactory' => DI\object('DataAccess\DatabaseFactory')\r
+ ->constructor(DI\link('db.credentials')),\r
'DataAccess\DataMapper\IDataMapper' => DI\object('DataAccess\DataMapper\DataMapper')\r
- ->constructor(DI\link('datamapper.maps'), DI\link('db.credentials')),\r
+ ->constructor(DI\link('datamapper.maps')),\r
'DataAccess\Queries\IQueryBuilderFactory' => DI\object('DataAccess\Queries\QueryBuilderFactory')\r
];\r