Initial xentral_oss_20.3.c9ffacf
This commit is contained in:
@@ -0,0 +1,200 @@
|
||||
<?php
|
||||
|
||||
namespace Xentral\Core\LegacyConfig;
|
||||
|
||||
use Config;
|
||||
use Xentral\Core\LegacyConfig\Exception\MultiDbConfigNotFoundException;
|
||||
|
||||
final class ConfigLoader
|
||||
{
|
||||
/**
|
||||
* @return Config
|
||||
*/
|
||||
public static function load()
|
||||
{
|
||||
$defaultConfig = self::loadDefaultConfig();
|
||||
|
||||
// Ist MultiDb-Key gesetzt?
|
||||
$dbSelect = self::determineMultiDbConfigKey();
|
||||
if ($dbSelect === null) {
|
||||
return $defaultConfig;
|
||||
}
|
||||
|
||||
// Ist MultiDb-Config vorhanden?
|
||||
$multiDbArray = self::loadMultiDbArray();
|
||||
if (empty($multiDbArray)) {
|
||||
return $defaultConfig;
|
||||
}
|
||||
|
||||
// MultiDb-Array aufbereiten
|
||||
$multiDbArray = MultiDbArrayHydrator::hydrate($defaultConfig, $multiDbArray);
|
||||
|
||||
// Zuerst MultiDB-Keys durchsuchen (wenn assoziatives Array)
|
||||
foreach ($multiDbArray as $multiDbKey => $multiDbItem) {
|
||||
if ($dbSelect === $multiDbKey) {
|
||||
return self::buildConfigFromMultiDbArray($defaultConfig, $multiDbItem);
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: MultiDB-Konfigurationen nach Feld 'dbname' durchsuchen
|
||||
foreach ($multiDbArray as $multiDbKey => $multiDbItem) {
|
||||
if ($dbSelect === $multiDbItem['dbname']) {
|
||||
return self::buildConfigFromMultiDbArray($defaultConfig, $multiDbItem);
|
||||
}
|
||||
}
|
||||
|
||||
throw new MultiDbConfigNotFoundException(sprintf(
|
||||
'MultiDb-Config "%s" not found.', $dbSelect
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Config[]|array
|
||||
*/
|
||||
public static function loadAll()
|
||||
{
|
||||
$defaultConfig = self::loadDefaultConfig();
|
||||
$multiDbArray = self::loadMultiDbArray();
|
||||
|
||||
// MultiDb-Array aufbereiten
|
||||
$multiDbArray = MultiDbArrayHydrator::hydrate($defaultConfig, $multiDbArray);
|
||||
|
||||
$result = [];
|
||||
foreach ($multiDbArray as $multiDbKey => $multiDbItem) {
|
||||
$result[$multiDbKey] = self::buildConfigFromMultiDbArray($defaultConfig, $multiDbItem);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Config[]|array
|
||||
*/
|
||||
public static function loadAllWithActiveCronjobs()
|
||||
{
|
||||
$defaultConfig = self::loadDefaultConfig();
|
||||
$multiDbArray = self::loadMultiDbArray();
|
||||
|
||||
// MultiDb-Array aufbereiten
|
||||
$multiDbArray = MultiDbArrayHydrator::hydrate($defaultConfig, $multiDbArray);
|
||||
|
||||
$result = [];
|
||||
foreach ($multiDbArray as $multiDbKey => $multiDbItem) {
|
||||
if ($multiDbItem['cronjob'] === true) {
|
||||
$result[$multiDbKey] = self::buildConfigFromMultiDbArray($defaultConfig, $multiDbItem);
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]|array
|
||||
*/
|
||||
public static function loadAllDescriptions()
|
||||
{
|
||||
$defaultConfig = self::loadDefaultConfig();
|
||||
$multiDbArray = self::loadMultiDbArray();
|
||||
|
||||
// MultiDb-Array aufbereiten
|
||||
$multiDbArray = MultiDbArrayHydrator::hydrate($defaultConfig, $multiDbArray);
|
||||
|
||||
$result = [];
|
||||
foreach ($multiDbArray as $multiDbKey => $multiDbItem) {
|
||||
$result[$multiDbKey] = $multiDbItem['description'];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Config $defaultConfig
|
||||
* @param array $multiDbItem
|
||||
*
|
||||
* @return Config
|
||||
*/
|
||||
private static function buildConfigFromMultiDbArray($defaultConfig, $multiDbItem)
|
||||
{
|
||||
$config = clone $defaultConfig;
|
||||
|
||||
$config->WFdbhost = $multiDbItem['dbhost'];
|
||||
$config->WFdbport = $multiDbItem['dbport'];
|
||||
$config->WFdbname = $multiDbItem['dbname'];
|
||||
$config->WFdbuser = $multiDbItem['dbuser'];
|
||||
$config->WFdbpass = $multiDbItem['dbpass'];
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Config
|
||||
*/
|
||||
private static function loadDefaultConfig()
|
||||
{
|
||||
if (!class_exists('\\Config', true)) {
|
||||
$configClassFilePath = dirname(dirname(dirname(__DIR__))) . '/conf/main.conf.php';
|
||||
if (is_file($configClassFilePath)) {
|
||||
require_once $configClassFilePath;
|
||||
}
|
||||
}
|
||||
|
||||
return new Config();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
private static function loadMultiDbArray()
|
||||
{
|
||||
$multiDbArray = [];
|
||||
|
||||
$multiDbFilePath = dirname(dirname(dirname(__DIR__))) . '/conf/multidb.conf.php';
|
||||
if (is_file($multiDbFilePath)) {
|
||||
$multiDbArray = include $multiDbFilePath;
|
||||
if (!is_array($multiDbArray)) {
|
||||
$multiDbArray = [];
|
||||
}
|
||||
}
|
||||
|
||||
return $multiDbArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* @uses $_POST
|
||||
* @uses $_COOKIE
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
private static function determineMultiDbConfigKey()
|
||||
{
|
||||
/**
|
||||
* Wenn MULTIDB-Konstante gesetzt, dann kommt der Request aus der Rest-API.
|
||||
*
|
||||
* @see www/api/bootstrap.php
|
||||
*/
|
||||
if (defined('MULTIDB')) {
|
||||
return constant('MULTIDB');
|
||||
}
|
||||
|
||||
/**
|
||||
* Wenn POST['db'] und POST['dbselect'] gesetzt, dann kommt der Request übers vom Login-Formular (Frontend).
|
||||
*
|
||||
* @see \Acl::Login()
|
||||
*/
|
||||
if (isset($_POST['db'], $_POST['dbselect']) && $_POST['dbselect'] === 'true') {
|
||||
return $_POST['db'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Wenn COOKIE['DBSELECTED'] gesetzt, dann kommt der Request übers Frontend und
|
||||
* der Login war in einem frührem Request erfolgreich.
|
||||
*
|
||||
* @see \Acl::Login()
|
||||
*/
|
||||
if (isset($_COOKIE['DBSELECTED']) && !empty($_COOKIE['DBSELECTED'])) {
|
||||
return $_COOKIE['DBSELECTED'];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Xentral\Core\LegacyConfig\Exception;
|
||||
|
||||
use InvalidArgumentException as SplInvalidArgumentException;
|
||||
|
||||
class InvalidArgumentException extends SplInvalidArgumentException implements LegacyConfigExceptionInterface
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Xentral\Core\LegacyConfig\Exception;
|
||||
|
||||
use Xentral\Core\Exception\CoreExceptionInterface;
|
||||
|
||||
interface LegacyConfigExceptionInterface extends CoreExceptionInterface
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
namespace Xentral\Core\LegacyConfig\Exception;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class MultiDbConfigNotFoundException extends RuntimeException implements LegacyConfigExceptionInterface
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
<?php
|
||||
|
||||
namespace Xentral\Core\LegacyConfig;
|
||||
|
||||
use Config;
|
||||
use Xentral\Core\LegacyConfig\Exception\InvalidArgumentException;
|
||||
|
||||
final class MultiDbArrayHydrator
|
||||
{
|
||||
/**
|
||||
* @param Config $defaultConfig
|
||||
* @param array $multiDbArray
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*
|
||||
* @return array $multiDbArray
|
||||
*/
|
||||
public static function hydrate(Config $defaultConfig, $multiDbArray)
|
||||
{
|
||||
if (!is_array($multiDbArray)) {
|
||||
throw new InvalidArgumentException('Can not hydrate array. Parameter is not an array.');
|
||||
}
|
||||
|
||||
$result = $multiDbArray;
|
||||
$result = self::fillEmptyValues($defaultConfig, $result);
|
||||
$result = self::includeDefaultConfig($defaultConfig, $result);
|
||||
$result = self::prepareArrayKeys($result);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fülle leere Werte mit Werten aus der Default-Config, so dass alle Einträge die gleiche Struktur haben.
|
||||
*
|
||||
* @param Config $defaultConfig
|
||||
* @param array $multiDbArray
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private static function fillEmptyValues(Config $defaultConfig, $multiDbArray)
|
||||
{
|
||||
$result = [];
|
||||
|
||||
// MultiDb-Array mit Werten aus der Default-Config füllen
|
||||
foreach ($multiDbArray as $key => $item) {
|
||||
|
||||
// Beschreibung darf nicht leer sein; als Fallback den Datenbanknamen verwenden
|
||||
$description = !empty($item['description']) ? $item['description'] : $defaultConfig->WFdbname;
|
||||
|
||||
// Cronjobs nur aktivieren, wenn Einstellung vorhanden und gesetzt (Default `false`).
|
||||
$cronjobsActive = (int)$item['cronjob'] === 1;
|
||||
|
||||
if(!empty($item['dbname']) && $defaultConfig->WFdbname === $item['dbname']) {
|
||||
$item = [];
|
||||
}
|
||||
|
||||
$dbhost = !empty($item['dbhost']) ? $item['dbhost'] : $defaultConfig->WFdbhost;
|
||||
$dbport = !empty($item['dbport']) ? $item['dbport'] : $defaultConfig->WFdbport;
|
||||
$dbname = !empty($item['dbname']) ? $item['dbname'] : $defaultConfig->WFdbname;
|
||||
$dbuser = !empty($item['dbuser']) ? $item['dbuser'] : $defaultConfig->WFdbuser;
|
||||
$dbpass = !empty($item['dbpass']) ? $item['dbpass'] : $defaultConfig->WFdbpass;
|
||||
|
||||
$result[$key] = [
|
||||
'description' => $description,
|
||||
'dbhost' => $dbhost,
|
||||
'dbport' => $dbport,
|
||||
'dbname' => $dbname,
|
||||
'dbuser' => $dbuser,
|
||||
'dbpass' => $dbpass,
|
||||
'cronjob' => $cronjobsActive,
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stellt sicher dass die Default-Config im MultiDbArray vorkommt
|
||||
*
|
||||
* @param Config $defaultConfig
|
||||
* @param array $multiDbArray
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private static function includeDefaultConfig(Config $defaultConfig, $multiDbArray)
|
||||
{
|
||||
// Prüfen ob Default-Config in MultiDb-Array vorhanden ist
|
||||
foreach ($multiDbArray as $key => $item) {
|
||||
if ($item['dbhost'] === $defaultConfig->WFdbhost &&
|
||||
$item['dbport'] === $defaultConfig->WFdbport &&
|
||||
$item['dbname'] === $defaultConfig->WFdbname) {
|
||||
return $multiDbArray; // Default-Config ist bereits enthalten
|
||||
}
|
||||
}
|
||||
|
||||
// Default-Config in MultiDb-Array anhängen
|
||||
$defaultDbName = $defaultConfig->WFdbname;
|
||||
$defaultConfigKey = !isset($multiDbArray[$defaultDbName]) ? $defaultDbName : '__default__';
|
||||
$multiDbArray[$defaultConfigKey] = [
|
||||
'description' => $defaultConfig->WFdbname,
|
||||
'dbhost' => $defaultConfig->WFdbhost,
|
||||
'dbport' => $defaultConfig->WFdbport,
|
||||
'dbname' => $defaultConfig->WFdbname,
|
||||
'dbuser' => $defaultConfig->WFdbuser,
|
||||
'dbpass' => $defaultConfig->WFdbpass,
|
||||
'cronjob' => true,
|
||||
];
|
||||
|
||||
return $multiDbArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ersetzt numerische Array-Schlüssel durch den Datenbanknamen
|
||||
*
|
||||
* @param array $multiDbArray
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private static function prepareArrayKeys($multiDbArray)
|
||||
{
|
||||
$result = [];
|
||||
|
||||
foreach ($multiDbArray as $key => $item) {
|
||||
if (is_numeric($key)) {
|
||||
$dbname = $item['dbname'];
|
||||
if (!isset($multiDbArray[$dbname])) {
|
||||
$key = $dbname;
|
||||
}
|
||||
}
|
||||
$result[$key] = $item;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user