You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by fe...@apache.org on 2006/03/12 07:37:57 UTC

svn commit: r385256 - /spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm

Author: felicity
Date: Sat Mar 11 22:37:56 2006
New Revision: 385256

URL: http://svn.apache.org/viewcvs?rev=385256&view=rev
Log:
streamline the header rules so that the header is retrieved, then all the appropriate rules are run.

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm?rev=385256&r1=385255&r2=385256&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm Sat Mar 11 22:37:56 2006
@@ -1703,6 +1703,9 @@
   my $evalstr = $self->start_rules_plugin_code("header");
   my $evalstr2 = '';
 
+  # hash to hold the rules, "header\tdefault value" => rulename
+  my %ordered = ();
+
   while (my($rulename, $rule) = each %{$self->{conf}{head_tests}->{$priority}}) {
     my $def = '';
     my ($hdrname, $testtype, $pat) =
@@ -1719,12 +1722,7 @@
     $hdrname =~ s/#/[HASH]/g;                # avoid probs with eval below
     $def =~ s/#/[HASH]/g;
 
-    $evalstr .= '
-      if ($self->{conf}->{scores}->{q#'.$rulename.'#}) {
-         '.$rulename.'_head_test($self, $_); # no need for OO calling here (its faster this way)
-         '.$self->ran_rule_plugin_code($rulename, "header").'
-      }
-    ';
+    push(@{$ordered{"$hdrname\t$def"}}, $rulename);
 
     if ($doing_user_rules) {
       next if (!$self->is_user_rule_sub ($rulename.'_head_test'));
@@ -1732,10 +1730,8 @@
 
     $evalstr2 .= '
       sub '.$rulename.'_head_test {
-        my $self = shift;
-        $_ = shift;
+        my($self,$text) = @_;
         '.$self->hash_line_for_rule($rulename).'
-        my $text = $self->get(q#'.$hdrname.'#, q#'.$def.'#);
         while ($text '.$testtype.'~ '.$pat.'g) {
           $self->got_hit (q#'.$rulename.'#, q{});
           '. $self->hit_rule_plugin_code($rulename, "header") . '
@@ -1746,6 +1742,20 @@
 
   }
 
+  # setup the function to run the rules
+  while(my($k,$v) = each %ordered) {
+    my($hdrname, $def) = split(/\t/, $k, 2);
+    $evalstr .= ' $hval = $self->get(q#'.$hdrname.'#, q#'.$def.'#);';
+    foreach my $rulename (@{$v}) {
+      $evalstr .= '
+      if ($self->{conf}->{scores}->{q#'.$rulename.'#}) {
+         '.$rulename.'_head_test($self, $hval); # no need for OO calling here (its faster this way)
+         '.$self->ran_rule_plugin_code($rulename, "header").'
+      }
+      ';
+    }
+  }
+
   # clear out a previous version of this fn, if already defined
   if (defined &{'_head_tests_'.$clean_priority}) {
     undef &{'_head_tests_'.$clean_priority};
@@ -1761,6 +1771,7 @@
 
     sub _head_tests_$clean_priority {
         my (\$self) = \@_;
+        my \$hval;
 
         $evalstr;
     }