Differential D19801 Diff 47292 src/infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php
Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php
| Show First 20 Lines • Show All 351 Lines • ▼ Show 20 Lines | foreach ($phases as $phase) { | ||||
| if ($auto) { | if ($auto) { | ||||
| $parts[] = qsprintf( | $parts[] = qsprintf( | ||||
| $conn, | $conn, | ||||
| 'AUTO_INCREMENT'); | 'AUTO_INCREMENT'); | ||||
| } | } | ||||
| if ($adjust['charset']) { | if ($adjust['charset']) { | ||||
| switch ($adjust['charset']) { | |||||
| case 'binary': | |||||
| $charset_value = qsprintf($conn, 'binary'); | |||||
| break; | |||||
| case 'utf8': | |||||
| $charset_value = qsprintf($conn, 'utf8'); | |||||
| break; | |||||
| case 'utf8mb4': | |||||
| $charset_value = qsprintf($conn, 'utf8mb4'); | |||||
| break; | |||||
| default: | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Unsupported character set "%s".', | |||||
| $adjust['charset'])); | |||||
| } | |||||
| switch ($adjust['collation']) { | |||||
| case 'binary': | |||||
| $collation_value = qsprintf($conn, 'binary'); | |||||
| break; | |||||
| case 'utf8_general_ci': | |||||
| $collation_value = qsprintf($conn, 'utf8_general_ci'); | |||||
| break; | |||||
| case 'utf8mb4_bin': | |||||
| $collation_value = qsprintf($conn, 'utf8mb4_bin'); | |||||
| break; | |||||
| case 'utf8mb4_unicode_ci': | |||||
| $collation_value = qsprintf($conn, 'utf8mb4_unicode_ci'); | |||||
| break; | |||||
| default: | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'Unsupported collation set "%s".', | |||||
| $adjust['collation'])); | |||||
| } | |||||
| $parts[] = qsprintf( | $parts[] = qsprintf( | ||||
| $conn, | $conn, | ||||
| 'CHARACTER SET %Q COLLATE %Q', | 'CHARACTER SET %Q COLLATE %Q', | ||||
| $adjust['charset'], | $charset_value, | ||||
| $adjust['collation']); | $collation_value); | ||||
| } | } | ||||
| if ($parts) { | |||||
| $parts = qsprintf($conn, '%LJ', $parts); | |||||
| } else { | |||||
| $parts = qsprintf($conn, ''); | |||||
| } | |||||
| if ($adjust['nullable']) { | |||||
| $nullable = qsprintf($conn, 'NULL'); | |||||
| } else { | |||||
| $nullable = qsprintf($conn, 'NOT NULL'); | |||||
| } | |||||
| // TODO: We're using "%Z" here for the column type, which is | |||||
Lint: TODO Comment: This comment has a TODO. | |||||
| // technically unsafe. It would be nice to be able to use "%Q" | |||||
| // instead, but this requires a fair amount of legwork to | |||||
| // enumerate all column types. | |||||
| queryfx( | queryfx( | ||||
| $conn, | $conn, | ||||
| 'ALTER TABLE %T.%T MODIFY %T %Q %Q %Q', | 'ALTER TABLE %T.%T MODIFY %T %Z %Q %Q', | ||||
| $adjust['database'], | $adjust['database'], | ||||
| $adjust['table'], | $adjust['table'], | ||||
| $adjust['name'], | $adjust['name'], | ||||
| $adjust['type'], | $adjust['type'], | ||||
| implode(' ', $parts), | $parts, | ||||
| $adjust['nullable'] ? 'NULL' : 'NOT NULL'); | $nullable); | ||||
| } | } | ||||
| break; | break; | ||||
| case 'key': | case 'key': | ||||
| if (($phase == 'drop_keys') && $adjust['exists']) { | if (($phase == 'drop_keys') && $adjust['exists']) { | ||||
| if ($adjust['name'] == 'PRIMARY') { | if ($adjust['name'] == 'PRIMARY') { | ||||
| $key_name = 'PRIMARY KEY'; | $key_name = 'PRIMARY KEY'; | ||||
| } else { | } else { | ||||
| $key_name = qsprintf($conn, 'KEY %T', $adjust['name']); | $key_name = qsprintf($conn, 'KEY %T', $adjust['name']); | ||||
| } | } | ||||
| queryfx( | queryfx( | ||||
| $conn, | $conn, | ||||
| 'ALTER TABLE %T.%T DROP %Q', | 'ALTER TABLE %T.%T DROP %Q', | ||||
| $adjust['database'], | $adjust['database'], | ||||
| $adjust['table'], | $adjust['table'], | ||||
| $key_name); | $key_name); | ||||
| } | } | ||||
| if (($phase == 'add_keys') && $adjust['keep']) { | if (($phase == 'add_keys') && $adjust['keep']) { | ||||
| // Different keys need different creation syntax. Notable | // Different keys need different creation syntax. Notable | ||||
| // special cases are primary keys and fulltext keys. | // special cases are primary keys and fulltext keys. | ||||
| if ($adjust['name'] == 'PRIMARY') { | if ($adjust['name'] == 'PRIMARY') { | ||||
| $key_name = 'PRIMARY KEY'; | $key_name = qsprintf($conn, 'PRIMARY KEY'); | ||||
| } else if ($adjust['indexType'] == 'FULLTEXT') { | } else if ($adjust['indexType'] == 'FULLTEXT') { | ||||
| $key_name = qsprintf($conn, 'FULLTEXT %T', $adjust['name']); | $key_name = qsprintf($conn, 'FULLTEXT %T', $adjust['name']); | ||||
| } else { | } else { | ||||
| if ($adjust['unique']) { | if ($adjust['unique']) { | ||||
| $key_name = qsprintf( | $key_name = qsprintf( | ||||
| $conn, | $conn, | ||||
| 'UNIQUE KEY %T', | 'UNIQUE KEY %T', | ||||
| $adjust['name']); | $adjust['name']); | ||||
| } else { | } else { | ||||
| $key_name = qsprintf( | $key_name = qsprintf( | ||||
| $conn, | $conn, | ||||
| '/* NONUNIQUE */ KEY %T', | '/* NONUNIQUE */ KEY %T', | ||||
| $adjust['name']); | $adjust['name']); | ||||
| } | } | ||||
| } | } | ||||
| queryfx( | queryfx( | ||||
| $conn, | $conn, | ||||
| 'ALTER TABLE %T.%T ADD %Q (%Q)', | 'ALTER TABLE %T.%T ADD %Q (%LK)', | ||||
| $adjust['database'], | $adjust['database'], | ||||
| $adjust['table'], | $adjust['table'], | ||||
| $key_name, | $key_name, | ||||
| implode(', ', $adjust['columns'])); | $adjust['columns']); | ||||
| } | } | ||||
| break; | break; | ||||
| default: | default: | ||||
| throw new Exception( | throw new Exception( | ||||
| pht('Unknown schema adjustment kind "%s"!', $adjust['kind'])); | pht('Unknown schema adjustment kind "%s"!', $adjust['kind'])); | ||||
| } | } | ||||
| } catch (AphrontQueryException $ex) { | } catch (AphrontQueryException $ex) { | ||||
| $failed[] = array($adjust, $ex); | $failed[] = array($adjust, $ex); | ||||
| ▲ Show 20 Lines • Show All 800 Lines • Show Last 20 Lines | |||||
This comment has a TODO.