Skip to content

Commit 55fc7cb

Browse files
committed
Tighten the rules for parsing time periods
These are used by the scanner config setting and for the auto-purge document ttl value. Remove some of the sloppiness such as allowing "secfoo" and "secbar" as "seconds".
1 parent 6396568 commit 55fc7cb

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

src/couch_scanner/src/couch_scanner_util.erl

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
-define(DAY, 24 * ?HOUR).
3232
-define(WEEK, 7 * ?DAY).
3333
-define(MONTH, 30 * ?DAY).
34+
-define(YEAR, 365 * ?DAY).
3435

3536
new_scan_id() ->
3637
TSec = integer_to_binary(erlang:system_time(second)),
@@ -240,15 +241,17 @@ parse_non_weekday_period(Period) ->
240241
undefined
241242
end.
242243

243-
parse_period_unit(Period) when is_list(Period) ->
244-
case Period of
245-
"sec" ++ _ -> ?SECOND;
246-
"min" ++ _ -> ?MINUTE;
247-
"hour" ++ _ -> ?HOUR;
248-
"day" ++ _ -> ?DAY;
249-
"week" ++ _ -> ?WEEK;
250-
"month" ++ _ -> ?MONTH;
251-
_ -> undefined
244+
%% erlfmt-ignore
245+
parse_period_unit(P) when is_list(P) ->
246+
if
247+
P == "s"; P == "sec"; P == "second"; P == "seconds" -> ?SECOND;
248+
P == "min"; P == "minute"; P == "minutes" -> ?MINUTE;
249+
P == "h"; P == "hrs"; P == "hour"; P == "hours" -> ?HOUR;
250+
P == "d"; P == "day"; P == "days" -> ?DAY;
251+
P == "w"; P == "week"; P == "weeks" -> ?WEEK;
252+
P == "mon"; P == "month"; P == "months" -> ?MONTH;
253+
P == "y"; P == "year"; P == "years" -> ?YEAR;
254+
true -> undefined
252255
end.
253256

254257
% Logging bits
@@ -297,6 +300,9 @@ parse_after_test() ->
297300
parse_repeat_test() ->
298301
?assertEqual(undefined, parse_repeat("foo")),
299302
?assertEqual(undefined, parse_repeat("ReStarT")),
303+
?assertEqual(undefined, parse_repeat("1_ms")),
304+
?assertEqual(undefined, parse_repeat("1_x")),
305+
?assertEqual(undefined, parse_repeat("1_m")),
300306
?assertEqual({weekday, 1}, parse_repeat("mon")),
301307
?assertEqual({weekday, 1}, parse_repeat("Monday")),
302308
?assertEqual({weekday, 2}, parse_repeat("tuesday")),
@@ -306,16 +312,25 @@ parse_repeat_test() ->
306312
?assertEqual({weekday, 6}, parse_repeat("sAt")),
307313
?assertEqual({weekday, 7}, parse_repeat("sundays")),
308314
?assertEqual(1, parse_repeat("1_sec")),
315+
?assertEqual(1, parse_repeat("1_s")),
309316
?assertEqual(1, parse_repeat("1_second")),
310317
?assertEqual(1, parse_repeat("1_sec")),
311318
?assertEqual(2, parse_repeat("2_sec")),
312319
?assertEqual(3, parse_repeat("3_seconds")),
313320
?assertEqual(60, parse_repeat("1_min")),
321+
?assertEqual(60, parse_repeat("1_minute")),
314322
?assertEqual(2 * 60, parse_repeat("2_minutes")),
315323
?assertEqual(60 * 60, parse_repeat("1_hour")),
324+
?assertEqual(3 * 60 * 60, parse_repeat("3_hours")),
325+
?assertEqual(2 * 60 * 60, parse_repeat("2_h")),
316326
?assertEqual(24 * 60 * 60, parse_repeat("1_day")),
317327
?assertEqual(7 * 24 * 60 * 60, parse_repeat("1_week")),
318-
?assertEqual(30 * 24 * 60 * 60, parse_repeat("1_month")).
328+
?assertEqual(2 * 7 * 24 * 60 * 60, parse_repeat("2_weeks")),
329+
?assertEqual(30 * 24 * 60 * 60, parse_repeat("1_month")),
330+
?assertEqual(30 * 24 * 60 * 60, parse_repeat("1_mon")),
331+
?assertEqual(2 * 30 * 24 * 60 * 60, parse_repeat("2_months")),
332+
?assertEqual(365 * 24 * 60 * 60, parse_repeat("1_year")),
333+
?assertEqual(2 * 365 * 24 * 60 * 60, parse_repeat("2_year")).
319334

320335
repeat_period_test() ->
321336
%Fri, May 31, 2024 16:08:37

0 commit comments

Comments
 (0)