Path: blob/master/src/applications/differential/storage/DifferentialViewState.php
12256 views
<?php12final class DifferentialViewState3extends DifferentialDAO4implements PhabricatorPolicyInterface {56protected $viewerPHID;7protected $objectPHID;8protected $viewState = array();910private $hasModifications;1112protected function getConfiguration() {13return array(14self::CONFIG_SERIALIZATION => array(15'viewState' => self::SERIALIZATION_JSON,16),17self::CONFIG_KEY_SCHEMA => array(18'key_viewer' => array(19'columns' => array('viewerPHID', 'objectPHID'),20'unique' => true,21),22'key_object' => array(23'columns' => array('objectPHID'),24),25'key_modified' => array(26'columns' => array('dateModified'),27),28),29) + parent::getConfiguration();30}3132public function setChangesetProperty(33DifferentialChangeset $changeset,34$key,35$value) {3637if ($this->getChangesetProperty($changeset, $key) === $value) {38return;39}4041$properties = array(42'value' => $value,43'epoch' => PhabricatorTime::getNow(),44);4546$diff_id = $changeset->getDiffID();47if ($diff_id !== null) {48$properties['diffID'] = (int)$diff_id;49}5051$changeset_id = $changeset->getID();52if ($changeset_id !== null) {53$properties['changesetID'] = (int)$changeset_id;54}5556$path_hash = $this->getChangesetPathHash($changeset);57$changeset_phid = $this->getChangesetKey($changeset);5859$this->hasModifications = true;6061$this->viewState['changesets'][$path_hash][$key][$changeset_phid] =62$properties;63}6465public function getChangesetProperty(66DifferentialChangeset $changeset,67$key,68$default = null) {6970$entries = $this->getChangesetPropertyEntries(71$changeset,72$key);7374$entries = isort($entries, 'epoch');7576$entry = last($entries);77if (!is_array($entry)) {78$entry = array();79}8081return idx($entry, 'value', $default);82}8384public function getChangesetPropertyEntries(85DifferentialChangeset $changeset,86$key) {87$path_hash = $this->getChangesetPathHash($changeset);8889$entries = idxv($this->viewState, array('changesets', $path_hash, $key));90if (!is_array($entries)) {91$entries = array();92}9394return $entries;95}9697public function getHasModifications() {98return $this->hasModifications;99}100101private function getChangesetPathHash(DifferentialChangeset $changeset) {102$path = $changeset->getFilename();103return PhabricatorHash::digestForIndex($path);104}105106private function getChangesetKey(DifferentialChangeset $changeset) {107$key = $changeset->getID();108109if ($key === null) {110return '*';111}112113return (string)$key;114}115116public static function copyViewStatesToObject($src_phid, $dst_phid) {117$table = new self();118$conn = $table->establishConnection('w');119120queryfx(121$conn,122'INSERT IGNORE INTO %R123(viewerPHID, objectPHID, viewState, dateCreated, dateModified)124SELECT viewerPHID, %s, viewState, dateCreated, dateModified125FROM %R WHERE objectPHID = %s',126$table,127$dst_phid,128$table,129$src_phid);130}131132/* -( PhabricatorPolicyInterface )----------------------------------------- */133134135public function getCapabilities() {136return array(137PhabricatorPolicyCapability::CAN_VIEW,138);139}140141public function getPolicy($capability) {142return PhabricatorPolicies::POLICY_NOONE;143}144145public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {146return ($viewer->getPHID() === $this->getViewerPHID());147}148149}150151152