lib/exqlite/basic.ex

defmodule Exqlite.Basic do
  @moduledoc """
  A very basis API without lots of options to allow simpler usage for basic needs.
  """

  alias Exqlite.Connection
  alias Exqlite.Query
  alias Exqlite.Sqlite3
  alias Exqlite.Error
  alias Exqlite.Result

  def open(path) do
    Connection.connect(database: path)
  end

  def close(conn = %Connection{}) do
    with :ok <- Sqlite3.close(conn.db) do
      :ok
    else
      {:error, reason} -> {:error, %Error{message: reason}}
    end
  end

  def exec(conn = %Connection{}, stmt, args \\ []) do
    %Query{statement: stmt} |> Connection.handle_execute(args, [], conn)
  end

  def rows(exec_result) do
    case exec_result do
      {:ok, %Query{}, %Result{rows: rows, columns: columns}, %Connection{}} ->
        {:ok, rows, columns}

      {:error, %Error{message: message}, %Connection{}} ->
        {:error, message}
    end
  end

  def load_extension(conn, path) do
    exec(conn, "select load_extension(?)", [path])
  end

  def enable_load_extension(conn) do
    Sqlite3.enable_load_extension(conn.db, true)
  end

  def disable_load_extension(conn) do
    Sqlite3.enable_load_extension(conn.db, false)
  end
end