From e6d8da4cdc78933ca4053486cd1f7e63dbf62294 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 3 Oct 2022 20:03:29 +0200 Subject: Fix causal reads in CalDAV backend Signed-off-by: Christoph Wurst --- apps/dav/lib/CalDAV/CalDavBackend.php | 49 +++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index a147d785cc7..3d5fdb14588 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -64,6 +64,7 @@ use OCA\DAV\Events\CalendarUpdatedEvent; use OCA\DAV\Events\SubscriptionCreatedEvent; use OCA\DAV\Events\SubscriptionDeletedEvent; use OCA\DAV\Events\SubscriptionUpdatedEvent; +use OCP\AppFramework\Db\TTransactional; use OCP\Calendar\Exceptions\CalendarException; use OCP\DB\Exception; use OCP\DB\QueryBuilder\IQueryBuilder; @@ -119,6 +120,9 @@ use function time; * @package OCA\DAV\CalDAV */ class CalDavBackend extends AbstractBackend implements SyncSupport, SubscriptionSupport, SchedulingSupport { + + use TTransactional; + public const CALENDAR_TYPE_CALENDAR = 0; public const CALENDAR_TYPE_SUBSCRIPTION = 1; @@ -812,15 +816,19 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription } } - $query = $this->db->getQueryBuilder(); - $query->insert('calendars'); - foreach ($values as $column => $value) { - $query->setValue($column, $query->createNamedParameter($value)); - } - $query->executeStatement(); - $calendarId = $query->getLastInsertId(); + [$calendarId, $calendarData] = $this->atomic(function() use ($values) { + $query = $this->db->getQueryBuilder(); + $query->insert('calendars'); + foreach ($values as $column => $value) { + $query->setValue($column, $query->createNamedParameter($value)); + } + $query->executeStatement(); + $calendarId = $query->getLastInsertId(); + + $calendarData = $this->getCalendarById($calendarId); + return [$calendarId, $calendarData]; + }, $this->db); - $calendarData = $this->getCalendarById($calendarId); $this->dispatcher->dispatchTyped(new CalendarCreatedEvent((int)$calendarId, $calendarData)); return $calendarId; @@ -2446,21 +2454,22 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription } } - $valuesToInsert = []; - - $query = $this->db->getQueryBuilder(); - - foreach (array_keys($values) as $name) { - $valuesToInsert[$name] = $query->createNamedParameter($values[$name]); - } + [$subscriptionId, $subscriptionRow] = $this->atomic(function() use ($values) { + $valuesToInsert = []; + $query = $this->db->getQueryBuilder(); + foreach (array_keys($values) as $name) { + $valuesToInsert[$name] = $query->createNamedParameter($values[$name]); + } + $query->insert('calendarsubscriptions') + ->values($valuesToInsert) + ->executeStatement(); - $query->insert('calendarsubscriptions') - ->values($valuesToInsert) - ->executeStatement(); + $subscriptionId = $query->getLastInsertId(); - $subscriptionId = $query->getLastInsertId(); + $subscriptionRow = $this->getSubscriptionById($subscriptionId); + return [$subscriptionId, $subscriptionRow]; + }, $this->db); - $subscriptionRow = $this->getSubscriptionById($subscriptionId); $this->dispatcher->dispatchTyped(new SubscriptionCreatedEvent($subscriptionId, $subscriptionRow)); return $subscriptionId; -- cgit v1.2.3