aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2017-02-03 16:24:53 +0100
committerRoeland Jago Douma <roeland@famdouma.nl>2017-04-28 09:35:36 +0200
commit43427e26d78123e66652741d960c14cf40342715 (patch)
tree411718cd0fb932c2fce38fb6dc879bcdbad12144
parent6d93cb74888ae0da0d2286ca1cd82179ea367513 (diff)
downloadnextcloud-server-43427e26d78123e66652741d960c14cf40342715.tar.gz
nextcloud-server-43427e26d78123e66652741d960c14cf40342715.zip
Add console command to migrate the charset
-rw-r--r--core/Command/Db/ConvertMysqlToMB4.php12
-rw-r--r--lib/private/DB/MySqlTools.php49
-rw-r--r--lib/private/Setup/MySQL.php30
3 files changed, 62 insertions, 29 deletions
diff --git a/core/Command/Db/ConvertMysqlToMB4.php b/core/Command/Db/ConvertMysqlToMB4.php
index 286274753ee..38aff8b09d8 100644
--- a/core/Command/Db/ConvertMysqlToMB4.php
+++ b/core/Command/Db/ConvertMysqlToMB4.php
@@ -22,6 +22,7 @@
namespace OC\Core\Command\Db;
use Doctrine\DBAL\Platforms\MySqlPlatform;
+use OC\DB\MySqlTools;
use OC\Migration\ConsoleOutput;
use OC\Repair\Collation;
use OCP\IConfig;
@@ -71,18 +72,17 @@ class ConvertMysqlToMB4 extends Command {
return 1;
}
- $oldValue = $this->config->getSystemValue('mysql.utf8mb4', false);
- // enable charset
- $this->config->setSystemValue('mysql.utf8mb4', true);
-
- if (!$this->connection->supports4ByteText()) {
+ $tools = new MySqlTools();
+ if (!$tools->supports4ByteCharset($this->connection)) {
$url = $this->urlGenerator->linkToDocs('admin-mysql-utf8mb4');
$output->writeln("The database is not properly setup to use the charset utf8mb4.");
$output->writeln("For more information please read the documentation at $url");
- $this->config->setSystemValue('mysql.utf8mb4', $oldValue);
return 1;
}
+ // enable charset
+ $this->config->setSystemValue('mysql.utf8mb4', true);
+
// run conversion
$coll = new Collation($this->config, $this->logger, $this->connection, false);
$coll->run(new ConsoleOutput($output));
diff --git a/lib/private/DB/MySqlTools.php b/lib/private/DB/MySqlTools.php
new file mode 100644
index 00000000000..32f1de887c3
--- /dev/null
+++ b/lib/private/DB/MySqlTools.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2017, ownCloud GmbH
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\DB;
+
+use OCP\IDBConnection;
+
+/**
+* Various MySQL specific helper functions.
+*/
+class MySqlTools {
+
+ /**
+ * @param Connection $connection
+ * @return bool
+ */
+ public function supports4ByteCharset(IDBConnection $connection) {
+ foreach (['innodb_file_format' => 'Barracuda', 'innodb_large_prefix' => 'ON', 'innodb_file_per_table' => 'ON'] as $var => $val) {
+ $result = $connection->executeQuery("SHOW VARIABLES LIKE '$var'");
+ $rows = $result->fetch();
+ $result->closeCursor();
+ if ($rows === false) {
+ return false;
+ }
+ if (strcasecmp($rows['Value'], $val) !== 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php
index d72a106053f..3f3ad6d9589 100644
--- a/lib/private/Setup/MySQL.php
+++ b/lib/private/Setup/MySQL.php
@@ -27,7 +27,7 @@
*/
namespace OC\Setup;
-use OC\DB\ConnectionFactory;
+use OC\DB\MySqlTools;
use OCP\IDBConnection;
class MySQL extends AbstractDatabase {
@@ -38,9 +38,12 @@ class MySQL extends AbstractDatabase {
$connection = $this->connect(['dbname' => null]);
// detect mb4
- if (is_null($this->config->getSValue('mysql.utf8mb4', null)) && $this->supports4ByteCharset($connection)) {
- $this->config->setValue('mysql.utf8mb4', true);
- $connection = $this->connect();
+ if (is_null($this->config->getValue('mysql.utf8mb4', null))) {
+ $tools = new MySqlTools();
+ if ($tools->supports4ByteCharset($connection)) {
+ $this->config->setValue('mysql.utf8mb4', true);
+ $connection = $this->connect();
+ }
}
$this->createSpecificUser($username, $connection);
@@ -169,23 +172,4 @@ class MySQL extends AbstractDatabase {
'dbpassword' => $this->dbPassword,
]);
}
-
- /**
- * @param IDBConnection $connection
- * @return bool
- */
- private function supports4ByteCharset(IDBConnection $connection) {
- foreach (['innodb_file_format' => 'Barracuda', 'innodb_large_prefix' => 'ON', 'innodb_file_per_table' => 'ON'] as $var => $val) {
- $result = $connection->executeQuery("SHOW VARIABLES LIKE '$var'");
- $rows = $result->fetch();
- $result->closeCursor();
- if ($rows === false) {
- return false;
- }
- if (strcasecmp($rows['Value'], $val) === 0) {
- return false;
- }
- }
- return true;
- }
}