Current section

Files

Jump to
monet lib transaction.ex
Raw

lib/transaction.ex

defmodule Monet.Transaction do
@moduledoc """
Created via `Monet.transaction/1` or `Monet.transaction/2`.
"""
alias __MODULE__
alias Monet.{Connection, Error, Reader, Writer}
# use a struct instead of a record so that we can pattern match it easier
defstruct [:conn]
def new(conn), do: %Transaction{conn: conn}
@doc """
Executes the query using the specific transaction
"""
def query(tx, sql, args \\ nil)
# With no arguments, we can pass this to `Connection.query/3` as-is
def query(tx, sql, args) do
# Connection.query returns {result, conn} for the pool
# we only care about the result
tx.conn |> Connection.query(sql, args) |> elem(0)
end
def commit(tx) do
conn = tx.conn
with :ok, Writer.query(conn, "commit"),
{:ok, "&4 t\n"} <- Reader.message(conn)
do
:ok
else
{:ok, data} -> {:error, Error.new(:driver, "invalid commit response", data)}
err -> err
end
end
def rollback(tx) do
conn = tx.conn
with :ok, Writer.query(conn, "rollback"),
{:ok, "&4 t\n"} <- Reader.message(conn)
do
:ok
else
{:ok, data} -> {:error, Error.new(:driver, "invalid rollback response", data)}
err -> err
end
end
end