From 8e2acb148243d494f2c6ccb655f904f2261870f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 9 Sep 2014 15:18:57 +0200 Subject: [PATCH] repair search lucene before installing --- lib/private/repair.php | 3 +- lib/repair/innodb.php | 2 +- lib/repair/searchlucenetables.php | 63 +++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 lib/repair/searchlucenetables.php diff --git a/lib/private/repair.php b/lib/private/repair.php index 4ff446f860..50e54ae117 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -84,7 +84,8 @@ class Repair extends BasicEmitter { public static function getBeforeUpgradeRepairSteps() { return array( new \OC\Repair\InnoDB(), - new \OC\Repair\Collation(\OC::$server->getConfig(), \OC_DB::getConnection()) + new \OC\Repair\Collation(\OC::$server->getConfig(), \OC_DB::getConnection()), + new \OC\Repair\SearchLuceneTables() ); } diff --git a/lib/repair/innodb.php b/lib/repair/innodb.php index 6b795a749e..0e13c30be9 100644 --- a/lib/repair/innodb.php +++ b/lib/repair/innodb.php @@ -23,7 +23,7 @@ class InnoDB extends BasicEmitter implements \OC\RepairStep { public function run() { $connection = \OC_DB::getConnection(); if (!$connection->getDatabasePlatform() instanceof MySqlPlatform) { - $this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to no')); + $this->emit('\OC\Repair', 'info', array('Not a mysql database -> nothing to do')); return; } diff --git a/lib/repair/searchlucenetables.php b/lib/repair/searchlucenetables.php new file mode 100644 index 0000000000..32231e9a1d --- /dev/null +++ b/lib/repair/searchlucenetables.php @@ -0,0 +1,63 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Repair; + +use OC\Hooks\BasicEmitter; + +class SearchLuceneTables extends BasicEmitter implements \OC\RepairStep { + + public function getName() { + return 'Repair duplicate entries in oc_lucene_status'; + } + + /** + * Fix duplicate entries in oc_lucene_status + * + * search_lucene prior to v0.5.0 did not have a primary key on the lucene_status table. Newer versions do, which + * causes the migration check to fail because it tries to insert duplicate rows into the new schema. + * + * FIXME Currently, apps don't have a way of repairing anything before the migration check: + * @link https://github.com/owncloud/core/issues/10980 + * + * As a result this repair step needs to live in the core repo, although it belongs into search_lucene: + * @link https://github.com/owncloud/core/issues/10205#issuecomment-54957557 + * + * It will completely remove any rows that make a file id have more than one status: + * fileid | status fileid | status + * --------+-------- will become --------+-------- + * 2 | E 3 | E + * 2 | I + * 3 | E + * + * search_lucene will then reindex the fileids without a status when the next indexing job is executed + */ + public function run() { + if (\OC_DB::tableExists('lucene_status')) { + $this->emit('\OC\Repair', 'info', array('removing duplicate entries from lucene_status')); + + $connection = \OC_DB::getConnection(); + $query = $connection->prepare(' + DELETE FROM `*PREFIX*lucene_status` + WHERE `fileid` IN ( + SELECT `fileid` + FROM ( + SELECT `fileid` + FROM `*PREFIX*lucene_status` + GROUP BY `fileid` + HAVING count(`fileid`) > 1 + ) AS `mysqlerr1093hack` + )'); + $query->execute(); + } else { + $this->emit('\OC\Repair', 'info', array('lucene_status table does not exist -> nothing to do')); + } + } + +} +