78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
defmodule Mix.Tasks.Ecto.Create do
 | 
						|
  use Mix.Task
 | 
						|
  import Mix.Ecto
 | 
						|
 | 
						|
  @shortdoc "Creates the repository storage"
 | 
						|
 | 
						|
  @switches [
 | 
						|
    quiet: :boolean,
 | 
						|
    repo: [:string, :keep],
 | 
						|
    no_compile: :boolean,
 | 
						|
    no_deps_check: :boolean
 | 
						|
  ]
 | 
						|
 | 
						|
  @aliases [
 | 
						|
    r: :repo,
 | 
						|
    q: :quiet
 | 
						|
  ]
 | 
						|
 | 
						|
  @moduledoc """
 | 
						|
  Create the storage for the given repository.
 | 
						|
 | 
						|
  The repositories to create are the ones specified under the
 | 
						|
  `:ecto_repos` option in the current app configuration. However,
 | 
						|
  if the `-r` option is given, it replaces the `:ecto_repos` config.
 | 
						|
 | 
						|
  Since Ecto tasks can only be executed once, if you need to create
 | 
						|
  multiple repositories, set `:ecto_repos` accordingly or pass the `-r`
 | 
						|
  flag multiple times.
 | 
						|
 | 
						|
  ## Examples
 | 
						|
 | 
						|
      $ mix ecto.create
 | 
						|
      $ mix ecto.create -r Custom.Repo
 | 
						|
 | 
						|
  ## Command line options
 | 
						|
 | 
						|
    * `-r`, `--repo` - the repo to create
 | 
						|
    * `--quiet` - do not log output
 | 
						|
    * `--no-compile` - do not compile before creating
 | 
						|
    * `--no-deps-check` - do not compile before creating
 | 
						|
 | 
						|
  """
 | 
						|
 | 
						|
  @impl true
 | 
						|
  def run(args) do
 | 
						|
    repos = parse_repo(args)
 | 
						|
    {opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
 | 
						|
 | 
						|
    Enum.each(repos, fn repo ->
 | 
						|
      ensure_repo(repo, args)
 | 
						|
 | 
						|
      ensure_implements(
 | 
						|
        repo.__adapter__(),
 | 
						|
        Ecto.Adapter.Storage,
 | 
						|
        "create storage for #{inspect(repo)}"
 | 
						|
      )
 | 
						|
 | 
						|
      case repo.__adapter__().storage_up(repo.config()) do
 | 
						|
        :ok ->
 | 
						|
          unless opts[:quiet] do
 | 
						|
            Mix.shell().info("The database for #{inspect(repo)} has been created")
 | 
						|
          end
 | 
						|
 | 
						|
        {:error, :already_up} ->
 | 
						|
          unless opts[:quiet] do
 | 
						|
            Mix.shell().info("The database for #{inspect(repo)} has already been created")
 | 
						|
          end
 | 
						|
 | 
						|
        {:error, term} when is_binary(term) ->
 | 
						|
          Mix.raise("The database for #{inspect(repo)} couldn't be created: #{term}")
 | 
						|
 | 
						|
        {:error, term} ->
 | 
						|
          Mix.raise("The database for #{inspect(repo)} couldn't be created: #{inspect(term)}")
 | 
						|
      end
 | 
						|
    end)
 | 
						|
  end
 | 
						|
end
 |