Packages

An Elixir SQLite database library utilising the rusqlite Rust crate

Current section

Files

Jump to
xqlite lib xqlite result.ex
Raw

lib/xqlite/result.ex

defmodule Xqlite.Result do
@moduledoc """
A struct representing the result of a query.
Implements the `Table.Reader` protocol, making results directly
consumable by libraries like Explorer, Kino, VegaLite, etc.
## Fields
* `:columns` — list of column name strings
* `:rows` — list of rows, each row being a list of values
* `:num_rows` — number of result rows returned
* `:changes` — number of rows modified by the last DML statement
(INSERT/UPDATE/DELETE). For SELECT queries this is 0.
"""
@enforce_keys [:columns, :rows, :num_rows]
defstruct [:columns, :rows, :num_rows, changes: 0]
@type t :: %__MODULE__{
columns: [String.t()],
rows: [[term()]],
num_rows: non_neg_integer(),
changes: non_neg_integer()
}
@doc """
Converts a raw NIF query result map into a `Xqlite.Result` struct.
"""
@spec from_map(%{columns: [String.t()], rows: [[term()]], num_rows: non_neg_integer()}) ::
t()
def from_map(%{columns: columns, rows: rows, num_rows: num_rows} = map) do
%__MODULE__{
columns: columns,
rows: rows,
num_rows: num_rows,
changes: Map.get(map, :changes, 0)
}
end
end
defimpl Table.Reader, for: Xqlite.Result do
def init(%{columns: columns, rows: rows, num_rows: num_rows}) do
{:rows, %{columns: columns, count: num_rows}, rows}
end
end