herd_db.erl 1.9 KB

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