diff --git a/src/Config.php b/src/Config.php index d7c8c96..a1e8bbf 100644 --- a/src/Config.php +++ b/src/Config.php @@ -14,7 +14,8 @@ class Config protected $cluster; protected $address; protected $port = 3306; - protected $properties = []; + protected $properties = []; // arbitrary database properties such as name, description, tier, etc + protected $arguments = []; // DSN arguments protected $fileName; public function getName() @@ -138,6 +139,25 @@ public function getProperty($key) return $this->properties[$key]; } + public function setArgument($key, $value) + { + $this->arguments[$key] = $value; + return $this; + } + + public function getArgument($key) + { + if (!isset($this->arguments[$key])) { + return null; + } + return $this->arguments[$key]; + } + + public function getArguments() + { + return $this->arguments; + } + public function validate() { if (!$this->getName()) { diff --git a/src/Connector.php b/src/Connector.php index ea4c00d..c9aa7c8 100644 --- a/src/Connector.php +++ b/src/Connector.php @@ -23,6 +23,13 @@ public function getConfig($dsn) $config->setPassword(parse_url($dsn, PHP_URL_PASS)); $config->setAddress(parse_url($dsn, PHP_URL_HOST)); $port = parse_url($dsn, PHP_URL_PORT); + $arguments = parse_url($dsn, PHP_URL_QUERY); + parse_str($arguments, $arguments); // parse ?x=y&a=b format into k/v array + + foreach ($arguments as $k=>$v) { + $config->setArgument($k, $v); + } + if ($port) { $config->setPort($port); } @@ -94,6 +101,9 @@ public function getPdoDsn(Config $config, $mode = 'db') break; case 'sqlsrv': $pdoDsn .= 'Server=' . $config->getAddress() . ';Database=' . $config->getName(); + foreach ($config->getArguments() as $k=>$v) { + $pdoDsn .= ';' . $k . '=' . $v; + } break; default: throw new RuntimeException("Unsupported driver: " . $config->getDriver());