move to MooseX::Declare
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Producer / SQL / PostgreSQL.pm
1 use MooseX::Declare;
2 role SQL::Translator::Producer::SQL::PostgreSQL {
3     use SQL::Translator::Constants qw(:sqlt_types);
4     use SQL::Translator::Types qw(Column Index Table);
5     
6     my %data_type_mapping = (
7         SQL_LONGVARCHAR() => 'text',
8         SQL_TIMESTAMP()   => 'timestamp',
9         SQL_TYPE_TIMESTAMP() => 'timestamp without time zone',
10         SQL_TYPE_TIMESTAMP_WITH_TIMEZONE() => 'timestamp',
11         SQL_INTEGER()     => 'integer',
12         SQL_CHAR()        => 'character',
13         SQL_VARCHAR()     => 'varchar',
14         SQL_BIGINT()      => 'bigint',
15     );
16     
17     method _create_table(Table $table) {
18         my $pg_version = 0;
19     
20         my $create_table;
21         my (@create, @column_defs, @index_defs, @constraint_defs);
22     
23         $create_table .= 'DROP TABLE '   . $table->name . ";\n" if $self->drop_table;
24         $create_table .= 'CREATE TABLE ' . $table->name . " (\n";
25     
26         push @column_defs, $self->_create_column($_) for values %{$table->columns};
27         $create_table .= join(",\n", map { '  ' . $_ } @column_defs ) . "\n)";
28     
29         foreach my $index (values %{$table->indexes}) {
30             if ($index->type eq 'NORMAL') {
31                 push @index_defs, $self->_create_index($index, $table);
32             } else {
33                 push @constraint_defs, $self->_create_index($index);
34             }
35         }
36     
37         print $create_table . ";\n";
38         return (@create, $create_table, @index_defs, @constraint_defs);
39     }
40     
41     method _create_column(Column $column) {
42         my $size = $column->size;
43         my $default_value = $column->default_value;
44     
45         my $column_def;
46         $column_def  = $column->name . ' ';
47         $column_def .= defined $data_type_mapping{$column->data_type}
48                        ? $data_type_mapping{$column->data_type}
49                        : $column->data_type;
50         $column_def .= '(' . $column->size . ')' if $size;
51         $column_def .= ' NOT NULL' unless $column->is_nullable;
52         $column_def .= ' PRIMARY KEY' if $column->is_auto_increment;
53         $column_def .= ' DEFAULT ' . $default_value if $column->default_value && !$column->is_auto_increment;
54         $column_def;
55     }
56     
57     method _create_index(Index $index, Table $table?) {
58         my $index_def;
59         if ($index->type eq 'PRIMARY_KEY') {
60             $index_def = 'CONSTRAINT ' . $index->name .  ' PRIMARY KEY ' .  '(' . (join ', ', map { $_->name } values %{$index->columns}) . ')';
61         }
62         elsif ($index->type eq 'UNIQUE') {
63             $index_def = 'CONSTRAINT ' . $index->name .  ' UNIQUE ' .  '(' . (join ', ', map { $_->name } values %{$index->columns}) . ')';
64         }
65         elsif ($index->type eq 'NORMAL') {
66             $index_def = 'CREATE INDEX ' . $index->name . ' ON ' . $table->name . '('.  (join ', ', map { $_->name } values %{$index->columns}) . ')';
67         }
68     
69         $index_def;
70     }
71 }