X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FSQLite.pm;h=10b5a51dcf6a9b6b673b9c66a39aa8fea75cf8c8;hb=2661d702977d22849f5fcc4f756c649d7170874b;hp=2f81efe0eb516ecce9e4c2c46f40af1111cdc10b;hpb=70698e1c8a6466ec114a57d6108b79827c93a703;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/SQLite.pm b/lib/SQL/Translator/Parser/SQLite.pm index 2f81efe..10b5a51 100644 --- a/lib/SQL/Translator/Parser/SQLite.pm +++ b/lib/SQL/Translator/Parser/SQLite.pm @@ -1,11 +1,9 @@ package SQL::Translator::Parser::SQLite; # ------------------------------------------------------------------- -# $Id: SQLite.pm,v 1.2 2003-10-04 01:16:39 kycl4rk Exp $ +# $Id: SQLite.pm,v 1.12 2006-11-10 21:43:15 mwz444 Exp $ # ------------------------------------------------------------------- -# Copyright (C) 2003 Ken Y. Clark , -# darren chamberlain , -# Chris Mungall +# 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 @@ -111,7 +109,7 @@ trigger-action ::= trigger-step ::= update-statement | insert-statement | - delete-statement | select-statemen + delete-statement | select-statement CREATE VIEW @@ -154,7 +152,7 @@ like-op::= use strict; use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ]; -$VERSION = sprintf "%d.%02d", q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.12 $ =~ /(\d+)\.(\d+)/; $DEBUG = 0 unless defined $DEBUG; use Data::Dumper; @@ -182,7 +180,7 @@ $GRAMMAR = q! # failed. -ky # startrule : statement(s) eofile { - $return => { + $return = { tables => \%tables, views => \@views, triggers => \@triggers, @@ -193,6 +191,7 @@ eofile : /^\Z/ statement : begin_transaction | commit + | drop | comment | create | @@ -201,6 +200,8 @@ begin_transaction : /begin transaction/i SEMICOLON commit : /commit/i SEMICOLON +drop : /drop/i TABLE table_name SEMICOLON + comment : /^\s*(?:#|-{2}).*\n/ { my $comment = $item[1]; @@ -410,7 +411,7 @@ sort_order : /(ASC|DESC)/i # # Create Trigger -create : CREATE TEMPORARY(?) TRIGGER NAME before_or_after(?) database_event ON table_name trigger_action +create : CREATE TEMPORARY(?) TRIGGER NAME before_or_after(?) database_event ON table_name trigger_action SEMICOLON { my $table_name = $item[8]->{'name'}; push @triggers, { @@ -420,6 +421,7 @@ create : CREATE TEMPORARY(?) TRIGGER NAME before_or_after(?) database_event ON t instead_of => 0, db_event => $item[6], action => $item[9], + on_table => $table_name, } } @@ -433,6 +435,7 @@ create : CREATE TEMPORARY(?) TRIGGER NAME instead_of database_event ON view_name instead_of => 1, db_event => $item[6], action => $item[9], + on_table => $table_name, } } @@ -453,9 +456,16 @@ for_each : /FOR EACH ROW/i | /FOR EACH STATEMENT/i when : WHEN expr { $item[2] } -trigger_step : /(select|delete|insert|update)/i /[^;]+/ SEMICOLON +string : + /'(\\.|''|[^\\\'])*'/ + +nonstring : /[^;\'"]+/ + +statement_body : (string | nonstring)(s?) + +trigger_step : /(select|delete|insert|update)/i statement_body SEMICOLON { - $return = join( ' ', $item[1], $item[2] ) + $return = join( ' ', $item[1], join ' ', @{ $item[2] || [] } ) } before_or_after : /(before|after)/i { $return = lc $1 } @@ -535,6 +545,8 @@ VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/ } | /NULL/ { 'NULL' } + | /CURRENT_TIMESTAMP/i + { 'CURRENT_TIMESTAMP' } !; @@ -556,9 +568,11 @@ sub parse { warn Dumper( $result ) if $DEBUG; my $schema = $translator->schema; - my @tables = sort { - $result->{ $a }->{'order'} <=> $result->{ $b }->{'order'} - } keys %{ $result->{'tables'} }; + my @tables = + map { $_->[1] } + sort { $a->[0] <=> $b->[0] } + map { [ $result->{'tables'}{ $_ }->{'order'}, $_ ] } + keys %{ $result->{'tables'} }; for my $table_name ( @tables ) { my $tdata = $result->{'tables'}{ $table_name }; @@ -604,8 +618,8 @@ sub parse { 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; } } @@ -623,6 +637,7 @@ sub parse { perform_action_when => $def->{'when'}, database_event => $def->{'db_event'}, action => $def->{'action'}, + on_table => $def->{'on_table'}, ); }