hi, i’m trying to “init” or “setup” default mnesia database for my application with mix task, here my mix task
defmodule Mix.Tasks.Database do
use Mix.Task
@shortdoc "Init Database"
def run(_) do
:net_kernel.start([:danilla@master, :shortnames])
:mnesia.start()
:mnesia.create_schema([node()])
IO.puts("Creating tables ...")
case :mnesia.create_table(Users,
attributes: [:username, :password, :tfa_key, :tfa_used],
disc_copies: [node()]
) do
{:atomic, :ok} ->
IO.puts("Users table created successfully !")
{:aborted, {:already_exists, Users}} ->
IO.puts("Users table already exist !")
{:aborted, {:bad_type, Users, :disc_copies, :danilla@master}} ->
IO.puts("Error, disc_copies failed")
_ ->
IO.puts("Unknown Error !")
end
case :mnesia.create_table(Secrets,
attributes: [:id, :type, :value],
disc_copies: [node()]
) do
{:atomic, :ok} ->
IO.puts("Secrets table created successfully !")
{:aborted, {:already_exists, Secrets}} ->
IO.puts("Secrets table already exist !")
{:aborted, {:bad_type, Secrets, :disc_copies, :danilla@master}} ->
IO.puts("Error, disc_copies failed")
_ ->
IO.puts("Unknown Error !")
end
# in iex `:mnesia.dirty_read({Users, "admin"})` return []
case :mnesia.dirty_read({Users, "admin"}) do
{:aborted, {:no_exists, [Users, "admin"]}} ->
tfa_secret = random_string(12)
case :mnesia.dirty_write({Users, "admin", "$2b$06$YChCKP6dY3R1zysxIRC8peB2rxqTT0b15r.K1PxLyCGVjdu6AuGku", tfa_secret, false}) do
:ok ->
IO.puts("Default user has been created !")
_ ->
IO.puts("Unknown Error !")
end
_ ->
IO.puts ("Unknown Error !")
end
:mnesia.stop()
end
def random_string(length) do
:crypto.strong_rand_bytes(length) |> Base.url_encode64 |> binary_part(0, length)
end
end
what i need is to create :
- a mnesia that save the data to disk
- same error that like execution in iex
some error that i found :
Creating tables ...
Error, disc_copies failed
Error, disc_copies failed
** (exit) {:aborted, {:no_exists, [Users, "admin"]}}
(mnesia) mnesia.erl:355: :mnesia.abort/1
lib/mix/tasks/database.ex:48: Mix.Tasks.Database.run/1
(mix) lib/mix/task.ex:331: Mix.Task.run_task/3
(mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2
(elixir) lib/code.ex:767: Code.require_file/2