class DBRotator

Constants

TIME_FORMAT

Public Class Methods

new(config) click to toggle source
# File lib/db_rotator.rb, line 6
def initialize(config)
  @config = config.config
  @schemas = []

  populate_schemas
rescue
  on_failure $!
end

Public Instance Methods

import() click to toggle source
# File lib/db_rotator.rb, line 31
def import
  import_dump
  populate_schemas
end
refresh() click to toggle source
# File lib/db_rotator.rb, line 24
def refresh
  download_dump
  import
  prune
  grant_access
end
rotate() click to toggle source
# File lib/db_rotator.rb, line 15
def rotate
  refresh
  update_db_yaml
  on_success

rescue
  on_failure $!
end

Private Instance Methods

bash_exec(cmd, skip_raise = false) click to toggle source
# File lib/db_rotator.rb, line 146
def bash_exec(cmd, skip_raise = false)
  out = `#{cmd} || echo '__failed'`
  out = out.strip == "__failed" ? nil : out
  raise "Command failed: #{cmd}" if !skip_raise && !out

  out
end
current_user() click to toggle source
# File lib/db_rotator.rb, line 142
def current_user
  mysql_exec("SELECT current_user()").split("\n").last
end
download_dump() click to toggle source
# File lib/db_rotator.rb, line 50
def download_dump
  verbose_message "Downloading dump..."
  bash_exec "rm -f #{local_dump_path}"
  bash_exec "#{@config[:scp_command]} #{local_dump_path}"
end
extra_pipe() click to toggle source
# File lib/db_rotator.rb, line 106
def extra_pipe
  @config[:unarchive_extra_pipe] && "#{@config[:unarchive_extra_pipe].join(' | ')} |"
end
grant_access() click to toggle source
# File lib/db_rotator.rb, line 83
def grant_access
  verbose_message "Granting ..."
  mysql_exec "GRANT ALL ON #{todays_dbname}.* to #{current_user}"
end
import_dump() click to toggle source
# File lib/db_rotator.rb, line 56
def import_dump
  if reasonable_diskspace?
    verbose_message "Importing dump..."

    mysql_exec "DROP SCHEMA IF EXISTS #{todays_dbname}"
    mysql_exec "CREATE SCHEMA #{todays_dbname}"

    bash_exec %[#{@config[:unarchive_command]} #{local_dump_path} |
                #{extra_pipe}
               #{@config[:mysql_command]} #{todays_dbname}]
  else
    raise "not enough disk space: #{raw_diskspace}"
  end
end
local_dump_path() click to toggle source
# File lib/db_rotator.rb, line 122
def local_dump_path
  [@config[:local_dump_destination], @config[:dump_filename]].join('/')
end
mysql_exec(cmd) click to toggle source
# File lib/db_rotator.rb, line 154
def mysql_exec(cmd)
  bash_exec "#{@config[:mysql_command]} -B -e '#{cmd}'"
end
on_failure(err) click to toggle source
# File lib/db_rotator.rb, line 42
def on_failure(err)
  if @config[:on_failure]
    bash_exec "#{@config[:on_failure]} #{err.class.name} '#{err.message}'"
  else
    raise err
  end
end
on_success() click to toggle source
# File lib/db_rotator.rb, line 38
def on_success
  bash_exec "#{@config[:on_success]}" if @config[:on_success]
end
populate_schemas() click to toggle source
# File lib/db_rotator.rb, line 88
def populate_schemas
  @schemas = raw_schemas.split.each.with_object([]) do |schema_name, memo|
    memo << Schema.new(schema_name, schema_regex) if schema_name =~ schema_regex
  end
end
prune() click to toggle source
# File lib/db_rotator.rb, line 71
def prune
  if @config[:maximum_dbs]
    verbose_message "Pruning DBs..."

    if @schemas.count > (n = @config[:maximum_dbs].to_i)
      @schemas.sort_by(&:to_date).reverse[n..-1].each do |schema|
        mysql_exec "DROP SCHEMA IF EXISTS #{schema.name}"
      end
    end
  end
end
raw_diskspace() click to toggle source
# File lib/db_rotator.rb, line 134
def raw_diskspace
  bash_exec "df -h `mysql -B -e 'select @@datadir;' | tail -1` | tail -1 | awk '{ print $2 }'"
end
raw_schemas() click to toggle source
# File lib/db_rotator.rb, line 138
def raw_schemas
  mysql_exec "SHOW DATABASES"
end
reasonable_diskspace?() click to toggle source
# File lib/db_rotator.rb, line 126
def reasonable_diskspace?
  if @config[:reasonable_diskspace]
    return raw_diskspace.to_i >= @config[:reasonable_diskspace]
  end

  true
end
schema_regex() click to toggle source
# File lib/db_rotator.rb, line 118
def schema_regex
  /#{@config[:db_prefix]}([0-9]+)/
end
todays_dbname() click to toggle source
# File lib/db_rotator.rb, line 114
def todays_dbname
  "#{@config[:db_prefix]}#{todays_stamp}"
end
todays_stamp() click to toggle source
# File lib/db_rotator.rb, line 110
def todays_stamp
  Time.now.strftime(TIME_FORMAT)
end
update_db_yaml() click to toggle source
# File lib/db_rotator.rb, line 94
def update_db_yaml
  if @config[:rails_db_yaml_path]
    hash = YAML.load(File.read(@config[:rails_db_yaml_path]))

    @config[:rails_environments].each do |env|
      hash[env.to_s]["database"] = todays_dbname
    end

    File.write(@config[:rails_db_yaml_path], hash.to_yaml)
  end
end
verbose_message(msg) click to toggle source
# File lib/db_rotator.rb, line 158
def verbose_message(msg)
  puts msg if @config[:verbose]
end