Fix causal reads in CalDAV backend

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
pull/34415/head
Christoph Wurst 2022-10-03 20:03:29 +07:00
parent f888f99b0a
commit e6d8da4cdc
1 changed files with 29 additions and 20 deletions

@ -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;