Packages
postgrex
0.10.0
1.0.0-rc.1
retired
1.0.0-rc.0
retired
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.0
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.13
0.15.12
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.13.0-rc.0
0.12.2
0.12.1
0.12.0
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.2
PostgreSQL driver for Elixir
Current section
Files
Jump to
Current section
Files
lib/postgrex/result.ex
defmodule Postgrex.Result do
@moduledoc """
Result struct returned from any successful query. Its fields are:
* `command` - An atom of the query command, for example: `:select` or
`:insert`;
* `columns` - The column names;
* `rows` - The result set. A list of tuples, each tuple corresponding to a
row, each element in the tuple corresponds to a column;
* `num_rows` - The number of fetched or affected rows;
* `decoders` - List of anonymous functions to decode each column;
"""
@type t :: %__MODULE__{
command: atom,
columns: [String.t] | nil,
rows: [[term] | term] | nil,
num_rows: integer,
decoders: [(term -> term)] | nil}
defstruct [command: nil, columns: nil, rows: nil, num_rows: nil,
decoders: nil]
@doc """
Decodes a result set.
It is a no-op if the result was already decoded.
A mapper function can be given to further process
each row, in no specific order.
"""
@spec decode(t, ([term] -> term)) :: t
def decode(result_set, mapper \\ fn x -> x end)
def decode(%Postgrex.Result{decoders: nil} = res, _mapper), do: res
def decode(res, mapper) do
%Postgrex.Result{rows: rows, decoders: decoders} = res
rows = decode(rows, decoders, mapper, [])
%Postgrex.Result{res | rows: rows, decoders: nil}
end
defp decode([row | rows], decoders, mapper, decoded) do
decoded = [mapper.(decode_row(row, decoders)) | decoded]
decode(rows, decoders, mapper, decoded)
end
defp decode([], _, _, decoded), do: decoded
defp decode_row([nil | rest], [_ | decoders]) do
[nil | decode_row(rest, decoders)]
end
defp decode_row([elem | rest], [decode | decoders]) do
[decode.(elem) | decode_row(rest, decoders)]
end
defp decode_row([], []), do: []
end