Permalink
Browse files

Add 'script/dbconsole' -- the database analog of 'script/console'

  • Loading branch information...
purcell authored and jeremy committed May 4, 2008
1 parent 0a21193 commit 4a07103687084496b773e18a03b1f2f5e686f7ad
Showing with 52 additions and 0 deletions.
  1. +3 −0 railties/bin/dbconsole
  2. +49 −0 railties/lib/commands/dbconsole.rb
View
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+require File.dirname(__FILE__) + '/../config/boot'
+require 'commands/dbconsole'
@@ -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

4 comments on commit 4a07103

@notlaforge

This comment has been minimized.

Show comment
Hide comment
@notlaforge

notlaforge May 14, 2008

Contributor

This leaves the MySQL password in the output of ps. The same is true in the case of the environment variable used for postgres.

Contributor

notlaforge replied May 14, 2008

This leaves the MySQL password in the output of ps. The same is true in the case of the environment variable used for postgres.

@jeremy

This comment has been minimized.

Show comment
Hide comment
@jeremy

jeremy May 14, 2008

Member

If this is a concern, you develop in a strange place and have bigger problems. That said, patches are welcome :)

Member

jeremy replied May 14, 2008

If this is a concern, you develop in a strange place and have bigger problems. That said, patches are welcome :)

@EppO

This comment has been minimized.

Show comment
Hide comment
@EppO

EppO Jun 3, 2008

in the case of cross-referenced environnements (or just environnement aliases) like:

all:
adapter: postgresql

development: all
database: dev
login: …
pass: …

production: all
database: prod
login: …
pass: …

Error “not supported for this database type” is returned. Environnement should be built correctly

EppO replied Jun 3, 2008

in the case of cross-referenced environnements (or just environnement aliases) like:

all:
adapter: postgresql

development: all
database: dev
login: …
pass: …

production: all
database: prod
login: …
pass: …

Error “not supported for this database type” is returned. Environnement should be built correctly

@EppO

This comment has been minimized.

Show comment
Hide comment
@EppO

EppO Jun 3, 2008

sorry for the bad formatted code…

EppO replied Jun 3, 2008

sorry for the bad formatted code…

Please sign in to comment.