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 @@
+