[Pkg-owncloud-commits] [owncloud] 64/273: Fixed mime type repair step

David Prévot taffit at moszumanska.debian.org
Fri Jul 4 03:12:58 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository owncloud.

commit 67d0a3c15e52d865ebb5420e98b177a1bb9e42ba
Author: Vincent Petry <pvince81 at owncloud.com>
Date:   Thu Jun 26 16:40:12 2014 +0200

    Fixed mime type repair step
---
 lib/repair/repairmimetypes.php       | 96 +++++++++++++++++++++++++-----------
 tests/lib/repair/repairmimetypes.php | 78 ++++++++++++++++++++++++-----
 2 files changed, 133 insertions(+), 41 deletions(-)

diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index 397d18e..f7618c6 100644
--- a/lib/repair/repairmimetypes.php
+++ b/lib/repair/repairmimetypes.php
@@ -24,61 +24,99 @@ class RepairMimeTypes extends BasicEmitter implements \OC\RepairStep {
 			'application/msexcel' => 'application/vnd.ms-excel',
 		);
 
-		$stmt = \OC_DB::prepare('
-			UPDATE `*PREFIX*mimetypes`
-			SET    `mimetype` = ?
+		$existsStmt = \OC_DB::prepare('
+			SELECT count(`mimetype`)
+			FROM   `*PREFIX*mimetypes`
 			WHERE  `mimetype` = ?
 		');
 
+		$getIdStmt = \OC_DB::prepare('
+			SELECT `id`
+			FROM   `*PREFIX*mimetypes`
+			WHERE  `mimetype` = ?
+		');
+
+		$insertStmt = \OC_DB::prepare('
+			INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
+			VALUES ( ? )
+		');
+
+		$updateWrongStmt = \OC_DB::prepare('
+			UPDATE `*PREFIX*filecache`
+			SET `mimetype` = (
+				SELECT `id`
+				FROM `*PREFIX*mimetypes`
+				WHERE `mimetype` = ?
+			) WHERE `mimetype` = ?
+		');
+
+		$deleteStmt = \OC_DB::prepare('
+			DELETE FROM `*PREFIX*mimetypes`
+			WHERE `id` = ?
+		');
+
 		foreach ($wrongMimetypes as $wrong => $correct) {
-			\OC_DB::executeAudited($stmt, array($wrong, $correct));
+
+
+			// do we need to remove a wrong mimetype?
+			$result = \OC_DB::executeAudited($getIdStmt, array($wrong));
+			$wrongId = $result->fetchOne();
+
+			if ($wrongId !== false) {
+
+				// do we need to insert the correct mimetype?
+				$result = \OC_DB::executeAudited($existsStmt, array($correct));
+				$exists = $result->fetchOne();
+
+				if ( ! $exists ) {
+					// insert mimetype
+					\OC_DB::executeAudited($insertStmt, array($correct));
+				}
+
+				// change wrong mimetype to correct mimetype in filecache
+				\OC_DB::executeAudited($updateWrongStmt, array($correct, $wrongId));
+
+				// delete wrong mimetype
+				\OC_DB::executeAudited($deleteStmt, array($wrongId));
+
+			}
+
 		}
 
 		$updatedMimetypes = array(
 			'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
-			'xlsx' => 'application/vnd.ms-excel',
-			'pptx' => 'application/vnd.ms-powerpoint',
+			'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+			'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
 		);
 
+		$updateByNameStmt = \OC_DB::prepare('
+			UPDATE `*PREFIX*filecache`
+			SET `mimetype` = (
+				SELECT `id`
+				FROM `*PREFIX*mimetypes`
+				WHERE `mimetype` = ?
+			) WHERE `name` LIKE ?
+		');
+
 		// separate doc from docx etc
 		foreach ($updatedMimetypes as $extension => $mimetype ) {
-			$result = \OC_DB::executeAudited('
-				SELECT count(`mimetype`)
-				FROM   `*PREFIX*mimetypes`
-				WHERE  `mimetype` = ?
-				', array($mimetype)
-			);
-
+			$result = \OC_DB::executeAudited($existsStmt, array($mimetype));
 			$exists = $result->fetchOne();
 
 			if ( ! $exists ) {
 				// insert mimetype
-				\OC_DB::executeAudited('
-					INSERT INTO `*PREFIX*mimetypes` ( `mimetype` )
-					VALUES ( ? )
-					', array($mimetype)
-				);
+				\OC_DB::executeAudited($insertStmt, array($mimetype));
 			}
 
 			// change mimetype for files with x extension
-			\OC_DB::executeAudited('
-				UPDATE `*PREFIX*filecache`
-				SET `mimetype` = (
-					SELECT `id`
-					FROM `*PREFIX*mimetypes`
-					WHERE `mimetype` = ?
-				) WHERE `name` LIKE ?
-				', array($mimetype, '%.'.$extension)
-			);
+			\OC_DB::executeAudited($updateByNameStmt, array($mimetype, '%.'.$extension));
 		}
-		return true;
 	}
 
 	/**
 	 * Fix mime types
 	 */
 	public function run() {
-		// TODO: check precondition to avoid running the fix every time
 		if ($this->fixOfficeMimeTypes()) {
 			$this->emit('\OC\Repair', 'info', array('Fixed office mime types'));
 		}
diff --git a/tests/lib/repair/repairmimetypes.php b/tests/lib/repair/repairmimetypes.php
index 9160050..5c0a36d 100644
--- a/tests/lib/repair/repairmimetypes.php
+++ b/tests/lib/repair/repairmimetypes.php
@@ -62,6 +62,20 @@ class TestRepairMimeTypes extends PHPUnit_Framework_TestCase {
 	}
 
 	/**
+	 * Returns the id of a given mime type or null
+	 * if it does not exist.
+	 */
+	private function getMimeTypeIdFromDB($mimeType) {
+		$sql = 'SELECT `id` FROM `*PREFIX*mimetypes` WHERE mimetype = ?';
+		$results = \OC_DB::executeAudited($sql, array($mimeType));
+		$result = $results->fetchOne();
+		if ($result) {
+			return $result['id'];
+		}
+		return null;
+	}
+
+	/**
 	 * Test renaming and splitting old office mime types
 	 */
 	public function testRenameOfficeMimeTypes() {
@@ -79,16 +93,17 @@ class TestRepairMimeTypes extends PHPUnit_Framework_TestCase {
 		$this->repair->run();
 
 		// force mimetype reload
+		DummyFileCache::clearCachedMimeTypes();
 		$this->storage->getCache()->loadMimeTypes();
 
 		$this->checkEntries(
 			array(
 				array('test.doc', 'application/msword'),
 				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
-				array('test.xls', 'application/msexcel'),
-				array('test.xlsx', 'application/vnd.ms-excel'),
-				array('test.ppt', 'application/mspowerpoint'),
-				array('test.pptx', 'application/vnd.ms-powerpoint'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
 			)
 		);
 	}
@@ -119,22 +134,61 @@ class TestRepairMimeTypes extends PHPUnit_Framework_TestCase {
 		$this->repair->run();
 
 		// force mimetype reload
+		DummyFileCache::clearCachedMimeTypes();
 		$this->storage->getCache()->loadMimeTypes();
 
 		$this->checkEntries(
 			array(
 				array('test.doc', 'application/msword'),
 				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
-				array('test.xls', 'application/msexcel'),
-				array('test.xlsx', 'application/vnd.ms-excel'),
-				array('test.ppt', 'application/mspowerpoint'),
-				array('test.pptx', 'application/vnd.ms-powerpoint'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
 				array('bogus.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
-				array('bogus.xlsx', 'application/vnd.ms-excel'),
-				array('bogus.pptx', 'application/vnd.ms-powerpoint'),
+				array('bogus.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('bogus.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
 				array('bogus2.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
-				array('bogus2.xlsx', 'application/vnd.ms-excel'),
-				array('bogus2.pptx', 'application/vnd.ms-powerpoint'),
+				array('bogus2.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('bogus2.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+			)
+		);
+
+		// wrong mimetypes are gone
+		$this->assertNull($this->getMimeTypeIdFromDB('application/msexcel'));
+		$this->assertNull($this->getMimeTypeIdFromDB('application/mspowerpoint'));
+	}
+
+	/**
+	 * Test that nothing happens and no error happens when all mimetypes are
+	 * already correct and no old ones exist..
+	 */
+	public function testDoNothingWhenOnlyNewFiles() {
+		$this->addEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
+			)
+		);
+
+		$this->repair->run();
+
+		// force mimetype reload
+		DummyFileCache::clearCachedMimeTypes();
+		$this->storage->getCache()->loadMimeTypes();
+
+		$this->checkEntries(
+			array(
+				array('test.doc', 'application/msword'),
+				array('test.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'),
+				array('test.xls', 'application/vnd.ms-excel'),
+				array('test.xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
+				array('test.ppt', 'application/vnd.ms-powerpoint'),
+				array('test.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
 			)
 		);
 	}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list