Understand Postgres enumerated types
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / DBI / Pg.pm
index 8e4d7c1..1b922f1 100644 (file)
@@ -224,6 +224,18 @@ EOF
         elsif (lc($data_type) eq 'character') {
             $info->{data_type} = 'char';
         }
+        else {
+            my ($typetype) = $self->schema->storage->dbh
+                ->selectrow_array(<<EOF, {}, $data_type);
+SELECT typtype
+FROM pg_catalog.pg_type
+WHERE typname = ?
+EOF
+            if ($typetype eq 'e') {
+                $info->{data_type} = 'enum';
+            }
+        }
+
 
 # process SERIAL columns
         if (ref($info->{default_value}) eq 'SCALAR' && ${ $info->{default_value} } =~ /\bnextval\(['"]([.\w]+)/i) {
@@ -245,6 +257,28 @@ EOF
     return $result;
 }
 
+sub _extra_column_info {
+    my ($self, $table, $col, $info, $dbi_info) = @_;
+    my %extra_info;
+
+    # The following will extract a list of allowed values if this
+    # is an enumerated type. Otherwise, no results and we do nothing.
+    my $typevalues = $self->schema->storage->dbh
+        ->selectall_arrayref(<<EOF, {}, $info->{data_type});
+SELECT e.enumlabel
+FROM pg_catalog.pg_enum e
+JOIN pg_catalog.pg_type t ON t.oid = e.enumtypid
+WHERE t.typname = ?
+EOF
+
+    if (@$typevalues) {
+        $extra_info{extra}{list} = [ map { $_->[0] } @$typevalues ];
+    }
+
+    return \%extra_info;
+}
+
+
 =head1 SEE ALSO
 
 L<DBIx::Class::Schema::Loader>, L<DBIx::Class::Schema::Loader::Base>,