| 
<?php
 namespace queasy\db;
 
 use ArrayAccess;
 
 use InvalidArgumentException;
 
 class Connection
 {
 const DEFAULT = 'sqlite::memory:';
 const DEFAULT_DRIVER = 'sqlite';
 
 const GENERIC_TEMPLATE = '%s:host=%s;port=%s;dbname=%s';
 const SQLITE_TEMPLATE = 'sqlite:%s';
 
 /**
 * @var string Connection string.
 */
 private $string;
 
 /**
 * Constructor.
 *
 * @param string|array|ArrayAccess $config String representing DSN, or array (or ArrayAccess instance) with database connection config options
 *
 * @throws DbException When $config doesn't represent a recognizable structure to build connection string
 */
 public function __construct($config = null)
 {
 if (empty($config)) {
 $this->string = static::DEFAULT;
 
 return;
 }
 
 if (is_string($config)) {
 $this->string = $config;
 
 return;
 }
 
 if (is_array($config) || (is_object($config) && ($config instanceof ArrayAccess))) {
 if (isset($config['dsn'])) {
 $this->string = $config['dsn'];
 
 return;
 }
 
 $this->string = isset($config['driver'])
 ? sprintf(
 static::GENERIC_TEMPLATE,
 $config['driver'],
 isset($config['host'])? $config['host']: null,
 isset($config['port'])? $config['port']: null,
 isset($config['name'])? $config['name']: null)
 : sprintf(
 static::SQLITE_TEMPLATE,
 isset($config['path'])
 ? $config['path']
 : ':memory:');
 
 return;
 }
 
 throw new InvalidArgumentException('Wrong config argument.');
 }
 
 /**
 * Returns generated connection string.
 *
 * @return string Connection string
 */
 public function get()
 {
 return $this->string;
 }
 
 /**
 * Returns generated connection string when class instance is invoked as a function.
 *
 * @return string Connection string
 */
 public function __invoke()
 {
 return $this->get();
 }
 }
 
 
 |