Path: blob/master/src/applications/herald/storage/transcript/HeraldTranscript.php
12261 views
<?php12final class HeraldTranscript extends HeraldDAO3implements4PhabricatorPolicyInterface,5PhabricatorDestructibleInterface {67protected $objectTranscript;8protected $ruleTranscripts = array();9protected $conditionTranscripts = array();10protected $applyTranscripts = array();1112protected $time;13protected $host;14protected $duration;1516protected $objectPHID;17protected $dryRun;18protected $garbageCollected = 0;1920private $object = self::ATTACHABLE;2122const TABLE_SAVED_HEADER = 'herald_savedheader';2324public function getXHeraldRulesHeader() {25$ids = array();26foreach ($this->applyTranscripts as $xscript) {27if ($xscript->getApplied()) {28if ($xscript->getRuleID()) {29$ids[] = $xscript->getRuleID();30}31}32}33if (!$ids) {34return 'none';35}3637// A rule may have multiple effects, which will cause it to be listed38// multiple times.39$ids = array_unique($ids);4041foreach ($ids as $k => $id) {42$ids[$k] = '<'.$id.'>';43}4445return implode(', ', $ids);46}4748public static function saveXHeraldRulesHeader($phid, $header) {4950// Combine any existing header with the new header, listing all rules51// which have ever triggered for this object.52$header = self::combineXHeraldRulesHeaders(53self::loadXHeraldRulesHeader($phid),54$header);5556queryfx(57id(new HeraldTranscript())->establishConnection('w'),58'INSERT INTO %T (phid, header) VALUES (%s, %s)59ON DUPLICATE KEY UPDATE header = VALUES(header)',60self::TABLE_SAVED_HEADER,61$phid,62$header);6364return $header;65}6667private static function combineXHeraldRulesHeaders($u, $v) {68if ($u === null) {69return $v;70}7172$u = preg_split('/[, ]+/', $u);73$v = preg_split('/[, ]+/', $v);7475$combined = array_unique(array_filter(array_merge($u, $v)));76return implode(', ', $combined);77}7879public static function loadXHeraldRulesHeader($phid) {80$header = queryfx_one(81id(new HeraldTranscript())->establishConnection('r'),82'SELECT * FROM %T WHERE phid = %s',83self::TABLE_SAVED_HEADER,84$phid);85if ($header) {86return idx($header, 'header');87}88return null;89}909192protected function getConfiguration() {93// Ugh. Too much of a mess to deal with.94return array(95self::CONFIG_AUX_PHID => true,96self::CONFIG_TIMESTAMPS => false,97self::CONFIG_SERIALIZATION => array(98'objectTranscript' => self::SERIALIZATION_PHP,99'ruleTranscripts' => self::SERIALIZATION_PHP,100'conditionTranscripts' => self::SERIALIZATION_PHP,101'applyTranscripts' => self::SERIALIZATION_PHP,102),103self::CONFIG_BINARY => array(104'objectTranscript' => true,105'ruleTranscripts' => true,106'conditionTranscripts' => true,107'applyTranscripts' => true,108),109self::CONFIG_COLUMN_SCHEMA => array(110'time' => 'epoch',111'host' => 'text255',112'duration' => 'double',113'dryRun' => 'bool',114'garbageCollected' => 'bool',115),116self::CONFIG_KEY_SCHEMA => array(117'key_phid' => null,118'phid' => array(119'columns' => array('phid'),120'unique' => true,121),122'objectPHID' => array(123'columns' => array('objectPHID'),124),125'garbageCollected' => array(126'columns' => array('garbageCollected', 'time'),127),128),129) + parent::getConfiguration();130}131132public function __construct() {133$this->time = time();134$this->host = php_uname('n');135}136137public function addApplyTranscript(HeraldApplyTranscript $transcript) {138$this->applyTranscripts[] = $transcript;139return $this;140}141142public function getApplyTranscripts() {143return nonempty($this->applyTranscripts, array());144}145146public function setDuration($duration) {147$this->duration = $duration;148return $this;149}150151public function setObjectTranscript(HeraldObjectTranscript $transcript) {152$this->objectTranscript = $transcript;153return $this;154}155156public function getObjectTranscript() {157return $this->objectTranscript;158}159160public function addRuleTranscript(HeraldRuleTranscript $transcript) {161$this->ruleTranscripts[$transcript->getRuleID()] = $transcript;162return $this;163}164165public function discardDetails() {166$this->applyTranscripts = null;167$this->ruleTranscripts = null;168$this->objectTranscript = null;169$this->conditionTranscripts = null;170}171172public function getRuleTranscripts() {173return nonempty($this->ruleTranscripts, array());174}175176public function addConditionTranscript(177HeraldConditionTranscript $transcript) {178$rule_id = $transcript->getRuleID();179$cond_id = $transcript->getConditionID();180181$this->conditionTranscripts[$rule_id][$cond_id] = $transcript;182return $this;183}184185public function getConditionTranscriptsForRule($rule_id) {186return idx($this->conditionTranscripts, $rule_id, array());187}188189public function getMetadataMap() {190return array(191pht('Run At Epoch') => date('F jS, g:i:s A', $this->time),192pht('Run On Host') => $this->host,193pht('Run Duration') => (int)(1000 * $this->duration).' ms',194);195}196197public function generatePHID() {198return PhabricatorPHID::generateNewPHID(199HeraldTranscriptPHIDType::TYPECONST);200}201202public function attachObject($object = null) {203$this->object = $object;204return $this;205}206207public function getObject() {208return $this->assertAttached($this->object);209}210211/* -( PhabricatorPolicyInterface )----------------------------------------- */212213public function getCapabilities() {214return array(215PhabricatorPolicyCapability::CAN_VIEW,216);217}218219public function getPolicy($capability) {220switch ($capability) {221case PhabricatorPolicyCapability::CAN_VIEW:222return PhabricatorPolicies::POLICY_USER;223}224}225226public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {227return false;228}229230public function describeAutomaticCapability($capability) {231return pht(232'To view a transcript, you must be able to view the object the '.233'transcript is about.');234}235236237/* -( PhabricatorDestructibleInterface )----------------------------------- */238239240public function destroyObjectPermanently(241PhabricatorDestructionEngine $engine) {242243$this->openTransaction();244$this->delete();245$this->saveTransaction();246}247248249}250251252