diff options
author | Lucas Azevedo <lhs_azevedo@hotmail.com> | 2023-09-01 14:05:15 -0300 |
---|---|---|
committer | backportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com> | 2023-09-16 19:31:26 +0000 |
commit | f0a1716bb59b19d7cbc1d497682b9734039d348d (patch) | |
tree | 6b2305f1aa3e475a912ecd848f75f177ab52ad6a | |
parent | 5139643a63a89ebcc85ff613b486cddfb0ce58e0 (diff) | |
download | nextcloud-server-f0a1716bb59b19d7cbc1d497682b9734039d348d.tar.gz nextcloud-server-f0a1716bb59b19d7cbc1d497682b9734039d348d.zip |
fix(mimetype): Remove unnecessary transaction when storing a mime type
Fixes #40064.
This could be fixed by adding a rollback and starting a new transaction
before the SELECT query, but in this case that would have the same
effect as not using one.
See https://dev.mysql.com/doc/refman/8.0/en/innodb-autocommit-commit-rollback.html
and https://www.postgresql.org/docs/7.1/sql-begin.html#R1-SQL-BEGIN-1
Signed-off-by: Lucas Azevedo <lhs_azevedo@hotmail.com>
-rw-r--r-- | lib/private/Files/Type/Loader.php | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/lib/private/Files/Type/Loader.php b/lib/private/Files/Type/Loader.php index 20c298f21b3..7ca1b677fb5 100644 --- a/lib/private/Files/Type/Loader.php +++ b/lib/private/Files/Type/Loader.php @@ -116,35 +116,31 @@ class Loader implements IMimeTypeLoader { * @return int inserted ID */ protected function store($mimetype) { - $mimetypeId = $this->atomic(function () use ($mimetype) { - try { - $insert = $this->dbConnection->getQueryBuilder(); - $insert->insert('mimetypes') - ->values([ - 'mimetype' => $insert->createNamedParameter($mimetype) - ]) - ->executeStatement(); - return $insert->getLastInsertId(); - } catch (DbalException $e) { - if ($e->getReason() !== DBException::REASON_UNIQUE_CONSTRAINT_VIOLATION) { - throw $e; - } - $qb = $this->dbConnection->getQueryBuilder(); - $qb->select('id') - ->from('mimetypes') - ->where($qb->expr()->eq('mimetype', $qb->createNamedParameter($mimetype))); - $result = $qb->executeQuery(); - $id = $result->fetchOne(); - $result->closeCursor(); - if ($id !== false) { - return (int) $id; - } + try { + $insert = $this->dbConnection->getQueryBuilder(); + $insert->insert('mimetypes') + ->values([ + 'mimetype' => $insert->createNamedParameter($mimetype) + ]) + ->executeStatement(); + $mimetypeId = $insert->getLastInsertId(); + } catch (DbalException $e) { + if ($e->getReason() !== DBException::REASON_UNIQUE_CONSTRAINT_VIOLATION) { + throw $e; + } + + $qb = $this->dbConnection->getQueryBuilder(); + $qb->select('id') + ->from('mimetypes') + ->where($qb->expr()->eq('mimetype', $qb->createNamedParameter($mimetype))); + $result = $qb->executeQuery(); + $id = $result->fetchOne(); + $result->closeCursor(); + if ($id === false) { throw new \Exception("Database threw an unique constraint on inserting a new mimetype, but couldn't return the ID for this very mimetype"); } - }, $this->dbConnection); - if (!$mimetypeId) { - throw new \Exception("Failed to get mimetype id for $mimetype after trying to store it"); + $mimetypeId = (int) $id; } $this->mimetypes[$mimetypeId] = $mimetype; |