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'; |
12 | # use aliased 'SQL::Translator::Object::Schema'; |
13 | use aliased 'SQL::Translator::Object::Table'; |
14 | |
15 | around _build_data_type_mapping { |
16 | my $data_type_mapping = $self->$orig; |
17 | $data_type_mapping->{date} = SQL_DATE(); |
18 | |
19 | return $data_type_mapping; |
20 | }; |
21 | |
22 | multi method parse(Schema $data) { $data } |
23 | |
24 | multi method parse(Str $data) { |
25 | # my ( $translator, $data ) = @_; |
26 | my $translator = $self->translator; |
27 | # my $parser = Parse::RecDescent->new($GRAMMAR); |
28 | my $parser = Parse::RecDescent->new($self->grammar); |
29 | |
30 | # local $::RD_TRACE = $translator->trace ? 1 : undef; |
31 | # local $DEBUG = $translator->debug; |
32 | local $::RD_TRACE = undef; #$self->trace ? 1 : undef; |
33 | |
34 | unless (defined $parser) { |
35 | return $translator->error("Error instantiating Parse::RecDescent ". |
36 | "instance: Bad grammer"); |
37 | } |
38 | |
39 | my $result = $parser->startrule($data); |
40 | die "Parse failed" unless defined $result; |
41 | # return $translator->error( "Parse failed." ) unless defined $result; |
42 | # warn Dumper( $result ) if $DEBUG; |
43 | |
44 | my $schema = $translator->schema; |
45 | my @tables = |
46 | map { $_->[1] } |
47 | sort { $a->[0] <=> $b->[0] } |
48 | map { [ $result->{'tables'}{ $_ }->{'order'}, $_ ] } |
49 | keys %{ $result->{'tables'} }; |
50 | |
51 | for my $table_name ( @tables ) { |
52 | my $tdata = $result->{'tables'}{ $table_name }; |
53 | my $table = $schema->add_table( |
54 | name => $tdata->{'name'}, |
55 | ) or die $schema->error; |
56 | |
57 | $table->comments( $tdata->{'comments'} ); |
58 | |
59 | for my $fdata ( @{ $tdata->{'fields'} } ) { |
60 | my $field = $table->add_field( |
61 | name => $fdata->{'name'}, |
62 | data_type => $fdata->{'data_type'}, |
63 | size => $fdata->{'size'}, |
64 | default_value => $fdata->{'default'}, |
65 | is_auto_increment => $fdata->{'is_auto_inc'}, |
66 | is_nullable => $fdata->{'is_nullable'}, |
67 | comments => $fdata->{'comments'}, |
68 | ) or die $table->error; |
69 | |
70 | $table->primary_key( $field->name ) if $fdata->{'is_primary_key'}; |
71 | |
72 | for my $cdata ( @{ $fdata->{'constraints'} } ) { |
73 | next unless $cdata->{'type'} eq 'foreign_key'; |
74 | $cdata->{'fields'} ||= [ $field->name ]; |
75 | push @{ $tdata->{'constraints'} }, $cdata; |
76 | } |
77 | } |
78 | |
79 | for my $idata ( @{ $tdata->{'indices'} || [] } ) { |
80 | my $index = $table->add_index( |
81 | name => $idata->{'name'}, |
82 | type => uc $idata->{'type'}, |
83 | fields => $idata->{'fields'}, |
84 | ) or die $table->error; |
85 | } |
86 | |
87 | for my $cdata ( @{ $tdata->{'constraints'} || [] } ) { |
88 | my $constraint = $table->add_constraint( |
89 | name => $cdata->{'name'}, |
90 | type => $cdata->{'type'}, |
91 | fields => $cdata->{'fields'}, |
92 | reference_table => $cdata->{'reference_table'}, |
93 | reference_fields => $cdata->{'reference_fields'}, |
94 | match_type => $cdata->{'match_type'} || '', |
95 | on_delete => $cdata->{'on_delete'} |
96 | || $cdata->{'on_delete_do'}, |
97 | on_update => $cdata->{'on_update'} |
98 | || $cdata->{'on_update_do'}, |
99 | ) or die $table->error; |
100 | } |
101 | } |
102 | |
103 | for my $def ( @{ $result->{'views'} || [] } ) { |
104 | my $view = $schema->add_view( |
105 | name => $def->{'name'}, |
106 | sql => $def->{'sql'}, |
107 | ); |
108 | } |
109 | |
110 | for my $def ( @{ $result->{'triggers'} || [] } ) { |
111 | my $view = $schema->add_trigger( |
112 | name => $def->{'name'}, |
113 | perform_action_when => $def->{'when'}, |
114 | database_events => $def->{'db_events'}, |
115 | action => $def->{'action'}, |
116 | on_table => $def->{'on_table'}, |
117 | ); |
118 | } |
119 | |
120 | return 1; |
121 | } |
4f4fd192 |
122 | } |