Path: blob/master/src/applications/draft/storage/PhabricatorVersionedDraft.php
12242 views
<?php12final class PhabricatorVersionedDraft extends PhabricatorDraftDAO {34const KEY_VERSION = 'draft.version';56protected $objectPHID;7protected $authorPHID;8protected $version;9protected $properties = array();1011protected function getConfiguration() {12return array(13self::CONFIG_SERIALIZATION => array(14'properties' => self::SERIALIZATION_JSON,15),16self::CONFIG_COLUMN_SCHEMA => array(17'version' => 'uint32',18),19self::CONFIG_KEY_SCHEMA => array(20'key_object' => array(21'columns' => array('objectPHID', 'authorPHID', 'version'),22'unique' => true,23),24),25) + parent::getConfiguration();26}2728public function setProperty($key, $value) {29$this->properties[$key] = $value;30return $this;31}3233public function getProperty($key, $default = null) {34return idx($this->properties, $key, $default);35}3637public static function loadDrafts(38array $object_phids,39$viewer_phid) {4041$rows = id(new self())->loadAllWhere(42'objectPHID IN (%Ls) AND authorPHID = %s ORDER BY version ASC',43$object_phids,44$viewer_phid);4546$map = array();47foreach ($rows as $row) {48$map[$row->getObjectPHID()] = $row;49}5051return $map;52}5354public static function loadDraft(55$object_phid,56$viewer_phid) {5758return id(new PhabricatorVersionedDraft())->loadOneWhere(59'objectPHID = %s AND authorPHID = %s ORDER BY version DESC LIMIT 1',60$object_phid,61$viewer_phid);62}6364public static function loadOrCreateDraft(65$object_phid,66$viewer_phid,67$version) {6869$draft = self::loadDraft($object_phid, $viewer_phid);70if ($draft) {71return $draft;72}7374try {75return id(new self())76->setObjectPHID($object_phid)77->setAuthorPHID($viewer_phid)78->setVersion((int)$version)79->save();80} catch (AphrontDuplicateKeyQueryException $ex) {81$duplicate_exception = $ex;82}8384// In rare cases we can race ourselves, and at one point there was a bug85// which caused the browser to submit two preview requests at exactly86// the same time. If the insert failed with a duplicate key exception,87// try to load the colliding row to recover from it.8889$draft = self::loadDraft($object_phid, $viewer_phid);90if ($draft) {91return $draft;92}9394throw $duplicate_exception;95}9697public static function purgeDrafts(98$object_phid,99$viewer_phid) {100101$draft = new PhabricatorVersionedDraft();102$conn_w = $draft->establishConnection('w');103104queryfx(105$conn_w,106'DELETE FROM %T WHERE objectPHID = %s AND authorPHID = %s',107$draft->getTableName(),108$object_phid,109$viewer_phid);110}111112}113114115