Commit | Line | Data |
4f4fd192 |
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 | |
4f4fd192 |
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 | } |
287d4603 |
24 | } |
4f4fd192 |
25 | |
26 | print $create_table . ";\n"; |
27 | return (@create, $create_table, @index_defs, @constraint_defs); |
287d4603 |
28 | } |
4f4fd192 |
29 | |
30 | method _create_column(Column $column) { |
31 | my $size = $column->size; |
32 | my $default_value = $column->default_value; |
a584e206 |
33 | $default_value =~ s/^CURRENT_TIMESTAMP/now()/i if $default_value; |
4f4fd192 |
34 | |
35 | my $column_def; |
36 | $column_def = $column->name . ' '; |
a5c5cd44 |
37 | $column_def .= defined $self->data_type_mapping->{$column->data_type} |
38 | ? $self->data_type_mapping->{$column->data_type} |
4f4fd192 |
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; |
287d4603 |
45 | } |
4f4fd192 |
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; |
287d4603 |
60 | } |
287d4603 |
61 | } |