Skip to content

Commit

Permalink
add files
Browse files Browse the repository at this point in the history
  • Loading branch information
taylorotwell committed Apr 30, 2019
1 parent 4560d28 commit 05b029e
Showing 1 changed file with 190 additions and 0 deletions.
190 changes: 190 additions & 0 deletions src/Illuminate/Database/ConfigurationUrlParser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
<?php

namespace Illuminate\Database;

use Illuminate\Support\Arr;
use InvalidArgumentException;

class ConfigurationUrlParser
{
/**
* The drivers aliases map.
*
* @var array
*/
protected static $driverAliases = [
'mssql' => 'sqlsrv',
'mysql2' => 'mysql', // RDS
'postgres' => 'pgsql',
'postgresql' => 'pgsql',
'sqlite3' => 'sqlite',
];

/**
* Parse the database configuration, hydrating options using a database configuration URL if possible.
*
* @param array|string $config
* @return array
*/
public function parseConfiguration($config)
{
if (is_string($config)) {
$config = ['url' => $config];
}

$url = $config['url'] ?? null;

$config = Arr::except($config, 'url');

if (! $url) {
return $config;
}

$parsedUrl = $this->parseUrl($url);

return array_merge(
$config,
$this->getPrimaryOptions($parsedUrl),
$this->getQueryOptions($parsedUrl)
);
}

/**
* Get the primary database connection options.
*
* @param array $url
* @return array
*/
protected function getPrimaryOptions($url)
{
return array_filter([
'driver' => $this->getDriver($url),
'database' => $this->getDatabase($url),
'host' => $url['host'] ?? null,
'port' => $url['port'] ?? null,
'username' => $url['user'] ?? null,
'password' => $url['pass'] ?? null,
], function ($value) {
return ! is_null($value);
});
}

/**
* Get the database driver from the URL.
*
* @param array $url
* @return string|null
*/
protected function getDriver($url)
{
$alias = $url['scheme'] ?? null;

if (! $alias) {
return null;
}

return static::$driverAliases[$alias] ?? $alias;
}

/**
* Get the database name from the URL.
*
* @param array $url
* @return string|null
*/
protected function getDatabase($url)
{
$path = $url['path'] ?? null;

return $path ? substr($path, 1) : null;
}

/**
* Get all of the additional database options from the query string.
*
* @param array $url
* @return array
*/
protected function getQueryOptions($url)
{
$queryString = $url['query'] ?? null;

if (! $queryString) {
return [];
}

$query = [];

parse_str($queryString, $query);

return $this->parseStringsToNativeTypes($query);
}

/**
* Parse the string URL to an array of components.
*
* @param string $url
* @return array
*/
protected function parseUrl($url): array
{
$url = preg_replace('#^(sqlite3?):///#', '$1://null/', $url);

$parsedUrl = parse_url($url);

if ($parsedUrl === false) {
throw new InvalidArgumentException('The database configuration URL is malformed.');
}

return $this->parseStringsToNativeTypes(
array_map('rawurldecode', $parsedUrl)
);
}

/**
* Convert string casted values to their native types.
*
* @param mixed $value
* @return mixed
*/
protected function parseStringsToNativeTypes($value)
{
if (is_array($value)) {
return array_map([$this, 'parseStringsToNativeTypes'], $value);
}

if (! is_string($value)) {
return $value;
}

$parsedValue = json_decode($value, true);

if (json_last_error() === JSON_ERROR_NONE) {
return $parsedValue;
}

return $value;
}

/**
* Get all of the current drivers aliases.
*
* @return array
*/
public static function getDriverAliases()
{
return static::$driverAliases;
}

/**
* Add the given driver alias to the driver aliases array.
*
* @param string $alias
* @param string $driver
* @return void
*/
public static function addDriverAlias($alias, $driver)
{
static::$driverAliases[$alias] = $driver;
}
}

0 comments on commit 05b029e

Please sign in to comment.