X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI.pm;h=ac2990055d9a6e87c43edb57528beb20cea0cb58;hb=fc22fbac7c99f1ee8a52e529a6ce4ee35fd5d4a9;hp=4ee25cc0ff1292fedb1457238cc4eaa91c15965c;hpb=1346e22d4899edf837c77312259c3ebaaf71f602;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 4ee25cc..ac29900 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -518,25 +518,41 @@ Returns database type info for a given table columns. =cut +# override this in a subclass if your DBD ->can('column_info'), +# but the call itself is horribly broken. +sub _column_info_broken { 0 } + sub columns_info_for { my ($self, $table) = @_; + my %result; - if ( $self->dbh->can( 'column_info' ) ){ + if ( $self->dbh->can( 'column_info' ) && !$self->_column_info_broken){ my $sth = $self->dbh->column_info( undef, undef, $table, '%' ); $sth->execute(); while ( my $info = $sth->fetchrow_hashref() ){ my %column_info; $column_info{data_type} = $info->{TYPE_NAME}; $column_info{size} = $info->{COLUMN_SIZE}; - $column_info{is_nullable} = $info->{NULLABLE}; + $column_info{is_nullable} = $info->{NULLABLE} ? 1 : 0; + $column_info{default_value} = $info->{COLUMN_DEF}; $result{$info->{COLUMN_NAME}} = \%column_info; } } else { my $sth = $self->dbh->prepare("SELECT * FROM $table WHERE 1=0"); $sth->execute; - my @columns = @{$sth->{NAME}}; + my @columns = @{$sth->{NAME_lc}}; for my $i ( 0 .. $#columns ){ - $result{$columns[$i]}{data_type} = $sth->{TYPE}->[$i]; + my %column_info; + my $type_num = $sth->{TYPE}->[$i]; + my $type_name; + if(defined $type_num && $self->dbh->can('type_info')) { + my $type_info = $self->dbh->type_info($type_num); + $type_name = $type_info->{TYPE_NAME} if $type_info; + } + $column_info{data_type} = $type_name ? $type_name : $type_num; + $column_info{size} = $sth->{PRECISION}->[$i]; + $column_info{is_nullable} = $sth->{NULLABLE}->[$i] ? 1 : 0; + $result{$columns[$i]} = \%column_info; } } return \%result;