Last active
August 29, 2015 14:07
-
-
Save ryanhalliday/007dab505210f05f4986 to your computer and use it in GitHub Desktop.
SQL Connection Manager
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Ry167\SQL; | |
use InvalidArgumentException; | |
/** | |
* SQL Connection Manager | |
* | |
* Manages a multiple SQL Connections and their initiation. | |
* @author Ryan Halliday <[email protected]> | |
* @link http://ry167.com | |
* @version 0.1 | |
*/ | |
class Connections{ | |
/** | |
* Stores available connection options | |
* @var array | |
*/ | |
private $Connections = array( | |
'default' => null, | |
); | |
/** | |
* Stores available read-only connections | |
* @var array | |
*/ | |
private $Reads = array(); | |
/** | |
* Stores available write connections | |
* @var array | |
*/ | |
private $Writes = array(); | |
/** | |
* Default options for a connection to have | |
* @var array | |
*/ | |
private $Options = array(); | |
/** | |
* What class to initiate upon calling a get*() method. | |
* @var string | |
*/ | |
private $Class = '\PDO'; | |
/** | |
* Constructs the connector class and potentially adds a default connection | |
* @param string $dsn | |
* @param string $username | |
* @param string $password | |
* @param array $options | |
*/ | |
public function __construct($dsn = null, $username = null, $password = null, $options = array()){ | |
if (!is_null($dsn)) $this->addConnection('default',$dsn,$username,$password,$options); | |
} | |
/** | |
* Set the class to initiate upon calling a get*() method. | |
* @param string $class | |
*/ | |
public function setClass($class){ | |
$this->Class = $class; | |
} | |
/** | |
* Set default options for connections. Their own settings will override these defaults | |
* @param mixed|array $key Can be an array of Key => Value pairs of options or the key for the $val parameter. | |
* @param mixed $val Value to be set for the previous key. | |
*/ | |
public function setOptions($key,$val = null){ | |
if (is_array($key)){ | |
$this->Options = $this->Options + $key; | |
} | |
else $this->Options[$key] = $val; | |
} | |
/** | |
* Adds a named array of Connection settings to the Connections array | |
* @param string $name Type of connection to add. Should be 'write', 'read' or 'default' unless it is being uniquely named, which is allowed. | |
* @param string $dsn Data Source Name for PDO | |
* @param string $username Username for PDO | |
* @param string $password Password for PDO | |
* @param array $options | |
*/ | |
public function add($name, $dsn, $username = null, $password = null, $options = array()){ | |
if (strtolower($name) == 'write' || strtolower($name) == 'read'){ | |
$this->{ucfirst(strtolower($name))."s"}[] = array( | |
'dsn' => $dsn, | |
'username' => $username, | |
'password' => $password, | |
'options' => $options | |
); | |
} | |
else{ | |
$this->Connections[$name] = array( | |
'dsn' => $dsn, | |
'username' => $username, | |
'password' => $password, | |
'options' => $options | |
); | |
} | |
} | |
/** | |
* Get a named connection | |
* @param string $name Name of the connection | |
* @throws InvalidArgumentException If there is no connection of the name specified | |
*/ | |
public function get($name){ | |
if (isset($this->Connections[$name]) && !is_null($this->Connections)){ | |
$Options = $this->Options + $this->Connections[$name]['options']; | |
return new $this->Class($this->Connections[$name]['dsn'],$this->Connections[$name]['username'], | |
$this->Connections[$name]['password'],$Options); | |
} | |
else throw new InvalidArgumentException("No default connection available and none specified"); | |
} | |
/** | |
* Initiate the default connection | |
* @see Connections::get() This is just an alias. | |
*/ | |
public function getDefault(){ | |
return $this->get('default'); | |
} | |
/** | |
* Gets a random writable connection | |
* @return mixed Instance of $this->Class (Default: PDO) | |
* @throws InvalidArgumentException If there is no write connections specified | |
*/ | |
public function getWrite(){ | |
if (count($this->Writes) > 0){ | |
$Num = mt_rand(0,count($this->Writes)-1); | |
$Options = $this->Options + $this->Writes[$Num]['options']; | |
return new $this->Class($this->Writes[$Num]['dsn'],$this->Writes[$Num]['username'], | |
$this->Writes[$Num]['password'],$Options); | |
} | |
else throw new InvalidArgumentException("There must be at least one write connection defined to be able to get one"); | |
} | |
/** | |
* Gets a random readable connection | |
* @return mixed Instance of $this->Class (Default: PDO) | |
* @throws InvalidArgumentException If there is no read connections specified | |
*/ | |
public function getRead(){ | |
if (count($this->Reads) > 0){ | |
$Num = mt_rand(0,count($this->Reads)-1); | |
$Options = $this->Options + $this->Reads[$Num]['options']; | |
return new $this->Class($this->Reads[$Num]['dsn'],$this->Reads[$Num]['username'], | |
$this->Reads[$Num]['password'],$Options); | |
} | |
else throw new InvalidArgumentException("There must be at least one read connection defined to be able to get one"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment