class ActiveRecord::Tasks::MySQLDatabaseTasks
:nodoc:
:nodoc:
def charset
def charset connection.charset end
def collation
def collation connection.collation end
def configuration
def configuration @configuration end
def configuration_without_database
def configuration_without_database configuration.merge('database' => nil) end
def create
def create establish_connection configuration_without_database connection.create_database configuration['database'], creation_options establish_connection configuration rescue ActiveRecord::StatementInvalid => error if /database exists/ === error.message raise DatabaseAlreadyExists else raise end rescue error_class => error if error.respond_to?(:errno) && error.errno == ACCESS_DENIED_ERROR $stdout.print error.error establish_connection root_configuration_without_database connection.create_database configuration['database'], creation_options if configuration['username'] != 'root' connection.execute grant_statement.gsub(/\s+/, ' ').strip end establish_connection configuration else $stderr.puts "Couldn't create database for #{configuration.inspect}, #{creation_options.inspect}" $stderr.puts "(If you set the charset manually, make sure you have a matching collation)" if configuration['encoding'] end end
def creation_options
def creation_options Hash.new.tap do |options| options[:charset] = configuration['encoding'] if configuration.include? 'encoding' options[:collation] = configuration['collation'] if configuration.include? 'collation' # Set default charset only when collation isn't set. options[:charset] ||= DEFAULT_CHARSET unless options[:collation] # Set default collation only when charset is also default. options[:collation] ||= DEFAULT_COLLATION if options[:charset] == DEFAULT_CHARSET end end
def drop
def drop establish_connection configuration connection.drop_database configuration['database'] end
def error_class
def error_class if configuration['adapter'] =~ /jdbc/ require 'active_record/railties/jdbcmysql_error' ArJdbcMySQL::Error elsif defined?(Mysql2) Mysql2::Error elsif defined?(Mysql) Mysql::Error else StandardError end end
def grant_statement
def grant_statement <<-SQL ALL PRIVILEGES ON #{configuration['database']}.* #{configuration['username']}'@'localhost' FIED BY '#{configuration['password']}' WITH GRANT OPTION; SQL end
def initialize(configuration)
def initialize(configuration) @configuration = configuration end
def prepare_command_options(command)
def prepare_command_options(command) args = [command] args.concat(['--user', configuration['username']]) if configuration['username'] args << "--password=#{configuration['password']}" if configuration['password'] args.concat(['--default-character-set', configuration['encoding']]) if configuration['encoding'] configuration.slice('host', 'port', 'socket').each do |k, v| args.concat([ "--#{k}", v ]) if v end args end
def purge
def purge establish_connection :test connection.recreate_database configuration['database'], creation_options end
def root_configuration_without_database
def root_configuration_without_database configuration_without_database.merge( 'username' => 'root', 'password' => root_password ) end
def root_password
def root_password $stdout.print "Please provide the root password for your mysql installation\n>" $stdin.gets.strip end
def structure_dump(filename)
def structure_dump(filename) args = prepare_command_options('mysqldump') args.concat(["--result-file", "#{filename}"]) args.concat(["--no-data"]) args.concat(["#{configuration['database']}"]) unless Kernel.system(*args) $stderr.puts "Could not dump the database structure. "\ "Make sure `mysqldump` is in your PATH and check the command output for warnings." end end
def structure_load(filename)
def structure_load(filename) args = prepare_command_options('mysql') args.concat(['--execute', %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}]) args.concat(["--database", "#{configuration['database']}"]) Kernel.system(*args) end