X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=DBSchema%2FDBD%2Fmysql.pm;h=0bda38d17a23b616ee418b18d8beca568180699a;hb=3f71532c073ddb428889a4c46843cb82f5be15ad;hp=3d64477ec119e3331745dd41f4f56779f4335e79;hpb=7d5538189564cc786eacb4a2969a2ad19cbdf84c;p=DBIx-DBSchema.git diff --git a/DBSchema/DBD/mysql.pm b/DBSchema/DBD/mysql.pm index 3d64477..0bda38d 100644 --- a/DBSchema/DBD/mysql.pm +++ b/DBSchema/DBD/mysql.pm @@ -4,13 +4,15 @@ use strict; use vars qw($VERSION @ISA %typemap); use DBIx::DBSchema::DBD; -$VERSION = '0.03'; +$VERSION = '0.06'; @ISA = qw(DBIx::DBSchema::DBD); %typemap = ( - 'TIMESTAMP' => 'DATETIME', - 'SERIAL' => 'INTEGER', - 'BOOL' => 'TINYINT', + 'TIMESTAMP' => 'DATETIME', + 'SERIAL' => 'INTEGER', + 'BIGSERIAL' => 'BIGINT', + 'BOOL' => 'TINYINT', + 'LONG VARBINARY' => 'LONGBLOB', ); =head1 NAME @@ -30,24 +32,30 @@ $schema = new_native DBIx::DBSchema $dbh; This module implements a MySQL-native driver for DBIx::DBSchema. =cut + use Data::Dumper; sub columns { my($proto, $dbh, $table ) = @_; + my $oldkhv=$dbh->{FetchHashKeyName}; + $dbh->{FetchHashKeyName}="NAME"; my $sth = $dbh->prepare("SHOW COLUMNS FROM $table") or die $dbh->errstr; $sth->execute or die $sth->errstr; - map { - $_->{'Type'} =~ /^(\w+)\(?([\d\,]+)?\)?( unsigned)?$/ + my @r = map { + #warn Dumper($_); + $_->{'Type'} =~ /^(\w+)\(?([^)]+)?\)?( \d+)?$/ or die "Illegal type: ". $_->{'Type'}. "\n"; my($type, $length) = ($1, $2); [ $_->{'Field'}, $type, - $_->{'Null'}, + ( $_->{'Null'} =~ /^YES$/i ? 'NULL' : '' ), $length, $_->{'Default'}, $_->{'Extra'} ] } @{ $sth->fetchall_arrayref( {} ) }; + $dbh->{FetchHashKeyName}=$oldkhv; + @r; } #sub primary_key { @@ -82,6 +90,8 @@ sub index { sub _show_index { my($proto, $dbh, $table ) = @_; + my $oldkhv=$dbh->{FetchHashKeyName}; + $dbh->{FetchHashKeyName}="NAME"; my $sth = $dbh->prepare("SHOW INDEX FROM $table") or die $dbh->errstr; $sth->execute or die $sth->errstr; @@ -97,10 +107,53 @@ sub _show_index { push @{ $unique{ $row->{'Key_name'} } }, $row->{'Column_name'}; } } + $dbh->{FetchHashKeyName}=$oldkhv; ( $pkey, \%unique, \%index ); } +sub column_callback { + my( $proto, $dbh, $table, $column_obj ) = @_; + + my $hashref = { 'explicit_null' => 1, }; + + $hashref->{'effective_local'} = 'AUTO_INCREMENT' + if $column_obj->type =~ /^(\w*)SERIAL$/i; + + if ( $column_obj->default =~ /^(NOW)\(\)$/i + && $column_obj->type =~ /^(TIMESTAMP|DATETIME)$/i ) { + + $hashref->{'effective_default'} = 'CURRENT_TIMESTAMP'; + $hashref->{'effective_type'} = 'TIMESTAMP'; + + } + + $hashref; + +} + +sub alter_column_callback { + my( $proto, $dbh, $table, $old_column, $new_column ) = @_; + my $old_name = $old_column->name; + my $new_def = $new_column->line($dbh); + +# this would have been nice, but it appears to be doing too much... + +# return {} if $old_column->line($dbh) eq $new_column->line($dbh); +# +# #{ 'sql_alter' => +# { 'sql_alter_null' => +# "ALTER TABLE $table CHANGE $old_name $new_def", +# }; + + return {} if $old_column->null eq $new_column->null; + { 'sql_alter_null' => + "ALTER TABLE $table MODIFY $new_def", + }; + + +} + =head1 AUTHOR Ivan Kohler @@ -109,6 +162,7 @@ Ivan Kohler Copyright (c) 2000 Ivan Kohler Copyright (c) 2000 Mail Abuse Prevention System LLC +Copyright (c) 2007 Freeside Internet Services, Inc. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.