pgsql_wire.erl 971 B

123456789101112131415161718192021222324252627282930313233343536
  1. -module(pgsql_wire).
  2. -export([init/1,
  3. decode_messages/2,
  4. encode/2,
  5. encode/3]).
  6. -include("pgsql_binary.hrl").
  7. -record(state, {options, tail}).
  8. init(Options) ->
  9. #state{options = Options}.
  10. decode_messages(Bin, #state{tail = Tail} = State) ->
  11. decode_messages([], <<Bin/binary, Tail/binary>>, State).
  12. encode(Data, State = #state{}) ->
  13. Bin = iolist_to_binary(Data),
  14. <<(byte_size(Bin) + 4):?int32, Bin/binary>>.
  15. encode(Type, Data, State = #state{}) ->
  16. Bin = iolist_to_binary(Data),
  17. <<Type:8, (byte_size(Bin) + 4):?int32, Bin/binary>>.
  18. decode_messages(Acc, <<Type:8, Len:?int32, Rest/binary>> = Bin, State) ->
  19. Len2 = Len - 4,
  20. case Rest of
  21. <<Data:Len2/binary, Tail/binary>> ->
  22. decode([{Type, Data} | Acc], Tail, State);
  23. _Other ->
  24. {lists:reverse(Acc), State#state{tail = Bin}}
  25. end;
  26. decode_messages(Acc, Bin, State) ->
  27. {lists:reverse(Acc), State#state{tail = Bin}}.