-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcron-parser.lua
92 lines (72 loc) · 2.19 KB
/
cron-parser.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
local ffi = require('ffi')
ffi.cdef[[
typedef struct {
uint8_t seconds[8];
uint8_t minutes[8];
uint8_t hours[3];
uint8_t days_of_week[1];
uint8_t days_of_month[4];
uint8_t months[2];
} cron_expr;
void cron_parse_expr(const char* expression, cron_expr* target, const char** error);
time_t cron_next(cron_expr* expr, time_t date);
]]
local ccronexpr = package.search('cron.ccronexpr')
local cron = ffi.load(ccronexpr)
local function parse(raw_expr)
local parsed_expr = ffi.new("cron_expr[1]")
local err = ffi.new("const char*[1]")
cron.cron_parse_expr(raw_expr, parsed_expr, err)
if err[0] ~= box.NULL then
return nil, ffi.string(err[0])
end
local lua_parsed_expr = {
seconds = {},
minutes = {},
hours = {},
days_of_week = nil,
days_of_month = {},
months = {}
}
for i = 0,7 do
lua_parsed_expr.seconds[i + 1] = parsed_expr[0].seconds[i]
lua_parsed_expr.minutes[i + 1] = parsed_expr[0].minutes[i]
end
for i = 0,2 do
lua_parsed_expr.hours[i + 1] = parsed_expr[0].hours[i]
end
lua_parsed_expr.days_of_week = parsed_expr[0].days_of_week[0]
for i = 0,3 do
lua_parsed_expr.days_of_month[i + 1] = parsed_expr[0].days_of_month[i]
end
for i = 0,1 do
lua_parsed_expr.months[i + 1] = parsed_expr[0].months[i]
end
return lua_parsed_expr
end
local function next(lua_parsed_expr, from_time)
local parsed_expr = ffi.new('cron_expr[1]')
for i = 0,7 do
parsed_expr[0].seconds[i] = lua_parsed_expr.seconds[i + 1]
parsed_expr[0].minutes[i] = lua_parsed_expr.minutes[i + 1]
end
for i = 0,2 do
parsed_expr[0].hours[i] = lua_parsed_expr.hours[i + 1]
end
parsed_expr[0].days_of_week[0] = lua_parsed_expr.days_of_week
for i = 0,3 do
parsed_expr[0].days_of_month[i] = lua_parsed_expr.days_of_month[i + 1]
end
for i = 0,1 do
parsed_expr[0].months[i] = lua_parsed_expr.months[i + 1]
end
if from_time == nil then
from_time = os.time()
end
local ts = cron.cron_next(parsed_expr, from_time)
return tonumber(ts)
end
return {
parse = parse,
next = next
}