Packages
avrora
0.1.0-beta
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.2
0.24.1
0.24.0
0.23.0
0.22.0
0.21.1
0.21.0
0.20.0
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.1
0.14.0
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.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.1-beta
0.1.0-beta
An Elixir library for working with Avro messages conveniently. It supports local schema files and Confluent® schema registry.
Current section
Files
Jump to
Current section
Files
lib/aurora/storage/memory.ex
defmodule Avrora.Storage.Memory do
@moduledoc """
Fast in-memory storage of schemas with access by global id or full name.
"""
use GenServer
@behaviour Avrora.Storage
@ets_opts [
:private,
:set,
:compressed,
{:read_concurrency, true},
{:write_concurrency, true}
]
def start_link(opts \\ []) do
{name_opts, _} = Keyword.split(opts, [:name])
opts = Keyword.merge([name: __MODULE__], name_opts)
GenServer.start_link(__MODULE__, [], opts)
end
@impl true
def init(_state \\ []) do
{:ok, [table: :ets.new(nil, @ets_opts)]}
end
@impl true
def handle_cast({:put, key, value}, state) do
{:ok, table} = Keyword.fetch(state, :table)
true = :ets.insert(table, {key, value})
{:noreply, state}
end
@impl true
def handle_call({:get, key}, _from, state) do
{:ok, table} = Keyword.fetch(state, :table)
case :ets.lookup(table, key) do
[{_, value}] -> {:reply, value, state}
_ -> {:reply, nil, state}
end
end
@doc """
Retrieve a value by a given key.
## Examples
iex> {:ok, _} = Avrora.Storage.Memory.start_link()
iex> Avrora.Storage.Memory.put("my-key", %{"hello" => "world"})
{:ok, %{"hello" => "world"}}
iex> Avrora.Storage.Memory.get("my-key")
{:ok, %{"hello" => "world"}}
iex> Avrora.Storage.Memory.get("unknown-key")
{:ok, nil}
"""
@impl true
def get(key), do: get(__MODULE__, key)
@doc false
@spec get(pid() | atom(), String.t() | integer()) ::
{:ok, nil | Avrora.Schema.t()} | {:error, term()}
def get(pid, key), do: {:ok, GenServer.call(pid, {:get, key})}
@doc """
Stores a value with a given key. If the value is already exists it will be replaced.
## Examples
iex> {:ok, _} = Avrora.Storage.Memory.start_link()
iex> avro = %Avrora.Schema{id: nil, ex_schema: %AvroEx.Schema{}, raw_schema: %{"k" => "v"}}
iex> Avrora.Storage.Memory.put("my-key", avro)
{:ok, %Avrora.Schema{id: nil, ex_schema: %AvroEx.Schema{}, raw_schema: %{"k" => "v"}}}
"""
@impl true
def put(key, value), do: put(__MODULE__, key, value)
@doc false
@spec put(pid() | atom(), String.t() | integer(), Avrora.Schema.t()) ::
{:ok, Avrora.Schema.t()} | {:error, term()}
def put(pid, key, value), do: {GenServer.cast(pid, {:put, key, value}), value}
end