Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15622971
D10500.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
19 KB
Referenced Files
None
Subscribers
None
D10500.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1189,6 +1189,7 @@
'PhabricatorAuditManagementWorkflow' => 'applications/audit/management/PhabricatorAuditManagementWorkflow.php',
'PhabricatorAuditPreviewController' => 'applications/audit/controller/PhabricatorAuditPreviewController.php',
'PhabricatorAuditReplyHandler' => 'applications/audit/mail/PhabricatorAuditReplyHandler.php',
+ 'PhabricatorAuditSchemaSpec' => 'applications/audit/storage/PhabricatorAuditSchemaSpec.php',
'PhabricatorAuditStatusConstants' => 'applications/audit/constants/PhabricatorAuditStatusConstants.php',
'PhabricatorAuditTransaction' => 'applications/audit/storage/PhabricatorAuditTransaction.php',
'PhabricatorAuditTransactionComment' => 'applications/audit/storage/PhabricatorAuditTransactionComment.php',
@@ -1233,6 +1234,7 @@
'PhabricatorAuthProviderConfigTransactionQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigTransactionQuery.php',
'PhabricatorAuthRegisterController' => 'applications/auth/controller/PhabricatorAuthRegisterController.php',
'PhabricatorAuthRevokeTokenController' => 'applications/auth/controller/PhabricatorAuthRevokeTokenController.php',
+ 'PhabricatorAuthSchemaSpec' => 'applications/auth/storage/PhabricatorAuthSchemaSpec.php',
'PhabricatorAuthSession' => 'applications/auth/storage/PhabricatorAuthSession.php',
'PhabricatorAuthSessionEngine' => 'applications/auth/engine/PhabricatorAuthSessionEngine.php',
'PhabricatorAuthSessionGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthSessionGarbageCollector.php',
@@ -4069,6 +4071,7 @@
'PhabricatorAuditManagementWorkflow' => 'PhabricatorManagementWorkflow',
'PhabricatorAuditPreviewController' => 'PhabricatorAuditController',
'PhabricatorAuditReplyHandler' => 'PhabricatorMailReplyHandler',
+ 'PhabricatorAuditSchemaSpec' => 'PhabricatorConfigSchemaSpec',
'PhabricatorAuditTransaction' => 'PhabricatorApplicationTransaction',
'PhabricatorAuditTransactionComment' => 'PhabricatorApplicationTransactionComment',
'PhabricatorAuditTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
@@ -4113,6 +4116,7 @@
'PhabricatorAuthProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'PhabricatorAuthRegisterController' => 'PhabricatorAuthController',
'PhabricatorAuthRevokeTokenController' => 'PhabricatorAuthController',
+ 'PhabricatorAuthSchemaSpec' => 'PhabricatorConfigSchemaSpec',
'PhabricatorAuthSession' => array(
'PhabricatorAuthDAO',
'PhabricatorPolicyInterface',
diff --git a/src/applications/audit/storage/PhabricatorAuditSchemaSpec.php b/src/applications/audit/storage/PhabricatorAuditSchemaSpec.php
new file mode 100644
--- /dev/null
+++ b/src/applications/audit/storage/PhabricatorAuditSchemaSpec.php
@@ -0,0 +1,11 @@
+<?php
+
+final class PhabricatorAuditSchemaSpec extends PhabricatorConfigSchemaSpec {
+
+ public function buildSchemata() {
+ $this->buildTransactionSchema(
+ new PhabricatorAuditTransaction(),
+ new PhabricatorAuditTransactionComment());
+ }
+
+}
diff --git a/src/applications/audit/storage/PhabricatorAuditTransactionComment.php b/src/applications/audit/storage/PhabricatorAuditTransactionComment.php
--- a/src/applications/audit/storage/PhabricatorAuditTransactionComment.php
+++ b/src/applications/audit/storage/PhabricatorAuditTransactionComment.php
@@ -22,4 +22,20 @@
return ($this->getTransactionPHID() != null);
}
+ public function getConfiguration() {
+ $config = parent::getConfiguration();
+ $config[self::CONFIG_COLUMN_SCHEMA] = array(
+ 'commitPHID' => 'phid?',
+ 'pathID' => 'id?',
+ 'isNewFile' => 'bool',
+ 'lineNumber' => 'uint32',
+ 'lineLength' => 'uint32',
+ 'fixedState' => 'text12?',
+ 'hasReplies' => 'bool',
+ 'replyToCommentPHID' => 'phid?',
+ 'legacyCommentID' => 'id?',
+ ) + $config[self::CONFIG_COLUMN_SCHEMA];
+ return $config;
+ }
+
}
diff --git a/src/applications/auth/storage/PhabricatorAuthFactorConfig.php b/src/applications/auth/storage/PhabricatorAuthFactorConfig.php
--- a/src/applications/auth/storage/PhabricatorAuthFactorConfig.php
+++ b/src/applications/auth/storage/PhabricatorAuthFactorConfig.php
@@ -14,6 +14,11 @@
'properties' => self::SERIALIZATION_JSON,
),
self::CONFIG_AUX_PHID => true,
+ self::CONFIG_COLUMN_SCHEMA => array(
+ 'factorKey' => 'text64',
+ 'factorName' => 'text',
+ 'factorSecret' => 'text',
+ ),
) + parent::getConfiguration();
}
diff --git a/src/applications/auth/storage/PhabricatorAuthProviderConfig.php b/src/applications/auth/storage/PhabricatorAuthProviderConfig.php
--- a/src/applications/auth/storage/PhabricatorAuthProviderConfig.php
+++ b/src/applications/auth/storage/PhabricatorAuthProviderConfig.php
@@ -29,6 +29,14 @@
self::CONFIG_SERIALIZATION => array(
'properties' => self::SERIALIZATION_JSON,
),
+ self::CONFIG_COLUMN_SCHEMA => array(
+ 'isEnabled' => 'bool',
+ 'shouldAllowLogin' => 'bool',
+ 'shouldAllowRegistration' => 'bool',
+ 'shouldAllowLink' => 'bool',
+ 'shouldAllowUnlink' => 'bool',
+ 'shouldTrustEmails' => 'bool',
+ ),
) + parent::getConfiguration();
}
diff --git a/src/applications/auth/storage/PhabricatorAuthSchemaSpec.php b/src/applications/auth/storage/PhabricatorAuthSchemaSpec.php
new file mode 100644
--- /dev/null
+++ b/src/applications/auth/storage/PhabricatorAuthSchemaSpec.php
@@ -0,0 +1,11 @@
+<?php
+
+final class PhabricatorAuthSchemaSpec extends PhabricatorConfigSchemaSpec {
+
+ public function buildSchemata() {
+ $this->buildLiskSchemata('PhabricatorAuthDAO');
+ $this->buildTransactionSchema(
+ new PhabricatorAuthProviderConfigTransaction());
+ }
+
+}
diff --git a/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php b/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php
--- a/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php
+++ b/src/applications/auth/storage/PhabricatorAuthTemporaryToken.php
@@ -14,6 +14,16 @@
public function getConfiguration() {
return array(
self::CONFIG_TIMESTAMPS => false,
+ self::CONFIG_COLUMN_SCHEMA => array(
+ 'tokenType' => 'text64',
+ 'tokenExpires' => 'epoch',
+ 'tokenCode' => 'text64',
+ ),
+ self::CONFIG_KEY_SCHEMA => array(
+ 'key_token' => array(
+ 'columns' => array('objectPHID', 'tokenType', 'tokenCode'),
+ ),
+ ),
) + parent::getConfiguration();
}
diff --git a/src/applications/config/controller/PhabricatorConfigController.php b/src/applications/config/controller/PhabricatorConfigController.php
--- a/src/applications/config/controller/PhabricatorConfigController.php
+++ b/src/applications/config/controller/PhabricatorConfigController.php
@@ -11,11 +11,14 @@
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
- $nav->addLabel(pht('Site Configuration'));
- $nav->addFilter('/', pht('Option Groups'));
+ $nav->addLabel(pht('Configuration'));
+ $nav->addFilter('/', pht('Browse Settings'));
$nav->addFilter('all/', pht('All Settings'));
+ $nav->addLabel(pht('Setup'));
$nav->addFilter('issue/', pht('Setup Issues'));
+ $nav->addLabel(pht('Database'));
$nav->addFilter('database/', pht('Database Status'));
+ $nav->addLabel(pht('Welcome'));
$nav->addFilter('welcome/', pht('Welcome Screen'));
return $nav;
diff --git a/src/applications/config/controller/PhabricatorConfigDatabaseController.php b/src/applications/config/controller/PhabricatorConfigDatabaseController.php
--- a/src/applications/config/controller/PhabricatorConfigDatabaseController.php
+++ b/src/applications/config/controller/PhabricatorConfigDatabaseController.php
@@ -525,10 +525,12 @@
$actual_coltype = $actual_column->getColumnType();
$actual_charset = $actual_column->getCharacterSet();
$actual_collation = $actual_column->getCollation();
+ $actual_nullable = $actual_column->getNullable();
} else {
$actual_coltype = null;
$actual_charset = null;
$actual_collation = null;
+ $actual_nullable = null;
}
if ($expect_column) {
@@ -536,11 +538,13 @@
$expect_coltype = $expect_column->getColumnType();
$expect_charset = $expect_column->getCharacterSet();
$expect_collation = $expect_column->getCollation();
+ $expect_nullable = $expect_column->getNullable();
} else {
$data_type = null;
$expect_coltype = null;
$expect_charset = null;
$expect_collation = null;
+ $expect_nullable = null;
}
@@ -580,6 +584,14 @@
pht('Expected Collation'),
$expect_collation,
),
+ array(
+ pht('Nullable'),
+ $this->getNullableString($actual_nullable),
+ ),
+ array(
+ pht('Expected Nullable'),
+ $this->getNullableString($expect_nullable),
+ ),
),
$column->getIssues());
@@ -747,4 +759,14 @@
return $view;
}
+ private function getNullableString($value) {
+ if ($value === null) {
+ return '';
+ } else if ($value === true) {
+ return pht('Yes');
+ } else {
+ return pht('No');
+ }
+ }
+
}
diff --git a/src/applications/config/schema/PhabricatorConfigColumnSchema.php b/src/applications/config/schema/PhabricatorConfigColumnSchema.php
--- a/src/applications/config/schema/PhabricatorConfigColumnSchema.php
+++ b/src/applications/config/schema/PhabricatorConfigColumnSchema.php
@@ -67,6 +67,11 @@
return ((int)$matches[1]) * 4;
}
+ switch ($type) {
+ case 'int(10) unsigned':
+ return 4;
+ }
+
// TODO: Build this out to catch overlong indexes.
return 0;
@@ -88,6 +93,10 @@
$issues[] = self::ISSUE_COLUMNTYPE;
}
+ if ($this->getNullable() !== $expect->getNullable()) {
+ $issues[] = self::ISSUE_NULLABLE;
+ }
+
return $issues;
}
diff --git a/src/applications/config/schema/PhabricatorConfigKeySchema.php b/src/applications/config/schema/PhabricatorConfigKeySchema.php
--- a/src/applications/config/schema/PhabricatorConfigKeySchema.php
+++ b/src/applications/config/schema/PhabricatorConfigKeySchema.php
@@ -6,7 +6,7 @@
private $columnNames;
public function setColumnNames(array $column_names) {
- $this->columnNames = $column_names;
+ $this->columnNames = array_values($column_names);
return $this;
}
diff --git a/src/applications/config/schema/PhabricatorConfigSchemaSpec.php b/src/applications/config/schema/PhabricatorConfigSchemaSpec.php
--- a/src/applications/config/schema/PhabricatorConfigSchemaSpec.php
+++ b/src/applications/config/schema/PhabricatorConfigSchemaSpec.php
@@ -42,26 +42,49 @@
->loadObjects();
foreach ($objects as $object) {
- $database = $this->getDatabase($object->getApplicationName());
+ $this->buildLiskObjectSchema($object);
+ }
+ }
+
+ protected function buildTransactionSchema(
+ PhabricatorApplicationTransaction $xaction,
+ PhabricatorApplicationTransactionComment $comment = null) {
+
+ $this->buildLiskObjectSchema($xaction);
+ if ($comment) {
+ $this->buildLiskObjectSchema($comment);
+ }
+ }
- $table = $this->newTable($object->getTableName());
+ private function buildLiskObjectSchema(PhabricatorLiskDAO $object) {
+ $database = $this->getDatabase($object->getApplicationName());
- $cols = $object->getSchemaColumns();
- foreach ($cols as $name => $type) {
- $details = $this->getDetailsForDataType($type);
- list($column_type, $charset, $collation) = $details;
+ $table = $this->newTable($object->getTableName());
- $column = $this->newColumn($name)
- ->setDataType($type)
- ->setColumnType($column_type)
- ->setCharacterSet($charset)
- ->setCollation($collation);
+ $cols = $object->getSchemaColumns();
+ foreach ($cols as $name => $type) {
+ $details = $this->getDetailsForDataType($type);
+ list($column_type, $charset, $collation, $nullable) = $details;
- $table->addColumn($column);
- }
+ $column = $this->newColumn($name)
+ ->setDataType($type)
+ ->setColumnType($column_type)
+ ->setCharacterSet($charset)
+ ->setCollation($collation)
+ ->setNullable($nullable);
- $database->addTable($table);
+ $table->addColumn($column);
}
+
+ $keys = $object->getSchemaKeys();
+ foreach ($keys as $key_name => $key_spec) {
+ $key = $this->newKey($key_name)
+ ->setColumnNames(idx($key_spec, 'columns', array()));
+
+ $table->addKey($key);
+ }
+
+ $database->addTable($table);
}
protected function buildEdgeSchemata(PhabricatorLiskDAO $object) {}
@@ -101,17 +124,31 @@
->setName($name);
}
+ protected function newKey($name) {
+ return id(new PhabricatorConfigKeySchema())
+ ->setName($name);
+ }
+
private function getDetailsForDataType($data_type) {
$column_type = null;
$charset = null;
$collation = null;
+ // If the type ends with "?", make the column nullable.
+ $nullable = false;
+ if (preg_match('/\?$/', $data_type)) {
+ $nullable = true;
+ $data_type = substr($data_type, 0, -1);
+ }
+
switch ($data_type) {
case 'id':
case 'epoch':
+ case 'uint32':
$column_type = 'int(10) unsigned';
break;
case 'phid':
+ case 'policy';
$column_type = 'varchar(64)';
$charset = 'binary';
$collation = 'binary';
@@ -121,11 +158,34 @@
$charset = 'binary';
$collation = 'binary';
break;
+ case 'text128':
+ $column_type = 'varchar(128)';
+ $charset = $this->getUTF8Charset();
+ $collation = $this->getUTF8Collation();
+ break;
+ case 'text64':
+ $column_type = 'varchar(64)';
+ $charset = $this->getUTF8Charset();
+ $collation = $this->getUTF8Collation();
+ break;
+ case 'text32':
+ $column_type = 'varchar(32)';
+ $charset = $this->getUTF8Charset();
+ $collation = $this->getUTF8Collation();
+ break;
+ case 'text12':
+ $column_type = 'varchar(12)';
+ $charset = $this->getUTF8Charset();
+ $collation = $this->getUTF8Collation();
+ break;
case 'text':
$column_type = 'longtext';
$charset = $this->getUTF8Charset();
$collation = $this->getUTF8Collation();
break;
+ case 'bool':
+ $column_type = 'tinyint(1)';
+ break;
default:
$column_type = pht('<unknown>');
$charset = pht('<unknown>');
@@ -133,7 +193,7 @@
break;
}
- return array($column_type, $charset, $collation);
+ return array($column_type, $charset, $collation, $nullable);
}
}
diff --git a/src/applications/config/schema/PhabricatorConfigStorageSchema.php b/src/applications/config/schema/PhabricatorConfigStorageSchema.php
--- a/src/applications/config/schema/PhabricatorConfigStorageSchema.php
+++ b/src/applications/config/schema/PhabricatorConfigStorageSchema.php
@@ -95,9 +95,9 @@
case self::ISSUE_SURPLUS:
return pht('Surplus');
case self::ISSUE_CHARSET:
- return pht('Wrong Character Set');
+ return pht('Better Character Set Available');
case self::ISSUE_COLLATION:
- return pht('Wrong Collation');
+ return pht('Better Collation Available');
case self::ISSUE_COLUMNTYPE:
return pht('Wrong Column Type');
case self::ISSUE_NULLABLE:
@@ -149,6 +149,7 @@
case self::ISSUE_COLUMNTYPE:
case self::ISSUE_SUBWARN:
case self::ISSUE_KEYCOLUMNS:
+ case self::ISSUE_NULLABLE:
return self::STATUS_WARN;
default:
throw new Exception(pht('Unknown schema issue "%s"!', $issue));
diff --git a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php
--- a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php
+++ b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php
@@ -107,6 +107,12 @@
'newValue' => self::SERIALIZATION_JSON,
'metadata' => self::SERIALIZATION_JSON,
),
+ self::CONFIG_COLUMN_SCHEMA => array(
+ 'commentPHID' => 'phid?',
+ 'commentVersion' => 'uint32',
+ 'contentSource' => 'text',
+ 'transactionType' => 'text32',
+ ),
) + parent::getConfiguration();
}
diff --git a/src/applications/transactions/storage/PhabricatorApplicationTransactionComment.php b/src/applications/transactions/storage/PhabricatorApplicationTransactionComment.php
--- a/src/applications/transactions/storage/PhabricatorApplicationTransactionComment.php
+++ b/src/applications/transactions/storage/PhabricatorApplicationTransactionComment.php
@@ -28,6 +28,18 @@
public function getConfiguration() {
return array(
self::CONFIG_AUX_PHID => true,
+ self::CONFIG_COLUMN_SCHEMA => array(
+ 'transactionPHID' => 'phid?',
+ 'commentVersion' => 'uint32',
+ 'content' => 'text',
+ 'contentSource' => 'text',
+ 'isDeleted' => 'bool',
+ ),
+ self::CONFIG_KEY_SCHEMA => array(
+ 'key_version' => array(
+ 'columns' => array('transactionPHID', 'commentVersion'),
+ ),
+ ),
) + parent::getConfiguration();
}
diff --git a/src/infrastructure/storage/lisk/LiskDAO.php b/src/infrastructure/storage/lisk/LiskDAO.php
--- a/src/infrastructure/storage/lisk/LiskDAO.php
+++ b/src/infrastructure/storage/lisk/LiskDAO.php
@@ -170,6 +170,7 @@
const CONFIG_SERIALIZATION = 'col-serialization';
const CONFIG_BINARY = 'binary';
const CONFIG_COLUMN_SCHEMA = 'col-schema';
+ const CONFIG_KEY_SCHEMA = 'key-schema';
const SERIALIZATION_NONE = 'id';
const SERIALIZATION_JSON = 'json';
@@ -347,6 +348,9 @@
* CONFIG_COLUMN_SCHEMA
* Provide a map of columns to schema column types.
*
+ * CONFIG_KEY_SCHEMA
+ * Provide a map of key names to key specifications.
+ *
* @return dictionary Map of configuration options to values.
*
* @task config
@@ -1736,6 +1740,8 @@
$builtin = array(
'id' => 'id',
'phid' => 'phid',
+ 'viewPolicy' => 'policy',
+ 'editPolicy' => 'policy',
'dateCreated' => 'epoch',
'dateModified' => 'epoch',
);
@@ -1785,4 +1791,29 @@
return $map;
}
+ public function getSchemaKeys() {
+ $custom_map = $this->getConfigOption(self::CONFIG_KEY_SCHEMA);
+ if (!$custom_map) {
+ $custom_map = array();
+ }
+
+ $default_map = array();
+ foreach ($this->getAllLiskProperties() as $property) {
+ switch ($property) {
+ case 'id':
+ $default_map['PRIMARY'] = array(
+ 'columns' => array('id'),
+ );
+ break;
+ case 'phid':
+ $default_map['key_phid'] = array(
+ 'columns' => array('phid'),
+ );
+ break;
+ }
+ }
+
+ return $custom_map + $default_map;
+ }
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, May 18, 4:10 PM (18 h, 13 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
8004120
Default Alt Text
D10500.diff (19 KB)
Attached To
Mode
D10500: Generate reasonable expected schemata for Audit and Auth
Attached
Detach File
Event Timeline
Log In to Comment