Current section
Files
Jump to
Current section
Files
lib/cassandra.ex
defmodule Cassandra do
@moduledoc """
Is a helper to create a session on a Cassandra cluster
## Example
```elixir
defmodule Repo do
use Cassandra, keyspace: "test"
end
# Start the repo
{:ok, _} = Repo.start_link
# Execute statements
{:ok, rows} = Repo.execute("SELECT * FROM users;")
```
"""
use Application
use Supervisor
alias Cassandra.{Cluster, Session}
defmacro __using__(opts \\ []) do
quote do
use Supervisor
@cluster __MODULE__.Cassandra.Cluster
@session __MODULE__.Cassandra.Session
@cache __MODULE__.Cassandra.Session.Cache
@connection_manager __MODULE__.Cassandra.Session.ConnectionManager
def start_link(options \\ []) do
Supervisor.start_link(__MODULE__, options)
end
def init(options) do
opts = unquote(opts)
config = case Keyword.fetch(opts, :otp_app) do
{:ok, app} -> Application.get_env(app, __MODULE__, [])
:error -> opts
end
options =
options
|> Keyword.merge(config)
|> Keyword.merge([
cluster: @cluster,
session: @session,
cache: @cache,
connection_manager: @connection_manager,
])
children = [
worker(Cluster, [options]),
supervisor(Session, [@cluster, options]),
]
supervise(children, strategy: :rest_for_one)
end
def execute(query, options \\ []) do
Session.execute(@session, query, options)
end
def run_stream(query, func, options \\ []) do
Session.run_stream(@session, query, func, options)
end
end
end
### Application Callbacks ###
def start(_type, options) do
Supervisor.start_link(__MODULE__, options)
end
### Supervisor Callbacks ###
def init(_options) do
children = [
worker(Cassandra.UUID, []),
]
supervise(children, strategy: :one_for_one)
end
end