Filter table definitions to scrub out unsupported features before trying to alter a table. This lets us skip those where we end up trying to change unsupported features.

This commit is contained in:
Brion Vibber 2010-10-13 16:04:28 -07:00
parent 4101de7dd7
commit 229c772634
4 changed files with 73 additions and 12 deletions

View File

@ -523,4 +523,20 @@ class MysqlSchema extends Schema
return parent::typeAndSize($column); return parent::typeAndSize($column);
} }
} }
/**
* Filter the given table definition array to match features available
* in this database.
*
* This lets us strip out unsupported things like comments, foreign keys,
* or type variants that we wouldn't get back from getTableDef().
*
* @param array $tableDef
*/
function filterDef(array $tableDef)
{
// @fixme add foreign-key support for MySQL
unset($tableDef['foreign keys']);
return $tableDef;
}
} }

View File

@ -406,4 +406,29 @@ class PgsqlSchema extends Schema
} }
} }
/**
* Filter the given table definition array to match features available
* in this database.
*
* This lets us strip out unsupported things like comments, foreign keys,
* or type variants that we wouldn't get back from getTableDef().
*
* @param array $tableDef
*/
function filterDef(array $tableDef)
{
foreach (array_keys($tableDef['fields']) as $name => &$col) {
// No convenient support for field descriptions
unset($col['description']);
if (isset($col['size'])) {
// Don't distinguish between tinyint and int.
if ($col['size'] == 'tiny' && $col['type'] == 'int') {
unset($col['size']);
}
}
}
return $tableDef;
}
} }

View File

@ -143,6 +143,7 @@ class Schema
*/ */
public function buildCreateTable($name, $def) public function buildCreateTable($name, $def)
{ {
$def = $this->filterDef($def);
$sql = array(); $sql = array();
foreach ($def['fields'] as $col => $colDef) { foreach ($def['fields'] as $col => $colDef) {
@ -487,17 +488,19 @@ class Schema
} }
} }
$old = $this->filterDef($old);
$def = $this->filterDef($def);
// @fixme check if not present // @fixme check if not present
$fields = $this->diffArrays($old['fields'], $def['fields'], array($this, 'columnsEqual')); $fields = $this->diffArrays($old['fields'], $def['fields'], array($this, 'columnsEqual'));
$uniques = $this->diffArrays($old['unique keys'], $def['unique keys']); $uniques = $this->diffArrays($old['unique keys'], $def['unique keys']);
$indexes = $this->diffArrays($old['indexes'], $def['indexes']); $indexes = $this->diffArrays($old['indexes'], $def['indexes']);
/* $total = $fields['count'] + $uniques['count'] + $indexes['count'];
if (count($toadd) + count($todrop) + count($tomod) == 0) { if ($total == 0) {
// nothing to do // nothing to do
return true; return array();
} }
*/
// For efficiency, we want this all in one // For efficiency, we want this all in one
// query, instead of using our methods. // query, instead of using our methods.
@ -561,7 +564,8 @@ class Schema
return array('add' => $toadd, return array('add' => $toadd,
'del' => $todrop, 'del' => $todrop,
'mod' => $tomod, 'mod' => $tomod,
'keep' => $tokeep); 'keep' => $tokeep,
'count' => count($toadd) + count($todrop) + count($tomod));
} }
/** /**
@ -847,6 +851,20 @@ class Schema
return $table; return $table;
} }
/**
* Filter the given table definition array to match features available
* in this database.
*
* This lets us strip out unsupported things like comments, foreign keys,
* or type variants that we wouldn't get back from getTableDef().
*
* @param array $tableDef
*/
function filterDef(array $tableDef)
{
return $tableDef;
}
function isNumericType($type) function isNumericType($type)
{ {
$type = strtolower($type); $type = strtolower($type);

View File

@ -129,17 +129,19 @@ function dumpBuildTable($tableName)
function dumpEnsureTable($tableName) function dumpEnsureTable($tableName)
{ {
echo "-- \n";
echo "-- $tableName\n";
echo "-- \n";
$schema = Schema::get(); $schema = Schema::get();
$def = getCoreSchema($tableName); $def = getCoreSchema($tableName);
$sql = $schema->buildEnsureTable($tableName, $def); $sql = $schema->buildEnsureTable($tableName, $def);
$sql[] = '';
echo implode(";\n", $sql); if ($sql) {
echo "\n"; echo "-- \n";
echo "-- $tableName\n";
echo "-- \n";
$sql[] = '';
echo implode(";\n", $sql);
echo "\n";
}
} }
function showDiff($a, $b) function showDiff($a, $b)