ML-154: add early platform detection for SQLite extensions

This commit is contained in:
Claudio Ortolina
2026-04-30 13:39:39 +01:00
parent 13068aa0ac
commit 08fcd70a8c
4 changed files with 113 additions and 54 deletions
+73 -14
View File
@@ -1,25 +1,41 @@
defmodule MusicLibrary.Repo do
@moduledoc """
Main application repository using SQLite3 with FTS5 unicode and vec0 extensions.
"""
use Ecto.Repo,
otp_app: :music_library,
adapter: Ecto.Adapters.SQLite3
@doc """
Returns `:ok` if the current OS/architecture has precompiled SQLite extensions
available (unicode, vec0). Raises `RuntimeError` with a diagnostic message
including the detected platform and supported alternatives.
"""
def ensure_supported_platform! do
case platform_string() do
{:ok, _platform} -> :ok
{:error, os, arch} -> raise_unsupported_platform(os, arch)
end
end
@doc """
Returns `true` if the current OS/architecture has precompiled SQLite extensions
available (unicode, vec0).
"""
def supported_platform? do
match?({:ok, _}, platform_string())
end
@doc """
Returns the filesystem path for a named SQLite extension.
Only macOS (Intel/Apple Silicon) and Linux (amd64/arm64) are supported.
"""
def extension_path(name) do
[arch | _rest] =
:erlang.system_info(:system_architecture)
|> List.to_string()
|> String.split("-")
platform = platform_string!()
{_, os} = :os.type()
platform =
case {os, arch} do
{:darwin, "x86_64"} -> "darwin-amd64"
{:darwin, "aarch64"} -> "darwin-arm64"
{:linux, "x86_64"} -> "linux-amd64"
{:linux, "aarch64"} -> "linux-arm64"
_other -> raise "Unsupported OS or platform"
end
extension =
case os do
:darwin -> "dylib"
@@ -34,6 +50,49 @@ defmodule MusicLibrary.Repo do
])
end
defp raise_unsupported_platform(os, arch) do
raise """
Unsupported platform: #{os} / #{arch}
This application ships precompiled SQLite extensions (unicode, vec0) for:
• darwin-amd64 (macOS Intel)
• darwin-arm64 (macOS Apple Silicon)
• linux-amd64 (Linux x86_64)
• linux-arm64 (Linux aarch64)
Your platform (#{inspect(os)} / #{arch}) is not supported. The SQLite extensions
required for full-text search (unicode) and vector similarity search (vec0)
cannot be loaded on this architecture.
To run on this platform, provide compatible builds of these extensions in
priv/sqlite_extensions/#{os}-#{arch}/.
"""
end
defp platform_string! do
case platform_string() do
{:ok, platform} -> platform
{:error, _os, _arch} -> raise "Unsupported OS or platform"
end
end
defp platform_string do
[arch | _rest] =
:erlang.system_info(:system_architecture)
|> List.to_string()
|> String.split("-")
{_, os} = :os.type()
case {os, arch} do
{:darwin, "x86_64"} -> {:ok, "darwin-amd64"}
{:darwin, "aarch64"} -> {:ok, "darwin-arm64"}
{:linux, "x86_64"} -> {:ok, "linux-amd64"}
{:linux, "aarch64"} -> {:ok, "linux-arm64"}
_ -> {:error, os, arch}
end
end
def vacuum, do: query("VACUUM")
def optimize, do: query("PRAGMA optimize")