Initial checkin.
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Parser / Sybase.pm
1 package SQL::Translator::Parser::Sybase;
2
3 #-----------------------------------------------------
4 # $Id: Sybase.pm,v 1.1.1.1 2002-03-01 02:26:25 kycl4rk Exp $
5 #
6 # File       : SQL/Translator/Parser/Sybase.pm
7 # Programmer : Ken Y. Clark, kclark@logsoft.com
8 # Created    : 2002/02/27
9 # Purpose    : parser for Sybase (dbschema.pl)
10 #-----------------------------------------------------
11
12 my $grammar = q{
13
14     { our ( %tables ) }
15
16     file         : statement(s) { \%tables }
17 #        { print "statements: ", join("\n", @{$item[1]}), "\n" }
18 #                   | <error>
19
20     statement    : create
21                    | junk
22 #        { 
23 #            print "statement: ", join("\n", @{$item[1]}), "\n";
24 #            $return = @{$item[1]};
25 #            print "statement: '", $item[1], "'\n";
26 #            $return = $item[1];
27 #        }
28                    | <error>
29
30     junk         : comment 
31                    | use
32                    | setuser
33                    | if
34                    | print
35                    | else
36                    | begin
37                    | end
38                    | grant
39                    | exec
40                    | GO
41
42     GO           : /go/
43 #        { print "GO: ", $item[1], "\n" }
44
45     use          : /use/i /.*/
46 #        { print "USE: ", $item[2], "\n" }
47
48     setuser      : /setuser/i /.*/
49 #        { print "SETUSER: ", $item[2], "\n" }
50
51     if           : /if/i /.*/
52 #        { print "IF: ", $item[2], "\n" }
53
54     print        : /\s*/ /print/i /.*/
55 #       { print "PRINT: ", $item[3], "\n" }
56
57     else        : /else/i /.*/
58 #        { print "ELSE: ", $item[2], "\n" }
59
60     begin       : /begin/i
61 #        { print "BEGIN\n" }
62
63     end         : /end/i
64 #        { print "END\n" }
65
66     grant       : /grant/i /.*/
67 #        { print "GRANT: ", $item[2], "\n" }
68
69     exec        : /exec/i /.*/
70 #        { print "EXEC: ", $item[2], "\n" }
71
72     comment      : /^\s*\/\*.*\*\//m
73 #        { print "COMMENT: ", $item[-1], "\n" }
74
75     create       : create_table table_name '(' field(s /,/) ')' lock(?)
76                 { 
77 #                    print "TABLE $item[2]: ", 
78 #                        join(', ', map{$_->{'name'}}@{$item[4]}), "\n";
79                     my $i = 0;
80                     for my $line ( @{ $item[4] } ) {
81                         if ( $line->{'type'} eq 'field' ) {
82                             my $field_name = $line->{'name'};
83                             $tables{ $item{'table_name'} }
84                                 {'fields'}{$field_name} = 
85                                 { %$line, order => $i };
86                             $i++;
87                     
88                             if ( $line->{'is_primary_key'} ) {
89                                 push
90                                 @{ $tables{ $item{'table_name'} }{'indeces'} },
91                                 {
92                                     type   => 'primary_key',
93                                     fields => [ $field_name ],
94                                 };
95                             }
96                         }
97                         else {
98                             push @{ $tables{ $item{'table_name'} }{'indeces'} },
99                                 $line;
100                         }
101                         $tables{ $item{'table_name'} }{'type'} = 
102                             $item{'table_type'}[0];
103                     }
104                 }
105                    | <error>
106
107     blank        : /\s*/
108
109     field        : field_name data_type null(?) 
110                    { 
111                         $return = { 
112                             type           => 'field',
113                             name           => $item{'field_name'}, 
114                             data_type      => $item{'data_type'}{'type'},
115                             size           => $item{'data_type'}{'size'},
116                             null           => $item{'null'}[0], 
117 #                            default        => $item{'default_val'}[0], 
118 #                            is_auto_inc    => $item{'auto_inc'}[0], 
119 #                            is_primary_key => $item{'primary_key'}[0], 
120                        } 
121                    }
122                 | <error>
123
124     index        : primary_key_index
125                    | unique_index
126                    | normal_index
127
128     table_name   : WORD '.' WORD
129         { $return = $item[3] }
130
131     field_name   : WORD
132
133     index_name   : WORD
134
135     data_type    : WORD field_size(?) 
136         { 
137             $return = { 
138                 type => $item[1], 
139                 size => $item[2][0]
140             } 
141         }
142
143     lock         : /lock/i /datarows/i
144
145     field_type   : WORD
146
147     field_size   : '(' num_range ')' { $item{'num_range'} }
148
149     num_range    : DIGITS ',' DIGITS
150         { $return = $item[1].','.$item[3] }
151                    | DIGITS
152         { $return = $item[1] }
153
154
155     create_table : /create/i /table/i
156
157     null         : /not/i /null/i
158         { $return = 0 }
159                    | /null/i
160         { $return = 1 }
161
162     default_val  : /default/i /(?:')?[\w\d.-]*(?:')?/ { $item[2]=~s/'//g; $return=$item[2] }
163
164     auto_inc     : /auto_increment/i { 1 }
165
166     primary_key  : /primary/i /key/i { 1 }
167
168     primary_key_index : primary_key index_name(?) '(' field_name(s /,/) ')'
169         { 
170             $return = { 
171                 name   => $item{'index_name'}[0],
172                 type   => 'primary_key',
173                 fields => $item[4],
174             } 
175         }
176
177     normal_index      : key index_name(?) '(' field_name(s /,/) ')'
178         { 
179             $return = { 
180                 name   => $item{'index_name'}[0],
181                 type   => 'normal',
182                 fields => $item[4],
183             } 
184         }
185
186     unique_index      : /unique/i key index_name(?) '(' field_name(s /,/) ')'
187         { 
188             $return = { 
189                 name   => $item{'index_name'}[0],
190                 type   => 'unique',
191                 fields => $item[5],
192             } 
193         }
194
195     key          : /key/i 
196                    | /index/i
197
198     table_type   : /TYPE=/i /\w+/ { $item[2] }
199
200     WORD         : /[\w#]+/
201
202     DIGITS       : /\d+/
203
204     COMMA        : ','
205
206 };
207
208 1;
209
210 #-----------------------------------------------------
211 # Every hero becomes a bore at last.
212 # Ralph Waldo Emerson
213 #-----------------------------------------------------
214
215 =head1 NAME
216
217 SQL::Translator::Parser::Sybase - parser for Sybase
218
219 =head1 SYNOPSIS
220
221   use SQL::Translator::Parser::Sybase;
222
223 =head1 DESCRIPTION
224
225 Blah blah blah.
226
227 =head1 AUTHOR
228
229 Ken Y. Clark, kclark@logsoft.com
230
231 =head1 SEE ALSO
232
233 perl(1).
234
235 =cut