1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- -module(herd_db).
- -export([epgsql_res_to_json/1]).
- -type(json_key() :: atom() | binary()).
- -type(json_value() :: atom() | integer() | float() | binary() | json_obj() | [json_value()]).
- -type(json_obj() :: {[{json_key(), json_value()}]}).
- -type(db_name() :: binary()).
- -type(db_type() :: atom()).
- -type(db_value() :: term()).
- -type(db_row() :: tuple()).
- -type(db_column() :: {column, db_name(), db_type(), term(), term(), term()}).
- -type(db_select() :: {ok, [db_column()], [db_row()]}).
- %%% module API
- -spec epgsql_res_to_json(db_select()) -> [json_obj()].
- epgsql_res_to_json({ok, Columns, Rows}) ->
- lists:map(fun(Row) -> epgsql_row_to_json(Columns, Row) end, Rows).
- %%% inner functions
- -spec epgsql_row_to_json([db_column()], db_row()) -> json_obj().
- epgsql_row_to_json(Columns, Row) ->
- KV = lists:map(
- fun(Index) ->
- {column, Name, Type, _, _, _} = lists:nth(Index, Columns),
- Value = epgsql_value_to_json(Type, element(Index, Row)),
- {Name, Value}
- end, lists:seq(1, length(Columns))),
- {KV}.
- -spec epgsql_value_to_json(db_type(), db_value()) -> json_value().
- epgsql_value_to_json(_Type, Value) when is_atom(Value);
- is_integer(Value);
- is_float(Value);
- is_binary(Value);
- is_list(Value)
- -> Value;
- epgsql_value_to_json(time, {H, M, S}) -> H * 3600 + M * 60 + trunc(S);
- epgsql_value_to_json(date, Date) -> epgsql_value_to_json(timestamp, {Date, {0, 0, 0.0}});
- epgsql_value_to_json(timestamp, Timestamp) -> epgsql_value_to_json(timestamptz, Timestamp);
- epgsql_value_to_json(timestamptz, Timestamp) ->
- herd_datetime:datetime_to_timestamp(
- herd_datetime:datetime_from_db(Timestamp));
- epgsql_value_to_json(Type, Value) -> throw({type_not_supported, Type, Value}).
|