Get enum values directly from column_info for PostgreSQL
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / DBI / Pg.pm
index 78e8a9f..317a07d 100644 (file)
@@ -197,7 +197,7 @@ sub _columns_info_for {
     my $self = shift;
     my ($table) = @_;
 
-    my $result = $self->next::method(@_);
+    my ($result, $raw) = $self->next::method(@_);
 
     while (my ($col, $info) = each %$result) {
         my $data_type = $info->{data_type};
@@ -281,7 +281,22 @@ EOF
         elsif (lc($data_type) eq 'character') {
             $info->{data_type} = 'char';
         }
-        else {
+        # DBD::Pg < 3.5.2 can get the order wrong on Pg >= 9.1.0
+        elsif (
+            ($DBD::Pg::VERSION >= 3.005002 or $self->dbh->{pg_server_version} < 90100)
+                and
+            my $values = $raw->{$col}->{pg_enum_values}
+        ) {
+            $info->{extra}{list} = $values;
+
+            # Store its original name in extra for SQLT to pick up.
+            $info->{extra}{custom_type_name} = $info->{data_type};
+
+            $info->{data_type} = 'enum';
+
+            delete $info->{size};
+        }
+        else  {
             my ($typetype) = $self->schema->storage->dbh
                 ->selectrow_array(<<EOF, {}, $data_type);
 SELECT typtype