summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/repair/repairmimetypes.php96
-rw-r--r--tests/lib/repair/repairmimetypes.php78
2 files changed, 133 insertions, 41 deletions
diff --git a/lib/repair/repairmimetypes.php b/lib/repair/repairmimetypes.php
index 397d18eb72d..f7618c6e060 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 91600502da0..5c0a36d469c 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'),
)
);
}