Path: blob/master/src/applications/config/schema/PhabricatorConfigStorageSchema.php
12256 views
<?php12abstract class PhabricatorConfigStorageSchema extends Phobject {34const ISSUE_MISSING = 'missing';5const ISSUE_MISSINGKEY = 'missingkey';6const ISSUE_SURPLUS = 'surplus';7const ISSUE_SURPLUSKEY = 'surpluskey';8const ISSUE_CHARSET = 'charset';9const ISSUE_COLLATION = 'collation';10const ISSUE_COLUMNTYPE = 'columntype';11const ISSUE_NULLABLE = 'nullable';12const ISSUE_KEYCOLUMNS = 'keycolumns';13const ISSUE_UNIQUE = 'unique';14const ISSUE_LONGKEY = 'longkey';15const ISSUE_SUBWARN = 'subwarn';16const ISSUE_SUBFAIL = 'subfail';17const ISSUE_AUTOINCREMENT = 'autoincrement';18const ISSUE_UNKNOWN = 'unknown';19const ISSUE_ACCESSDENIED = 'accessdenied';20const ISSUE_ENGINE = 'engine';2122const STATUS_OKAY = 'okay';23const STATUS_WARN = 'warn';24const STATUS_FAIL = 'fail';2526private $issues = array();27private $name;2829abstract public function newEmptyClone();30abstract protected function compareToSimilarSchema(31PhabricatorConfigStorageSchema $expect);32abstract protected function getSubschemata();3334public function compareTo(PhabricatorConfigStorageSchema $expect) {35if (get_class($expect) != get_class($this)) {36throw new Exception(pht('Classes must match to compare schemata!'));37}3839if ($this->getName() != $expect->getName()) {40throw new Exception(pht('Names must match to compare schemata!'));41}4243return $this->compareToSimilarSchema($expect);44}4546public function setName($name) {47$this->name = $name;48return $this;49}5051public function getName() {52return $this->name;53}5455public function setIssues(array $issues) {56$this->issues = array_fuse($issues);57return $this;58}5960public function getIssues() {61$issues = $this->issues;6263foreach ($this->getSubschemata() as $sub) {64switch ($sub->getStatus()) {65case self::STATUS_WARN:66$issues[self::ISSUE_SUBWARN] = self::ISSUE_SUBWARN;67break;68case self::STATUS_FAIL:69$issues[self::ISSUE_SUBFAIL] = self::ISSUE_SUBFAIL;70break;71}72}7374return $issues;75}7677public function getLocalIssues() {78return $this->issues;79}8081public function hasIssue($issue) {82return (bool)idx($this->getIssues(), $issue);83}8485public function getAllIssues() {86$issues = $this->getIssues();87foreach ($this->getSubschemata() as $sub) {88$issues += $sub->getAllIssues();89}90return $issues;91}9293public function getStatus() {94$status = self::STATUS_OKAY;95foreach ($this->getAllIssues() as $issue) {96$issue_status = self::getIssueStatus($issue);97$status = self::getStrongestStatus($status, $issue_status);98}99return $status;100}101102public static function getIssueName($issue) {103switch ($issue) {104case self::ISSUE_MISSING:105return pht('Missing');106case self::ISSUE_MISSINGKEY:107return pht('Missing Key');108case self::ISSUE_SURPLUS:109return pht('Surplus');110case self::ISSUE_SURPLUSKEY:111return pht('Surplus Key');112case self::ISSUE_CHARSET:113return pht('Better Character Set Available');114case self::ISSUE_COLLATION:115return pht('Better Collation Available');116case self::ISSUE_COLUMNTYPE:117return pht('Wrong Column Type');118case self::ISSUE_NULLABLE:119return pht('Wrong Nullable Setting');120case self::ISSUE_KEYCOLUMNS:121return pht('Key on Wrong Columns');122case self::ISSUE_UNIQUE:123return pht('Key has Wrong Uniqueness');124case self::ISSUE_LONGKEY:125return pht('Key is Too Long');126case self::ISSUE_SUBWARN:127return pht('Subschemata Have Warnings');128case self::ISSUE_SUBFAIL:129return pht('Subschemata Have Failures');130case self::ISSUE_AUTOINCREMENT:131return pht('Column has Wrong Autoincrement');132case self::ISSUE_UNKNOWN:133return pht('Column Has No Specification');134case self::ISSUE_ACCESSDENIED:135return pht('Access Denied');136case self::ISSUE_ENGINE:137return pht('Better Table Engine Available');138default:139throw new Exception(pht('Unknown schema issue "%s"!', $issue));140}141}142143public static function getIssueDescription($issue) {144switch ($issue) {145case self::ISSUE_MISSING:146return pht('This schema is expected to exist, but does not.');147case self::ISSUE_MISSINGKEY:148return pht('This key is expected to exist, but does not.');149case self::ISSUE_SURPLUS:150return pht('This schema is not expected to exist.');151case self::ISSUE_SURPLUSKEY:152return pht('This key is not expected to exist.');153case self::ISSUE_CHARSET:154return pht('This schema can use a better character set.');155case self::ISSUE_COLLATION:156return pht('This schema can use a better collation.');157case self::ISSUE_COLUMNTYPE:158return pht('This schema can use a better column type.');159case self::ISSUE_NULLABLE:160return pht('This schema has the wrong nullable setting.');161case self::ISSUE_KEYCOLUMNS:162return pht('This key is on the wrong columns.');163case self::ISSUE_UNIQUE:164return pht('This key has the wrong uniqueness setting.');165case self::ISSUE_LONGKEY:166return pht('This key is too long for utf8mb4.');167case self::ISSUE_SUBWARN:168return pht('Subschemata have setup warnings.');169case self::ISSUE_SUBFAIL:170return pht('Subschemata have setup failures.');171case self::ISSUE_AUTOINCREMENT:172return pht('This column has the wrong autoincrement setting.');173case self::ISSUE_UNKNOWN:174return pht('This column is missing a type specification.');175case self::ISSUE_ENGINE:176return pht('This table can use a better table engine.');177default:178throw new Exception(pht('Unknown schema issue "%s"!', $issue));179}180}181182public static function getIssueStatus($issue) {183switch ($issue) {184case self::ISSUE_MISSING:185case self::ISSUE_ACCESSDENIED:186case self::ISSUE_SURPLUS:187case self::ISSUE_NULLABLE:188case self::ISSUE_SUBFAIL:189case self::ISSUE_UNKNOWN:190return self::STATUS_FAIL;191case self::ISSUE_SUBWARN:192case self::ISSUE_COLUMNTYPE:193case self::ISSUE_CHARSET:194case self::ISSUE_COLLATION:195case self::ISSUE_MISSINGKEY:196case self::ISSUE_SURPLUSKEY:197case self::ISSUE_UNIQUE:198case self::ISSUE_KEYCOLUMNS:199case self::ISSUE_LONGKEY:200case self::ISSUE_AUTOINCREMENT:201case self::ISSUE_ENGINE:202return self::STATUS_WARN;203default:204throw new Exception(pht('Unknown schema issue "%s"!', $issue));205}206}207208public static function getStatusSeverity($status) {209switch ($status) {210case self::STATUS_FAIL:211return 2;212case self::STATUS_WARN:213return 1;214case self::STATUS_OKAY:215return 0;216default:217throw new Exception(pht('Unknown schema status "%s"!', $status));218}219}220221public static function getStrongestStatus($u, $v) {222$u_sev = self::getStatusSeverity($u);223$v_sev = self::getStatusSeverity($v);224225if ($u_sev >= $v_sev) {226return $u;227} else {228return $v;229}230}231232233}234235236