Packages
pillar
0.16.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.1
0.34.0
0.33.1
0.33.0
0.32.0
0.31.0
0.30.0
0.29.1
0.29.0
0.28.0
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
Elixir client for ClickHouse, a fast open-source Online Analytical Processing (OLAP) database management system.
Current section
Files
Jump to
Current section
Files
lib/pillar.ex
defmodule Pillar do
@moduledoc false
alias Pillar.Connection
alias Pillar.HttpClient
alias Pillar.QueryBuilder
alias Pillar.ResponseParser
@default_timeout_ms 5_000
def insert(%Connection{} = connection, query, params \\ %{}, options \\ %{}) do
final_sql = QueryBuilder.build(query, params)
timeout = Map.get(options, :timeout, @default_timeout_ms)
execute_sql(connection, final_sql, timeout)
end
def query(%Connection{} = connection, query, params \\ %{}, options \\ %{}) do
final_sql = QueryBuilder.build(query, params)
timeout = Map.get(options, :timeout, @default_timeout_ms)
execute_sql(connection, final_sql, timeout)
end
def select(%Connection{} = connection, query, params \\ %{}, options \\ %{}) do
final_sql = QueryBuilder.build(query, params) <> "\n FORMAT JSON"
timeout = Map.get(options, :timeout, @default_timeout_ms)
execute_sql(connection, final_sql, timeout)
end
defp execute_sql(connection, final_sql, timeout) do
connection
|> Connection.url_from_connection()
|> HttpClient.post(final_sql, timeout: timeout)
|> ResponseParser.parse()
end
defmacro __using__(
connection_strings: connection_strings,
name: name,
pool_size: pool_size
) do
quote do
use GenServer
import Supervisor.Spec
@pool_timeout_for_waiting_worker 5_000
defp poolboy_config do
[
name: {:local, unquote(name)},
worker_module: Pillar.Pool.Worker,
size: unquote(pool_size),
max_overflow: Kernel.ceil(unquote(pool_size) * 0.3)
]
end
def start_link(_opts \\ nil) do
children = [
:poolboy.child_spec(:worker, poolboy_config(), unquote(connection_strings))
]
opts = [strategy: :one_for_one, name: :"#{unquote(name)}.Supervisor"]
Supervisor.start_link(children, opts)
end
def init(init_arg) do
{:ok, init_arg}
end
def select(sql, params \\ %{}, options \\ %{}) do
:poolboy.transaction(
unquote(name),
fn pid -> GenServer.call(pid, {:select, sql, params, options}, :infinity) end,
@pool_timeout_for_waiting_worker
)
end
def query(sql, params \\ %{}, options \\ %{}) do
:poolboy.transaction(
unquote(name),
fn pid -> GenServer.call(pid, {:query, sql, params, options}, :infinity) end,
@pool_timeout_for_waiting_worker
)
end
def async_query(sql, params \\ %{}, options \\ %{}) do
:poolboy.transaction(
unquote(name),
fn pid -> GenServer.cast(pid, {:query, sql, params, options}) end,
@pool_timeout_for_waiting_worker
)
end
def insert(sql, params \\ %{}, options \\ %{}) do
:poolboy.transaction(
unquote(name),
fn pid -> GenServer.call(pid, {:insert, sql, params, options}, :infinity) end,
@pool_timeout_for_waiting_worker
)
end
def async_insert(sql, params \\ %{}, options \\ %{}) do
:poolboy.transaction(
unquote(name),
fn pid -> GenServer.cast(pid, {:insert, sql, params, options}) end,
@pool_timeout_for_waiting_worker
)
end
end
end
end