package SQL::Translator::Parser::SQLite;
# -------------------------------------------------------------------
-# $Id: SQLite.pm,v 1.1 2003-10-03 00:20:51 kycl4rk Exp $
+# $Id: SQLite.pm,v 1.9 2006-06-08 21:02:19 schiffbruechige Exp $
# -------------------------------------------------------------------
-# Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>,
-# darren chamberlain <darren@cpan.org>,
-# Chris Mungall <cjm@fruitfly.org>
+# Copyright (C) 2002-4 SQLFairy Authors
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
trigger-step ::=
update-statement | insert-statement |
- delete-statement | select-statemen
+ delete-statement | select-statement
CREATE VIEW
use strict;
use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ];
-$VERSION = sprintf "%d.%02d", q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/;
+$VERSION = sprintf "%d.%02d", q$Revision: 1.9 $ =~ /(\d+)\.(\d+)/;
$DEBUG = 0 unless defined $DEBUG;
use Data::Dumper;
$GRAMMAR = q!
{
- my ( %tables, $table_order, @table_comments );
+ my ( %tables, $table_order, @table_comments, @views, @triggers );
}
#
# won't cause the failure needed to know that the parse, as a whole,
# failed. -ky
#
-startrule : statement(s) eofile { \%tables }
+startrule : statement(s) eofile {
+ $return = {
+ tables => \%tables,
+ views => \@views,
+ triggers => \@triggers,
+ }
+}
eofile : /^\Z/
statement : begin_transaction
| commit
+ | drop
| comment
| create
| <error>
commit : /commit/i SEMICOLON
+drop : /drop/i TABLE <commit> table_name SEMICOLON
+
comment : /^\s*(?:#|-{2}).*\n/
{
my $comment = $item[1];
create : CREATE TEMPORARY(?) TRIGGER NAME before_or_after(?) database_event ON table_name trigger_action
{
my $table_name = $item[8]->{'name'};
- push @{ $tables{ $table_name }{'triggers'} }, {
+ push @triggers, {
name => $item[4],
is_temporary => $item[2][0] ? 1 : 0,
when => $item[5][0],
instead_of => 0,
db_event => $item[6],
action => $item[9],
+ on_table => $table_name,
}
}
create : CREATE TEMPORARY(?) TRIGGER NAME instead_of database_event ON view_name trigger_action
{
my $table_name = $item[8]->{'name'};
- push @{ $tables{ $table_name }{'triggers'} }, {
+ push @triggers, {
name => $item[4],
is_temporary => $item[2][0] ? 1 : 0,
when => undef,
instead_of => 1,
db_event => $item[6],
action => $item[9],
+ on_table => $table_name,
}
}
view_name : qualified_name
#
+# Create View
+#
+create : CREATE TEMPORARY(?) VIEW view_name AS select_statement
+ {
+ push @views, {
+ name => $item[4]->{'name'},
+ sql => $item[6],
+ is_temporary => $item[2][0] ? 1 : 0,
+ }
+ }
+
+select_statement : SELECT /[^;]+/ SEMICOLON
+ {
+ $return = join( ' ', $item[1], $item[2] );
+ }
+
+#
# Tokens
#
BEGIN_C : /begin/i
TRIGGER : /trigger/i
+VIEW : /view/i
+
+SELECT : /select/i
+
ON : /on/i
+AS : /as/i
+
WORD : /\w+/
WHEN : /when/i
SEMICOLON : ';'
-NAME : /'?(\w+)'?/ { $return = $1 }
+NAME : /'?(\w+)'?/ { $return = $1 }
-VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/
+VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/
{ $item[1] }
| /'.*?'/
{
}
| /NULL/
{ 'NULL' }
+ | /CURRENT_TIMESTAMP/i
+ { 'CURRENT_TIMESTAMP' }
!;
warn Dumper( $result ) if $DEBUG;
my $schema = $translator->schema;
- my @tables = sort {
- $result->{ $a }->{'order'} <=> $result->{ $b }->{'order'}
- } keys %{ $result };
+ my @tables =
+ map { $_->[1] }
+ sort { $a->[0] <=> $b->[0] }
+ map { [ $result->{'tables'}{ $_ }->{'order'}, $_ ] }
+ keys %{ $result->{'tables'} };
for my $table_name ( @tables ) {
- my $tdata = $result->{ $table_name };
+ my $tdata = $result->{'tables'}{ $table_name };
my $table = $schema->add_table(
name => $tdata->{'name'},
) or die $schema->error;
reference_table => $cdata->{'reference_table'},
reference_fields => $cdata->{'reference_fields'},
match_type => $cdata->{'match_type'} || '',
- on_delete => $cdata->{'on_delete_do'},
- on_update => $cdata->{'on_update_do'},
+ on_delete => $cdata->{'on_delete'} || $cdata->{'on_delete_do'},
+ on_update => $cdata->{'on_update'} || $cdata->{'on_update_do'},
) or die $table->error;
}
}
+ for my $def ( @{ $result->{'views'} || [] } ) {
+ my $view = $schema->add_view(
+ name => $def->{'name'},
+ sql => $def->{'sql'},
+ );
+ }
+
+ for my $def ( @{ $result->{'triggers'} || [] } ) {
+ my $view = $schema->add_trigger(
+ name => $def->{'name'},
+ perform_action_when => $def->{'when'},
+ database_event => $def->{'db_event'},
+ action => $def->{'action'},
+ on_table => $def->{'on_table'},
+ );
+ }
+
return 1;
}