nginxsonarrradarrplexorganizrdashboardapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmark
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.8 KiB
148 lines
3.8 KiB
<?php
|
|
|
|
namespace Cron;
|
|
|
|
/**
|
|
* Abstract CRON expression field
|
|
*/
|
|
abstract class AbstractField implements FieldInterface
|
|
{
|
|
/**
|
|
* Check to see if a field is satisfied by a value
|
|
*
|
|
* @param string $dateValue Date value to check
|
|
* @param string $value Value to test
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isSatisfied($dateValue, $value)
|
|
{
|
|
if ($this->isIncrementsOfRanges($value)) {
|
|
return $this->isInIncrementsOfRanges($dateValue, $value);
|
|
} elseif ($this->isRange($value)) {
|
|
return $this->isInRange($dateValue, $value);
|
|
}
|
|
|
|
return $value == '*' || $dateValue == $value;
|
|
}
|
|
|
|
/**
|
|
* Check if a value is a range
|
|
*
|
|
* @param string $value Value to test
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isRange($value)
|
|
{
|
|
return strpos($value, '-') !== false;
|
|
}
|
|
|
|
/**
|
|
* Check if a value is an increments of ranges
|
|
*
|
|
* @param string $value Value to test
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isIncrementsOfRanges($value)
|
|
{
|
|
return strpos($value, '/') !== false;
|
|
}
|
|
|
|
/**
|
|
* Test if a value is within a range
|
|
*
|
|
* @param string $dateValue Set date value
|
|
* @param string $value Value to test
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isInRange($dateValue, $value)
|
|
{
|
|
$parts = array_map('trim', explode('-', $value, 2));
|
|
|
|
return $dateValue >= $parts[0] && $dateValue <= $parts[1];
|
|
}
|
|
|
|
/**
|
|
* Test if a value is within an increments of ranges (offset[-to]/step size)
|
|
*
|
|
* @param string $dateValue Set date value
|
|
* @param string $value Value to test
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isInIncrementsOfRanges($dateValue, $value)
|
|
{
|
|
$parts = array_map('trim', explode('/', $value, 2));
|
|
$stepSize = isset($parts[1]) ? (int) $parts[1] : 0;
|
|
|
|
if ($stepSize === 0) {
|
|
return false;
|
|
}
|
|
|
|
if (($parts[0] == '*' || $parts[0] === '0')) {
|
|
return (int) $dateValue % $stepSize == 0;
|
|
}
|
|
|
|
$range = explode('-', $parts[0], 2);
|
|
$offset = $range[0];
|
|
$to = isset($range[1]) ? $range[1] : $dateValue;
|
|
// Ensure that the date value is within the range
|
|
if ($dateValue < $offset || $dateValue > $to) {
|
|
return false;
|
|
}
|
|
|
|
if ($dateValue > $offset && 0 === $stepSize) {
|
|
return false;
|
|
}
|
|
|
|
for ($i = $offset; $i <= $to; $i+= $stepSize) {
|
|
if ($i == $dateValue) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Returns a range of values for the given cron expression
|
|
*
|
|
* @param string $expression The expression to evaluate
|
|
* @param int $max Maximum offset for range
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getRangeForExpression($expression, $max)
|
|
{
|
|
$values = array();
|
|
|
|
if ($this->isRange($expression) || $this->isIncrementsOfRanges($expression)) {
|
|
if (!$this->isIncrementsOfRanges($expression)) {
|
|
list ($offset, $to) = explode('-', $expression);
|
|
$stepSize = 1;
|
|
}
|
|
else {
|
|
$range = array_map('trim', explode('/', $expression, 2));
|
|
$stepSize = isset($range[1]) ? $range[1] : 0;
|
|
$range = $range[0];
|
|
$range = explode('-', $range, 2);
|
|
$offset = $range[0];
|
|
$to = isset($range[1]) ? $range[1] : $max;
|
|
}
|
|
$offset = $offset == '*' ? 0 : $offset;
|
|
for ($i = $offset; $i <= $to; $i += $stepSize) {
|
|
$values[] = $i;
|
|
}
|
|
sort($values);
|
|
}
|
|
else {
|
|
$values = array($expression);
|
|
}
|
|
|
|
return $values;
|
|
}
|
|
|
|
}
|
|
|