Changeset 292

Show
Ignore:
Timestamp:
12/20/07 01:27:47 (8 months ago)
Author:
gethema..@gmail.com
Message:

added patch by adam on wday not honoured

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/server/cron_trigger.rb

    r217 r292  
    3939        end 
    4040 
    41         # day 
    42         month_days = (1 .. month_days(year, month)) 
    43         days = @day.select do |d| month_days === d end 
    44         unless days.include?(day) 
    45           next_day = days.detect(lambda { days.min }) do |d| d > day end 
    46           hour, min, sec = @hour.min, @min.min, @sec.min 
    47           if next_day.nil? or next_day < day 
    48             day = next_day.nil? ? @day.min : next_day 
    49             month += 1 
    50             retry 
    51           end 
    52           day = next_day 
    53         end 
    54  
     41        # according to crontab(5): 
     42        # Note: The day of a command’s execution can be specified by two fields — day of month, and day of week. 
     43        # If both fields are restricted (i.e., aren’t *), the command  will  be  run  when  either 
     44        # field matches the current time.  For example, ‘‘30 4 1,15 * 5’’ would cause a command to be 
     45        # run at 4:30 am on the 1st and 15th of each month, plus every Friday. 
     46        if !day_restricted? and wday_restricted? 
     47          # unrestricted day, restricted wday. go by wday 
     48          unless @wday.include?(wday) 
     49            next_wday = @wday.detect(lambda { @wday.min }) do |w| w > wday end 
     50            hour, min, sec = @hour.min, @min.min, @sec.min 
     51            if next_wday < wday 
     52              # next week. 
     53              day += + 7 - (wday - next_wday) 
     54              if day > month_days(year, month) 
     55                day -= month_days(year, month) 
     56                month += 1 
     57              end 
     58              wday = next_wday               
     59              retry 
     60            end 
     61             
     62            day += (next_wday - wday) 
     63            wday = next_wday 
     64          end 
     65        elsif !wday_restricted? and day_restricted? 
     66          # unrestricted wday, restricted day. go by day 
     67          month_days = (1 .. month_days(year, month)) 
     68          days = @day.select do |d| month_days === d end 
     69          unless days.include?(day) 
     70            next_day = days.detect(lambda { days.min }) do |d| d > day end 
     71            hour, min, sec = @hour.min, @min.min, @sec.min 
     72            if next_day.nil? or next_day < day 
     73              day = next_day.nil? ? @day.min : next_day 
     74              month += 1 
     75              retry 
     76            end 
     77            day = next_day 
     78          end 
     79        else         
     80          # both @day and @wday are restricted, or unrestricted 
     81          month_days = (1 .. month_days(year, month)) 
     82          days = @day.select do |d| month_days === d end 
     83          unless days.include?(day) || @wday.include?(wday) 
     84            next_day = days.detect(lambda { days.min }) do |d| d > day end 
     85            next_wday = @wday.detect(lambda { @wday.min }) do |w| w > wday end 
     86            hour, min, sec = @hour.min, @min.min, @sec.min 
     87             
     88            # which is less? next_day or next_wday? 
     89            # just calculate how many days from 'day' they both are. 
     90 
     91            if next_day.nil? or next_day < day 
     92              next_by_mday = month_days(year, month) - day + (next_day.nil? ? @day.min : next_day) 
     93            else 
     94              next_by_mday = next_day - day               
     95            end 
     96             
     97            if next_wday.nil? or next_wday < wday 
     98              next_by_wday = 7 - wday + (next_wday.nil? ? @day.min : next_wday) 
     99            else 
     100              next_by_wday = next_wday - wday 
     101            end 
     102             
     103            next_day = [next_by_wday, next_by_mday].min 
     104            if next_day + day > month_days(year, month) 
     105              # next fire lands on next month 
     106              day += next_day - month_days(year, month) 
     107              wday += next_day % 7 
     108              wday -= 7 if wday > 6 
     109              month += 1 
     110              if month > 12 
     111                year += 1 
     112                month = 1 
     113              end 
     114              retry 
     115            end 
     116            day += next_day 
     117          end 
     118        end 
     119 
     120         
     121         
    55122        # hour 
    56123        unless @hour.include?(hour) 
     
    92159 
    93160      Time.local sec, min, hour, day, month, year, wday, yday, isdst, zone 
     161    end 
     162 
     163    def day_restricted? 
     164      return !@day.eql?(1..31) 
     165    end 
     166 
     167    def wday_restricted? 
     168      return !@wday.eql?(0..6) 
    94169    end 
    95170