diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine.app.src b/apps/emqx_rule_engine/src/emqx_rule_engine.app.src index 8608cd67a..edca35839 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine.app.src +++ b/apps/emqx_rule_engine/src/emqx_rule_engine.app.src @@ -2,7 +2,7 @@ {application, emqx_rule_engine, [ {description, "EMQX Rule Engine"}, % strict semver, bump manually! - {vsn, "5.0.5"}, + {vsn, "5.0.6"}, {modules, []}, {registered, [emqx_rule_engine_sup, emqx_rule_engine]}, {applications, [kernel, stdlib, rulesql, getopt]}, diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index adc787797..d41e9b56e 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -187,6 +187,24 @@ sha256/1 ]). +%% zip Funcs +-export([ + zip/1, + unzip/1 +]). + +%% gzip Funcs +-export([ + gzip/1, + gunzip/1 +]). + +%% compressed Funcs +-export([ + zip_compress/1, + zip_uncompress/1 +]). + %% Data encode and decode -export([ base64_encode/1, @@ -928,6 +946,36 @@ sha256(S) when is_binary(S) -> hash(Type, Data) -> emqx_misc:bin_to_hexstr(crypto:hash(Type, Data), lower). +%%------------------------------------------------------------------------------ +%% gzip Funcs +%%------------------------------------------------------------------------------ + +gzip(S) when is_binary(S) -> + zlib:gzip(S). + +gunzip(S) when is_binary(S) -> + zlib:gunzip(S). + +%%------------------------------------------------------------------------------ +%% zip Funcs +%%------------------------------------------------------------------------------ + +zip(S) when is_binary(S) -> + zlib:zip(S). + +unzip(S) when is_binary(S) -> + zlib:unzip(S). + +%%------------------------------------------------------------------------------ +%% zip_compress Funcs +%%------------------------------------------------------------------------------ + +zip_compress(S) when is_binary(S) -> + zlib:compress(S). + +zip_uncompress(S) when is_binary(S) -> + zlib:uncompress(S). + %%------------------------------------------------------------------------------ %% Data encode and decode Funcs %%------------------------------------------------------------------------------ diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 35ff60831..504211440 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -843,6 +843,48 @@ prop_hash_fun() -> end ). +%%------------------------------------------------------------------------------ +%% Test cases for zip funcs +%%------------------------------------------------------------------------------ + +t_zip_funcs(_) -> + ?PROPTEST(prop_zip_fun). + +prop_zip_fun() -> + ?FORALL( + S, + binary(), + S == apply_func(unzip, [apply_func(zip, [S])]) + ). + +%%------------------------------------------------------------------------------ +%% Test cases for gzip funcs +%%------------------------------------------------------------------------------ + +t_gzip_funcs(_) -> + ?PROPTEST(prop_gzip_fun). + +prop_gzip_fun() -> + ?FORALL( + S, + binary(), + S == apply_func(gunzip, [apply_func(gzip, [S])]) + ). + +%%------------------------------------------------------------------------------ +%% Test cases for zip funcs +%%------------------------------------------------------------------------------ + +t_zip_compress_funcs(_) -> + ?PROPTEST(prop_zip_compress_fun). + +prop_zip_compress_fun() -> + ?FORALL( + S, + binary(), + S == apply_func(zip_uncompress, [apply_func(zip_compress, [S])]) + ). + %%------------------------------------------------------------------------------ %% Test cases for base64 %%------------------------------------------------------------------------------ diff --git a/changes/v5.0.13-en.md b/changes/v5.0.13-en.md index 23d3840b3..74d495e29 100644 --- a/changes/v5.0.13-en.md +++ b/changes/v5.0.13-en.md @@ -10,6 +10,8 @@ - Refactor: use `POST` not `PUT` for `/users/{name}/change_pwd` [#9533](https://github.com/emqx/emqx/pull/9533). +- Add compression functions `zip`, `gzip`, `zip_compress` in Rule-Engine and corresponding decompression functions [#9573](https://github.com/emqx/emqx/pull/9573). + ## Bug fixes - Trigger `message.dropped` hook when QoS2 message is resend by client with a same packet id, or 'awaiting_rel' queue is full [#9487](https://github.com/emqx/emqx/pull/9487). diff --git a/changes/v5.0.13-zh.md b/changes/v5.0.13-zh.md index ce25bc35d..adb53c947 100644 --- a/changes/v5.0.13-zh.md +++ b/changes/v5.0.13-zh.md @@ -10,6 +10,8 @@ - 重构: `/users/{name}/change_pwd` 的请求方式从 `PUT` 改为了 `POST` [#9533](https://github.com/emqx/emqx/pull/9533)。 +- 规则引擎支持压缩函数 `zip`, `gzip`, `zip_compress` 及对应的解压缩函数 [#9573](https://github.com/emqx/emqx/pull/9573)。 + ## 修复 - 当 QoS2 消息被重发(使用相同 Packet ID),或当 'awaiting_rel' 队列已满时,触发消息丢弃钩子(`message.dropped`)及计数器 [#9487](https://github.com/emqx/emqx/pull/9487)。