epgsql_cmd_copy_done.erl 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. %%% @doc Tells server that the transfer of COPY data is done.
  2. %%%
  3. %%% It makes server to "commit" the data to the table and switch to the normal command-processing
  4. %%% mode.
  5. %%%
  6. %%% @see epgsql_cmd_copy_from_stdin
  7. -module(epgsql_cmd_copy_done).
  8. -behaviour(epgsql_command).
  9. -export([init/1, execute/2, handle_message/4]).
  10. -export_type([response/0]).
  11. -type response() :: {ok, Count :: non_neg_integer()}
  12. | {error, epgsql:query_error()}.
  13. %% -include("epgsql.hrl").
  14. -include("protocol.hrl").
  15. -include("../epgsql_copy.hrl").
  16. init(_) ->
  17. [].
  18. execute(Sock0, St) ->
  19. #copy{format = Format} = epgsql_sock:get_subproto_state(Sock0), % assert we are in copy-mode
  20. Sock1 = epgsql_sock:set_packet_handler(on_message, Sock0),
  21. Sock = epgsql_sock:set_attr(subproto_state, undefined, Sock1),
  22. {PktType, PktData} = epgsql_wire:encode_copy_done(),
  23. case Format of
  24. text ->
  25. {send, PktType, PktData, Sock, St};
  26. binary ->
  27. Pkts = [{?COPY_DATA, epgsql_wire:encode_copy_trailer()},
  28. {PktType, PktData}],
  29. {send_multi, Pkts, Sock, St}
  30. end.
  31. handle_message(?COMMAND_COMPLETE, Bin, Sock, St) ->
  32. Complete = epgsql_wire:decode_complete(Bin),
  33. Res = case Complete of
  34. {copy, Count} -> {ok, Count};
  35. copy -> ok
  36. end,
  37. {add_result, Res, {complete, Complete}, Sock, St};
  38. handle_message(?ERROR, Error, Sock, St) ->
  39. Result = {error, Error},
  40. {add_result, Result, Result, Sock, St};
  41. handle_message(?READY_FOR_QUERY, _Status, Sock, _State) ->
  42. [Result] = epgsql_sock:get_results(Sock),
  43. {finish, Result, done, Sock};
  44. handle_message(_, _, _, _) ->
  45. unknown.