better
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Generator / Role / DDL.pm
1 package SQL::Translator::Generator::Role::DDL;
2
3 use Moo::Role;
4 use SQL::Translator::Utils qw(header_comment);
5
6 requires '_build_type_map';
7 requires '_build_numeric_types';
8 requires '_build_unquoted_defaults';
9 requires 'field_type_size';
10 requires 'quote';
11
12 has type_map => (
13    is => 'ro',
14    builder => '_build_type_map',
15 );
16
17 has numeric_types => (
18    is => 'ro',
19    builder => '_build_numeric_types',
20 );
21
22 has unquoted_defaults => (
23    is => 'ro',
24    builder => '_build_unquoted_defaults',
25 );
26
27 has add_comments => (
28    is => 'ro',
29 );
30
31 has add_drop_table => (
32    is => 'ro',
33 );
34
35 # would also be handy to have a required size set if there is such a thing
36
37 sub field_name { $_[0]->quote($_[1]->name) }
38
39 sub field_comments {
40    ( $_[1]->comments ? ('-- ' . $_[1]->comments . "\n ") : () )
41 }
42
43 sub table_comments {
44    my ($self, $table) = @_;
45    if ($self->add_comments) {
46       return (
47          "",
48          "--",
49          "-- Table: " . $self->quote($table->name) . "",
50          "--",
51          map "-- $_", $table->comments
52       )
53    } else {
54       return ()
55    }
56 }
57
58 sub field_nullable { ($_[1]->is_nullable ? $_[0]->nullable : 'NOT NULL' ) }
59
60 sub field_default {
61   return () if !defined $_[1]->default_value;
62
63   my $val = $_[1]->default_value;
64   $val = "'$val'" unless $_[0]->numeric_types->{$_[1]->data_type};
65   return ( "DEFAULT $val" )
66 }
67
68 sub field_type {
69    my ($self, $field) = @_;
70
71    my $field_type = $field->data_type;
72    ($self->type_map->{$field_type} || $field_type).$self->field_type_size($field)
73 }
74
75 sub fields {
76   my ($self, $table) = @_;
77   ( map $self->field($_), $table->get_fields )
78 }
79
80 sub indices {
81   my ($self, $table) = @_;
82   (map $self->index($_), $table->get_indices)
83 }
84
85 sub nullable { 'NULL' }
86
87 sub header_comments { header_comment() . "\n" if $_[0]->add_comments }
88
89 1;