Packages
postgrex
0.13.5
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/type_manager.ex
defmodule Postgrex.TypeManager do
@moduledoc false
use GenServer
def get(module, key) do
GenServer.call(__MODULE__, {:get, module, key})
end
def start_link() do
GenServer.start_link(__MODULE__, nil, [name: __MODULE__])
end
def init(nil) do
{:ok, {%{}, %{}}}
end
def handle_call({:get, module, key}, {pid, _}, {keys, mons} = state) do
key = {module, key}
case keys do
%{^key => server} ->
{:reply, server, state}
%{} ->
{:ok, server} = Postgrex.TypeSupervisor.start_server(module, pid)
mref = Process.monitor(server)
state = {Map.put(keys, key, server), Map.put(mons, mref, key)}
{:reply, server, state}
end
end
def handle_info({:DOWN, mref, _, _, _}, {keys, mons}) do
{key, mons} = Map.pop(mons, mref)
state = {Map.delete(keys, key), mons}
{:noreply, state}
end
end