From 4a07103687084496b773e18a03b1f2f5e686f7ad Mon Sep 17 00:00:00 2001 From: Steve Purcell Date: Sun, 4 May 2008 12:53:50 +0200 Subject: Add 'script/dbconsole' -- the database analog of 'script/console' --- railties/lib/commands/dbconsole.rb | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 railties/lib/commands/dbconsole.rb (limited to 'railties/lib/commands/dbconsole.rb') diff --git a/railties/lib/commands/dbconsole.rb b/railties/lib/commands/dbconsole.rb new file mode 100644 index 0000000000..03477f9b69 --- /dev/null +++ b/railties/lib/commands/dbconsole.rb @@ -0,0 +1,49 @@ +require 'optparse' +OptionParser.new do |opt| + opt.banner = "Usage: dbconsole [environment]" + opt.parse!(ARGV) + abort opt.to_s unless (0..1).include?(ARGV.size) +end + +env = ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV'] || 'development' + +def find_cmd(*commands) + dirs_on_path = ENV['PATH'].split(File::PATH_SEPARATOR) + commands += commands.map{|cmd| "#{cmd}.exe"} if RUBY_PLATFORM =~ /win32/ + commands.detect do |cmd| + dirs_on_path.detect do |path| + File.executable? File.join(path, cmd) + end + end || abort("couldn't find matching executable: #{commands.join(', ')}") +end + + +require 'yaml' +config = YAML::load(File.read(RAILS_ROOT + "/config/database.yml"))[env] + +unless config + abort "No database is configured for the environment '#{env}'" +end + +case config["adapter"] +when "mysql" + exec(find_cmd(*%w(mysql5 mysql)), + *({ 'host' => '--host', + 'port' => '--port', + 'socket' => '--socket', + 'username' => '--user', + 'password' => '--password', + 'encoding' => '--default-character-set' + }.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact + + [config['database']])) +when "postgresql" + ENV['PGHOST'] = config["host"] if config["host"] + ENV['PGPORT'] = config["port"].to_s if config["port"] + ENV['PGPASSWORD'] = config["password"].to_s if config["password"] + exec(find_cmd('psql'), '-U', config["username"], config["database"]) +when "sqlite" + exec(find_cmd('sqlite'), config["database"]) +when "sqlite3" + exec(find_cmd('sqlite3'), config["database"]) +else abort "not supported for this database type" +end -- cgit v1.2.3 From 2561732a08ae97fa44706a8eca4db147c4a7c286 Mon Sep 17 00:00:00 2001 From: Jeremy Kemper Date: Wed, 7 May 2008 13:50:46 -0700 Subject: Some dbconsole tweaks. [#102 state:resolved] --- railties/lib/commands/dbconsole.rb | 46 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'railties/lib/commands/dbconsole.rb') diff --git a/railties/lib/commands/dbconsole.rb b/railties/lib/commands/dbconsole.rb index 03477f9b69..28c3a3e41f 100644 --- a/railties/lib/commands/dbconsole.rb +++ b/railties/lib/commands/dbconsole.rb @@ -1,49 +1,55 @@ +require 'yaml' require 'optparse' + OptionParser.new do |opt| opt.banner = "Usage: dbconsole [environment]" opt.parse!(ARGV) abort opt.to_s unless (0..1).include?(ARGV.size) end -env = ENV['RAILS_ENV'] = ARGV.first || ENV['RAILS_ENV'] || 'development' +env = ARGV.first || ENV['RAILS_ENV'] || 'development' +unless config = YAML.load_file(RAILS_ROOT + "/config/database.yml")[env] + abort "No database is configured for the environment '#{env}'" +end + def find_cmd(*commands) - dirs_on_path = ENV['PATH'].split(File::PATH_SEPARATOR) + dirs_on_path = ENV['PATH'].to_s.split(File::PATH_SEPARATOR) commands += commands.map{|cmd| "#{cmd}.exe"} if RUBY_PLATFORM =~ /win32/ commands.detect do |cmd| dirs_on_path.detect do |path| File.executable? File.join(path, cmd) end - end || abort("couldn't find matching executable: #{commands.join(', ')}") + end || abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.") end +case config["adapter"] +when "mysql" + args = { + 'host' => '--host', + 'port' => '--port', + 'socket' => '--socket', + 'username' => '--user', + 'password' => '--password', + 'encoding' => '--default-character-set' + }.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact -require 'yaml' -config = YAML::load(File.read(RAILS_ROOT + "/config/database.yml"))[env] + args << config['database'] -unless config - abort "No database is configured for the environment '#{env}'" -end + exec(find_cmd('mysql5', 'mysql'), *args) -case config["adapter"] -when "mysql" - exec(find_cmd(*%w(mysql5 mysql)), - *({ 'host' => '--host', - 'port' => '--port', - 'socket' => '--socket', - 'username' => '--user', - 'password' => '--password', - 'encoding' => '--default-character-set' - }.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact + - [config['database']])) when "postgresql" ENV['PGHOST'] = config["host"] if config["host"] ENV['PGPORT'] = config["port"].to_s if config["port"] ENV['PGPASSWORD'] = config["password"].to_s if config["password"] exec(find_cmd('psql'), '-U', config["username"], config["database"]) + when "sqlite" exec(find_cmd('sqlite'), config["database"]) + when "sqlite3" exec(find_cmd('sqlite3'), config["database"]) -else abort "not supported for this database type" + +else + abort "Unknown command-line client for #{config['database']}. Submit a Rails patch to add support!" end -- cgit v1.2.3