f7152eebf8c7db980d0e81a9db86aee28d3869ef
[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     method _create_table(Table $table) {
7         my $pg_version = 0;
8     
9         my $create_table;
10         my (@create, @column_defs, @index_defs, @constraint_defs);
11     
12         $create_table .= 'DROP TABLE '   . $table->name . ";\n" if $self->drop_table;
13         $create_table .= 'CREATE TABLE ' . $table->name . " (\n";
14     
15         push @column_defs, $self->_create_column($_) for values %{$table->columns};
16         $create_table .= join(",\n", map { '  ' . $_ } @column_defs ) . "\n)";
17     
18         foreach my $index (values %{$table->indexes}) {
19             if ($index->type eq 'NORMAL') {
20                 push @index_defs, $self->_create_index($index, $table);
21             } else {
22                 push @constraint_defs, $self->_create_index($index);
23             }
24         }
25     
26         print $create_table . ";\n";
27         return (@create, $create_table, @index_defs, @constraint_defs);
28     }
29     
30     method _create_column(Column $column) {
31         my $size = $column->size;
32         my $default_value = $column->default_value;
33         $default_value =~ s/^CURRENT_TIMESTAMP/now()/i if $default_value;
34     
35         my $column_def;
36         $column_def  = $column->name . ' ';
37         $column_def .= defined $self->data_type_mapping->{$column->sql_data_type}
38                        ? $self->data_type_mapping->{$column->sql_data_type}
39                        : $column->data_type;
40         $column_def .= '(' . $column->size . ')' if $size;
41         $column_def .= ' NOT NULL' unless $column->is_nullable;
42         $column_def .= ' PRIMARY KEY' if $column->is_auto_increment;
43         $column_def .= ' DEFAULT ' . $default_value if $column->default_value && !$column->is_auto_increment;
44         $column_def;
45     }
46     
47     method _create_index(Index $index, Table $table?) {
48         my $index_def;
49         if ($index->type eq 'PRIMARY_KEY') {
50             $index_def = 'CONSTRAINT ' . $index->name .  ' PRIMARY KEY ' .  '(' . (join ', ', map { $_->name } values %{$index->columns}) . ')';
51         }
52         elsif ($index->type eq 'UNIQUE') {
53             $index_def = 'CONSTRAINT ' . $index->name .  ' UNIQUE ' .  '(' . (join ', ', map { $_->name } values %{$index->columns}) . ')';
54         }
55         elsif ($index->type eq 'NORMAL') {
56             $index_def = 'CREATE INDEX ' . $index->name . ' ON ' . $table->name . '('.  (join ', ', map { $_->name } values %{$index->columns}) . ')';
57         }
58     
59         $index_def;
60     }
61 }