#!/usr/bin/env ruby # # Author:: Christian Reiniger # License:: GNU GPL v2 or later, as described in the accompanying LICENSE file # Homepage: http://dsadmin.dotsrc.org/ # require 'ostruct' require 'optparse' require 'yaml' require File.dirname(__FILE__) + '/../config/boot' class GenSql def main opts = parseOpts @config = YAML.load_file(File.dirname(__FILE__) + '/../config/database.yml') case(opts.action) when :create : build_creator(opts.db) when :destroy : build_destructor(opts.db) when :recreate build_destructor(opts.db) build_creator(opts.db) end end private # ------------------------------------------------------------------ def parseOpts options = OpenStruct.new options.action = nil options.db = :development opts = OptionParser.new opts.banner = "Usage: gensql.rb []" opts.separator "" opts.separator "Generates the SQL (batch) for creating / destroying one of the dsadmin" opts.separator "databases. Example for creating the development DB:" opts.separator " gensql --create --dev | mysql -u root -p" opts.separator "This tool takes database names, usernames and passwords from ../config/database.yaml," opts.separator "so make sure that file is set up correctly!" opts.separator "" opts.separator "Commands:" opts.on("--create", "--new", "-c", "Generate database creation SQL") do options.action = :create end opts.on("--destroy", "--kill", "-d", "Generate database removal SQL") do options.action = :destroy end opts.on("--recreate", "-r", "Generate database deletion and recreation SQL") do options.action = :recreate end opts.on("--help", "-h", "Show this message") do puts opts exit end opts.separator "" opts.separator "Databases:" opts.on("--production", "--prod", "Production") do options.db = :production end opts.on("--development", "--dev", "Development (default)") do options.db = :development end opts.on("--test", "Test") do options.db = :test end opts.parse!(ARGV.clone) if(options.action == nil) puts opts exit end options end def build_creator(databaseid) dbname = @config[databaseid.to_s]['database'] dbuser = @config[databaseid.to_s]['username'] dbpass = @config[databaseid.to_s]['password'] testperm = (databaseid.to_s == "test") ? ",CREATE,DROP,INDEX" : ''; puts "START TRANSACTION;" puts "CREATE DATABASE #{dbname};" puts "USE #{dbname};" puts File.read(File.dirname(__FILE__) + "/structure.sql") puts "GRANT DELETE,INSERT,LOCK TABLES,SELECT,UPDATE#{testperm} ON #{dbname}.* TO '#{dbuser}'@'localhost' IDENTIFIED BY '#{dbpass}';" puts "COMMIT;" end def build_destructor(databaseid) dbname = @config[databaseid.to_s]['database'] dbuser = @config[databaseid.to_s]['username'] puts "START TRANSACTION;" puts "REVOKE ALL ON #{dbname}.* FROM '#{dbuser}'@'localhost';" puts "DROP DATABASE #{dbname};" puts "COMMIT;" end end # class GenSql GenSql.new.main