fix sizeless types and typemap for SQLite
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Generator / DDL / SQLite.pm
1 package SQL::Translator::Generator::DDL::SQLite;
2
3 # AUTHOR: Arthur Axel fREW Schmidt
4 # Copyright: Same as Perl 5
5
6 use Moo;
7 use SQL::Translator::Generator::Utils;
8
9 has quote_chars => (is=>'ro', default=>sub { +[qw(" ")] } );
10
11 with 'SQL::Translator::Generator::Role::Quote';
12 with 'SQL::Translator::Generator::Role::DDL';
13
14 sub name_sep { q(.) }
15
16 sub _build_type_map {
17    +{
18       set   => 'varchar',
19       bytea => 'blob',
20    }
21 }
22
23 sub _build_sizeless_types {
24    +{
25       text => 1,
26       blob => 1,
27    }
28 }
29 sub _build_numeric_types {
30    +{
31       int                => 1,
32       integer            => 1,
33       tinyint            => 1,
34       smallint           => 1,
35       mediumint          => 1,
36       bigint             => 1,
37       'unsigned big int' => 1,
38       int2               => 1,
39       int8               => 1,
40       numeric            => 1,
41       decimal            => 1,
42       boolean            => 1,
43       real               => 1,
44       double             => 1,
45       'double precision' => 1,
46       float              => 1,
47    }
48 }
49
50 sub _build_unquoted_defaults {
51    +{
52        NULL              => 1,
53        'now()'           => 1,
54        CURRENT_TIMESTAMP => 1,
55    }
56 }
57
58 sub nullable { () }
59
60 sub _ipk {
61    my ($self, $field) = @_;
62
63    my $pk = $field->table->primary_key;
64    my @pk_fields = $pk ? $pk->fields : ();
65
66    $field->is_primary_key && scalar @pk_fields == 1 &&
67    ( $field->data_type =~ /int(eger)?$/i
68     ||
69    ( $field->data_type =~ /^number?$/i && $field->size !~ /,/ ) )
70 }
71
72 sub field {
73    my ($self, $field) = @_;
74
75
76    return join ' ',
77       $self->field_comments($field),
78       $self->field_name($field),
79       ( $self->_ipk($field)
80          ? ( 'INTEGER PRIMARY KEY' )
81          : ( $self->field_type($field) )
82       ),
83       $self->field_nullable($field),
84       $self->field_default($field),
85 }
86
87 1;
88