mirror of
https://gitee.com/johng/gf
synced 2026-07-03 11:51:04 +08:00
improve package gcron
This commit is contained in:
24
go.sum
24
go.sum
@ -2,10 +2,8 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 h1:LdXxtjzvZYhhUaonAaAKArG3pyC67kGL3YY+6hGG8G4=
|
||||
github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc=
|
||||
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
@ -20,25 +18,16 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grokify/html-strip-tags-go v0.0.0-20190921062105-daaa06bf1aaf h1:wIOAyJMMen0ELGiFzlmqxdcV1yGbkyHBAB6PolcNbLA=
|
||||
github.com/grokify/html-strip-tags-go v0.0.0-20190921062105-daaa06bf1aaf/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg=
|
||||
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
|
||||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
|
||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
@ -55,19 +44,16 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio=
|
||||
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||
|
||||
@ -33,6 +33,10 @@ type cronSchedule struct {
|
||||
const (
|
||||
// regular expression for cron pattern, which contains 6 parts of time units.
|
||||
regexForCron = `^([\-/\d\*\?,]+)\s+([\-/\d\*\?,]+)\s+([\-/\d\*\?,]+)\s+([\-/\d\*\?,]+)\s+([\-/\d\*\?,A-Za-z]+)\s+([\-/\d\*\?,A-Za-z]+)$`
|
||||
|
||||
patternItemTypeUnknown = iota
|
||||
patternItemTypeWeek
|
||||
patternItemTypeMonth
|
||||
)
|
||||
|
||||
var (
|
||||
@ -103,37 +107,37 @@ func newSchedule(pattern string) (*cronSchedule, error) {
|
||||
pattern: pattern,
|
||||
}
|
||||
// Second.
|
||||
if m, err := parseItem(match[1], 0, 59, false); err != nil {
|
||||
if m, err := parsePatternItem(match[1], 0, 59, false); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
schedule.second = m
|
||||
}
|
||||
// Minute.
|
||||
if m, err := parseItem(match[2], 0, 59, false); err != nil {
|
||||
if m, err := parsePatternItem(match[2], 0, 59, false); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
schedule.minute = m
|
||||
}
|
||||
// Hour.
|
||||
if m, err := parseItem(match[3], 0, 23, false); err != nil {
|
||||
if m, err := parsePatternItem(match[3], 0, 23, false); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
schedule.hour = m
|
||||
}
|
||||
// Day.
|
||||
if m, err := parseItem(match[4], 1, 31, true); err != nil {
|
||||
if m, err := parsePatternItem(match[4], 1, 31, true); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
schedule.day = m
|
||||
}
|
||||
// Month.
|
||||
if m, err := parseItem(match[5], 1, 12, false); err != nil {
|
||||
if m, err := parsePatternItem(match[5], 1, 12, false); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
schedule.month = m
|
||||
}
|
||||
// Week.
|
||||
if m, err := parseItem(match[6], 0, 6, true); err != nil {
|
||||
if m, err := parsePatternItem(match[6], 0, 6, true); err != nil {
|
||||
return nil, err
|
||||
} else {
|
||||
schedule.week = m
|
||||
@ -144,52 +148,55 @@ func newSchedule(pattern string) (*cronSchedule, error) {
|
||||
}
|
||||
}
|
||||
|
||||
// parseItem parses every item in the pattern and returns the result as map.
|
||||
func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]struct{}, error) {
|
||||
// parsePatternItem parses every item in the pattern and returns the result as map, which is used for indexing.
|
||||
func parsePatternItem(item string, min int, max int, allowQuestionMark bool) (map[int]struct{}, error) {
|
||||
m := make(map[int]struct{}, max-min+1)
|
||||
if item == "*" || (allowQuestionMark && item == "?") {
|
||||
for i := min; i <= max; i++ {
|
||||
m[i] = struct{}{}
|
||||
}
|
||||
} else {
|
||||
// Like: MON,FRI
|
||||
for _, item := range strings.Split(item, ",") {
|
||||
interval := 1
|
||||
intervalArray := strings.Split(item, "/")
|
||||
var (
|
||||
interval = 1
|
||||
intervalArray = strings.Split(item, "/")
|
||||
)
|
||||
if len(intervalArray) == 2 {
|
||||
if i, err := strconv.Atoi(intervalArray[1]); err != nil {
|
||||
if number, err := strconv.Atoi(intervalArray[1]); err != nil {
|
||||
return nil, gerror.NewCodef(gcode.CodeInvalidParameter, `invalid pattern item: "%s"`, item)
|
||||
} else {
|
||||
interval = i
|
||||
interval = number
|
||||
}
|
||||
}
|
||||
var (
|
||||
rangeMin = min
|
||||
rangeMax = max
|
||||
fieldType = byte(0)
|
||||
itemType = patternItemTypeUnknown
|
||||
rangeArray = strings.Split(intervalArray[0], "-") // Like: 1-30, JAN-DEC
|
||||
)
|
||||
switch max {
|
||||
case 6:
|
||||
// It's checking week field.
|
||||
fieldType = 'w'
|
||||
itemType = patternItemTypeWeek
|
||||
case 12:
|
||||
// It's checking month field.
|
||||
fieldType = 'm'
|
||||
itemType = patternItemTypeMonth
|
||||
}
|
||||
// Eg: */5
|
||||
if rangeArray[0] != "*" {
|
||||
if i, err := parseItemValue(rangeArray[0], fieldType); err != nil {
|
||||
if number, err := parsePatternItemValue(rangeArray[0], itemType); err != nil {
|
||||
return nil, gerror.NewCodef(gcode.CodeInvalidParameter, `invalid pattern item: "%s"`, item)
|
||||
} else {
|
||||
rangeMin = i
|
||||
rangeMax = i
|
||||
rangeMin = number
|
||||
rangeMax = number
|
||||
}
|
||||
}
|
||||
if len(rangeArray) == 2 {
|
||||
if i, err := parseItemValue(rangeArray[1], fieldType); err != nil {
|
||||
if number, err := parsePatternItemValue(rangeArray[1], itemType); err != nil {
|
||||
return nil, gerror.NewCodef(gcode.CodeInvalidParameter, `invalid pattern item: "%s"`, item)
|
||||
} else {
|
||||
rangeMax = i
|
||||
rangeMax = number
|
||||
}
|
||||
}
|
||||
for i := rangeMin; i <= rangeMax; i += interval {
|
||||
@ -200,24 +207,24 @@ func parseItem(item string, min int, max int, allowQuestionMark bool) (map[int]s
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// parseItemValue parses the field value to a number according to its field type.
|
||||
func parseItemValue(value string, fieldType byte) (int, error) {
|
||||
// parsePatternItemValue parses the field value to a number according to its field type.
|
||||
func parsePatternItemValue(value string, itemType int) (int, error) {
|
||||
if gregex.IsMatchString(`^\d+$`, value) {
|
||||
// Pure number.
|
||||
if i, err := strconv.Atoi(value); err == nil {
|
||||
return i, nil
|
||||
// It is pure number.
|
||||
if number, err := strconv.Atoi(value); err == nil {
|
||||
return number, nil
|
||||
}
|
||||
} else {
|
||||
// Check if contains letter,
|
||||
// Check if it contains letter,
|
||||
// it converts the value to number according to predefined map.
|
||||
switch fieldType {
|
||||
case 'm':
|
||||
if i, ok := monthMap[strings.ToLower(value)]; ok {
|
||||
return i, nil
|
||||
switch itemType {
|
||||
case patternItemTypeWeek:
|
||||
if number, ok := monthMap[strings.ToLower(value)]; ok {
|
||||
return number, nil
|
||||
}
|
||||
case 'w':
|
||||
if i, ok := weekMap[strings.ToLower(value)]; ok {
|
||||
return i, nil
|
||||
case patternItemTypeMonth:
|
||||
if number, ok := weekMap[strings.ToLower(value)]; ok {
|
||||
return number, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user