Packages
electric
1.6.7
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/shape_cache/shape_status/shape_db/migrator.ex
defmodule Electric.ShapeCache.ShapeStatus.ShapeDb.Migrator do
use GenServer
alias Electric.ShapeCache.ShapeStatus.ShapeDb
require Logger
@optimization_period :timer.minutes(60)
def start_link(args) do
GenServer.start_link(__MODULE__, args)
end
@impl GenServer
def init(args) do
{:ok, stack_id} = Keyword.fetch(args, :stack_id)
exclusive_mode = Keyword.get(args, :exclusive_mode, false)
Process.set_label({:shape_db_migrator, stack_id})
Logger.metadata(stack_id: stack_id)
Electric.Telemetry.Sentry.set_tags_context(stack_id: stack_id)
Logger.notice("Shape database file: #{inspect(ShapeDb.Connection.db_path!(args))}")
with :ok <- apply_migration(stack_id, args, exclusive_mode) do
{:ok, schedule_optimize(stack_id), :hibernate}
end
end
defp apply_migration(_stack_id, _opts, true = _exclusive?) do
# In exclusive mode we *must* apply the migrations within the pool
# connection initialization because we might be using a memory db.
:ok
end
defp apply_migration(_stack_id, opts, false = _exclusive?) do
with {:ok, conn} <- ShapeDb.Connection.open(opts, integrity_check: true),
{:ok, _version} <- ShapeDb.Connection.migrate(conn, opts),
# https://sqlite.org/pragma.html#pragma_optimize
# Applications with long-lived database connections should run "PRAGMA
# optimize=0x10002" when the database connection first opens
:ok = ShapeDb.Connection.optimize(conn, "0x10002"),
:ok = ShapeDb.Connection.close(conn) do
:ok
end
end
@impl GenServer
def handle_info(:optimize, stack_id) do
ShapeDb.Connection.checkout_write!(stack_id, :optimize, fn %{conn: conn} ->
:ok = ShapeDb.Connection.optimize(conn)
end)
{:noreply, schedule_optimize(stack_id), :hibernate}
end
defp schedule_optimize(stack_id) do
Process.send_after(self(), :optimize, @optimization_period)
stack_id
end
end