From: Ash Berlin Date: Sun, 16 Dec 2007 22:24:00 +0000 (+0000) Subject: Some SQL_TYPE mapping stuff X-Git-Tag: v0.11008~348^2~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6b2dbb1aa4a925ed68ccde86bffce9541eeb671d;p=dbsrgits%2FSQL-Translator.git Some SQL_TYPE mapping stuff --- diff --git a/lib/SQL/Translator/Parser/MySQL.pm b/lib/SQL/Translator/Parser/MySQL.pm index 86027e1..410fe23 100644 --- a/lib/SQL/Translator/Parser/MySQL.pm +++ b/lib/SQL/Translator/Parser/MySQL.pm @@ -141,8 +141,55 @@ use Data::Dumper; use Parse::RecDescent; use Exporter; use Storable qw(dclone); +use DBI qw(:sql_types); use base qw(Exporter); +our %type_mapping = ( + int => SQL_INTEGER, + integer => SQL_INTEGER, + + tinyint => SQL_TINYINT, + smallint => SQL_SMALLINT, + mediumint, + bigint, + + float => SQL_FLOAT, # Precision 0..23 + double => SQL_DOUBLE, # Precision 24..53 + "double precision" => SQL_DOUBLE, + real => SQL_DOUBLE, + + # all these are the same. + decimal => SQL_DECIMAL, + numeric => SQL_NUMERIC, + dec => SQL_DECIMAL, + # fixed: does this exist + + bit => SQL_BIT + + date => SQL_DATE, + datetime => SQL_DATETIME, + timestamp => SQL_TIMESTAMP, + time => SQL_TIME, + year + + + char => SQL_CHAR, + varchar => SQL_VARCHAR, + binary => SQL_BINARY, + varbinary => SQL_VARBINARY, + tinyblob => SQL_BLOB, + tinytext => + blob => SQL_BLOB, + text => SQL_LONGVARCHAR + mediumblob => SQL_BLOB, + mediumtext => SQL_LONGVARCHAR + longblob => SQL_BLOB + longtext => SQL_LONGVARCHAR + + enum + set +); + @EXPORT_OK = qw(parse); # Enable warnings within the Parse::RecDescent module. @@ -938,10 +985,12 @@ sub normalize_field { } $field->size($size); $field->data_type($type); + $field->sql_data_type( $type_mapping{lc $type} || SQL_UNKNOWN_TYPE ); $field->extra->{list} = $list if @$list; } } + 1; # ------------------------------------------------------------------- diff --git a/lib/SQL/Translator/Schema/Field.pm b/lib/SQL/Translator/Schema/Field.pm index 37730e1..2f20ee5 100644 --- a/lib/SQL/Translator/Schema/Field.pm +++ b/lib/SQL/Translator/Schema/Field.pm @@ -66,7 +66,7 @@ use overload __PACKAGE__->_attributes( qw/ table name data_type size is_primary_key is_nullable is_auto_increment default_value comments is_foreign_key - is_unique order + is_unique order sql_data_type /); =pod @@ -136,6 +136,21 @@ Get or set the field's data type. return $self->{'data_type'} || ''; } +sub sql_data_type { + +=head2 sql_data_type + +Constant from DBI package representing this data type. See L +for more details. + +=cut + + my $self = shift; + $self->{sql_data_type} = shift if @_; + return $self->{sql_data_type} || 0; + +} + # ---------------------------------------------------------------------- sub default_value { @@ -585,7 +600,14 @@ Determines if this field is the same as another return 0 unless $self->SUPER::equals($other); return 0 unless $case_insensitive ? uc($self->name) eq uc($other->name) : $self->name eq $other->name; - return 0 unless lc($self->data_type) eq lc($other->data_type); + + # Comparing types: use sql_data_type if both are not 0. Else use string data_type + if ($self->sql_data_type && $other->sql_data_type) { + return 0 unless $self->sql_data_type == $other->sql_data_type + } else { + return 0 unless lc($self->data_type) eq lc($other->data_type) + } + return 0 unless $self->size eq $other->size; return 0 unless (!defined $self->default_value || $self->default_value eq 'NULL') eq (!defined $other->default_value || $other->default_value eq 'NULL'); return 0 if defined $self->default_value && $self->default_value ne $other->default_value;