private function setupDatabase($config, $name)
{
$builder = $this->getContainerBuilder();
foreach ((array) $config['options'] as $key => $value) {
if (preg_match('#^PDO::\\w+\\z#', $key)) {
unset($config['options'][$key]);
$config['options'][constant($key)] = $value;
}
}
$connection = $builder->addDefinition($this->prefix("{$name}.connection"))->setClass(Nette\Database\Connection::class, [$config['dsn'], $config['user'], $config['password'], $config['options']])->setAutowired($config['autowired']);
$structure = $builder->addDefinition($this->prefix("{$name}.structure"))->setClass(Nette\Database\Structure::class)->setArguments([$connection])->setAutowired($config['autowired']);
if (!empty($config['reflection'])) {
$conventionsServiceName = 'reflection';
$config['conventions'] = $config['reflection'];
if (is_string($config['conventions']) && strtolower($config['conventions']) === 'conventional') {
$config['conventions'] = 'Static';
}
} else {
$conventionsServiceName = 'conventions';
}
if (!$config['conventions']) {
$conventions = NULL;
} elseif (is_string($config['conventions'])) {
$conventions = $builder->addDefinition($this->prefix("{$name}.{$conventionsServiceName}"))->setClass(preg_match('#^[a-z]+\\z#i', $config['conventions']) ? 'Nette\\Database\\Conventions\\' . ucfirst($config['conventions']) . 'Conventions' : $config['conventions'])->setArguments(strtolower($config['conventions']) === 'discovered' ? [$structure] : [])->setAutowired($config['autowired']);
} else {
$tmp = Nette\DI\Compiler::filterArguments([$config['conventions']]);
$conventions = reset($tmp);
}
$builder->addDefinition($this->prefix("{$name}.context"))->setClass(Nette\Database\Context::class, [$connection, $structure, $conventions])->setAutowired($config['autowired']);
if ($config['debugger']) {
$connection->addSetup('@Tracy\\BlueScreen::addPanel', ['Nette\\Bridges\\DatabaseTracy\\ConnectionPanel::renderException']);
if ($this->debugMode) {
$connection->addSetup('Nette\\Database\\Helpers::createDebugPanel', [$connection, !empty($config['explain']), $name]);
}
}
if ($this->name === 'database') {
$builder->addAlias($this->prefix($name), $this->prefix("{$name}.connection"));
$builder->addAlias("nette.database.{$name}", $this->prefix($name));
$builder->addAlias("nette.database.{$name}.context", $this->prefix("{$name}.context"));
}
}