Some cleanup on detecting types

This commit is contained in:
Brion Vibber 2010-10-07 16:49:49 -07:00
parent 82e9a2eee8
commit 14e4f50f29
2 changed files with 59 additions and 9 deletions

View File

@ -94,23 +94,37 @@ class MysqlSchema extends Schema
$name = $row['COLUMN_NAME']; $name = $row['COLUMN_NAME'];
$field = array(); $field = array();
if ($row['DATA_TYPE'] !== null) { // warning -- 'unsigned' attr on numbers isn't given in DATA_TYPE and friends.
$field['type'] = $row['DATA_TYPE']; // It is stuck in on COLUMN_TYPE though (eg 'bigint(20) unsigned')
list($type, $size) = $this->reverseMapType($row['DATA_TYPE']);
$field['type'] = $type;
if ($size !== null) {
$field['size'] = $size;
} }
if ($row['CHARACTER_MAXIMUM_LENGTH'] !== null) {
$field['length'] = intval($row['CHARACTER_MAXIMUM_LENGTH']); if ($type == 'char' || $type == 'varchar') {
if ($row['CHARACTER_MAXIMUM_LENGTH'] !== null) {
$field['length'] = intval($row['CHARACTER_MAXIMUM_LENGTH']);
}
} }
if ($row['NUMERIC_PRECISION'] !== null) { if ($type == 'numeric') {
$field['precision'] = intval($row['NUMERIC_PRECISION']); // Other int types may report these values, but they're irrelevant.
} // Just ignore them!
if ($row['NUMERIC_SCALE'] !== null) { if ($row['NUMERIC_PRECISION'] !== null) {
$field['scale'] = intval($row['NUMERIC_SCALE']); $field['precision'] = intval($row['NUMERIC_PRECISION']);
}
if ($row['NUMERIC_SCALE'] !== null) {
$field['scale'] = intval($row['NUMERIC_SCALE']);
}
} }
if ($row['IS_NULLABLE'] == 'NO') { if ($row['IS_NULLABLE'] == 'NO') {
$field['not null'] = true; $field['not null'] = true;
} }
if ($row['COLUMN_DEFAULT'] !== null) { if ($row['COLUMN_DEFAULT'] !== null) {
$field['default'] = $row['COLUMN_DEFAULT']; $field['default'] = $row['COLUMN_DEFAULT'];
if ($this->isNumericType($type)) {
$field['default'] = intval($field['default']);
}
} }
if ($row['COLUMN_KEY'] !== null) { if ($row['COLUMN_KEY'] !== null) {
// We'll need to look up key info... // We'll need to look up key info...
@ -562,6 +576,35 @@ class MysqlSchema extends Schema
return $type; return $type;
} }
/**
* Map a MySQL native type back to an independent type + size
*
* @param string $type
* @return array ($type, $size) -- $size may be null
*/
protected function reverseMapType($type)
{
$type = strtolower($type);
$map = array(
'decimal' => array('numeric', null),
'tinyint' => array('int', 'tiny'),
'smallint' => array('int', 'small'),
'mediumint' => array('int', 'medium'),
'bigint' => array('int', 'big'),
'tinyblob' => array('blob', 'tiny'),
'mediumblob' => array('blob', 'medium'),
'longblob' => array('blob', 'long'),
'tinytext' => array('text', 'tiny'),
'mediumtext' => array('text', 'medium'),
'longtext' => array('text', 'long'),
);
if (isset($map[$type])) {
return $map[$type];
} else {
return array($type, null);
}
}
function typeAndSize($column) function typeAndSize($column)
{ {
if ($column['type'] == 'enum') { if ($column['type'] == 'enum') {

View File

@ -583,6 +583,13 @@ class Schema
return $table; return $table;
} }
function isNumericType($type)
{
$type = strtolower($type);
$known = array('int', 'serial', 'numeric');
return in_array($type, $known);
}
} }
class SchemaTableMissingException extends Exception class SchemaTableMissingException extends Exception