# iex> pages |> Duck.start_link # iex> {:ok, r} = :pages |> Duck.conn |> Duckdbex.query("1+1") # iex> {:ok, r} = :pages |> Duck.conn |> Duckdbex.query("select 1 + 1;") # iex> r |> Duckdbex.fetch_all # [[2]] defmodule Duck do use GenServer # see: https://www.youtube.com/watch?v=y_b6RTes83c defp label(name), do: {:via, :gproc, {:n, :l, {:row, name}}} def start_link(name) do {:ok, db} = Duckdbex.open {:ok, conn} = Duckdbex.connection(db) GenServer.start_link(__MODULE__, [conn, db], name: label(name)) end def start_link(name, node) do {:ok, db} = Duckdbex.open(node) {:ok, conn} = Duckdbex.connection(db) GenServer.start_link(__MODULE__, [conn, db], name: label(name)) end def handle_call(:conn, pid, shape = [conn | _]), do: {:reply, conn, shape} def handle_call(:close, pid, [conn, db]) do :ok = Duckdbex.release(conn) :ok = Duckdbex.release(db) {:exit, 0} end def conn(name), do: GenServer.call(label(name), :conn) def close(name), do: GenServer.call(label(name), :close) end