better
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Generator / DDL / SQLite.pm
1 package SQL::Translator::Generator::DDL::SQLite;
2
3 use Moo;
4 use SQL::Translator::Generator::Utils;
5
6 with 'SQL::Translator::Generator::Role::Quote';
7 with 'SQL::Translator::Generator::Role::DDL';
8
9 sub quote_chars { [qw(" ")] }
10 sub name_sep { q(.) }
11
12 sub _build_type_map {
13    +{
14       date => 'datetime',
15       'time' => 'datetime',
16    }
17 }
18
19 has sizeless_types => (
20    is => 'ro',
21    builder => '_build_sizeless_types',
22 );
23
24 sub _build_sizeless_types { +{ text => 1 } }
25 sub _build_numeric_types { +{ int => 1, tinyint => 1 } }
26
27 sub _build_unquoted_defaults {
28    +{
29        NULL              => 1,
30        'now()'           => 1,
31        CURRENT_TIMESTAMP => 1,
32    }
33 }
34
35 sub nullable { () }
36
37 sub _ipk {
38    my ($self, $field) = @_;
39
40    my $pk = $field->table->primary_key;
41    my @pk_fields = $pk ? $pk->fields : ();
42
43    $field->is_primary_key && scalar @pk_fields == 1 &&
44    ( $field->data_type =~ /int(eger)?$/i
45     ||
46    ( $field->data_type =~ /^number?$/i && $field->size !~ /,/ ) )
47 }
48
49 sub field {
50    my ($self, $field) = @_;
51
52
53    return join ' ',
54       $self->field_comments($field),
55       $self->field_name($field),
56       ( $self->_ipk($field)
57          ? ( 'INTEGER PRIMARY KEY' )
58          : ( $self->field_type($field) )
59       ),
60       $self->field_nullable($field),
61       $self->field_default($field),
62 }
63
64 sub field_type_size {
65    my ($self, $field) = @_;
66
67    ($field->size && !$self->sizeless_types->{$field->data_type}
68       ? '(' . $field->size . ')'
69       : ''
70    )
71 }
72
73 1;
74