X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FSQLite.pm;h=faa22d2418fbcf4975ce0d02bb88f568d304ca07;hb=22b9814ae49dd04433213e7f3c3cab8f1f9640df;hp=1533bea84a2c44bbc11b3771f868a8094c930485;hpb=8c12c4066e7b70bfa3aee7185f831a30d2bf9025;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/SQLite.pm b/lib/SQL/Translator/Parser/SQLite.pm index 1533bea..faa22d2 100644 --- a/lib/SQL/Translator/Parser/SQLite.pm +++ b/lib/SQL/Translator/Parser/SQLite.pm @@ -1,11 +1,7 @@ package SQL::Translator::Parser::SQLite; # ------------------------------------------------------------------- -# $Id: SQLite.pm,v 1.5 2004-02-04 17:32:42 dlc Exp $ -# ------------------------------------------------------------------- -# Copyright (C) 2003 Ken Y. Clark , -# darren chamberlain , -# Chris Mungall +# Copyright (C) 2002-2009 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 @@ -154,7 +150,7 @@ like-op::= use strict; use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ]; -$VERSION = sprintf "%d.%02d", q$Revision: 1.5 $ =~ /(\d+)\.(\d+)/; +$VERSION = '1.59'; $DEBUG = 0 unless defined $DEBUG; use Data::Dumper; @@ -193,14 +189,17 @@ eofile : /^\Z/ statement : begin_transaction | commit + | drop | comment | create | -begin_transaction : /begin transaction/i SEMICOLON +begin_transaction : /begin/i TRANSACTION(?) SEMICOLON commit : /commit/i SEMICOLON +drop : /drop/i TABLE table_name SEMICOLON + comment : /^\s*(?:#|-{2}).*\n/ { my $comment = $item[1]; @@ -410,7 +409,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, { @@ -418,8 +417,9 @@ create : CREATE TEMPORARY(?) TRIGGER NAME before_or_after(?) database_event ON t is_temporary => $item[2][0] ? 1 : 0, when => $item[5][0], instead_of => 0, - db_event => $item[6], + db_events => [ $item[6] ], action => $item[9], + on_table => $table_name, } } @@ -431,8 +431,9 @@ create : CREATE TEMPORARY(?) TRIGGER NAME instead_of database_event ON view_name is_temporary => $item[2][0] ? 1 : 0, when => undef, instead_of => 1, - db_event => $item[6], + db_events => [ $item[6] ], action => $item[9], + on_table => $table_name, } } @@ -449,13 +450,20 @@ trigger_action : for_each(?) when(?) BEGIN_C trigger_step(s) END_C } } -for_each : /FOR EACH ROW/i | /FOR EACH STATEMENT/i +for_each : /FOR EACH ROW/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 } @@ -488,6 +496,8 @@ BEGIN_C : /begin/i END_C : /end/i +TRANSACTION: /transaction/i + CREATE : /create/i TEMPORARY : /temp(orary)?/i { 1 } @@ -535,6 +545,8 @@ VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/ } | /NULL/ { 'NULL' } + | /CURRENT_TIMESTAMP/i + { 'CURRENT_TIMESTAMP' } !; @@ -606,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,8 +635,9 @@ sub parse { my $view = $schema->add_trigger( name => $def->{'name'}, perform_action_when => $def->{'when'}, - database_event => $def->{'db_event'}, + database_events => $def->{'db_events'}, action => $def->{'action'}, + on_table => $def->{'on_table'}, ); }