123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- %%% @doc Tells server that the transfer of COPY data is done.
- %%%
- %%% It makes server to "commit" the data to the table and switch to the normal command-processing
- %%% mode.
- %%%
- %%% @see epgsql_cmd_copy_from_stdin
- -module(epgsql_cmd_copy_done).
- -behaviour(epgsql_command).
- -export([init/1, execute/2, handle_message/4]).
- -export_type([response/0]).
- -type response() :: {ok, Count :: non_neg_integer()}
- | {error, epgsql:query_error()}.
- %% -include("epgsql.hrl").
- -include("protocol.hrl").
- -include("../epgsql_copy.hrl").
- init(_) ->
- [].
- execute(Sock0, St) ->
- #copy{format = Format} = epgsql_sock:get_subproto_state(Sock0), % assert we are in copy-mode
- Sock1 = epgsql_sock:set_packet_handler(on_message, Sock0),
- Sock = epgsql_sock:set_attr(subproto_state, undefined, Sock1),
- {PktType, PktData} = epgsql_wire:encode_copy_done(),
- case Format of
- text ->
- {send, PktType, PktData, Sock, St};
- binary ->
- Pkts = [{?COPY_DATA, epgsql_wire:encode_copy_trailer()},
- {PktType, PktData}],
- {send_multi, Pkts, Sock, St}
- end.
- handle_message(?COMMAND_COMPLETE, Bin, Sock, St) ->
- Complete = epgsql_wire:decode_complete(Bin),
- Res = case Complete of
- {copy, Count} -> {ok, Count};
- copy -> ok
- end,
- {add_result, Res, {complete, Complete}, Sock, St};
- handle_message(?ERROR, Error, Sock, St) ->
- Result = {error, Error},
- {add_result, Result, Result, Sock, St};
- handle_message(?READY_FOR_QUERY, _Status, Sock, _State) ->
- [Result] = epgsql_sock:get_results(Sock),
- {finish, Result, done, Sock};
- handle_message(_, _, _, _) ->
- unknown.
|