8c58869b41144d64a255ab1bfd0a54184bd2c66b
[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 => 'lazy',
21 );
22
23 sub _build_sizeless_types { +{ text => 1 } }
24 sub _build_numeric_types { +{ int => 1, tinyint => 1 } }
25
26 sub _build_unquoted_defaults {
27    +{
28        NULL              => 1,
29        'now()'           => 1,
30        CURRENT_TIMESTAMP => 1,
31    }
32 }
33
34 sub nullable { () }
35
36 sub _ipk {
37    my ($self, $field) = @_;
38
39    my $pk = $field->table->primary_key;
40    my @pk_fields = $pk ? $pk->fields : ();
41
42    $field->is_primary_key && scalar @pk_fields == 1 &&
43    ( $field->data_type =~ /int(eger)?$/i
44     ||
45    ( $field->data_type =~ /^number?$/i && $field->size !~ /,/ ) )
46 }
47
48 sub field {
49    my ($self, $field) = @_;
50
51
52    return join ' ',
53       $self->field_comments($field),
54       $self->field_name($field),
55       ( $self->_ipk($field)
56          ? ( 'INTEGER PRIMARY KEY' )
57          : ( $self->field_type($field) )
58       ),
59       $self->field_nullable($field),
60       $self->field_default($field),
61 }
62
63 sub field_type_size {
64    my ($self, $field) = @_;
65
66    ($field->size && !$self->sizeless_types->{$field->data_type}
67       ? '(' . $field->size . ')'
68       : ''
69    )
70 }
71
72 1;
73