1 package SQL::Translator::Parser::MySQL;
3 #-----------------------------------------------------
4 # $Id: MySQL.pm,v 1.3 2002-07-23 19:22:11 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.3 $ =~ /(\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 return $translator->error("Error instantiating Parse::RecDescent ".
43 "instance: Bad grammer");
46 # Is this right? It was $parser->parse before, but that didn't
47 # work; Parse::RecDescent appears to need the name of a rule
48 # with which to begin, so I chose the first rule in the grammar.
49 return $parser->file($data);
56 file : statement(s) { \%tables }
62 create : create_table table_name '(' line(s /,/) ')' table_type(?) ';'
65 for my $line ( @{ $item[4] } ) {
66 if ( $line->{'type'} eq 'field' ) {
67 my $field_name = $line->{'name'};
68 $tables{ $item{'table_name'} }
69 {'fields'}{$field_name} =
70 { %$line, order => $i };
73 if ( $line->{'is_primary_key'} ) {
75 @{ $tables{ $item{'table_name'} }{'indeces'} },
77 type => 'primary_key',
78 fields => [ $field_name ],
83 push @{ $tables{ $item{'table_name'} }{'indeces'} },
86 $tables{ $item{'table_name'} }{'type'} =
87 $item{'table_type'}[0];
100 field : field_name data_type not_null(?) default_val(?) auto_inc(?) primary_key(?)
102 my $null = defined $item{'not_null'}[0]
103 ? $item{'not_null'}[0] : 1 ;
106 name => $item{'field_name'},
107 data_type => $item{'data_type'}{'type'},
108 size => $item{'data_type'}{'size'},
110 default => $item{'default_val'}[0],
111 is_auto_inc => $item{'auto_inc'}[0],
112 is_primary_key => $item{'primary_key'}[0],
117 index : primary_key_index
127 data_type : WORD field_size(?)
137 field_size : '(' num_range ')' { $item{'num_range'} }
139 num_range : DIGITS ',' DIGITS
140 { $return = $item[1].','.$item[3] }
142 { $return = $item[1] }
145 create_table : /create/i /table/i
147 not_null : /not/i /null/i { $return = 0 }
149 default_val : /default/i /(?:')?[\w\d.-]*(?:')?/ { $item[2]=~s/'//g; $return=$item[2] }
151 auto_inc : /auto_increment/i { 1 }
153 primary_key : /primary/i /key/i { 1 }
155 primary_key_index : primary_key index_name(?) '(' field_name(s /,/) ')'
158 name => $item{'index_name'}[0],
159 type => 'primary_key',
164 normal_index : key index_name(?) '(' field_name(s /,/) ')'
167 name => $item{'index_name'}[0],
173 unique_index : /unique/i key index_name(?) '(' field_name(s /,/) ')'
176 name => $item{'index_name'}[0],
185 table_type : /TYPE=/i /\w+/ { $item[2] }
197 #-----------------------------------------------------
198 # Where man is not nature is barren.
200 #-----------------------------------------------------
204 SQL::Translator::Parser::MySQL - parser for MySQL
209 use SQL::Translator::Parser::MySQL;
211 my $translator = SQL::Translator->new;
212 $translator->parser("SQL::Translator::Parser::MySQL");
220 Ken Y. Clark, kclark@logsoft.com