|
|
@ -14,7 +14,7 @@ |
|
|
|
, nowMs/0 |
|
|
|
, msToBinStr/0 |
|
|
|
, msToBinStr/1 |
|
|
|
, parse_rotation_date_spec/1 |
|
|
|
, parseRotateDateSpec/1 |
|
|
|
, calcNextRotate/1 |
|
|
|
, validate_trace/1 |
|
|
|
, check_traces/4 |
|
|
@ -205,66 +205,66 @@ i3b(Num) -> |
|
|
|
integer_to_binary(Num) |
|
|
|
end. |
|
|
|
|
|
|
|
parse_rotation_hour_spec([], Res) -> |
|
|
|
parseRotateHourSpec([], Res) -> |
|
|
|
{ok, Res}; |
|
|
|
parse_rotation_hour_spec([$H, M1, M2], Res) -> |
|
|
|
parseRotateHourSpec([$H, M1, M2], Res) -> |
|
|
|
case list_to_integer([M1, M2]) of |
|
|
|
X when X >= 0, X =< 59 -> |
|
|
|
{ok, Res ++ [{minute, X}]}; |
|
|
|
_ -> |
|
|
|
{error, invalid_date_spec} |
|
|
|
end; |
|
|
|
parse_rotation_hour_spec([$H, M], Res) when M >= $0, M =< $9 -> |
|
|
|
{ok, Res ++ [{minute, M - 48}]}; |
|
|
|
parse_rotation_hour_spec(_, _) -> |
|
|
|
parseRotateHourSpec([$H, M], Res) when M >= $0, M =< $9 -> |
|
|
|
{ok, Res ++ [{minute, M - $0}]}; |
|
|
|
parseRotateHourSpec(_, _) -> |
|
|
|
{error, invalid_date_spec}. |
|
|
|
|
|
|
|
%% Default to 00:00:00 rotation |
|
|
|
parse_rotation_day_spec([], Res) -> |
|
|
|
parseRotateDaySpec([], Res) -> |
|
|
|
{ok, Res ++ [{hour, 0}]}; |
|
|
|
parse_rotation_day_spec([$D, D1, D2 | T], Res) -> |
|
|
|
parseRotateDaySpec([$D, D1, D2 | T], Res) -> |
|
|
|
case list_to_integer([D1, D2]) of |
|
|
|
X when X >= 0, X =< 23 -> |
|
|
|
parse_rotation_hour_spec(T, Res ++ [{hour, X}]); |
|
|
|
parseRotateHourSpec(T, Res ++ [{hour, X}]); |
|
|
|
_ -> |
|
|
|
{error, invalid_date_spec} |
|
|
|
end; |
|
|
|
parse_rotation_day_spec([$D, D | T], Res) when D >= $0, D =< $9 -> |
|
|
|
parse_rotation_hour_spec(T, Res ++ [{hour, D - 48}]); |
|
|
|
parse_rotation_day_spec(X, Res) -> |
|
|
|
parse_rotation_hour_spec(X, Res). |
|
|
|
|
|
|
|
parse_rotation_date_spec([$$, $W, W | T]) when W >= $0, W =< $6 -> |
|
|
|
Week = W - 48, |
|
|
|
parse_rotation_day_spec(T, [{day, Week}]); |
|
|
|
parse_rotation_date_spec([$$, $M, L | T]) when L == $L; L == $l -> |
|
|
|
parseRotateDaySpec([$D, D | T], Res) when D >= $0, D =< $9 -> |
|
|
|
parseRotateHourSpec(T, Res ++ [{hour, D - $0}]); |
|
|
|
parseRotateDaySpec(X, Res) -> |
|
|
|
parseRotateHourSpec(X, Res). |
|
|
|
|
|
|
|
parseRotateDateSpec([$$, $W, W | T]) when W >= $0, W =< $6 -> |
|
|
|
Week = W - $0, |
|
|
|
parseRotateDaySpec(T, [{day, Week}]); |
|
|
|
parseRotateDateSpec([$$, $M, L | T]) when L == $L; L == $l -> |
|
|
|
%% last day in month. |
|
|
|
parse_rotation_day_spec(T, [{date, last}]); |
|
|
|
parse_rotation_date_spec([$$, $M, M1, M2 | [$D | _] = T]) -> |
|
|
|
parseRotateDaySpec(T, [{date, last}]); |
|
|
|
parseRotateDateSpec([$$, $M, M1, M2 | [$D | _] = T]) -> |
|
|
|
case list_to_integer([M1, M2]) of |
|
|
|
X when X >= 1, X =< 31 -> |
|
|
|
parse_rotation_day_spec(T, [{date, X}]); |
|
|
|
parseRotateDaySpec(T, [{date, X}]); |
|
|
|
_ -> |
|
|
|
{error, invalid_date_spec} |
|
|
|
end; |
|
|
|
parse_rotation_date_spec([$$, $M, M | [$D | _] = T]) -> |
|
|
|
parse_rotation_day_spec(T, [{date, M - 48}]); |
|
|
|
parse_rotation_date_spec([$$, $M, M1, M2]) -> |
|
|
|
parseRotateDateSpec([$$, $M, M | [$D | _] = T]) -> |
|
|
|
parseRotateDaySpec(T, [{date, M - $0}]); |
|
|
|
parseRotateDateSpec([$$, $M, M1, M2]) -> |
|
|
|
case list_to_integer([M1, M2]) of |
|
|
|
X when X >= 1, X =< 31 -> |
|
|
|
{ok, [{date, X}, {hour, 0}]}; |
|
|
|
_ -> |
|
|
|
{error, invalid_date_spec} |
|
|
|
end; |
|
|
|
parse_rotation_date_spec([$$, $M, M]) -> |
|
|
|
{ok, [{date, M - 48}, {hour, 0}]}; |
|
|
|
parse_rotation_date_spec([$$ | X]) when X /= [] -> |
|
|
|
parse_rotation_day_spec(X, []); |
|
|
|
parse_rotation_date_spec(_) -> |
|
|
|
parseRotateDateSpec([$$, $M, M]) -> |
|
|
|
{ok, [{date, M - $0}, {hour, 0}]}; |
|
|
|
parseRotateDateSpec([$$ | X]) when X /= [] -> |
|
|
|
parseRotateDaySpec(X, []); |
|
|
|
parseRotateDateSpec(_) -> |
|
|
|
{error, invalid_date_spec}. |
|
|
|
|
|
|
|
calcNextRotate(Spec) -> |
|
|
|
NowDataTime = erlang:localtime(), |
|
|
|
NowDataTime = erlang:localtime(), |
|
|
|
Later = calculate_next_rotation(Spec, NowDataTime), |
|
|
|
calendar:datetime_to_gregorian_seconds(Later) - calendar:datetime_to_gregorian_seconds(NowDataTime). |
|
|
|
|
|
|
@ -639,36 +639,36 @@ get_env(Key, Def) -> |
|
|
|
-ifdef(TEST). |
|
|
|
|
|
|
|
parse_test() -> |
|
|
|
?assertEqual({ok, [{minute, 0}]}, parse_rotation_date_spec("$H0")), |
|
|
|
?assertEqual({ok, [{minute, 59}]}, parse_rotation_date_spec("$H59")), |
|
|
|
?assertEqual({ok, [{hour, 0}]}, parse_rotation_date_spec("$D0")), |
|
|
|
?assertEqual({ok, [{hour, 23}]}, parse_rotation_date_spec("$D23")), |
|
|
|
?assertEqual({ok, [{day, 0}, {hour, 23}]}, parse_rotation_date_spec("$W0D23")), |
|
|
|
?assertEqual({ok, [{day, 5}, {hour, 16}]}, parse_rotation_date_spec("$W5D16")), |
|
|
|
?assertEqual({ok, [{day, 0}, {hour, 12}, {minute, 30}]}, parse_rotation_date_spec("$W0D12H30")), |
|
|
|
?assertEqual({ok, [{date, 1}, {hour, 0}]}, parse_rotation_date_spec("$M1D0")), |
|
|
|
?assertEqual({ok, [{date, 5}, {hour, 6}]}, parse_rotation_date_spec("$M5D6")), |
|
|
|
?assertEqual({ok, [{date, 5}, {hour, 0}]}, parse_rotation_date_spec("$M5")), |
|
|
|
?assertEqual({ok, [{date, 31}, {hour, 0}]}, parse_rotation_date_spec("$M31")), |
|
|
|
?assertEqual({ok, [{date, 31}, {hour, 1}]}, parse_rotation_date_spec("$M31D1")), |
|
|
|
?assertEqual({ok, [{date, last}, {hour, 0}]}, parse_rotation_date_spec("$ML")), |
|
|
|
?assertEqual({ok, [{date, last}, {hour, 0}]}, parse_rotation_date_spec("$Ml")), |
|
|
|
?assertEqual({ok, [{day, 5}, {hour, 0}]}, parse_rotation_date_spec("$W5")), |
|
|
|
?assertEqual({ok, [{minute, 0}]}, parseRotateDateSpec("$H0")), |
|
|
|
?assertEqual({ok, [{minute, 59}]}, parseRotateDateSpec("$H59")), |
|
|
|
?assertEqual({ok, [{hour, 0}]}, parseRotateDateSpec("$D0")), |
|
|
|
?assertEqual({ok, [{hour, 23}]}, parseRotateDateSpec("$D23")), |
|
|
|
?assertEqual({ok, [{day, 0}, {hour, 23}]}, parseRotateDateSpec("$W0D23")), |
|
|
|
?assertEqual({ok, [{day, 5}, {hour, 16}]}, parseRotateDateSpec("$W5D16")), |
|
|
|
?assertEqual({ok, [{day, 0}, {hour, 12}, {minute, 30}]}, parseRotateDateSpec("$W0D12H30")), |
|
|
|
?assertEqual({ok, [{date, 1}, {hour, 0}]}, parseRotateDateSpec("$M1D0")), |
|
|
|
?assertEqual({ok, [{date, 5}, {hour, 6}]}, parseRotateDateSpec("$M5D6")), |
|
|
|
?assertEqual({ok, [{date, 5}, {hour, 0}]}, parseRotateDateSpec("$M5")), |
|
|
|
?assertEqual({ok, [{date, 31}, {hour, 0}]}, parseRotateDateSpec("$M31")), |
|
|
|
?assertEqual({ok, [{date, 31}, {hour, 1}]}, parseRotateDateSpec("$M31D1")), |
|
|
|
?assertEqual({ok, [{date, last}, {hour, 0}]}, parseRotateDateSpec("$ML")), |
|
|
|
?assertEqual({ok, [{date, last}, {hour, 0}]}, parseRotateDateSpec("$Ml")), |
|
|
|
?assertEqual({ok, [{day, 5}, {hour, 0}]}, parseRotateDateSpec("$W5")), |
|
|
|
ok. |
|
|
|
|
|
|
|
parse_fail_test() -> |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$H")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$H60")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$D")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$D24")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$W7")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$W7D1")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$M32")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$M32D1")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$D15M5")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parse_rotation_date_spec("$M5W5")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$H")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$H60")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$D")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$D24")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$W7")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$W7D1")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$M32")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$M32D1")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$D15M5")), |
|
|
|
?assertEqual({error, invalid_date_spec}, parseRotateDateSpec("$M5W5")), |
|
|
|
ok. |
|
|
|
|
|
|
|
rotation_calculation_test() -> |
|
|
|