Robert Bohne wrote:
> Hello developer,
> 
> currently SQL::T::Parser::XML... doesn't support database_events.
> 
> The current XML format has an attribute database_event which can be used
> to set one database event.
> Example:
> <triggers>
>      <trigger name="foo_trigger" database_event="insert" on_table="Basic"
>          perform_action_when="after" order="1">
>          <action>update modified=timestamp();</action>
>          <extra foo="bar" hello="world" bar="baz" />
>      </trigger>
>  </triggers>
> 
> But we need more than one database event. My idea for a new XML Syntax.
> It deletes the attribute database_event and adds a tag database_events.
> Example:
> <triggers>
>      <trigger name="foo_trigger" on_table="Basic"
>          perform_action_when="after" order="1">
>       <database_events>
>           <event>insert</event>
>       </database_events>
>          <action>update modified=timestamp();</action>
>          <extra foo="bar" hello="world" bar="baz" />
>      </trigger>
>  </triggers>
> 
> The parser should support both variants and the producer create only the
> new style.

I did some work on the failing tests yesterday, and along the way
fixed this. What I did is make database_events an attribute which
takes a comma-separated list of event names. This change has not yet
reached CPAN, so if you feel strongly that your syntax is better,
please contribute a patch against trunk and we will consider it.

Here are the relevant changes I made yesterday:

=== lib/SQL/Translator/Parser/XML/SQLFairy.pm
==================================================================
--- lib/SQL/Translator/Parser/XML/SQLFairy.pm   (revision 1510)
+++ lib/SQL/Translator/Parser/XML/SQLFairy.pm   (revision 1522)
@@ -102,6 +102,7 @@
 $DEBUG   = 0 unless defined $DEBUG;

 use Data::Dumper;
+use Carp::Clan qw/^SQL::Translator/;
 use Exporter;
 use base qw(Exporter);
 @EXPORT_OK = qw(parse);
@@ -232,9 +233,24 @@
     );
     foreach (@nodes) {
         my %data = get_tagfields($xp, $_, "sqlf:", qw/
-            name perform_action_when database_event fields on_table action 
order
+            name perform_action_when database_event database_events fields 
on_table action order
             extra
         /);
+
+        # back compat
+        if (my $evt = $data{database_event} and $translator->{show_warnings}) {
+          carp 'The database_event tag is deprecated - please use 
database_events (which can take one or more comma separated event names)';
+          $data{database_events} = join (', ',
+            $data{database_events} || (),
+            $evt,
+          );
+        }
+
+        # split into arrayref
+        if (my $evts = $data{database_events}) {
+          $data{database_events} = [split (/\s*,\s*/, $evts) ];
+        }
+
         $schema->add_trigger( %data ) or die $schema->error;
     }

=== t/data/xml/schema.xml
==================================================================
--- t/data/xml/schema.xml       (revision 1510)
+++ t/data/xml/schema.xml       (revision 1522)
@@ -92,11 +92,16 @@
   </views>

   <triggers>
-      <trigger name="foo_trigger" database_events="insert" on_table="Basic"
+      <trigger name="foo_trigger" database_event="insert" on_table="Basic"
           perform_action_when="after" order="1">
           <action>update modified=timestamp();</action>
           <extra foo="bar" hello="world" bar="baz" />
       </trigger>
+      <trigger name="bar_trigger" database_events="insert , update" 
on_table="Basic"
+          perform_action_when="before" order="1">
+          <action>update modified2=timestamp();</action>
+          <extra hello="aliens" />
+      </trigger>
   </triggers>

   <procedures>
=== t/16xml-parser.t
==================================================================
--- t/16xml-parser.t    (revision 1510)
+++ t/16xml-parser.t    (revision 1522)
@@ -27,7 +27,7 @@
 #=============================================================================

 BEGIN {
-    maybe_plan(204, 'SQL::Translator::Parser::XML::SQLFairy');
+    maybe_plan(212, 'SQL::Translator::Parser::XML::SQLFairy');
 }

 my $testschema = "$Bin/data/xml/schema.xml";
@@ -39,13 +39,22 @@
     add_drop_table => 1,
 );
 die "Can't find test schema $testschema" unless -e $testschema;
-my $sql = $sqlt->translate(
+
+my $sql;
+{
+  my @w;
+  local $SIG{__WARN__} = sub { push @w, $_[0] if $_[0] =~ /The database_event 
tag is deprecated - please use database_events/ };
+
+  $sql = $sqlt->translate(
     from     => 'XML-SQLFairy',
     to       => 'MySQL',
     filename => $testschema,
-) or die $sqlt->error;
-print $sql if DEBUG;
+  ) or die $sqlt->error;
+  print $sql if DEBUG;

+  ok (@w, 'database_event deprecation warning issued');
+}
+
 # Test the schema objs generted from the XML
 #
 my $scma = $sqlt->schema;
@@ -220,6 +229,16 @@
                 bar => "baz",
             },
         },
+        {
+            name                => 'bar_trigger',
+            perform_action_when => 'before',
+            database_events     => 'insert,update',
+            on_table            => 'Basic',
+            action              => 'update modified2=timestamp();',
+            extra => {
+                hello => "aliens",
+            },
+        },
     ],

     procedures => [

------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations 
Conference from O'Reilly Media. Velocity features a full day of 
expert-led, hands-on workshops and two days of sessions from industry 
leaders in dedicated Performance & Operations tracks. Use code vel09scf 
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
-- 
sqlfairy-developers mailing list
sqlfairy-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlfairy-developers

Reply via email to