Skip to content

Commit 38125fc

Browse files
authored
Merge pull request #20 from mikpe/fix-sext-for-otp23
mnesia_eleveldb_sext: handle OTP-23 external format changes
2 parents 84cd070 + 7c40e07 commit 38125fc

1 file changed

Lines changed: 63 additions & 15 deletions

File tree

src/mnesia_eleveldb_sext.erl

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -290,20 +290,50 @@ prefix_bitstring(B) ->
290290
{false, <<?binary:8, Enc/binary>>}.
291291

292292
encode_pid(P) ->
293-
PBin = term_to_binary(P),
294-
<<131,103,100,ALen:16,Name:ALen/binary,Rest:9/binary>> = PBin,
293+
case term_to_binary(P) of
294+
<<131,88,100,ALen:16,Name:ALen/binary,NS:8/binary,C:32>> ->
295+
case C > 3 of
296+
true -> encode_pid(Name, NS, <<255, C:32>>);
297+
false -> encode_pid(Name, NS, <<C>>)
298+
end;
299+
<<131,103,100,ALen:16,Name:ALen/binary,NS:8/binary,C:8>> ->
300+
true = C =< 3,
301+
encode_pid(Name, NS, <<C>>)
302+
end.
303+
304+
encode_pid(Name, NS, C) ->
295305
NameEnc = encode_bin_elems(Name),
296-
<<?pid, NameEnc/binary, Rest/binary>>.
306+
<<?pid, NameEnc/binary, NS/binary, C/binary>>.
297307

298308
encode_port(P) ->
299-
PBin = term_to_binary(P),
300-
<<131,102,100,ALen:16,Name:ALen/binary,Rest:5/binary>> = PBin,
309+
case term_to_binary(P) of
310+
<<131,89,100,ALen:16,Name:ALen/binary,N:4/binary,C:32>> ->
311+
case C > 3 of
312+
true -> encode_port(Name, N, <<255, C:32>>);
313+
false -> encode_port(Name, N, <<C>>)
314+
end;
315+
<<131,102,100,ALen:16,Name:ALen/binary,N:4/binary,C:8>> ->
316+
true = C =< 3,
317+
encode_port(Name, N, <<C>>)
318+
end.
319+
320+
encode_port(Name, N, C) ->
301321
NameEnc = encode_bin_elems(Name),
302-
<<?port, NameEnc/binary, Rest/binary>>.
322+
<<?port, NameEnc/binary, N/binary, C/binary>>.
303323

304324
encode_ref(R) ->
305-
RBin = term_to_binary(R),
306-
<<131,114,_Len:16,100,NLen:16,Name:NLen/binary,Rest/binary>> = RBin,
325+
case term_to_binary(R) of
326+
<<131,90,_Len:16,100,NLen:16,Name:NLen/binary,C:32,Rest/binary>> ->
327+
case C > 3 of
328+
true -> encode_ref(Name, <<255, C:32, Rest/binary>>);
329+
false -> encode_ref(Name, <<C, Rest/binary>>)
330+
end;
331+
<<131,114,_Len:16,100,NLen:16,Name:NLen/binary,C:8,Rest/binary>> ->
332+
true = C =< 3,
333+
encode_ref(Name, <<C, Rest/binary>>)
334+
end.
335+
336+
encode_ref(Name, Rest) ->
307337
NameEnc = encode_bin_elems(Name),
308338
RestEnc = encode_bin_elems(Rest),
309339
<<?reference, NameEnc/binary, RestEnc/binary>>.
@@ -771,23 +801,41 @@ decode_list(Elems, Acc) ->
771801

772802
decode_pid(Bin) ->
773803
{Name, Rest} = decode_binary(Bin),
774-
<<Tail:9/binary, Rest1/binary>> = Rest,
775804
NameSz = size(Name),
776-
{binary_to_term(<<131,103,100,NameSz:16,Name/binary,Tail/binary>>), Rest1}.
805+
case Rest of
806+
<<NS:8/binary, 255, C:4/binary, Rest1/binary>> ->
807+
{binary_to_term(<<131,88,100,NameSz:16,Name/binary,NS/binary,C/binary>>), Rest1};
808+
<<NS:8/binary, C:8, Rest1/binary>> ->
809+
true = C =< 3,
810+
{binary_to_term(<<131,103,100,NameSz:16,Name/binary,NS/binary,C>>), Rest1}
811+
end.
777812

778813
decode_port(Bin) ->
779814
{Name, Rest} = decode_binary(Bin),
780-
<<Tail:5/binary, Rest1/binary>> = Rest,
781815
NameSz = size(Name),
782-
{binary_to_term(<<131,102,100,NameSz:16,Name/binary,Tail/binary>>), Rest1}.
816+
case Rest of
817+
<<N:4/binary, 255, C:4/binary, Rest1/binary>> ->
818+
{binary_to_term(<<131,89,100,NameSz:16,Name/binary,N/binary,C/binary>>), Rest1};
819+
<<N:4/binary, C:8, Rest1/binary>> ->
820+
true = C =< 3,
821+
{binary_to_term(<<131,102,100,NameSz:16,Name/binary,N/binary,C>>), Rest1}
822+
end.
783823

784824
decode_ref(Bin) ->
785825
{Name, Rest} = decode_binary(Bin),
786826
{Tail, Rest1} = decode_binary(Rest),
787827
NLen = size(Name),
788-
Len = (size(Tail)-1) div 4,
789-
RefBin = <<131,114,Len:16,100,NLen:16,Name/binary,Tail/binary>>,
790-
{binary_to_term(RefBin), Rest1}.
828+
case Tail of
829+
<<255, C:4/binary, Tail1/binary>> ->
830+
Len = size(Tail1) div 4,
831+
RefBin = <<131,90,Len:16,100,NLen:16,Name/binary,C/binary,Tail1/binary>>,
832+
{binary_to_term(RefBin), Rest1};
833+
<<C:8, Tail1/binary>> ->
834+
true = C =< 3,
835+
Len = size(Tail1) div 4,
836+
RefBin = <<131,114,Len:16,100,NLen:16,Name/binary,C,Tail1/binary>>,
837+
{binary_to_term(RefBin), Rest1}
838+
end.
791839

792840
decode_neg(I, 1, Rest) ->
793841
{(I - 16#7fffFFFF), Rest};

0 commit comments

Comments
 (0)