Skip to content

Commit 0c12bef

Browse files
committed
chore: wrap share updates in transaction
Signed-off-by: grnd-alt <git@belakkaf.net>
1 parent 7e1770a commit 0c12bef

File tree

1 file changed

+69
-46
lines changed

1 file changed

+69
-46
lines changed

lib/Sharing/DeckShareProvider.php

Lines changed: 69 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -283,39 +283,62 @@ private function applyBoardPermission($share, $permissions, $userId) {
283283
* @inheritDoc
284284
*/
285285
public function update(IShare $share) {
286-
$qb = $this->dbConnection->getQueryBuilder();
287-
$qb->update('share')
288-
->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
289-
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
290-
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
291-
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
292-
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
293-
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
294-
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
295-
->execute();
286+
$this->dbConnection->beginTransaction();
287+
try {
288+
$qb = $this->dbConnection->getQueryBuilder();
289+
$qb->update('share')
290+
->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
291+
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
292+
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
293+
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
294+
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
295+
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
296+
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE));
297+
298+
$shareAttributes = $this->formatShareAttributes($share->getAttributes());
299+
if ($shareAttributes !== null) {
300+
$qb->set('attributes', $qb->createNamedParameter($shareAttributes));
301+
}
296302

297-
/*
298-
* Update all user defined group shares
299-
*/
300-
$qb = $this->dbConnection->getQueryBuilder();
301-
$qb->update('share')
302-
->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
303-
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
304-
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
305-
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
306-
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
307-
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
308-
->execute();
303+
$qb->executeStatement();
309304

310-
/*
311-
* Now update the permissions for all children that have not set it to 0
312-
*/
313-
$qb = $this->dbConnection->getQueryBuilder();
314-
$qb->update('share')
315-
->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
316-
->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
317-
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
318-
->execute();
305+
/*
306+
* Update all user defined group shares
307+
*/
308+
$qb = $this->dbConnection->getQueryBuilder();
309+
$qb->update('share')
310+
->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
311+
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
312+
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
313+
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
314+
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
315+
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE));
316+
317+
if ($shareAttributes !== null) {
318+
$qb->set('attributes', $qb->createNamedParameter($shareAttributes));
319+
}
320+
321+
$qb->executeStatement();
322+
323+
/*
324+
* Now update the permissions for all children that have not set it to 0
325+
*/
326+
$qb = $this->dbConnection->getQueryBuilder();
327+
$qb->update('share')
328+
->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
329+
->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
330+
->set('permissions', $qb->createNamedParameter($share->getPermissions()));
331+
332+
if ($shareAttributes !== null) {
333+
$qb->set('attributes', $qb->createNamedParameter($shareAttributes));
334+
}
335+
336+
$qb->executeStatement();
337+
} catch (\Exception $e) {
338+
$this->dbConnection->rollBack();
339+
throw $e;
340+
}
341+
$this->dbConnection->commit();
319342

320343
return $share;
321344
}
@@ -1043,22 +1066,22 @@ public function getAllShares(): iterable {
10431066
}
10441067

10451068
protected function updateShareAttributes(IShare $share, ?string $data): IShare {
1046-
if ($data !== null && $data !== '') {
1047-
$attributes = $share->getAttributes() ?? $share->newAttributes();
1048-
$compressedAttributes = \json_decode($data, true);
1049-
if ($compressedAttributes === false || $compressedAttributes === null) {
1050-
return $share;
1051-
}
1052-
foreach ($compressedAttributes as $compressedAttribute) {
1053-
$attributes->setAttribute(
1054-
$compressedAttribute[0],
1055-
$compressedAttribute[1],
1056-
$compressedAttribute[2]
1057-
);
1058-
}
1059-
$share->setAttributes($attributes);
1069+
if ($data === null || $data === '') {
1070+
return $share;
10601071
}
1061-
1072+
$attributes = $share->getAttributes() ?? $share->newAttributes();
1073+
$compressedAttributes = \json_decode($data, true);
1074+
if ($compressedAttributes === false || $compressedAttributes === null) {
1075+
return $share;
1076+
}
1077+
foreach ($compressedAttributes as $compressedAttribute) {
1078+
$attributes->setAttribute(
1079+
$compressedAttribute[0],
1080+
$compressedAttribute[1],
1081+
$compressedAttribute[2]
1082+
);
1083+
}
1084+
$share->setAttributes($attributes);
10621085
return $share;
10631086
}
10641087

0 commit comments

Comments
 (0)