Commit | Line | Data |
4f4fd192 |
1 | use MooseX::Declare; |
2 | role SQL::Translator::Parser::DDL::SQLite { |
3db4188f |
3 | use MooseX::Types::Moose qw(Str); |
4 | use MooseX::MultiMethods; |
5 | use SQL::Translator::Constants qw(:sqlt_types :sqlt_constants); |
6 | use SQL::Translator::Types qw(Schema); |
7 | use aliased 'SQL::Translator::Object::Column'; |
8 | use aliased 'SQL::Translator::Object::Constraint'; |
9 | use aliased 'SQL::Translator::Object::ForeignKey'; |
10 | use aliased 'SQL::Translator::Object::Index'; |
11 | use aliased 'SQL::Translator::Object::PrimaryKey'; |
3db4188f |
12 | use aliased 'SQL::Translator::Object::Table'; |
9b231fde |
13 | use aliased 'SQL::Translator::Object::Trigger'; |
14 | use aliased 'SQL::Translator::Object::View'; |
3db4188f |
15 | |
16 | around _build_data_type_mapping { |
17 | my $data_type_mapping = $self->$orig; |
18 | $data_type_mapping->{date} = SQL_DATE(); |
19 | |
20 | return $data_type_mapping; |
21 | }; |
22 | |
23 | multi method parse(Schema $data) { $data } |
24 | |
25 | multi method parse(Str $data) { |
3db4188f |
26 | my $translator = $self->translator; |
3db4188f |
27 | my $parser = Parse::RecDescent->new($self->grammar); |
28 | |
3db4188f |
29 | unless (defined $parser) { |
30 | return $translator->error("Error instantiating Parse::RecDescent ". |
31 | "instance: Bad grammer"); |
32 | } |
33 | |
34 | my $result = $parser->startrule($data); |
35 | die "Parse failed" unless defined $result; |
3db4188f |
36 | |
37 | my $schema = $translator->schema; |
38 | my @tables = |
39 | map { $_->[1] } |
9b231fde |
40 | # sort { $a->[0] <=> $b->[0] } |
3db4188f |
41 | map { [ $result->{'tables'}{ $_ }->{'order'}, $_ ] } |
42 | keys %{ $result->{'tables'} }; |
43 | |
44 | for my $table_name ( @tables ) { |
45 | my $tdata = $result->{'tables'}{ $table_name }; |
9b231fde |
46 | my $table = Table->new({ name => $tdata->{'name'}, schema => $schema }); |
3db4188f |
47 | $table->comments( $tdata->{'comments'} ); |
9b231fde |
48 | $schema->add_table($table); |
3db4188f |
49 | |
50 | for my $fdata ( @{ $tdata->{'fields'} } ) { |
9b231fde |
51 | my $field = Column->new({ |
3db4188f |
52 | name => $fdata->{'name'}, |
53 | data_type => $fdata->{'data_type'}, |
9b231fde |
54 | sql_data_type => $self->data_type_mapping->{$fdata->{data_type}} || -999999, |
3db4188f |
55 | size => $fdata->{'size'}, |
56 | default_value => $fdata->{'default'}, |
57 | is_auto_increment => $fdata->{'is_auto_inc'}, |
58 | is_nullable => $fdata->{'is_nullable'}, |
59 | comments => $fdata->{'comments'}, |
9b231fde |
60 | table => $table, |
61 | }); |
62 | $table->add_column($field); |
3db4188f |
63 | |
64 | $table->primary_key( $field->name ) if $fdata->{'is_primary_key'}; |
65 | |
66 | for my $cdata ( @{ $fdata->{'constraints'} } ) { |
67 | next unless $cdata->{'type'} eq 'foreign_key'; |
68 | $cdata->{'fields'} ||= [ $field->name ]; |
69 | push @{ $tdata->{'constraints'} }, $cdata; |
70 | } |
71 | } |
72 | |
73 | for my $idata ( @{ $tdata->{'indices'} || [] } ) { |
9b231fde |
74 | my @columns = delete $idata->{fields}; |
75 | my $index = Index->new({ |
76 | name => $idata->{'name'}, |
77 | type => uc $idata->{'type'}, |
78 | table => $table, |
79 | }); |
80 | $index->add_column($table->get_column(@$_[0])) for @columns; |
81 | $table->add_index($index); |
3db4188f |
82 | } |
83 | |
84 | for my $cdata ( @{ $tdata->{'constraints'} || [] } ) { |
9b231fde |
85 | my $constraint; |
86 | if (uc $cdata->{type} eq 'PRIMARY_KEY') { |
87 | $constraint = PrimaryKey->new({ name => $cdata->{name} || 'primary_key', table => $table }); |
88 | $constraint->add_column($table->get_column($_)) for @{$cdata->{fields}}; |
89 | $table->get_column($_)->is_primary_key(1) for @{$cdata->{fields}}; |
90 | } elsif (uc $cdata->{type} eq 'FOREIGN_KEY') { |
91 | $constraint = ForeignKey->new({ name => $cdata->{name} || 'foreign_key', |
92 | table => $table, |
93 | reference_table => $cdata->{reference_table}, |
94 | reference_columns => $cdata->{reference_fields}, |
95 | on_delete => $cdata->{on_delete} || $cdata->{on_delete_do}, |
96 | on_update => $cdata->{on_update} || $cdata->{on_update_do} }); |
97 | $table->get_column($_)->is_foreign_key(1) for @{$cdata->{fields}}; |
98 | $table->get_column($_)->foreign_key_reference($constraint) for @{$cdata->{fields}}; |
99 | } else { |
100 | $constraint = Constraint->new({ name => $cdata->{name} || 'constraint', type => uc $cdata->{type}, table => $table }); |
101 | $constraint->add_column($table->get_column($_)) for @{$cdata->{fields}}; |
102 | } |
103 | $table->add_constraint($constraint); |
104 | =cut |
105 | my $constraint = Constraint->new({ |
3db4188f |
106 | name => $cdata->{'name'}, |
107 | type => $cdata->{'type'}, |
9b231fde |
108 | columns => $cdata->{'fields'}, |
3db4188f |
109 | reference_table => $cdata->{'reference_table'}, |
110 | reference_fields => $cdata->{'reference_fields'}, |
111 | match_type => $cdata->{'match_type'} || '', |
9b231fde |
112 | on_delete => $cdata->{'on_delete'} || $cdata->{'on_delete_do'}, |
113 | on_update => $cdata->{'on_update'} || $cdata->{'on_update_do'}, |
114 | table => $table, |
115 | }); |
116 | $table->add_constraint($constraint); |
117 | =cut |
3db4188f |
118 | } |
119 | } |
120 | |
121 | for my $def ( @{ $result->{'views'} || [] } ) { |
9b231fde |
122 | my $view = View->new({ |
123 | name => $def->{'name'}, |
124 | sql => $def->{'sql'}, |
125 | }); |
126 | $schema->add_view($view); |
3db4188f |
127 | } |
128 | |
129 | for my $def ( @{ $result->{'triggers'} || [] } ) { |
9b231fde |
130 | my $trigger = Trigger->new({ |
3db4188f |
131 | name => $def->{'name'}, |
132 | perform_action_when => $def->{'when'}, |
133 | database_events => $def->{'db_events'}, |
134 | action => $def->{'action'}, |
135 | on_table => $def->{'on_table'}, |
9b231fde |
136 | }); |
137 | $schema->add_trigger($trigger); |
3db4188f |
138 | } |
3db4188f |
139 | return 1; |
140 | } |
4f4fd192 |
141 | } |