Packages
postgrex
0.15.1
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/parameters.ex
defmodule Postgrex.Parameters do
@moduledoc false
use GenServer
defstruct []
@type t :: %__MODULE__{}
def start_link(_) do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
end
@spec insert(%{binary => binary}) :: reference
def insert(parameters) do
GenServer.call(__MODULE__, {:insert, parameters})
end
@spec put(reference, binary, binary) :: boolean
def put(ref, name, value) do
try do
:ets.lookup_element(__MODULE__, ref, 2)
rescue
ArgumentError ->
false
else
parameters ->
parameters = Map.put(parameters, name, value)
:ets.update_element(__MODULE__, ref, {2, parameters})
end
end
@spec delete(reference) :: :ok
def delete(ref) do
GenServer.cast(__MODULE__, {:delete, ref})
end
@spec fetch(reference) :: {:ok, %{binary => binary}} | :error
def fetch(ref) do
try do
:ets.lookup_element(__MODULE__, ref, 2)
rescue
ArgumentError ->
:error
else
parameters ->
{:ok, parameters}
end
end
def init(nil) do
opts = [:public, :named_table, {:read_concurrency, true}, {:write_concurrency, true}]
state = :ets.new(__MODULE__, opts)
{:ok, state}
end
def handle_call({:insert, parameters}, {pid, _}, state) do
ref = Process.monitor(pid)
true = :ets.insert_new(state, {ref, parameters})
{:reply, ref, state}
end
def handle_cast({:delete, ref}, state) do
:ets.delete(state, ref)
{:noreply, state}
end
def handle_info({:DOWN, ref, :process, _, _}, state) do
:ets.delete(state, ref)
{:noreply, state}
end
end
defimpl DBConnection.Query, for: Postgrex.Parameters do
def parse(query, _), do: query
def describe(query, _), do: query
def encode(_, nil, _), do: nil
def decode(_, parameters, _), do: parameters
end