database config model class
improved config loading code
This commit is contained in:
parent
eead92e0dd
commit
762d1652ee
@ -26,7 +26,7 @@
|
|||||||
<pass>mysql_password</pass>
|
<pass>mysql_password</pass>
|
||||||
|
|
||||||
<!-- Database Name -->
|
<!-- Database Name -->
|
||||||
<db_name>database_name</db_name>
|
<name>database_name</name>
|
||||||
|
|
||||||
</database>
|
</database>
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@ class Database implements TimerListener {
|
|||||||
* Private Properties
|
* Private Properties
|
||||||
*/
|
*/
|
||||||
private $maniaControl = null;
|
private $maniaControl = null;
|
||||||
|
/** @var DatabaseConfig $config */
|
||||||
|
private $config = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new Database Connection
|
* Construct a new Database Connection
|
||||||
@ -32,40 +34,12 @@ class Database implements TimerListener {
|
|||||||
public function __construct(ManiaControl $maniaControl) {
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
$this->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
|
// Enable mysqli Reconnect
|
||||||
ini_set('mysqli.reconnect', 'on');
|
ini_set('mysqli.reconnect', 'on');
|
||||||
|
|
||||||
// Open database connection
|
// 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) {
|
if ($this->mysqli->connect_error) {
|
||||||
$message = "Couldn't connect to Database: '{$this->mysqli->connect_error}'";
|
$message = "Couldn't connect to Database: '{$this->mysqli->connect_error}'";
|
||||||
$this->maniaControl->quit($message, true);
|
$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
|
* @return bool
|
||||||
*/
|
*/
|
||||||
private function initDatabase() {
|
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
|
// Try to connect
|
||||||
$result = $this->mysqli->select_db($dbName);
|
$result = $this->mysqli->select_db($this->config->name);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
$this->maniaControl->log("Database '{$this->config->name}' doesn't exit! Trying to create it...");
|
||||||
|
|
||||||
// Create database
|
// Create database
|
||||||
$databaseQuery = "CREATE DATABASE ?;";
|
$databaseQuery = "CREATE DATABASE '" . $this->mysqli->escape_string($this->config->name) . "';";
|
||||||
$databaseStatement = $this->mysqli->prepare($databaseQuery);
|
$this->mysqli->query($databaseQuery);
|
||||||
if ($this->mysqli->error) {
|
if ($this->mysqli->error) {
|
||||||
$this->maniaControl->quit($this->mysqli->error, true);
|
$this->maniaControl->quit($this->mysqli->error, true);
|
||||||
return false;
|
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
|
// Connect to new database
|
||||||
$this->mysqli->select_db($dbName);
|
$this->mysqli->select_db($this->config->name);
|
||||||
if ($this->mysqli->error) {
|
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);
|
$this->maniaControl->quit($message, true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optimize all existing tables
|
* Optimize all existing Tables
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
@ -164,18 +182,16 @@ class Database implements TimerListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if Connection still exists every 5 seconds
|
* Check whether the Database Connection is still open
|
||||||
*
|
|
||||||
* @param float $time
|
|
||||||
*/
|
*/
|
||||||
public function checkConnection($time = null) {
|
public function checkConnection() {
|
||||||
if (!$this->mysqli || !$this->mysqli->ping()) {
|
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() {
|
public function __destruct() {
|
||||||
if ($this->mysqli && !$this->mysqli->connect_error) {
|
if ($this->mysqli && !$this->mysqli->connect_error) {
|
||||||
|
56
application/core/Database/DatabaseConfig.php
Normal file
56
application/core/Database/DatabaseConfig.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ManiaControl\Database;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model Class holding the Database Config
|
||||||
|
*
|
||||||
|
* @author ManiaControl Team <mail@maniacontrol.com>
|
||||||
|
* @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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user