toppage_handler.erl 1016 B

12345678910111213141516171819202122232425262728293031323334353637
  1. %% Feel free to use, reuse and abuse the code in this file.
  2. %% @doc Streaming handler.
  3. -module(toppage_handler).
  4. -export([init/2]).
  5. -export([content_types_provided/2]).
  6. -export([streaming_csv/2]).
  7. init(Req, Table) ->
  8. {cowboy_rest, Req, Table}.
  9. content_types_provided(Req, State) ->
  10. {[
  11. {{<<"text">>, <<"csv">>, []}, streaming_csv}
  12. ], Req, State}.
  13. streaming_csv(Req, Table) ->
  14. N = cowboy_req:binding(v1, Req, 1),
  15. MS = [{{'$1', '$2', '$3'}, [{'==', '$2', N}], ['$$']}],
  16. {{stream, result_streamer(Table, MS)}, Req, Table}.
  17. result_streamer(Table, MS) ->
  18. fun (Socket, Transport) ->
  19. send_records(Socket, Transport, ets:select(Table, MS, 1))
  20. end.
  21. send_records(Socket, Transport, {[Rec], Cont}) ->
  22. timer:sleep(500),
  23. send_line(Socket, Transport, Rec),
  24. send_records(Socket, Transport, ets:select(Cont));
  25. send_records(_Socket, _Transport, '$end_of_table') ->
  26. ok.
  27. send_line(Socket, Transport, [Key, V1, V2]) ->
  28. Transport:send(Socket,
  29. [Key, $,, integer_to_list(V1), $,, integer_to_list(V2), $\r, $\n]).