add base functionality to DDL parser
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Producer / SQL / PostgreSQL.pm
CommitLineData
4f4fd192 1use MooseX::Declare;
2role 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 . ' ';
98ec245a 37 $column_def .= defined $self->data_type_mapping->{$column->sql_data_type}
38 ? $self->data_type_mapping->{$column->sql_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}