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