require'erb'require'yaml'require'optparse'require'rails/commands/console_helper'moduleRailsclassDBConsoleincludeConsoleHelperattr_reader:argumentsclass<<selfdefparse_arguments(arguments)options={}OptionParser.newdo|opt|opt.banner="Usage: rails dbconsole [environment] [options]"opt.on("-p","--include-password","Automatically provide the password from database.yml")do|v|options['include_password']=trueendopt.on("--mode [MODE]",['html','list','line','column'],"Automatically put the sqlite3 database in the specified mode (html, list, line, column).")do|mode|options['mode']=modeendopt.on("--header")do|h|options['header']=hendopt.on("-h","--help","Show this help message.")doputsoptexitendopt.on("-e","--environment=name",String,"Specifies the environment to run this console under (test/development/production).","Default: development"){|v|options[:environment]=v.strip}opt.parse!(arguments)abortopt.to_sunless(0..1).include?(arguments.size)endset_options_env(arguments,options)endenddefinitialize(arguments=ARGV)@arguments=argumentsenddefstartoptions=self.class.parse_arguments(arguments)ENV['RAILS_ENV']=options[:environment]||environmentcaseconfig["adapter"]when/^(jdbc)?mysql/args={'host'=>'--host','port'=>'--port','socket'=>'--socket','username'=>'--user','encoding'=>'--default-character-set','sslca'=>'--ssl-ca','sslcert'=>'--ssl-cert','sslcapath'=>'--ssl-capath','sslcipher'=>'--ssl-cipher','sslkey'=>'--ssl-key'}.map{|opt,arg|"#{arg}=#{config[opt]}"ifconfig[opt]}.compactifconfig['password']&&options['include_password']args<<"--password=#{config['password']}"elsifconfig['password']&&!config['password'].to_s.empty?args<<"-p"endargs<<config['database']find_cmd_and_exec(['mysql','mysql5'],*args)when/^postgres|^postgis/ENV['PGUSER']=config["username"]ifconfig["username"]ENV['PGHOST']=config["host"]ifconfig["host"]ENV['PGPORT']=config["port"].to_sifconfig["port"]ENV['PGPASSWORD']=config["password"].to_sifconfig["password"]&&options['include_password']find_cmd_and_exec('psql',config["database"])when"sqlite3"args=[]args<<"-#{options['mode']}"ifoptions['mode']args<<"-header"ifoptions['header']args<<File.expand_path(config['database'],Rails.respond_to?(:root)?Rails.root:nil)find_cmd_and_exec('sqlite3',*args)when"oracle","oracle_enhanced"logon=""ifconfig['username']logon=config['username']logon<<"/#{config['password']}"ifconfig['password']&&options['include_password']logon<<"@#{config['database']}"ifconfig['database']endfind_cmd_and_exec('sqlplus',logon)when"sqlserver"args=[]args+=["-D","#{config['database']}"]ifconfig['database']args+=["-U","#{config['username']}"]ifconfig['username']args+=["-P","#{config['password']}"]ifconfig['password']ifconfig['host']host_arg="#{config['host']}"host_arg<<":#{config['port']}"ifconfig['port']args+=["-S",host_arg]endfind_cmd_and_exec("sqsh",*args)elseabort"Unknown command-line client for #{config['database']}."endenddefconfig@config||=beginifconfigurations[environment].blank?raiseActiveRecord::AdapterNotSpecified,"'#{environment}' database is not configured. Available configuration: #{configurations.inspect}"elseconfigurations[environment]endendenddefenvironmentRails.respond_to?(:env)?Rails.env:superendprotecteddefconfigurationsrequireAPP_PATHActiveRecord::Base.configurations=Rails.application.config.database_configurationActiveRecord::Base.configurationsenddeffind_cmd_and_exec(commands,*args)commands=Array(commands)dirs_on_path=ENV['PATH'].to_s.split(File::PATH_SEPARATOR)unless(ext=RbConfig::CONFIG['EXEEXT']).empty?commands=commands.map{|cmd|"#{cmd}#{ext}"}endfull_path_command=nilfound=commands.detectdo|cmd|dirs_on_path.detectdo|path|full_path_command=File.join(path,cmd)File.file?(full_path_command)&&File.executable?(full_path_command)endendiffoundexecfull_path_command,*argselseabort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")endendendend