Operand

_

gram: nucleus

> ./lib/duck.ex

# 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