protected function loadPage() { $table = new PhabricatorCalendarEvent(); $conn_r = $table->establishConnection('r'); $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); return $table->loadAllFromArray($data); }
<?php echo pht('Retro-naming unnamed events.') . "\n"; $table = new PhabricatorCalendarEvent(); $conn_w = $table->establishConnection('w'); $iterator = new LiskMigrationIterator($table); foreach ($iterator as $event) { $id = $event->getID(); if (strlen($event->getName()) == 0) { echo pht('Renaming event %d...', $id) . "\n"; $viewer = PhabricatorUser::getOmnipotentUser(); // NOTE: This uses PeopleQuery directly, instead of HandleQuery, to avoid // performing cache fills as a side effect; the caches were added by a // later patch. See T8209. $user = id(new PhabricatorPeopleQuery())->setViewer($viewer)->withPHIDs(array($event->getUserPHID()))->executeOne(); if ($user) { $new_name = $user->getUsername(); } else { $new_name = pht('Unnamed Event'); } queryfx($conn_w, 'UPDATE %T SET name = %s WHERE id = %d', $table->getTableName(), $new_name, $id); } } echo pht('Done.') . "\n";
<?php $table = new PhabricatorCalendarEvent(); $conn_w = $table->establishConnection('w'); echo "Assigning PHIDs to events...\n"; foreach (new LiskMigrationIterator($table) as $event) { $id = $event->getID(); echo "Updating event {$id}...\n"; if ($event->getPHID()) { continue; } queryfx($conn_w, 'UPDATE %T SET phid = %s WHERE id = %d', $table->getTableName(), $table->generatePHID(), $id); } echo "Done.\n";
protected function loadPage() { $table = new PhabricatorCalendarEvent(); $conn_r = $table->establishConnection('r'); $viewer = $this->getViewer(); $data = queryfx_all($conn_r, 'SELECT event.* FROM %T event %Q %Q %Q %Q %Q', $table->getTableName(), $this->buildJoinClause($conn_r), $this->buildWhereClause($conn_r), $this->buildGroupClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r)); $events = $table->loadAllFromArray($data); foreach ($events as $event) { $event->applyViewerTimezone($this->getViewer()); } if (!$this->generateGhosts) { return $events; } $enforced_end = null; foreach ($events as $key => $event) { $sequence_start = 0; $sequence_end = null; $duration = $event->getDateTo() - $event->getDateFrom(); $end = null; $instance_of = $event->getInstanceOfEventPHID(); if ($instance_of == null && $this->isCancelled !== null) { if ($event->getIsCancelled() != $this->isCancelled) { unset($events[$key]); continue; } } if ($event->getIsRecurring() && $instance_of == null) { $frequency = $event->getFrequencyUnit(); $modify_key = '+1 ' . $frequency; if ($this->rangeBegin && $this->rangeBegin > $event->getDateFrom()) { $max_date = $this->rangeBegin - $duration; $date = $event->getDateFrom(); $datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); while ($date < $max_date) { // TODO: optimize this to not loop through all off-screen events $sequence_start++; $datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); $date = $datetime->modify($modify_key)->format('U'); } $start = $this->rangeBegin; } else { $start = $event->getDateFrom() - $duration; } $date = $start; $datetime = PhabricatorTime::getDateTimeFromEpoch($date, $viewer); if ($this->rangeEnd && $event->getRecurrenceEndDate() && $this->rangeEnd < $event->getRecurrenceEndDate()) { $end = $this->rangeEnd; } else { if ($event->getRecurrenceEndDate()) { $end = $event->getRecurrenceEndDate(); } else { if ($this->rangeEnd) { $end = $this->rangeEnd; } else { if ($enforced_end) { if ($end) { $end = min($end, $enforced_end); } else { $end = $enforced_end; } } } } } if ($end) { $sequence_end = $sequence_start; while ($date < $end) { $sequence_end++; $datetime->modify($modify_key); $date = $datetime->format('U'); if ($sequence_end > $this->getRawResultLimit() + $sequence_start) { break; } } } else { $sequence_end = $this->getRawResultLimit() + $sequence_start; } $sequence_start = max(1, $sequence_start); for ($index = $sequence_start; $index < $sequence_end; $index++) { $events[] = $event->generateNthGhost($index, $viewer); } if (count($events) >= $this->getRawResultLimit()) { $events = msort($events, 'getDateFrom'); $events = array_slice($events, 0, $this->getRawResultLimit(), true); $enforced_end = last($events)->getDateFrom(); } } } $map = array(); $instance_sequence_pairs = array(); foreach ($events as $key => $event) { if ($event->getIsGhostEvent()) { $index = $event->getSequenceIndex(); $instance_sequence_pairs[] = array($event->getPHID(), $index); $map[$event->getPHID()][$index] = $key; } } if (count($instance_sequence_pairs) > 0) { $sub_query = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->setParentQuery($this)->withInstanceSequencePairs($instance_sequence_pairs)->execute(); foreach ($sub_query as $edited_ghost) { $indexes = idx($map, $edited_ghost->getInstanceOfEventPHID()); $key = idx($indexes, $edited_ghost->getSequenceIndex()); $events[$key] = $edited_ghost; } $id_map = array(); foreach ($events as $key => $event) { if ($event->getIsGhostEvent()) { continue; } if (isset($id_map[$event->getID()])) { unset($events[$key]); } else { $id_map[$event->getID()] = true; } } } return $events; }
// now store all day events with their "date" epochs as UTC, separate from // individual event times. $zone_min = new DateTimeZone('Pacific/Midway'); $zone_max = new DateTimeZone('Pacific/Kiritimati'); $zone_utc = new DateTimeZone('UTC'); foreach (new LiskMigrationIterator($table) as $event) { // If this event has already migrated, skip it. if ($event->getAllDayDateFrom()) { continue; } $is_all_day = $event->getIsAllDay(); $epoch_min = $event->getDateFrom(); $epoch_max = $event->getDateTo(); $date_min = new DateTime('@' . $epoch_min); $date_max = new DateTime('@' . $epoch_max); if ($is_all_day) { $date_min->setTimeZone($zone_min); $date_min->modify('+2 days'); $date_max->setTimeZone($zone_max); $date_max->modify('-2 days'); } else { $date_min->setTimeZone($zone_utc); $date_max->setTimeZone($zone_utc); } $string_min = $date_min->format('Y-m-d'); $string_max = $date_max->format('Y-m-d 23:59:00'); $allday_min = id(new DateTime($string_min, $zone_utc))->format('U'); $allday_max = id(new DateTime($string_max, $zone_utc))->format('U'); queryfx($conn, 'UPDATE %T SET allDayDateFrom = %d, allDayDateTo = %d WHERE id = %d', $table->getTableName(), $allday_min, $allday_max, $event->getID()); }
public function canDeleteAnyEvents(PhabricatorUser $viewer, PhabricatorCalendarImport $import) { $table = new PhabricatorCalendarEvent(); $conn = $table->establishConnection('r'); // Using a CalendarEventQuery here was failing oddly in a way that was // difficult to reproduce locally (see T11808). Just check the table // directly; this is significantly more efficient anyway. $any_event = queryfx_all($conn, 'SELECT phid FROM %T WHERE importSourcePHID = %s LIMIT 1', $table->getTableName(), $import->getPHID()); return (bool) $any_event; }
<?php echo pht('Adding %s to events.', 'mailkeys') . "\n"; $table = new PhabricatorCalendarEvent(); $conn_w = $table->establishConnection('w'); $iterator = new LiskMigrationIterator($table); foreach ($iterator as $event) { $id = $event->getID(); echo pht('Populating event %d...', $id) . "\n"; queryfx($conn_w, 'UPDATE %T SET mailKey = %s WHERE id = %d', $table->getTableName(), Filesystem::readRandomCharacters(20), $id); } echo pht('Done.') . "\n";