lib/hanami/cli/commands/app/db/utils/mysql.rb in hanami-cli-2.2.0.beta1 vs lib/hanami/cli/commands/app/db/utils/mysql.rb in hanami-cli-2.2.0.beta2
- old
+ new
@@ -9,21 +9,74 @@
module DB
module Utils
# @api private
class Mysql < Database
# @api private
- def create_command
- raise Hanami::CLI::NotImplementedError
+ def exec_create_command
+ return true if exists?
+
+ exec_cli("mysql", %(-e "CREATE DATABASE #{escaped_name}"))
end
# @api private
+ # @since 2.2.0
+ def exec_drop_command
+ return true unless exists?
+
+ exec_cli("mysql", %(-e "DROP DATABASE #{escaped_name}"))
+ end
+
+ # @api private
+ # @since 2.2.0
+ def exists?
+ result = exec_cli("mysql", %(-e "SHOW DATABASES LIKE '#{name}'" --batch))
+
+ result.successful? && result.out != ""
+ end
+
+ # @api private
+ # @since 2.2.0
def exec_dump_command
- raise Hanami::CLI::NotImplementedError
+ exec_cli(
+ "mysqldump",
+ "--no-data --routines --skip-comments --result-file=#{structure_file} #{escaped_name}"
+ )
end
# @api private
+ # @since 2.2.0
def exec_load_command
- raise Hanami::CLI::NotImplementedError
+ exec_cli(
+ "mysql",
+ %(--execute "SET FOREIGN_KEY_CHECKS = 0; SOURCE #{structure_file}; SET FOREIGN_KEY_CHECKS = 1" --database #{escaped_name})
+ )
+ end
+
+ private
+
+ def escaped_name
+ Shellwords.escape(name)
+ end
+
+ def exec_cli(cli_name, cli_args)
+ system_call.call(
+ "#{cli_name} #{cli_options} #{cli_args}",
+ env: cli_env_vars
+ )
+ end
+
+ def cli_options
+ [].tap { |opts|
+ opts << "--host=#{Shellwords.escape(database_uri.host)}" if database_uri.host
+ opts << "--port=#{Shellwords.escape(database_uri.port)}" if database_uri.port
+ opts << "--user=#{Shellwords.escape(database_uri.user)}" if database_uri.user
+ }.join(" ")
+ end
+
+ def cli_env_vars
+ @cli_env_vars ||= {}.tap do |vars|
+ vars["MYSQL_PWD"] = database_uri.password.to_s if database_uri.password
+ end
end
end
end
end
end