Packages
postgrex
1.0.0-rc.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
Retired package: Release invalid - Superseded by v0.13.0-rc.0
Current section
Files
Jump to
Current section
Files
lib/postgrex/extension.ex
defmodule Postgrex.Extension do
@moduledoc """
An extension knows how to encode and decode Postgres types to and from Elixir
values. Custom extensions can be enabled using the `:extension` option in
`Postgrex.start_link/1`.
For example to support label trees using the text encoding format:
defmodule MyApp.LTree do
@behaviour Postgrex.Extension
# It can be memory efficient to copy the decoded binary because a
# reference counted binary that points to a larger binary will be passed
# to the decode/4 callback. Copying the binary can allow the larger
# binary to be garbage collected sooner if the copy is going to be kept
# for a longer period of time. See `:binary.copy/1` for more
# information.
def init(_parameters, opts) when opts in [:reference, :copy], do: opts
# Use this extension when `type` from %Postgrex.TypeInfo{} is "ltree"
def matching(_opts), do: [type: "ltree"]
def format(_opts), do: :text
# Use a string that is the same as postgres's ltree text format
def encode(_type_info, bin, _types, _opts) when is_binary(bin), do: bin
def decode(_type_info, bin, _types, :reference), do: bin
def decode(_type_info, bin, _types, :copy), do: :binary.copy(bin)
end
This example is enabled with
`Postgrex.start_link([extensions: [{MyApp.LTree, :copy}]])`.
"""
alias Postgrex.Types
alias Postgrex.TypeInfo
@type t :: module
@type opts :: term
@doc """
Should perform any initialization of the extension. The function receives the
server parameters (http://www.postgresql.org/docs/9.4/static/runtime-config.html)
and user options. The options returned from this function will be passed to
all other callbacks.
"""
@callback init(Map.t, term) :: opts
@doc """
Specifies the types the extension matches, see `Postgrex.TypeInfo` for
specification of the fields.
"""
@callback matching(opts) :: [type: String.t,
send: String.t,
receive: String.t,
input: String.t,
output: String.t]
@doc """
Returns the format the type should be encoded as. See
http://www.postgresql.org/docs/9.4/static/protocol-overview.html#PROTOCOL-FORMAT-CODES.
"""
@callback format(opts) :: :binary | :text
@doc """
Should encode an Elixir value to a binary in the specified Postgres protocol
format.
"""
@callback encode(TypeInfo.t, term, Types.types, opts) :: iodata
@doc """
Should decode a binary in the specified Postgres protocol format to an Elixir
value.
"""
@callback decode(TypeInfo.t, binary, Types.types, opts) :: term
end