make default datetime type precision checking for Pg more precise
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / DBI / Pg.pm
index 538c6be..1a1efdc 100644 (file)
@@ -6,7 +6,7 @@ use base 'DBIx::Class::Schema::Loader::DBI';
 use Carp::Clan qw/^DBIx::Class/;
 use Class::C3;
 
-our $VERSION = '0.04999_12';
+our $VERSION = '0.04999_14';
 
 =head1 NAME
 
@@ -122,6 +122,62 @@ sub _column_comment {
     $column_number );
 }
 
+# Make sure data_type's that don't need it don't have a 'size' column_info, and
+# set the correct precision for datetime and varbit types.
+sub _columns_info_for {
+    my $self = shift;
+    my ($table) = @_;
+
+    my $result = $self->next::method(@_);
+
+    foreach my $col (keys %$result) {
+        my $data_type = $result->{$col}{data_type};
+
+        # these types are fixed size
+        if ($data_type =~
+/^(?:bigint|int8|bigserial|serial8|bit|boolean|bool|box|bytea|cidr|circle|date|double precision|float8|inet|integer|int|int4|line|lseg|macaddr|money|path|point|polygon|real|float4|smallint|int2|serial|serial4|text)\z/i) {
+            delete $result->{$col}{size};
+        }
+# for datetime types, check if it has a precision or not
+        elsif ($data_type =~ /^(?:interval|time|timestamp)\b/i) {
+            my ($precision) = $self->schema->storage->dbh
+                ->selectrow_array(<<EOF, {}, $table, $col);
+SELECT datetime_precision
+FROM information_schema.columns
+WHERE table_name = ? and column_name = ?
+EOF
+
+            if ((not $precision) || $precision !~ /^\d/
+                || ($data_type !~ /^time\b/i && $precision == 6)) { # only interval/timestamp default to precision == 6
+                delete $result->{$col}{size};
+            }
+            else {
+                $result->{$col}{size} = $precision;
+            }
+        }
+        elsif ($data_type =~ /^(?:bit varying|varbit)\z/i) {
+            my ($precision) = $self->schema->storage->dbh
+                ->selectrow_array(<<EOF, {}, $table, $col);
+SELECT character_maximum_length
+FROM information_schema.columns
+WHERE table_name = ? and column_name = ?
+EOF
+
+            $result->{$col}{size} = $precision;
+        }
+        elsif ($data_type =~ /^(?:numeric|decimal)\z/i) {
+            my $size = $result->{$col}{size};
+            $size =~ s/\s*//g;
+
+            my ($scale, $precision) = split /,/, $size;
+
+            $result->{$col}{size} = [ $precision, $scale ];
+        }
+    }
+
+    return $result;
+}
+
 sub _extra_column_info {
     my ($self, $info) = @_;
     my %extra_info;
@@ -140,7 +196,7 @@ L<DBIx::Class::Schema::Loader::DBI>
 
 =head1 AUTHOR
 
-See L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
+See L<DBIx::Class::Schema::Loader/AUTHOR> and L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
 
 =head1 LICENSE