Packages
elixium_core
0.4.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.1
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
The core package for the Elixium blockchain, containing all the modules needed to run the chain
Current section
Files
Jump to
Current section
Files
lib/store/oracle.ex
defmodule Elixium.Store.Oracle do
use GenServer
@moduledoc """
Responsible for reading and writing to a given store on behalf
of other processes. This fixes the issue with LevelDB not allowing
multiple processes read / write to a store at the same time.
"""
@doc """
Start an oracle to interface with a given module. Running an oracle with a
store will cause it to lock down the store, and no other process will be
able to communicate with it until the oracle has died.
"""
@spec start_link(atom) :: {:ok, pid} | {:error, String.t()}
def start_link(store) do
GenServer.start_link(__MODULE__, store, name: String.to_atom("#{store}Oracle"))
end
def init(store_ref) do
{:ok, store_ref}
end
def handle_call({function, options}, _from, store) do
response_from_store = apply(store, function, options)
{:reply, response_from_store, store}
end
@doc """
Call a method on the store module of a given oracle. Takes in a reference
to a started oracle process, and a tuple with the method name, and a list of
options to pass to the method. E.g. Oracle.inquire(oracle, {:load_known_peers, []})
"""
@spec inquire(pid, tuple) :: any()
def inquire(pid, options) do
GenServer.call(pid, options)
end
end