From 19ee2c953f9a5cef1d0d185c38cef05167cefdd1 Mon Sep 17 00:00:00 2001
From: Damien Metzger
Date: Wed, 26 Jun 2013 14:26:22 +0200
Subject: [PATCH] [*] IN : removed the possibility to choose his own storage
engine, automatically select the best one
---
classes/db/Db.php | 4 +-
classes/db/DbMySQLi.php | 37 +++++++++++-----
classes/db/DbPDO.php | 52 +++++++++++------------
classes/db/MySQL.php | 52 +++++++++++------------
install-dev/controllers/http/database.php | 14 +++---
install-dev/models/database.php | 28 ++++++------
install-dev/theme/views/database.phtml | 3 +-
7 files changed, 105 insertions(+), 85 deletions(-)
diff --git a/classes/db/Db.php b/classes/db/Db.php
index e543f35ce..f408d3af9 100644
--- a/classes/db/Db.php
+++ b/classes/db/Db.php
@@ -169,6 +169,8 @@ abstract class DbCore
/* do not remove, useful for some modules */
abstract public function set_db($db_name);
+
+ abstract public function getBestEngine();
/**
* Get Db object instance
@@ -674,7 +676,7 @@ abstract class DbCore
return call_user_func_array(array(Db::getClass(), 'hasTableWithSamePrefix'), array($server, $user, $pwd, $db, $prefix));
}
- public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
+ public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine = null)
{
return call_user_func_array(array(Db::getClass(), 'checkCreatePrivilege'), array($server, $user, $pwd, $db, $prefix, $engine));
}
diff --git a/classes/db/DbMySQLi.php b/classes/db/DbMySQLi.php
index 3d5556908..e03974a38 100644
--- a/classes/db/DbMySQLi.php
+++ b/classes/db/DbMySQLi.php
@@ -172,21 +172,36 @@ class DbMySQLiCore extends Db
if (!$link->real_connect($server, $user, $pwd, $db))
return (mysqli_connect_errno() == 1049) ? 2 : 1;
- if (strtolower($engine) == 'innodb')
- {
- $sql = 'SHOW VARIABLES WHERE Variable_name = \'have_innodb\'';
- $result = $link->query($sql);
- if (!$result)
- return 4;
- $row = $result->fetch_assoc();
- if (!$row || strtolower($row['Value']) != 'yes')
- return 4;
- }
$link->close();
return 0;
}
- public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
+ public function getBestEngine()
+ {
+ $value = 'InnoDB';
+
+ $sql = 'SHOW VARIABLES WHERE Variable_name = \'have_innodb\'';
+ $result = $link->query($sql);
+ if (!$result)
+ $value = 'MyISAM';
+ $row = $result->fetch_assoc();
+ if (!$row || strtolower($row['Value']) != 'yes')
+ $value = 'MyISAM';
+
+ /* MySQL >= 5.6 */
+ $sql = 'SHOW ENGINES';
+ $result = $link->query($sql);
+ while ($row = $result->fetch_assoc())
+ if ($row['Engine'] == 'InnoDB')
+ {
+ if (in_array($row['Support'], array('DEFAULT', 'YES')))
+ $value = 'InnoDB';
+ break;
+ }
+ return $value;
+ }
+
+ public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine = null)
{
$link = @new mysqli($server, $user, $pwd, $db);
if (mysqli_connect_error())
diff --git a/classes/db/DbPDO.php b/classes/db/DbPDO.php
index ed2870a16..9a381d721 100644
--- a/classes/db/DbPDO.php
+++ b/classes/db/DbPDO.php
@@ -174,7 +174,7 @@ class DbPDOCore extends Db
return (bool)$result->fetch();
}
- public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
+ public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine = null)
{
try {
$link = DbPDO::_getPDO($server, $user, $pwd, $db, 5);
@@ -206,34 +206,34 @@ class DbPDOCore extends Db
} catch (PDOException $e) {
return ($e->getCode() == 1049) ? 2 : 1;
}
-
- if (strtolower($engine) == 'innodb')
- {
- $value = 0;
-
- $sql = 'SHOW VARIABLES WHERE Variable_name = \'have_innodb\'';
- $result = $link->query($sql);
- if (!$result)
- $value = 4;
- $row = $result->fetch();
- if (!$row || strtolower($row['Value']) != 'yes')
- $value = 4;
-
- /* MySQL >= 5.6 */
- $sql = 'SHOW ENGINES';
- $result = $link->query($sql);
- while ($row = $result->fetch())
- if ($row['Engine'] == 'InnoDB')
- {
- if (in_array($row['Support'], array('DEFAULT', 'YES')))
- $value = 0;
- break;
- }
- return $value;
- }
unset($link);
return 0;
}
+
+ public function getBestEngine()
+ {
+ $value = 'InnoDB';
+
+ $sql = 'SHOW VARIABLES WHERE Variable_name = \'have_innodb\'';
+ $result = $link->query($sql);
+ if (!$result)
+ $value = 'MyISAM';
+ $row = $result->fetch();
+ if (!$row || strtolower($row['Value']) != 'yes')
+ $value = 'MyISAM';
+
+ /* MySQL >= 5.6 */
+ $sql = 'SHOW ENGINES';
+ $result = $link->query($sql);
+ while ($row = $result->fetch())
+ if ($row['Engine'] == 'InnoDB')
+ {
+ if (in_array($row['Support'], array('DEFAULT', 'YES')))
+ $value = 'InnoDB';
+ break;
+ }
+ return $value;
+ }
/**
* @see Db::checkEncoding()
diff --git a/classes/db/MySQL.php b/classes/db/MySQL.php
index ba05fd29c..d66f488da 100644
--- a/classes/db/MySQL.php
+++ b/classes/db/MySQL.php
@@ -165,36 +165,36 @@ class MySQLCore extends Db
return 1;
if (!@mysql_select_db($db, $link))
return 2;
-
- if (strtolower($engine) == 'innodb')
- {
- $value = 0;
-
- $sql = 'SHOW VARIABLES WHERE Variable_name = \'have_innodb\'';
- $result = mysql_query($sql);
- if (!$result)
- $value = 4;
- $row = mysql_fetch_assoc($result);
- if (!$row || strtolower($row['Value']) != 'yes')
- $value = 4;
-
- /* MySQL >= 5.6 */
- $sql = 'SHOW ENGINES';
- $result = mysql_query($sql);
- while ($row = mysql_fetch_assoc($result))
- if ($row['Engine'] == 'InnoDB')
- {
- if (in_array($row['Support'], array('DEFAULT', 'YES')))
- $value = 0;
- break;
- }
- return $value;
- }
@mysql_close($link);
return 0;
}
+
+ public function getBestEngine()
+ {
+ $value = 'InnoDB';
+
+ $sql = 'SHOW VARIABLES WHERE Variable_name = \'have_innodb\'';
+ $result = mysql_query($sql);
+ if (!$result)
+ $value = 'MyISAM';
+ $row = mysql_fetch_assoc($result);
+ if (!$row || strtolower($row['Value']) != 'yes')
+ $value = 'MyISAM';
+
+ /* MySQL >= 5.6 */
+ $sql = 'SHOW ENGINES';
+ $result = mysql_query($sql);
+ while ($row = mysql_fetch_assoc($result))
+ if ($row['Engine'] == 'InnoDB')
+ {
+ if (in_array($row['Support'], array('DEFAULT', 'YES')))
+ $value = 'InnoDB';
+ break;
+ }
+ return $value;
+ }
- public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
+ public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine = null)
{
ini_set('mysql.connect_timeout', 5);
if (!$link = @mysql_connect($server, $user, $pwd, true))
diff --git a/install-dev/controllers/http/database.php b/install-dev/controllers/http/database.php
index 6ec8ece98..3a603acdc 100644
--- a/install-dev/controllers/http/database.php
+++ b/install-dev/controllers/http/database.php
@@ -56,7 +56,6 @@ class InstallControllerHttpDatabase extends InstallControllerHttp
$this->session->database_login = trim(Tools::getValue('dbLogin'));
$this->session->database_password = trim(Tools::getValue('dbPassword'));
$this->session->database_prefix = trim(Tools::getValue('db_prefix'));
- $this->session->database_engine = Tools::getValue('dbEngine');
$this->session->database_clear = Tools::getValue('database_clear');
// Save email config
@@ -81,13 +80,15 @@ class InstallControllerHttpDatabase extends InstallControllerHttp
$this->session->database_login,
$this->session->database_password,
$this->session->database_prefix,
- $this->session->database_engine,
-
// We do not want to validate table prefix if we are already in install process
($this->session->step == 'process') ? true : $this->session->database_clear
);
-
- return count($this->errors) ? false : true;
+ if (count($this->errors))
+ return false;
+
+ if (!isset($this->session->database_engine))
+ $this->session->database_engine = $this->model_database->getBestEngine($this->session->database_server, $this->session->database_name, $this->session->database_login, $this->session->database_password);
+ return true;
}
public function process()
@@ -108,10 +109,9 @@ class InstallControllerHttpDatabase extends InstallControllerHttp
$login = Tools::getValue('dbLogin');
$password = Tools::getValue('dbPassword');
$prefix = Tools::getValue('db_prefix');
- $engine = Tools::getValue('dbEngine');
$clear = Tools::getValue('clear');
- $errors = $this->model_database->testDatabaseSettings($server, $database, $login, $password, $prefix, $engine, $clear);
+ $errors = $this->model_database->testDatabaseSettings($server, $database, $login, $password, $prefix, $clear);
$this->ajaxJsonAnswer(
(count($errors)) ? false : true,
diff --git a/install-dev/models/database.php b/install-dev/models/database.php
index 387713854..7105ebe9b 100644
--- a/install-dev/models/database.php
+++ b/install-dev/models/database.php
@@ -38,7 +38,7 @@ class InstallModelDatabase extends InstallAbstractModel
* @param bool $clear
* @return array List of errors
*/
- public function testDatabaseSettings($server, $database, $login, $password, $prefix, $engine, $clear = false)
+ public function testDatabaseSettings($server, $database, $login, $password, $prefix, $clear = false)
{
$errors = array();
@@ -55,14 +55,11 @@ class InstallModelDatabase extends InstallAbstractModel
if ($prefix && !Validate::isTablePrefix($prefix))
$errors[] = $this->language->l('Tables prefix is invalid');
- if (!Validate::isMySQLEngine($engine))
- $errors[] = $this->language->l('Wrong engine chosen for MySQL');
-
if (!$errors)
{
$dbtype = ' ('.Db::getClass().')';
// Try to connect to database
- switch (Db::checkConnection($server, $login, $password, $database, true, $engine))
+ switch (Db::checkConnection($server, $login, $password, $database, true))
{
case 0:
if (!Db::checkEncoding($server, $login, $password))
@@ -71,28 +68,33 @@ class InstallModelDatabase extends InstallAbstractModel
// Check if a table with same prefix already exists
if (!$clear && Db::hasTableWithSamePrefix($server, $login, $password, $database, $prefix))
$errors[] = $this->language->l('At least one table with same prefix was already found, please change your prefix or drop your database');
- if (($create_error = Db::checkCreatePrivilege($server, $login, $password, $database, $prefix, $engine)) !== true)
+ if (($create_error = Db::checkCreatePrivilege($server, $login, $password, $database, $prefix)) !== true)
{
$errors[] = $this->language->l(sprintf('Your database login don\'t have the privileges to create table on the database "%s". Ask your hosting provider:', $database));
if ($create_error != false)
$errors[] = $create_error;
}
- break;
+ break;
case 1:
$errors[] = $this->language->l('Database Server is not found. Please verify the login, password and server fields').$dbtype;
- break;
+ break;
case 2:
$errors[] = $this->language->l('Connection to MySQL server succeeded, but database "%s" not found', $database).$dbtype;
- break;
-
- case 4:
- $errors[] = $this->language->l('Engine innoDB is not supported by your MySQL server, please use MyISAM').$dbtype;
- break;
+ break;
}
}
return $errors;
}
+
+ public function getBestEngine($server, $database, $login, $password)
+ {
+ $class = Db::getClass();
+ $instance = new $class($server, $login, $password, $database, true);
+ $engine = $instance->getBestEngine();
+ unset($instance);
+ return $engine;
+ }
}
diff --git a/install-dev/theme/views/database.phtml b/install-dev/theme/views/database.phtml
index 8dae7d7a9..a24c92878 100644
--- a/install-dev/theme/views/database.phtml
+++ b/install-dev/theme/views/database.phtml
@@ -27,13 +27,14 @@
+