Differential D19801 Diff 47306 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 | |||||
// 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 |