From 1601867c9dd6a9ce28894d96e5dce3a7e003f4e3 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Mon, 13 Apr 2015 12:32:04 +0200 Subject: [PATCH] Remove unneeded getetag entries in properties table * fixes #13281 --- lib/private/repair.php | 2 + lib/repair/removegetetagentries.php | 59 ++++++++++++++ tests/lib/repair/removegetetagentriestest.php | 77 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 lib/repair/removegetetagentries.php create mode 100644 tests/lib/repair/removegetetagentriestest.php diff --git a/lib/private/repair.php b/lib/private/repair.php index 43350995be..a61ab4becd 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -33,6 +33,7 @@ use OC\Repair\AssetCache; use OC\Repair\CleanTags; use OC\Repair\Collation; use OC\Repair\DropOldJobs; +use OC\Repair\RemoveGetETagEntries; use OC\Repair\SqliteAutoincrement; use OC\Repair\DropOldTables; use OC\Repair\FillETags; @@ -108,6 +109,7 @@ class Repair extends BasicEmitter { new CleanTags(\OC_DB::getConnection()), new DropOldTables(\OC_DB::getConnection()), new DropOldJobs(\OC::$server->getJobList()), + new RemoveGetETagEntries(\OC_DB::getConnection()), ); } diff --git a/lib/repair/removegetetagentries.php b/lib/repair/removegetetagentries.php new file mode 100644 index 0000000000..4004076365 --- /dev/null +++ b/lib/repair/removegetetagentries.php @@ -0,0 +1,59 @@ + + * + * @copyright Copyright (c) 2015, 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 + * + */ + +namespace OC\Repair; + +use OC\Hooks\BasicEmitter; +use OCP\IDBConnection; + +class RemoveGetETagEntries extends BasicEmitter { + + /** + * @var IDBConnection + */ + protected $connection; + + /** + * @param IDBConnection $connection + */ + public function __construct(IDBConnection $connection) { + $this->connection = $connection; + } + + public function getName() { + return 'Remove getetag entries in properties table'; + } + + /** + * Removes all entries with the key "{DAV:}getetag" from the table properties + */ + public function run() { + $sql = 'DELETE FROM `*PREFIX*properties`' + . ' WHERE `propertyname` = ?'; + $deletedRows = $this->connection->executeUpdate($sql, ['{DAV:}getetag']); + + $this->emit( + '\OC\Repair', + 'info', + ['Removed ' . $deletedRows . ' unneeded "{DAV:}getetag" entries from properties table.'] + ); + } +} diff --git a/tests/lib/repair/removegetetagentriestest.php b/tests/lib/repair/removegetetagentriestest.php new file mode 100644 index 0000000000..43b7bf323c --- /dev/null +++ b/tests/lib/repair/removegetetagentriestest.php @@ -0,0 +1,77 @@ + + * + * @copyright Copyright (c) 2015, 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 + * + */ + +namespace Test\Repair; + +use OC\Repair\RemoveGetETagEntries; +use Test\TestCase; + +class RemoveGetETagEntriesTest extends TestCase { + /** @var \OCP\IDBConnection */ + protected $connection; + + protected function setUp() { + parent::setUp(); + + $this->connection = \OC::$server->getDatabaseConnection(); + } + + public function testRun() { + + $userName = 'removePropertiesUser'; + $data = [ + [$userName, '/abc.def.txt', '{DAV:}getetag', 'abcdef'], + [$userName, '/abc.def.txt', '{DAV:}anotherRandomProperty', 'ghi'], + ]; + + // insert test data + $sqlToInsertProperties = 'INSERT INTO `*PREFIX*properties` (`userid`, `propertypath`, `propertyname`, `propertyvalue`) VALUES (?, ?, ? ,?)'; + foreach ($data as $entry) { + $this->connection->executeUpdate($sqlToInsertProperties, $entry); + } + + // check if test data is written to DB + $sqlToFetchProperties = 'SELECT `userid`, `propertypath`, `propertyname`, `propertyvalue` FROM `*PREFIX*properties` WHERE `userid` = ?'; + $stmt = $this->connection->executeQuery($sqlToFetchProperties, [$userName]); + $entries = $stmt->fetchAll(\PDO::FETCH_NUM); + + $this->assertCount(2, $entries, 'Asserts that two entries are returned as we have inserted two'); + foreach($entries as $entry) { + $this->assertTrue(in_array($entry, $data), 'Asserts that the entries are the ones from the test data set'); + } + + // run repair step + $repair = new RemoveGetETagEntries($this->connection); + $repair->run(); + + // check if test data is correctly modified in DB + $stmt = $this->connection->executeQuery($sqlToFetchProperties, [$userName]); + $entries = $stmt->fetchAll(\PDO::FETCH_NUM); + + $this->assertCount(1, $entries, 'Asserts that only one entry is returned after the repair step - the other one has to be removed'); + $this->assertSame($data[1], $entries[0], 'Asserts that the returned entry is the correct one from the test data set'); + + // remove test data + $sqlToRemoveProperties = 'DELETE FROM `*PREFIX*properties` WHERE `userid` = ?'; + $this->connection->executeUpdate($sqlToRemoveProperties, [$userName]); + } + +}