From 762d1652ee87df3750ebe76b637dc2801fd52065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Tue, 27 May 2014 10:46:32 +0200 Subject: [PATCH] database config model class improved config loading code --- application/configs/server.xml | 2 +- application/core/Database/Database.php | 130 +++++++++++-------- application/core/Database/DatabaseConfig.php | 56 ++++++++ 3 files changed, 130 insertions(+), 58 deletions(-) create mode 100644 application/core/Database/DatabaseConfig.php diff --git a/application/configs/server.xml b/application/configs/server.xml index eff62ecc..8ac5bdad 100644 --- a/application/configs/server.xml +++ b/application/configs/server.xml @@ -26,7 +26,7 @@ mysql_password - database_name + database_name diff --git a/application/core/Database/Database.php b/application/core/Database/Database.php index 63b68cd6..e2911212 100644 --- a/application/core/Database/Database.php +++ b/application/core/Database/Database.php @@ -23,6 +23,8 @@ class Database implements TimerListener { * Private Properties */ private $maniaControl = null; + /** @var DatabaseConfig $config */ + private $config = null; /** * Construct a new Database Connection @@ -32,40 +34,12 @@ class Database implements TimerListener { public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - // Get mysql server information - /** @var \SimpleXMLElement $databaseXmlTag */ - $databaseXmlTag = $this->maniaControl->config->database; - $host = $databaseXmlTag->xpath('host'); - if (!$host) { - $message = "Invalid database configuration (host)."; - $this->maniaControl->quit($message, true); - } - $port = $databaseXmlTag->xpath('port'); - if (!$port) { - $message = "Invalid database configuration (port)."; - $this->maniaControl->quit($message, true); - } - $user = $databaseXmlTag->xpath('user'); - if (!$user) { - $message = "Invalid database configuration (user)."; - $this->maniaControl->quit($message, true); - } - $pass = $databaseXmlTag->xpath('pass'); - if (!$pass) { - $message = "Invalid database configuration (pass)."; - $this->maniaControl->quit($message, true); - } - - $host = (string)$host[0]; - $port = (int)$port[0]; - $user = (string)$user[0]; - $pass = (string)$pass[0]; - // Enable mysqli Reconnect ini_set('mysqli.reconnect', 'on'); // Open database connection - $this->mysqli = @new \mysqli($host, $user, $pass, null, $port); + $this->loadConfig(); + $this->mysqli = @new \mysqli($this->config->host, $this->config->user, $this->config->pass, null, $this->config->port); if ($this->mysqli->connect_error) { $message = "Couldn't connect to Database: '{$this->mysqli->connect_error}'"; $this->maniaControl->quit($message, true); @@ -83,51 +57,95 @@ class Database implements TimerListener { } /** - * Connect to the defined database (create it if needed) + * Load the Database Config + */ + private function loadConfig() { + $databaseElements = $this->maniaControl->config->xpath('database'); + if (!$databaseElements) { + trigger_error('No Database configured!', E_USER_ERROR); + } + $databaseElement = $databaseElements[0]; + + // Host + $hostElements = $databaseElement->xpath('host'); + if (!$hostElements) { + trigger_error("Invalid database configuration (Host).", E_USER_ERROR); + } + $host = (string)$hostElements[0]; + + // Port + $portElements = $databaseElement->xpath('port'); + if (!$portElements) { + trigger_error("Invalid database configuration (Port).", E_USER_ERROR); + } + $port = (string)$portElements[0]; + + // User + $userElements = $databaseElement->xpath('user'); + if (!$userElements) { + trigger_error("Invalid database configuration (User).", E_USER_ERROR); + } + $user = (string)$userElements[0]; + + // Pass + $passElements = $databaseElement->xpath('pass'); + if (!$passElements) { + trigger_error("Invalid database configuration (Pass).", E_USER_ERROR); + } + $pass = (string)$passElements[0]; + + // Name + $nameElements = $databaseElement->xpath('name'); + if (!$nameElements) { + $nameElements = $databaseElement->xpath('db_name'); + } + if (!$nameElements) { + trigger_error("Invalid database configuration (Name).", E_USER_ERROR); + } + $name = (string)$nameElements[0]; + + // Create config object + $config = new DatabaseConfig($host, $port, $user, $pass, $name); + if (!$config->validate()) { + $this->maniaControl->quit("Your config file doesn't seem to be maintained properly. Please check the database configuration again!", true); + } + $this->config = $config; + } + + /** + * Connect to the defined Database * * @return bool */ private function initDatabase() { - $dbName = $this->maniaControl->config->database->xpath('db_name'); - if (!$dbName) { - $this->maniaControl->quit("Invalid Database Configuration (db_name).", true); - return false; - } - $dbName = (string)$dbName[0]; - // Try to connect - $result = $this->mysqli->select_db($dbName); + $result = $this->mysqli->select_db($this->config->name); if ($result) { return true; } + $this->maniaControl->log("Database '{$this->config->name}' doesn't exit! Trying to create it..."); // Create database - $databaseQuery = "CREATE DATABASE ?;"; - $databaseStatement = $this->mysqli->prepare($databaseQuery); + $databaseQuery = "CREATE DATABASE '" . $this->mysqli->escape_string($this->config->name) . "';"; + $this->mysqli->query($databaseQuery); if ($this->mysqli->error) { $this->maniaControl->quit($this->mysqli->error, true); return false; } - $databaseStatement->bind_param('s', $dbName); - $databaseStatement->execute(); - if ($databaseStatement->error) { - $this->maniaControl->quit($databaseStatement->error, true); - return false; - } - $databaseStatement->close(); // Connect to new database - $this->mysqli->select_db($dbName); + $this->mysqli->select_db($this->config->name); if ($this->mysqli->error) { - $message = "Couldn't select database '{$dbName}'. {$this->mysqli->error}"; + $message = "Couldn't select database '{$this->config->name}'. {$this->mysqli->error}"; $this->maniaControl->quit($message, true); return false; } + return true; } /** - * Optimize all existing tables + * Optimize all existing Tables * * @return bool */ @@ -164,18 +182,16 @@ class Database implements TimerListener { } /** - * Check if Connection still exists every 5 seconds - * - * @param float $time + * Check whether the Database Connection is still open */ - public function checkConnection($time = null) { + public function checkConnection() { if (!$this->mysqli || !$this->mysqli->ping()) { - $this->maniaControl->quit("The MySQL server has gone away!", true); + $this->maniaControl->quit('The MySQL Server has gone away!', true); } } /** - * Destruct database connection + * Destruct Database Connection */ public function __destruct() { if ($this->mysqli && !$this->mysqli->connect_error) { diff --git a/application/core/Database/DatabaseConfig.php b/application/core/Database/DatabaseConfig.php new file mode 100644 index 00000000..0e32050f --- /dev/null +++ b/application/core/Database/DatabaseConfig.php @@ -0,0 +1,56 @@ + + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class DatabaseConfig { + /* + * Public Properties + */ + public $host = null; + public $port = null; + public $user = null; + public $pass = null; + public $name = null; + + /** + * Create a new Server Config Instance + * + * @param string $host Server Ip + * @param string $port Server Port + * @param string $user User + * @param string $pass Password + * @param string $name Name + */ + public function __construct($host = null, $port = null, $user = null, $pass = null, $name = null) { + $this->host = (string)$host; + $this->port = (int)$port; + $this->user = (string)$user; + $this->pass = (string)$pass; + $this->name = (string)$name; + } + + /** + * Validate the Config Data + * + * @return bool + */ + public function validate() { + if (!$this->host || !$this->port || !$this->user || !$this->pass || !$this->name) { + return false; + } + if ($this->user === 'mysql_user' || $this->pass === 'mysql_password') { + return false; + } + if ($this->name === 'database_name') { + return false; + } + return true; + } +}