Krug.DistributedMnesia (Krug v1.1.18) View Source

Utilitary module to handle Erlang Mnesia Database. Mnesia Database has single instance mode and also distributed mode that is purpose of this module. Single instance way don't allow us to improve horizontal scalability when we need.

Link to this section Summary

Functions

Removes all object entries from "table_name". Return true or false.

Almost the same that "init_cluster". The diference is that cluster_ips will be calculated to be all range of machine local network according the network mask range (/16 or /24).

Retrieves an object identified by "id_row" from "table_name". Return the registry entry or nil.

Stores an object "data_row" identified by "id_row" on "table_name". Return true or false.

Link to this section Functions

Removes all object entries from "table_name". Return true or false.

Requires mnesia already be started.

If you wish you application be able to scalabity then should be used

init_cluster(cluster_name,cluster_ips,ips_separator,disc_copies,tables)

function on application startup.

Link to this function

init_auto_cluster(cluster_name, cluster_cookie, disc_copies \\ false, tables \\ [])

View Source

Almost the same that "init_cluster". The diference is that cluster_ips will be calculated to be all range of machine local network according the network mask range (/16 or /24).

Link to this function

init_cluster(cluster_name, cluster_cookie, cluster_ips, ips_separator \\ "|", disc_copies \\ false, tables \\ [])

View Source

Start the distributed mnesia cluster. To be used on application start.

Example

defmodule <Your_App_Main_Module_Name>.Application do

  @moduledoc false

  use Application

  alias Krug.DistributedMnesia


  def start(_type, _args) do
    Supervisor.start_link(children(), opts())
  end

  defp children() do
      [
        ...
        <Your_App_Main_Module_Name>.DistributedMnesiaTaskStarter, # calls Krug.DistributedMnesia.init_cluster(...)
        ...
      ]
  end

  defp opts() do 
      [strategy: :one_for_one, name: <Your_App_Main_Module_Name>.Supervisor]
  end 
  
end
defmodule <Your_App_Main_Module_Name>.DistributedMnesiaConfigTaskStarter do
  def child_spec(opts) do
    %{id: __MODULE__,start: {__MODULE__, :start_link, [opts]}}
  end

  def start_link(opts) do
    Supervisor.start_link([{<Your_App_Main_Module_Name>.DistributedMnesiaConfigTask,opts}], strategy: :one_for_one)
  end
end
defmodule <Your_App_Main_Module_Name>.DistributedMnesiaConfigTask do

  use Task
  alias Krug.DistributedMnesia

  def start_link(opts) do
    Task.start_link(__MODULE__, :run, [opts])
  end

  def run(_opts) do
    cluster_cookie = "echo"
    cluster_name = "echo"
    cluster_ips = "192.168.1.12X "
    ips_separator = "X" 
    tables = [
      %{
         table_name: :users, 
         table_attributes: [:id, :name, :email, :last_access] 
      },
      %{
         table_name: log, 
         table_attributes: [:id, :user_id, :action, :date_time] 
      },
    ]  
  
    cluster_name
      |> DistributedMnesia.init_cluster(cluster_cookie,cluster_ips,ips_separator,true,tables)
  end

end

disc_copies: true for ":disc_copies" (ram + disc), false for ":ram_copies" (only ram).

tables: list of map table configurations

%{
  table_name: :users, # atom
  table_attributes: [:id, :name, :email] # atom list | the first element is the "id_row" value/column
}

.

connected_nodes: list (of atom) nodes already connected in a erlang cluster.

Link to this function

load(table_name, id_row)

View Source

Retrieves an object identified by "id_row" from "table_name". Return the registry entry or nil.

Requires mnesia already be started.

If you wish you application be able to scalabity then should be used

init_cluster(cluster_name,cluster_ips,ips_separator,disc_copies,tables)

function on application startup.

Link to this function

store(table_name, id_row, data_row)

View Source

Stores an object "data_row" identified by "id_row" on "table_name". Return true or false.

Requires mnesia already be started.

If you wish you application be able to scalabity then should be used

init_cluster(cluster_name,cluster_ips,ips_separator,disc_copies,tables)

function on application startup.