From b0d42ef2c8eaa9d7a6c4b70483a4a98b8f82a13a Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 6 May 2025 10:06:16 +0800 Subject: [PATCH] fix --- apps/efka/include/message_pb.hrl | 2 +- apps/efka/src/proto/message_pb.erl | 45 +++++++++++++----------------- message_pb.proto | 4 +-- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/apps/efka/include/message_pb.hrl b/apps/efka/include/message_pb.hrl index fbd054e..a42fdbe 100644 --- a/apps/efka/include/message_pb.hrl +++ b/apps/efka/include/message_pb.hrl @@ -57,7 +57,7 @@ service_name = <<>> :: unicode:chardata() | undefined, % = 2, optional at = 0 :: integer() | undefined, % = 3, optional, 32 bits tags = [] :: [{unicode:chardata(), unicode:chardata()}] | undefined, % = 4 - fields = [] :: [iodata()] | undefined % = 5, repeated + fields = <<>> :: iodata() | undefined % = 5, optional }). -endif. diff --git a/apps/efka/src/proto/message_pb.erl b/apps/efka/src/proto/message_pb.erl index 67d3e92..1c6135e 100644 --- a/apps/efka/src/proto/message_pb.erl +++ b/apps/efka/src/proto/message_pb.erl @@ -304,11 +304,15 @@ encode_msg_data(#data{device_uuid = F1, service_name = F2, at = F3, tags = F4, f true -> e_field_data_tags(TrF4, B3, TrUserData) end end, - begin - TrF5 = id(F5, TrUserData), - if TrF5 == [] -> B4; - true -> e_field_data_fields(TrF5, B4, TrUserData) - end + if F5 == undefined -> B4; + true -> + begin + TrF5 = id(F5, TrUserData), + case iolist_size(TrF5) of + 0 -> B4; + _ -> e_type_bytes(TrF5, <>, TrUserData) + end + end end. encode_msg_ping(Msg, TrUserData) -> encode_msg_ping(Msg, <<>>, TrUserData). @@ -635,12 +639,6 @@ e_field_data_tags([Elem | Rest], Bin, TrUserData) -> e_field_data_tags(Rest, Bin3, TrUserData); e_field_data_tags([], Bin, _TrUserData) -> Bin. -e_field_data_fields([Elem | Rest], Bin, TrUserData) -> - Bin2 = <>, - Bin3 = e_type_bytes(id(Elem, TrUserData), Bin2, TrUserData), - e_field_data_fields(Rest, Bin3, TrUserData); -e_field_data_fields([], Bin, _TrUserData) -> Bin. - e_field_ping_ips([Elem | Rest], Bin, TrUserData) -> Bin2 = <>, Bin3 = e_type_string(id(Elem, TrUserData), Bin2, TrUserData), @@ -1103,14 +1101,14 @@ skip_32_session_reply(<<_:32, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp skip_64_session_reply(<<_:64, Rest/binary>>, Z1, Z2, F, F@_1, TrUserData) -> dfp_read_field_def_session_reply(Rest, Z1, Z2, F, F@_1, TrUserData). -decode_msg_data(Bin, TrUserData) -> dfp_read_field_def_data(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), 'tr_decode_init_default_data.tags'([], TrUserData), id([], TrUserData), TrUserData). +decode_msg_data(Bin, TrUserData) -> dfp_read_field_def_data(Bin, 0, 0, 0, id(<<>>, TrUserData), id(<<>>, TrUserData), id(0, TrUserData), 'tr_decode_init_default_data.tags'([], TrUserData), id(<<>>, TrUserData), TrUserData). dfp_read_field_def_data(<<10, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_device_uuid(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_data(<<18, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_service_name(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_data(<<24, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_at(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_data(<<34, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_tags(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); dfp_read_field_def_data(<<42, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> d_field_data_fields(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); -dfp_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, R2, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = lists_reverse(R2, TrUserData)}; +dfp_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, F@_5, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = F@_5}; dfp_read_field_def_data(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dg_read_field_def_data(Other, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). dg_read_field_def_data(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 32 - 7 -> dg_read_field_def_data(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); @@ -1131,7 +1129,7 @@ dg_read_field_def_data(<<0:1, X:7, Rest/binary>>, N, Acc, _, F@_1, F@_2, F@_3, F 5 -> skip_32_data(Rest, 0, 0, Key bsr 3, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) end end; -dg_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, R2, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = lists_reverse(R2, TrUserData)}. +dg_read_field_def_data(<<>>, 0, 0, _, F@_1, F@_2, F@_3, R1, F@_5, TrUserData) -> #data{device_uuid = F@_1, service_name = F@_2, at = F@_3, tags = 'tr_decode_repeated_finalize_data.tags'(R1, TrUserData), fields = F@_5}. d_field_data_device_uuid(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_data_device_uuid(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); d_field_data_device_uuid(<<0:1, X:7, Rest/binary>>, N, Acc, F, _, F@_2, F@_3, F@_4, F@_5, TrUserData) -> @@ -1154,9 +1152,9 @@ d_field_data_tags(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, Prev, dfp_read_field_def_data(RestF, 0, 0, F, F@_1, F@_2, F@_3, 'tr_decode_repeated_add_elem_data.tags'(NewFValue, Prev, TrUserData), F@_5, TrUserData). d_field_data_fields(<<1:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) when N < 57 -> d_field_data_fields(Rest, N + 7, X bsl N + Acc, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); -d_field_data_fields(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, Prev, TrUserData) -> +d_field_data_fields(<<0:1, X:7, Rest/binary>>, N, Acc, F, F@_1, F@_2, F@_3, F@_4, _, TrUserData) -> {NewFValue, RestF} = begin Len = X bsl N + Acc, <> = Rest, Bytes2 = binary:copy(Bytes), {id(Bytes2, TrUserData), Rest2} end, - dfp_read_field_def_data(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, cons(NewFValue, Prev, TrUserData), TrUserData). + dfp_read_field_def_data(RestF, 0, 0, F, F@_1, F@_2, F@_3, F@_4, NewFValue, TrUserData). skip_varint_data(<<1:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> skip_varint_data(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData); skip_varint_data(<<0:1, _:7, Rest/binary>>, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData) -> dfp_read_field_def_data(Rest, Z1, Z2, F, F@_1, F@_2, F@_3, F@_4, F@_5, TrUserData). @@ -1925,9 +1923,8 @@ merge_msg_data(#data{device_uuid = PFdevice_uuid, service_name = PFservice_name, NFtags == undefined -> PFtags end, fields = - if PFfields /= undefined, NFfields /= undefined -> 'erlang_++'(PFfields, NFfields, TrUserData); - PFfields == undefined -> NFfields; - NFfields == undefined -> PFfields + if NFfields =:= undefined -> PFfields; + true -> NFfields end}. -compile({nowarn_unused_function,merge_msg_ping/3}). @@ -2188,10 +2185,8 @@ v_msg_data(#data{device_uuid = F1, service_name = F2, at = F3, tags = F4, fields true -> v_type_int32(F3, [at | Path], TrUserData) end, 'v_map'(F4, [tags | Path], TrUserData), - if is_list(F5) -> - _ = [v_type_bytes(Elem, [fields | Path], TrUserData) || Elem <- F5], - ok; - true -> mk_type_error({invalid_list_of, bytes}, F5, [fields | Path]) + if F5 == undefined -> ok; + true -> v_type_bytes(F5, [fields | Path], TrUserData) end, ok; v_msg_data(X, Path, _TrUserData) -> mk_type_error({expected_msg, data}, X, Path). @@ -2485,7 +2480,7 @@ get_msg_defs() -> #field{name = service_name, fnum = 2, rnum = 3, type = string, occurrence = optional, opts = []}, #field{name = at, fnum = 3, rnum = 4, type = int32, occurrence = optional, opts = []}, #field{name = tags, fnum = 4, rnum = 5, type = {map, string, string}, occurrence = repeated, opts = []}, - #field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = repeated, opts = []}]}, + #field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = optional, opts = []}]}, {{msg, ping}, [#field{name = adcode, fnum = 1, rnum = 2, type = string, occurrence = optional, opts = []}, #field{name = boot_time, fnum = 2, rnum = 3, type = uint32, occurrence = optional, opts = []}, @@ -2560,7 +2555,7 @@ find_msg_def(data) -> #field{name = service_name, fnum = 2, rnum = 3, type = string, occurrence = optional, opts = []}, #field{name = at, fnum = 3, rnum = 4, type = int32, occurrence = optional, opts = []}, #field{name = tags, fnum = 4, rnum = 5, type = {map, string, string}, occurrence = repeated, opts = []}, - #field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = repeated, opts = []}]; + #field{name = fields, fnum = 5, rnum = 6, type = bytes, occurrence = optional, opts = []}]; find_msg_def(ping) -> [#field{name = adcode, fnum = 1, rnum = 2, type = string, occurrence = optional, opts = []}, #field{name = boot_time, fnum = 2, rnum = 3, type = uint32, occurrence = optional, opts = []}, diff --git a/message_pb.proto b/message_pb.proto index bc3616b..d5d985b 100644 --- a/message_pb.proto +++ b/message_pb.proto @@ -37,8 +37,8 @@ message Data { string service_name = 2; int32 at = 3; map tags = 4; - // 为了数据的灵活性,存储类型无关的二进制流 - repeated bytes fields = 5; + // 为了数据的灵活性,存储类型无关的二进制流; 兼容更多的业务逻辑情况 + bytes fields = 5; } //#{<<"adcode">> => 0,<<"boot_time">> => 18256077,<<"city">> => <<>>,