Skip to content

Instantly share code, notes, and snippets.

@elbow-jason
Forked from joshnuss/mnesia.exs
Last active August 29, 2015 14:17
Show Gist options
  • Save elbow-jason/b96e48e31d3e04ee5fd2 to your computer and use it in GitHub Desktop.
Save elbow-jason/b96e48e31d3e04ee5fd2 to your computer and use it in GitHub Desktop.
# define a record, first attribute is considered the key
defrecord User, email: "", first: "", last: ""
# encapsulates mnesia calls
defmodule Database do
def create_schema do
create_table User
end
def find(record, id) do
:mnesia.read(record, id)
end
def write(object) do
:mnesia.write(object)
end
def delete(user=User[]), do: nil # dont allow deleting user
def delete(object) do # everything else ok to delete :)
:mnesia.delete_object(object)
end
defp create_table(record) do
:mnesia.create_table record, [{:attributes, Dict.keys(record.__record__(:fields))}]
end
end
# start the database
:mnesia.start
# create the User table
Database.create_schema
# insert records
{:atomic, :ok} = :mnesia.transaction fn ->
Database.write(User.new(email: "jsmith1@home.com", first: "John", last: "Smith"))
Database.write(User.new(email: "jsmith2@home.com", first: "Jane", last: "Smith"))
end
# read a record by key
{:atomic, user} = :mnesia.transaction fn ->
Database.find(User, "jsmith1@home.com")
end
IO.puts("Found user #{inspect user}")
# delete the user
:mnesia.transaction fn ->
Database.delete(user)
end
# query with qlc. finds all users with last name == "Smith"
{:atomic, users} = :mnesia.transaction fn ->
query = :qlc.q(lc u inlist :mnesia.table(User), u.last == "Smith", do: u)
:qlc.e(query)
end
IO.puts("Found results #{inspect users}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment