Current section

Files

Jump to
tds lib tds.ex
Raw

lib/tds.ex

defmodule Tds do
alias Tds.Query
@timeout 5000
@execution_mode :prepare_execute
def start_link(opts \\ []) do
DBConnection.start_link(Tds.Protocol, default(opts))
end
def query(pid, statement, params, opts \\ []) do
query = %Query{statement: statement}
opts = Keyword.put_new(opts, :parameters, params)
case DBConnection.prepare_execute(pid, query, params, opts) do
{:ok, _query, result} -> {:ok, result}
{:error, err} -> {:error, err}
end
end
def query!(pid, statement, params, opts \\ []) do
query = %Query{statement: statement}
opts = Keyword.put_new(opts, :parameters, params)
case DBConnection.prepare_execute(pid, query, params, opts) do
{:ok, _query, result} -> result
{:error, %{mssql: %{msg_text: msg}}} -> raise Tds.Error, msg
{:error, err} -> raise err
end
end
def prepare(pid, statement, opts \\ []) do
query = %Query{statement: statement}
case DBConnection.prepare(pid, query, opts) do
{:ok, query} -> {:ok, query}
{:error, err} -> {:error, err}
end
end
def prepare!(pid, statement, opts \\ []) do
query = %Query{statement: statement}
case DBConnection.prepare(pid, query, opts) do
{:ok, query} -> query
{:error, %{mssql: %{msg_text: msg}}} -> raise Tds.Error, msg
{:error, err} -> raise err
end
end
def execute(pid, query, params, opts \\ []) do
case DBConnection.execute(pid, query, params, opts) do
{:ok, q, result} -> {:ok, q, result}
{:error, err} -> {:error, err}
end
end
def execute!(pid, query, params, opts \\ []) do
case DBConnection.execute(pid, query, params, opts) do
{:ok, _q, result} -> result
{:error, %{mssql: %{msg_text: msg}}} -> raise Tds.Error, msg
{:error, err} -> raise err
end
end
def close(pid, query, opts \\ []) do
case DBConnection.close(pid, query, opts) do
{:ok, result} -> {:ok, result}
{:error, err} -> {:error, err}
end
end
def close!(pid, query, opts \\ []) do
case DBConnection.close(pid, query, opts) do
{:ok, result} -> result
{:error, %{mssql: %{msg_text: msg}}} -> raise Tds.Error, msg
{:error, err} -> raise err
end
end
def transaction(pid, fun, opts \\ []) do
DBConnection.transaction(pid, fun, opts)
end
@spec rollback(DBConnection.t(), reason :: any) :: no_return
defdelegate rollback(conn, any), to: DBConnection
def child_spec(opts) do
DBConnection.child_spec(Tds.Protocol, default(opts))
end
defp default(opts) do
opts
|> Keyword.put_new(:idle_timeout, @timeout)
|> Keyword.put_new(:execution_mode, @execution_mode)
end
@doc """
Returns the configured JSON library.
To customize the JSON library, include the following in your `config/config.exs`:
config :myxql, json_library: SomeJSONModule
Defaults to `Jason`.
"""
@spec json_library() :: module()
def json_library() do
Application.fetch_env!(:tds, :json_library)
end
@doc """
Generates a version 4 (random) UUID in the MS uniqueidentifier binary format.
"""
@spec generate_uuid :: <<_::128>>
def generate_uuid(), do: Tds.Types.UUID.bingenerate()
@doc """
Decodes MS uniqueidentifier binary to its string representation
"""
def decode_uuid(uuid), do: Tds.Types.UUID.load(uuid)
@doc """
Same as `decode_uuid/1` but raises `ArgumentError` if value is invalid
"""
def decode_uuid!(uuid) do
case Tds.Types.UUID.load(uuid) do
{:ok, value} -> value
:error ->
raise ArgumentError, "Invalid uuid binary #{inspect(uuid)}"
end
end
@doc """
Encodes uuid string into MS uniqueidentifier binary
"""
@spec encode_uuid(any) :: :error | {:ok, <<_::128>>}
def encode_uuid(value), do: Tds.Types.UUID.dump(value)
@doc """
Same as `encode_uuid/1` but raises `ArgumentError` if value is invalid
"""
@spec encode_uuid!(any) :: <<_::128>>
def encode_uuid!(value), do: Tds.Types.UUID.dump!(value)
end