summaryrefslogtreecommitdiffstats
path: root/lib/private/Repair/Collation.php
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@owncloud.com>2016-04-21 19:22:58 +0200
committerRoeland Jago Douma <rullzer@owncloud.com>2016-04-21 19:22:58 +0200
commitdbe316f3c5b27f15f34ac8534f47dae491ef8e6b (patch)
treec4118882a2aa9ce5d4f0ae39721f49c0634a7b18 /lib/private/Repair/Collation.php
parente673ff0f330425ac37697e2ce2f262888289b406 (diff)
downloadnextcloud-server-dbe316f3c5b27f15f34ac8534f47dae491ef8e6b.tar.gz
nextcloud-server-dbe316f3c5b27f15f34ac8534f47dae491ef8e6b.zip
Move \OC\Repair to PSR-4
Diffstat (limited to 'lib/private/Repair/Collation.php')
-rw-r--r--lib/private/Repair/Collation.php90
1 files changed, 90 insertions, 0 deletions
diff --git a/lib/private/Repair/Collation.php b/lib/private/Repair/Collation.php
new file mode 100644
index 00000000000..48035f8d331
--- /dev/null
+++ b/lib/private/Repair/Collation.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Robin Appelman <icewind@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @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\Repair;
+
+use Doctrine\DBAL\Platforms\MySqlPlatform;
+use OC\Hooks\BasicEmitter;
+
+class Collation extends BasicEmitter implements \OC\RepairStep {
+ /**
+ * @var \OCP\IConfig
+ */
+ protected $config;
+
+ /**
+ * @var \OC\DB\Connection
+ */
+ protected $connection;
+
+ /**
+ * @param \OCP\IConfig $config
+ * @param \OC\DB\Connection $connection
+ */
+ public function __construct($config, $connection) {
+ $this->connection = $connection;
+ $this->config = $config;
+ }
+
+ public function getName() {
+ return 'Repair MySQL collation';
+ }
+
+ /**
+ * Fix mime types
+ */
+ public function run() {
+ if (!$this->connection->getDatabasePlatform() instanceof MySqlPlatform) {
+ $this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to no'));
+ return;
+ }
+
+ $tables = $this->getAllNonUTF8BinTables($this->connection);
+ foreach ($tables as $table) {
+ $this->emit('\OC\Repair', 'info', array("Change collation for $table ..."));
+ $query = $this->connection->prepare('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;');
+ $query->execute();
+ }
+ }
+
+ /**
+ * @param \Doctrine\DBAL\Connection $connection
+ * @return string[]
+ */
+ protected function getAllNonUTF8BinTables($connection) {
+ $dbName = $this->config->getSystemValue("dbname");
+ $rows = $connection->fetchAll(
+ "SELECT DISTINCT(TABLE_NAME) AS `table`" .
+ " FROM INFORMATION_SCHEMA . COLUMNS" .
+ " WHERE TABLE_SCHEMA = ?" .
+ " AND (COLLATION_NAME <> 'utf8_bin' OR CHARACTER_SET_NAME <> 'utf8')" .
+ " AND TABLE_NAME LIKE \"*PREFIX*%\"",
+ array($dbName)
+ );
+ $result = array();
+ foreach ($rows as $row) {
+ $result[] = $row['table'];
+ }
+ return $result;
+ }
+}
+