1 package SQL::Translator::Parser::MySQL;
3 #-----------------------------------------------------
4 # $Id: MySQL.pm,v 1.2 2002-03-21 18:50:53 dlc Exp $
5 #-----------------------------------------------------
6 # Copyright (C) 2002 Ken Y. Clark <kycl4rk@users.sourceforge.net>,
7 # darren chamberlain <darren@cpan.org>
9 # This program is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU General Public License as
11 # published by the Free Software Foundation; version 2.
13 # This program is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 # General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22 # -------------------------------------------------------------------
25 use vars qw($VERSION $GRAMMAR @EXPORT_OK);
26 $VERSION = sprintf "%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/;
28 #use SQL::Translator::Parser; # This is not necessary!
29 use Parse::RecDescent;
31 use base qw(Exporter);
33 @EXPORT_OK = qw(parse);
35 my $parser; # should we do this? There's no programmic way to
36 # change the grammar, so I think this is safe.
38 my ( $translator, $data ) = @_;
39 $parser ||= Parse::RecDescent->new($GRAMMAR);
41 unless (defined $parser) {
42 $translator->error_out("Error instantiating Parse::RecDescent ".
43 "instance: Bad grammer");
47 # Is this right? It was $parser->parse before, but that didn't
48 # work; Parse::RecDescent appears to need the name of a rule
49 # with which to begin, so I chose the first rule in the grammar.
50 return $parser->file($data);
57 file : statement(s) { \%tables }
63 create : create_table table_name '(' line(s /,/) ')' table_type(?) ';'
66 for my $line ( @{ $item[4] } ) {
67 if ( $line->{'type'} eq 'field' ) {
68 my $field_name = $line->{'name'};
69 $tables{ $item{'table_name'} }
70 {'fields'}{$field_name} =
71 { %$line, order => $i };
74 if ( $line->{'is_primary_key'} ) {
76 @{ $tables{ $item{'table_name'} }{'indeces'} },
78 type => 'primary_key',
79 fields => [ $field_name ],
84 push @{ $tables{ $item{'table_name'} }{'indeces'} },
87 $tables{ $item{'table_name'} }{'type'} =
88 $item{'table_type'}[0];
101 field : field_name data_type not_null(?) default_val(?) auto_inc(?) primary_key(?)
103 my $null = defined $item{'not_null'}[0]
104 ? $item{'not_null'}[0] : 1 ;
107 name => $item{'field_name'},
108 data_type => $item{'data_type'}{'type'},
109 size => $item{'data_type'}{'size'},
111 default => $item{'default_val'}[0],
112 is_auto_inc => $item{'auto_inc'}[0],
113 is_primary_key => $item{'primary_key'}[0],
118 index : primary_key_index
128 data_type : WORD field_size(?)
138 field_size : '(' num_range ')' { $item{'num_range'} }
140 num_range : DIGITS ',' DIGITS
141 { $return = $item[1].','.$item[3] }
143 { $return = $item[1] }
146 create_table : /create/i /table/i
148 not_null : /not/i /null/i { $return = 0 }
150 default_val : /default/i /(?:')?[\w\d.-]*(?:')?/ { $item[2]=~s/'//g; $return=$item[2] }
152 auto_inc : /auto_increment/i { 1 }
154 primary_key : /primary/i /key/i { 1 }
156 primary_key_index : primary_key index_name(?) '(' field_name(s /,/) ')'
159 name => $item{'index_name'}[0],
160 type => 'primary_key',
165 normal_index : key index_name(?) '(' field_name(s /,/) ')'
168 name => $item{'index_name'}[0],
174 unique_index : /unique/i key index_name(?) '(' field_name(s /,/) ')'
177 name => $item{'index_name'}[0],
186 table_type : /TYPE=/i /\w+/ { $item[2] }
198 #-----------------------------------------------------
199 # Where man is not nature is barren.
201 #-----------------------------------------------------
205 SQL::Translator::Parser::MySQL - parser for MySQL
210 use SQL::Translator::Parser::MySQL;
212 my $translator = SQL::Translator->new;
213 $translator->parser("SQL::Translator::Parser::MySQL");
221 Ken Y. Clark, kclark@logsoft.com