diff options
Diffstat (limited to 'library/Icinga/Common/Database.php')
-rw-r--r-- | library/Icinga/Common/Database.php | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/library/Icinga/Common/Database.php b/library/Icinga/Common/Database.php new file mode 100644 index 0000000..4c97765 --- /dev/null +++ b/library/Icinga/Common/Database.php @@ -0,0 +1,56 @@ +<?php +/* Icinga Web 2 | (c) 2020 Icinga GmbH | GPLv2+ */ + +namespace Icinga\Common; + +use Icinga\Application\Config as IcingaConfig; +use Icinga\Data\ResourceFactory; +use ipl\Sql\Config as SqlConfig; +use ipl\Sql\Connection; +use LogicException; +use PDO; + +/** + * Trait for accessing the Icinga Web database + */ +trait Database +{ + /** + * Get a connection to the Icinga Web database + * + * @return Connection + * + * @throws \Icinga\Exception\ConfigurationError + */ + protected function getDb() + { + if (! $this->hasDb()) { + throw new LogicException('Please check if a db instance exists at all'); + } + + $config = new SqlConfig(ResourceFactory::getResourceConfig( + IcingaConfig::app()->get('global', 'config_resource') + )); + if ($config->db === 'mysql') { + $config->charset = 'utf8mb4'; + } + + $config->options = [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ]; + if ($config->db === 'mysql') { + $config->options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET SESSION SQL_MODE='STRICT_TRANS_TABLES" + . ",NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'"; + } + + return new Connection($config); + } + + /** + * Check if db exists + * + * @return bool true if a database was found otherwise false + */ + protected function hasDb() + { + return (bool) IcingaConfig::app()->get('global', 'config_resource'); + } +} |