defmodule EventStore.Tasks.Init do @moduledoc """ Task to initalize the EventStore database """ import EventStore.Tasks.Output alias EventStore.Storage.Initializer @is_events_table_exists """ SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'events' ) """ @doc """ Runs task ## Parameters - config: the parsed EventStore config ## Opts - is_mix: set to `true` if running as part of a Mix task - quiet: set to `true` to silence output """ def exec(config, opts) do opts = Keyword.merge([is_mix: false, quiet: false], opts) conn_opts = [pool: EventStore.Config.get_pool()] {:ok, conn} = Postgrex.start_link(config) case run_query(conn, @is_events_table_exists, conn_opts) do %{rows: [[true]]} -> write_info("The EventStore database has already been initialized.", opts) %{rows: [[false]]} -> Initializer.run!(conn, conn_opts) write_info("The EventStore database has been initialized.", opts) end true = Process.unlink(conn) true = Process.exit(conn, :shutdown) :ok end defp run_query(conn, query, opts) do Postgrex.query!(conn, query, [], opts) end end