herd_db.erl 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. -module(herd_db).
  2. -export([epgsql_res_to_json/1]).
  3. -include("herd.hrl").
  4. %%% module API
  5. -spec epgsql_res_to_json(db_select()) -> [json_obj()].
  6. epgsql_res_to_json({ok, Columns, Rows}) ->
  7. lists:map(fun(Row) -> epgsql_row_to_json(Columns, Row) end, Rows).
  8. %%% inner functions
  9. -spec epgsql_row_to_json([db_column()], db_row()) -> json_obj().
  10. epgsql_row_to_json(Columns, Row) ->
  11. KV = lists:map(
  12. fun(Index) ->
  13. {column, Name, Type, _, _, _} = lists:nth(Index, Columns),
  14. Value = epgsql_value_to_json(Type, element(Index, Row)),
  15. {Name, Value}
  16. end, lists:seq(1, length(Columns))),
  17. {KV}.
  18. -spec epgsql_value_to_json(db_type(), db_value()) -> json_value().
  19. epgsql_value_to_json(_Type, Value) when is_atom(Value);
  20. is_integer(Value);
  21. is_float(Value);
  22. is_binary(Value)
  23. -> Value;
  24. epgsql_value_to_json(time, {H, M, S}) -> H * 3600 + M * 60 + trunc(S);
  25. epgsql_value_to_json(date, Date) -> epgsql_value_to_json(timestamp, {Date, {0, 0, 0.0}});
  26. epgsql_value_to_json(timestamp, Timestamp) -> epgsql_value_to_json(timestamptz, Timestamp);
  27. epgsql_value_to_json(timestamptz, Timestamp) ->
  28. herd_datetime:datetime_to_timestamp(
  29. herd_datetime:datetime_from_db(Timestamp));
  30. epgsql_value_to_json(Type, Value) -> throw({type_not_supported, Type, Value}).