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