toppage_handler.erl 1.1 KB

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