[-] Installer: check create table privileges

This commit is contained in:
Rémi Gaillard
2013-02-01 18:36:35 +01:00
parent 6a261cbc66
commit 5490f6063d
5 changed files with 74 additions and 0 deletions
+5
View File
@@ -674,6 +674,11 @@ 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)
{
return call_user_func_array(array(Db::getClass(), 'checkCreatePrivilege'), array($server, $user, $pwd, $db, $prefix, $engine));
}
/**
* @deprecated 1.5.0
*/
+19
View File
@@ -185,6 +185,25 @@ class DbMySQLiCore extends Db
$link->close();
return 0;
}
public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
{
$link = @new mysqli($server, $user, $pwd, $db);
if (mysqli_connect_error())
return false;
$sql = '
CREATE TABLE `'.$prefix.'test` (
`test` tinyint(1) unsigned NOT NULL
) ENGINE=MyISAM';
$result = $link->query($sql);
if (!$result)
return $link->error;
$link->query('DROP TABLE `'.$prefix.'test`');
return true;
}
/**
* @see Db::checkEncoding()
+22
View File
@@ -174,6 +174,28 @@ class DbPDOCore extends Db
return (bool)$result->fetch();
}
public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
{
try {
$link = DbPDO::_getPDO($server, $user, $pwd, $db, 5);
} catch (PDOException $e) {
return false;
}
$sql = '
CREATE TABLE `'.$prefix.'test` (
`test` tinyint(1) unsigned NOT NULL
) ENGINE=MyISAM';
$result = $link->query($sql);
if (!$result)
{
$error = $link->errorInfo();
return $error[2];
}
$link->query('DROP TABLE `'.$prefix.'test`');
return true;
}
/**
* @see Db::checkConnection()
*/
+22
View File
@@ -174,6 +174,28 @@ class MySQLCore extends Db
@mysql_close($link);
return 0;
}
public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine)
{
ini_set('mysql.connect_timeout', 5);
if (!$link = @mysql_connect($server, $user, $pwd, true))
return false;
if (!@mysql_select_db($db, $link))
return false;
$sql = '
CREATE TABLE `'.$prefix.'test` (
`test` tinyint(1) unsigned NOT NULL
) ENGINE=MyISAM';
$result = mysql_query($sql, $link);
if (!$result)
return mysql_error($link);
mysql_query('DROP TABLE `'.$prefix.'test`', $link);
return true;
}
/**
* @see Db::checkEncoding()
+6
View File
@@ -71,6 +71,12 @@ 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)
{
$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;
case 1: