diff options
author | Louis <louis@chmn.me> | 2024-06-25 14:06:45 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-25 14:06:45 +0200 |
commit | a0dc778e1431572cec8d64c33b97c267d62b1bfa (patch) | |
tree | 4ac9dd487c3a74a4440958c6515ea7822274b537 /lib | |
parent | 465ad2f4ec42b45b119b12b8fbab8db006a4f0f8 (diff) | |
parent | c47432fe49635c4b7aff193735937733c7e199a1 (diff) | |
download | nextcloud-server-a0dc778e1431572cec8d64c33b97c267d62b1bfa.tar.gz nextcloud-server-a0dc778e1431572cec8d64c33b97c267d62b1bfa.zip |
Merge pull request #45995 from nextcloud/backport/45580/stable29
[stable29] fix: avoid duplicate tag inserts by checking if the mapping exists already in db
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/SystemTag/SystemTagObjectMapper.php | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/private/SystemTag/SystemTagObjectMapper.php b/lib/private/SystemTag/SystemTagObjectMapper.php index 614d0274add..7a2e701515d 100644 --- a/lib/private/SystemTag/SystemTagObjectMapper.php +++ b/lib/private/SystemTag/SystemTagObjectMapper.php @@ -133,6 +133,27 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { } $this->assertTagsExist($tagIds); + $this->connection->beginTransaction(); + + $query = $this->connection->getQueryBuilder(); + $query->select('systemtagid') + ->from(self::RELATION_TABLE) + ->where($query->expr()->in('systemtagid', $query->createNamedParameter($tagIds, IQueryBuilder::PARAM_INT_ARRAY))) + ->andWhere($query->expr()->eq('objecttype', $query->createNamedParameter($objectType))) + ->andWhere($query->expr()->eq('objectid', $query->createNamedParameter($objId))); + $result = $query->executeQuery(); + $rows = $result->fetchAll(); + $existingTags = []; + foreach ($rows as $row) { + $existingTags[] = $row['systemtagid']; + } + //filter only tags that do not exist in db + $tagIds = array_diff($tagIds, $existingTags); + if (empty($tagIds)) { + // no tags to insert so return here + $this->connection->commit(); + return; + } $query = $this->connection->getQueryBuilder(); $query->insert(self::RELATION_TABLE) @@ -153,6 +174,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { } } + $this->connection->commit(); if (empty($tagsAssigned)) { return; } |