summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Azevedo <lhs_azevedo@hotmail.com>2023-09-01 14:05:15 -0300
committerbackportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com>2023-09-16 19:31:26 +0000
commitf0a1716bb59b19d7cbc1d497682b9734039d348d (patch)
tree6b2305f1aa3e475a912ecd848f75f177ab52ad6a
parent5139643a63a89ebcc85ff613b486cddfb0ce58e0 (diff)
downloadnextcloud-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.php48
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;