Packages

SQL provides state-of-the-art, high-performance SQL integration for Elixir, built to handle extreme concurrency with unmatched expressiveness and ergonomic query composition. Write safe, composable, parameterized queries directly, without translating to Ecto or any ORM.

Current section

Files

Jump to
sql lib mix tasks compile sql.ex
Raw

lib/mix/tasks/compile/sql.ex

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: 2025 DBVisor
defmodule Mix.Tasks.Compile.Sql do
@moduledoc """
A SQL compiler for sql files.
You must add it to your `mix.exs` as:
compilers: [:sql] ++ Mix.compilers()
"""
use Mix.Task.Compiler
@doc false
def run(_args) do
Mix.Task.Compiler.after_compiler(:elixir, fn
{:noop, diagnostics} ->
{:noop, diagnostics}
{status, diagnostics} ->
compile()
{status, diagnostics}
end)
end
def compile(files \\ files(), sql_files \\ [])
def compile([path|rest], sql_files) do
case {File.dir?(path), String.ends_with?(path, ".sql")} do
{true, false} -> compile(rest, compile(files(path), sql_files))
{false, true} -> compile(rest, [{path, do_compile(path)}|sql_files])
{false, false} -> compile(rest, sql_files)
end
end
def compile([], sql_files), do: sql_files
def do_compile(path) do
{:ok, context, tokens} = SQL.Lexer.lex(File.read!(path), path)
{:ok, context, tokens} = SQL.Parser.parse(tokens, context)
SQL.__inspect__(tokens, context, {nil, nil, 0, [file: Path.relative_to_cwd(path), line: 1]})
end
def files(path \\ File.cwd!) do
for file <- File.ls!(path), do: Path.join(path, file)
end
end