Просмотр исходного кода

Merge pull request #11135 from lafirest/pref/calendar_timeoffset

perf(rule_engine): improve the time offset parser
lafirest 2 лет назад
Родитель
Сommit
f2e3446e29
2 измененных файлов с 19 добавлено и 9 удалено
  1. 18 9
      apps/emqx/src/emqx_calendar.erl
  2. 1 0
      changes/ce/perf-11135.en.md

+ 18 - 9
apps/emqx/src/emqx_calendar.erl

@@ -22,7 +22,7 @@
 -define(DAYS_PER_YEAR, 365).
 -define(DAYS_PER_LEAP_YEAR, 366).
 -define(DAYS_FROM_0_TO_1970, 719528).
--define(SECONDS_FROM_0_TO_1970, ?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY).
+-define(SECONDS_FROM_0_TO_1970, (?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY)).
 
 -export([
     formatter/1,
@@ -140,12 +140,13 @@ offset_second_("Z") ->
 offset_second_("z") ->
     0;
 offset_second_(Offset) when is_list(Offset) ->
-    Sign = hd(Offset),
-    ((Sign == $+) orelse (Sign == $-)) orelse
-        error({bad_time_offset, Offset}),
-    Signs = #{$+ => 1, $- => -1},
-    PosNeg = maps:get(Sign, Signs),
     [Sign | HM] = Offset,
+    PosNeg =
+        case Sign of
+            $+ -> 1;
+            $- -> -1;
+            _ -> error({bad_time_offset, Offset})
+        end,
     {HourStr, MinuteStr, SecondStr} =
         case string:tokens(HM, ":") of
             [H, M] ->
@@ -157,9 +158,9 @@ offset_second_(Offset) when is_list(Offset) ->
             _ ->
                 error({bad_time_offset, Offset})
         end,
-    Hour = erlang:list_to_integer(HourStr),
-    Minute = erlang:list_to_integer(MinuteStr),
-    Second = erlang:list_to_integer(SecondStr),
+    Hour = list_to_int_or_error(HourStr, {bad_time_offset_hour, HourStr}),
+    Minute = list_to_int_or_error(MinuteStr, {bad_time_offset_minute, MinuteStr}),
+    Second = list_to_int_or_error(SecondStr, {bad_time_offset_second, SecondStr}),
     (Hour =< 23) orelse error({bad_time_offset_hour, Hour}),
     (Minute =< 59) orelse error({bad_time_offset_minute, Minute}),
     (Second =< 59) orelse error({bad_time_offset_second, Second}),
@@ -454,3 +455,11 @@ dm(9) -> 243;
 dm(10) -> 273;
 dm(11) -> 304;
 dm(12) -> 334.
+
+list_to_int_or_error(Str, Error) ->
+    case string:to_integer(Str) of
+        {Int, []} ->
+            Int;
+        _ ->
+            error(Error)
+    end.

+ 1 - 0
changes/ce/perf-11135.en.md

@@ -0,0 +1 @@
+Improve time offset parser in rules engine and return uniform error codes.