refactor table into more methods
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Generator / Role / DDL.pm
1 package SQL::Translator::Generator::Role::DDL;
2
3 use Moo::Role;
4
5 requires '_build_shim';
6 requires '_build_type_map';
7 requires '_build_numeric_types';
8 requires '_build_unquoted_defaults';
9 requires 'field_type_size';
10
11 has shim => (
12    is => 'ro',
13    handles => [ 'quote' ],
14    builder => '_build_shim',
15 );
16
17 has type_map => (
18    is => 'ro',
19    builder => '_build_type_map',
20 );
21
22 has numeric_types => (
23    is => 'ro',
24    builder => '_build_numeric_types',
25 );
26
27 has unquoted_defaults => (
28    is => 'ro',
29    builder => '_build_unquoted_defaults',
30 );
31
32 # would also be handy to have a required size set if there is such a thing
33
34 sub field_name { $_[0]->quote($_[1]->name) }
35
36 sub field_comments {
37    ( $_[1]->comments ? ('-- ' . $_[1]->comments . "\n ") : () )
38 }
39
40 sub field_nullable { ($_[1]->is_nullable ? $_[0]->nullable : 'NOT NULL' ) }
41
42 sub field_default {
43   return () if !defined $_[1]->default_value;
44
45   my $val = $_[1]->default_value;
46   $val = "'$val'" unless $_[0]->numeric_types->{$_[1]->data_type};
47   return ( "DEFAULT $val" )
48 }
49
50 sub field_type {
51    my ($self, $field) = @_;
52
53    my $field_type = $field->data_type;
54    ($self->type_map->{$field_type} || $field_type).$self->field_type_size($field)
55 }
56
57 sub fields {
58   my ($self, $table) = @_;
59   ( map $self->field($_), $table->get_fields )
60 }
61
62 sub nullable { 'NULL' }
63
64 1;